amiga_boottest

annotate tools/mk_adf.py @ 0:51422ea54b9d

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Wed, 21 Feb 2018 12:00:13 +0200
parents
children
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)