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.
14 OFFSETS16='out/rom16.offset.auto.h'
15 OFFSETS32='out/rom32.offset.auto.h'
19 return (v + a - 1) // a * a
24 for l in f.readlines():
28 if parts[0] != '#define':
30 opts[parts[1]] = parts[2]
33 def alteraddr(data, offset, ptr):
34 rel = struct.pack("<i", ptr)
35 return data[:offset] + rel + data[offset+4:]
45 if len(data16) != 65536:
46 print "16bit code is not 65536 bytes long"
50 o16 = scanconfig(OFFSETS16)
51 o32 = scanconfig(OFFSETS32)
54 spos = align(int(o16['OFFSET_bios16c_end'], 16), 16)
55 epos = int(o16['OFFSET_post16'], 16)
57 freespace = epos - spos
58 if size32 > freespace:
59 print "32bit code too large (%d vs %d)" % (size32, freespace)
62 if data16[spos:spos+size32] != '\0'*size32:
63 print "Non zero data in 16bit freespace (0x%x to 0x%x)" % (
66 outrom = data16[:spos] + data32 + data16[spos+size32:]
68 # Fixup initial jump to 32 bit code
69 jmppos = int(o16['OFFSET_set_entry32'], 16) - 0xf0000
70 start32 = int(o32['OFFSET__start'], 16)
71 outrom = alteraddr(outrom, jmppos+2, start32)
73 print "Writing output rom %s" % OUT
74 print " 16bit C-code size: %d" % spos
75 print " 32bit C-code size: %d" % size32
76 print " Total C-code size: %d" % (spos+size32)
83 # Build elf file with 32bit entry point
85 "ld -melf_i386 -e %s -Tdata 0xf0000 -b binary %s -o %s" % (
86 int(o32['OFFSET_post32'], 16), OUT, OUT+".elf"))
88 if __name__ == '__main__':