|
@@ -0,0 +1,71 @@
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import struct
|
|
|
+
|
|
|
+def usage():
|
|
|
+ print "%s <rom> <code> <addr>" % sys.argv[0]
|
|
|
+ sys.exit(0)
|
|
|
+
|
|
|
+
|
|
|
+def error(msg):
|
|
|
+ print "ERROR: %s" % msg
|
|
|
+ sys.exit(-1)
|
|
|
+
|
|
|
+def main():
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if len(sys.argv) != 4:
|
|
|
+ usage()
|
|
|
+ if not os.path.isfile(sys.argv[1]):
|
|
|
+ error("Can't open %s file" % sys.argv[1])
|
|
|
+ if not os.path.isfile(sys.argv[2]):
|
|
|
+ error("Can't open %s file" % sys.argv[2])
|
|
|
+
|
|
|
+ rom = open(sys.argv[1],"r").read()
|
|
|
+ code = open(sys.argv[2],"r").read()
|
|
|
+ out_filename = sys.argv[1].split(".")[0] + ".inject"
|
|
|
+ out = open(out_filename,"w")
|
|
|
+
|
|
|
+ irq_vector = 0x7FE0
|
|
|
+ bank_size = 1 << 15
|
|
|
+ code_len = len(code)
|
|
|
+ rom_len = len(rom)
|
|
|
+ bank_cnt = rom_len / bank_size
|
|
|
+ try:
|
|
|
+ addr = int(sys.argv[3],16)
|
|
|
+ except:
|
|
|
+ error("Expect %s in hex" % sys.argv[3])
|
|
|
+
|
|
|
+ addr_patch = struct.pack(">H",addr)
|
|
|
+
|
|
|
+
|
|
|
+ if addr > bank_size:
|
|
|
+ error("Addr 0x%04x is not within first bank" % addr)
|
|
|
+
|
|
|
+ if addr + code_len > ( bank_size - 256 ):
|
|
|
+ error("Code is %s bytes, and so too big to fit from 0x%04x into first bank" % (code_len,addr))
|
|
|
+
|
|
|
+ print "Rom size: 0x%08x (%i)" % (rom_len,rom_len)
|
|
|
+ print "Code size: 0x%04x (%i)" % (code_len,code_len)
|
|
|
+ print "Banks: 0x%04x (%i)" % (bank_cnt,bank_cnt)
|
|
|
+ print "Patch addr: 0x%08x" % addr
|
|
|
+ print "IRQ addr: 0x%08x" % irq_vector
|
|
|
+
|
|
|
+
|
|
|
+ out.write(rom[:addr])
|
|
|
+ out.write(code)
|
|
|
+ out.write(rom[addr+code_len:irq_vector])
|
|
|
+ out.write(addr_patch)
|
|
|
+ out.write(rom[irq_vector+2:])
|
|
|
+ print "%i Bytes written to %s" % (out.tell(),out_filename)
|
|
|
+ out.close()
|
|
|
+ print "Apply checksum fix"
|
|
|
+ cmd = "ucon64 -snes -chk %s 2>&1 > /dev/null" % out_filename
|
|
|
+ os.system(cmd)
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|
|
|
+
|