nuclear@0: #!/usr/bin/python nuclear@0: # mk_adf.py nuclear@0: # nuclear@0: # Stuff a given bootblock and payload into an output ADF image. nuclear@0: # nuclear@0: # Written & released by Keir Fraser nuclear@0: # nuclear@0: # This is free and unencumbered software released into the public domain. nuclear@0: # See the file COPYING for more details, or visit . nuclear@0: nuclear@0: import struct, sys nuclear@0: nuclear@0: # Amiga bootblock checksum nuclear@0: def checksum(bb, sum=0): nuclear@0: while len(bb): nuclear@0: x, bb = struct.unpack(">L",bb[:4]), bb[4:] nuclear@0: sum += x[0] nuclear@0: if sum >= (1<<32): nuclear@0: sum -= (1<<32)-1 nuclear@0: return sum nuclear@0: nuclear@0: def main(argv): nuclear@0: bb_f = open(argv[1], "rb") nuclear@0: pl_f = open(argv[2], "rb") nuclear@0: out_f = open(argv[3], "wb") nuclear@0: bb_dat = bb_f.read() nuclear@0: pl_dat = pl_f.read() nuclear@0: nuclear@0: # Construct bootblock header. We will splice in the checksum later. nuclear@0: header = struct.pack(">ccccLLLL", nuclear@0: 'D', 'O', 'S', '\0', # Bootblock signature nuclear@0: 0, # Checksum (placeholder) nuclear@0: 880, # Root block nuclear@0: 0x60060000, # BRA.B +6 nuclear@0: (len(pl_dat) + 511) & ~511) # Payload length, padded nuclear@0: nuclear@0: nuclear@0: # Compute checksum over header, bootblock, and first 512 bytes of payload. nuclear@0: sum = checksum(pl_dat[:512], checksum(bb_dat, checksum(header))) nuclear@0: sum ^= 0xFFFFFFFF nuclear@0: # Splice the computed checksum into the header nuclear@0: header = header[:4] + struct.pack(">L", sum) + header[8:] nuclear@0: # Write out the header and bootblock code nuclear@0: out_f.write(header) nuclear@0: out_f.write(bb_dat) nuclear@0: # Pad bootblock to 512 bytes nuclear@0: for x in xrange((512-len(bb_dat)-len(header))/4): nuclear@0: out_f.write(struct.pack(">L", 0)) nuclear@0: # Write the payload from sector 1 onwards nuclear@0: out_f.write(pl_dat) nuclear@0: # Pad the ADF image to 880kB nuclear@0: for x in xrange((901120-len(pl_dat)-512)/4): nuclear@0: out_f.write(struct.pack(">L", 0)) nuclear@0: nuclear@0: if __name__ == "__main__": nuclear@0: main(sys.argv)