Skip to content

Instantly share code, notes, and snippets.

@reidrac
Created November 15, 2016 19:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reidrac/3bf73bf75593d191211c467fe6f1a7ee to your computer and use it in GitHub Desktop.
Save reidrac/3bf73bf75593d191211c467fe6f1a7ee to your computer and use it in GitHub Desktop.
Python script to create a GX4000 CPR file
#!/usr/bin/env python
__version__ = "1.0"
import sys
from argparse import ArgumentParser
import struct
ROM_SIZE = 32 * 1024 * 16
def main():
cpr = [0xff for _ in range(ROM_SIZE)]
parser = ArgumentParser(description="CPR builder",
epilog="Copyright (C) 2016 Juan J Martinez <jjm@usebox.net>",
)
parser.add_argument("--version", action="version", version="%(prog)s " + __version__)
parser.add_argument("output", help="output file")
parser.add_argument("bins", metavar="BIN", nargs="+", help="binary:addr to include in the CPR")
args = parser.parse_args()
for binary in args.bins:
try:
filename, addr = binary.split(":")
except ValueError:
parser.error("%r: expected binary:addr" % binary)
if addr.startswith("0x"):
addr = int(addr, 16)
else:
addr = int(addr)
with open(filename, "rb") as fd:
data = fd.read()
print("Loading %r into 0x%04x" % (filename, addr))
for i in range(len(data)):
cpr[addr + i] = data[i]
print("Writing %r..." % args.output)
with open(args.output, "wb") as fd:
fd.write("RIFF")
# ROM size + 32 * 8 chunk headers (cbxx + length) + "AMS!"
fd.write(struct.pack("<L", ROM_SIZE + 32 * 8 + 4))
fd.write("AMS!")
for i in range(32):
fd.write("cb%02d" % i)
fd.write(struct.pack("<L", 1024 * 16))
ini = i * 1024 * 16
end = (i + 1) * 1024 * 16
fd.write(bytearray(cpr[ini:end]))
print("Done!")
if __name__ == "__main__":
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment