add rom inject

This commit is contained in:
david 2009-07-09 11:58:28 +02:00
parent 18c4b45824
commit 8f0096eb5e

71
scripts/rom_inject.py Normal file
View File

@ -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()