add rom inject
This commit is contained in:
parent
18c4b45824
commit
8f0096eb5e
71
scripts/rom_inject.py
Normal file
71
scripts/rom_inject.py
Normal 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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user