aboutsummaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rwxr-xr-xtools/buildrom.py78
-rwxr-xr-xtools/defsyms.py38
2 files changed, 116 insertions, 0 deletions
diff --git a/tools/buildrom.py b/tools/buildrom.py
new file mode 100755
index 0000000..beb51ac
--- /dev/null
+++ b/tools/buildrom.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+# Script to merge a rom32.bin file into a rom16.bin file.
+#
+# Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+
+import sys
+import struct
+
+ROM16='out/rom16.bin'
+ROM32='out/rom32.bin'
+OFFSETS16='out/rom16.offset.auto.h'
+OFFSETS32='out/rom32.offset.auto.h'
+OUT='out/rom.bin'
+
+def align(v, a):
+ return (v + a - 1) // a * a
+
+def scanconfig(file):
+ f = open(file, 'rb')
+ opts = {}
+ for l in f.readlines():
+ parts = l.split()
+ if len(parts) != 3:
+ continue
+ if parts[0] != '#define':
+ continue
+ opts[parts[1]] = parts[2]
+ return opts
+
+def alteraddr(data, offset, ptr):
+ rel = struct.pack("<i", ptr)
+ return data[:offset] + rel + data[offset+4:]
+
+
+def main():
+ # Read in files
+ f = open(ROM16, 'rb')
+ data16 = f.read()
+ f = open(ROM32, 'rb')
+ data32 = f.read()
+
+ if len(data16) != 65536:
+ print "16bit code is not 65536 bytes long"
+ sys.exit(1)
+
+ # Get config options
+ o16 = scanconfig(OFFSETS16)
+ o32 = scanconfig(OFFSETS32)
+
+ # Inject 32bit code
+ spos = align(int(o16['OFFSET_bios16c_end'], 16), 16)
+ epos = int(o16['OFFSET_post16'], 16)
+ size32 = len(data32)
+ freespace = epos - spos
+ if size32 > freespace:
+ print "32bit code too large (%d vs %d)" % (size32, freespace)
+ sys.exit(1)
+ outrom = data16[:spos] + data32 + data16[spos+size32:]
+
+ # Fixup initial jump to 32 bit code
+ jmppos = int(o16['OFFSET_set_entry32'], 16)
+ start32 = int(o32['OFFSET__start'], 16)
+ outrom = alteraddr(outrom, jmppos+2, start32)
+
+ # Fixup resume from 16 jump to 32 bit code
+ jmppos = int(o16['OFFSET_set_resume32'], 16)
+ resume32 = int(o32['OFFSET_call16_resume'], 16)
+ outrom = alteraddr(outrom, jmppos+2, resume32)
+
+ # Write output rom
+ f = open(OUT, 'wb')
+ f.write(outrom)
+ f.close()
+
+if __name__ == '__main__':
+ main()
diff --git a/tools/defsyms.py b/tools/defsyms.py
new file mode 100755
index 0000000..fe18d90
--- /dev/null
+++ b/tools/defsyms.py
@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+# Simple script to convert the output from 'nm' to a C style header
+# file with defined offsets.
+#
+# Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
+#
+# This file may be distributed under the terms of the GNU GPLv3 license.
+
+import sys
+import string
+
+def main():
+ syms = []
+ lines = sys.stdin.readlines()
+ for line in lines:
+ addr, type, sym = line.split()
+ if type not in 'TA':
+ # Only interested in global symbols in text segment
+ continue
+ for c in sym:
+ if c not in string.letters + string.digits + '_':
+ break
+ else:
+ syms.append((sym, addr))
+ print """
+#ifndef __OFFSET16_AUTO_H
+#define __OFFSET16_AUTO_H
+// Auto generated file - please see defsyms.py.
+// This file contains symbol offsets of a compiled binary.
+"""
+ for sym, addr in syms:
+ print "#define OFFSET_%s 0x%s" % (sym, addr)
+ print """
+#endif // __OFFSET16_AUTO_H
+"""
+
+if __name__ == '__main__':
+ main()