rev |
line source |
nuclear@0
|
1 #!/usr/bin/python
|
nuclear@0
|
2 # mk_adf.py <bootblock> <payload> <output_adf>
|
nuclear@0
|
3 #
|
nuclear@0
|
4 # Stuff a given bootblock and payload into an output ADF image.
|
nuclear@0
|
5 #
|
nuclear@0
|
6 # Written & released by Keir Fraser <keir.xen@gmail.com>
|
nuclear@0
|
7 #
|
nuclear@0
|
8 # This is free and unencumbered software released into the public domain.
|
nuclear@0
|
9 # See the file COPYING for more details, or visit <http://unlicense.org>.
|
nuclear@0
|
10
|
nuclear@0
|
11 import struct, sys
|
nuclear@0
|
12
|
nuclear@0
|
13 # Amiga bootblock checksum
|
nuclear@0
|
14 def checksum(bb, sum=0):
|
nuclear@0
|
15 while len(bb):
|
nuclear@0
|
16 x, bb = struct.unpack(">L",bb[:4]), bb[4:]
|
nuclear@0
|
17 sum += x[0]
|
nuclear@0
|
18 if sum >= (1<<32):
|
nuclear@0
|
19 sum -= (1<<32)-1
|
nuclear@0
|
20 return sum
|
nuclear@0
|
21
|
nuclear@0
|
22 def main(argv):
|
nuclear@0
|
23 bb_f = open(argv[1], "rb")
|
nuclear@0
|
24 pl_f = open(argv[2], "rb")
|
nuclear@0
|
25 out_f = open(argv[3], "wb")
|
nuclear@0
|
26 bb_dat = bb_f.read()
|
nuclear@0
|
27 pl_dat = pl_f.read()
|
nuclear@0
|
28
|
nuclear@0
|
29 # Construct bootblock header. We will splice in the checksum later.
|
nuclear@0
|
30 header = struct.pack(">ccccLLLL",
|
nuclear@0
|
31 'D', 'O', 'S', '\0', # Bootblock signature
|
nuclear@0
|
32 0, # Checksum (placeholder)
|
nuclear@0
|
33 880, # Root block
|
nuclear@0
|
34 0x60060000, # BRA.B +6
|
nuclear@0
|
35 (len(pl_dat) + 511) & ~511) # Payload length, padded
|
nuclear@0
|
36
|
nuclear@0
|
37
|
nuclear@0
|
38 # Compute checksum over header, bootblock, and first 512 bytes of payload.
|
nuclear@0
|
39 sum = checksum(pl_dat[:512], checksum(bb_dat, checksum(header)))
|
nuclear@0
|
40 sum ^= 0xFFFFFFFF
|
nuclear@0
|
41 # Splice the computed checksum into the header
|
nuclear@0
|
42 header = header[:4] + struct.pack(">L", sum) + header[8:]
|
nuclear@0
|
43 # Write out the header and bootblock code
|
nuclear@0
|
44 out_f.write(header)
|
nuclear@0
|
45 out_f.write(bb_dat)
|
nuclear@0
|
46 # Pad bootblock to 512 bytes
|
nuclear@0
|
47 for x in xrange((512-len(bb_dat)-len(header))/4):
|
nuclear@0
|
48 out_f.write(struct.pack(">L", 0))
|
nuclear@0
|
49 # Write the payload from sector 1 onwards
|
nuclear@0
|
50 out_f.write(pl_dat)
|
nuclear@0
|
51 # Pad the ADF image to 880kB
|
nuclear@0
|
52 for x in xrange((901120-len(pl_dat)-512)/4):
|
nuclear@0
|
53 out_f.write(struct.pack(">L", 0))
|
nuclear@0
|
54
|
nuclear@0
|
55 if __name__ == "__main__":
|
nuclear@0
|
56 main(sys.argv)
|