Created
November 15, 2016 19:35
-
-
Save reidrac/3bf73bf75593d191211c467fe6f1a7ee to your computer and use it in GitHub Desktop.
Python script to create a GX4000 CPR file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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