2 # Script to merge a rom32.bin file into a rom16.bin file.
4 # Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
6 # This file may be distributed under the terms of the GNU GPLv3 license.
13 OFFSETS16='out/rom16.offset.auto.h'
14 OFFSETS32='out/rom32.offset.auto.h'
18 return (v + a - 1) // a * a
23 for l in f.readlines():
27 if parts[0] != '#define':
29 opts[parts[1]] = parts[2]
32 def alteraddr(data, offset, ptr):
33 rel = struct.pack("<i", ptr)
34 return data[:offset] + rel + data[offset+4:]
44 if len(data16) != 65536:
45 print "16bit code is not 65536 bytes long"
49 o16 = scanconfig(OFFSETS16)
50 o32 = scanconfig(OFFSETS32)
53 spos = align(int(o16['OFFSET_bios16c_end'], 16), 16)
54 epos = int(o16['OFFSET_post16'], 16)
56 freespace = epos - spos
57 if size32 > freespace:
58 print "32bit code too large (%d vs %d)" % (size32, freespace)
60 outrom = data16[:spos] + data32 + data16[spos+size32:]
62 # Fixup initial jump to 32 bit code
63 jmppos = int(o16['OFFSET_set_entry32'], 16)
64 start32 = int(o32['OFFSET__start'], 16)
65 outrom = alteraddr(outrom, jmppos+2, start32)
67 # Fixup resume from 16 jump to 32 bit code
68 jmppos = int(o16['OFFSET_set_resume32'], 16)
69 resume32 = int(o32['OFFSET_call16_resume'], 16)
70 outrom = alteraddr(outrom, jmppos+2, resume32)
77 if __name__ == '__main__':