You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
4.9 KiB
192 lines
4.9 KiB
#! /usr/bin/env python3
|
|
import argparse
|
|
import os
|
|
import sys
|
|
|
|
from arcadeutils.binary import ByteUtil
|
|
|
|
|
|
def main() -> int:
|
|
parser = argparse.ArgumentParser("ROM manipulation utilities.")
|
|
subparsers = parser.add_subparsers(
|
|
dest="action",
|
|
help="Action to perform.",
|
|
)
|
|
|
|
byteswap = subparsers.add_parser(
|
|
"byteswap",
|
|
help="Swap every byte pair of a 16bit rom.",
|
|
)
|
|
byteswap.add_argument(
|
|
"old",
|
|
metavar="OLD",
|
|
type=str,
|
|
help="Old rom file to byteswap.",
|
|
)
|
|
byteswap.add_argument(
|
|
"new",
|
|
metavar="NEW",
|
|
type=str,
|
|
help="New rom file to write after byteswapping.",
|
|
)
|
|
|
|
wordswap = subparsers.add_parser(
|
|
"wordswap",
|
|
help="Swap every 32bit value in a 32bit rom.",
|
|
)
|
|
wordswap.add_argument(
|
|
"old",
|
|
metavar="OLD",
|
|
type=str,
|
|
help="Old rom file to wordswap.",
|
|
)
|
|
wordswap.add_argument(
|
|
"new",
|
|
metavar="NEW",
|
|
type=str,
|
|
help="New rom file to write after wordswapping.",
|
|
)
|
|
|
|
combine8 = subparsers.add_parser(
|
|
"combine8",
|
|
help="Combine two 8bit roms to one 16bit rom.",
|
|
)
|
|
combine8.add_argument(
|
|
"upper",
|
|
metavar="UPPER",
|
|
type=str,
|
|
help="Upper half of rom file.",
|
|
)
|
|
combine8.add_argument(
|
|
"lower",
|
|
metavar="LOWER",
|
|
type=str,
|
|
help="Lower half of rom file.",
|
|
)
|
|
combine8.add_argument(
|
|
"combined",
|
|
metavar="COMBINED",
|
|
type=str,
|
|
help="Combined output file.",
|
|
)
|
|
|
|
combine16 = subparsers.add_parser(
|
|
"combine16",
|
|
help="Combine two 16bit roms to one 32bit rom.",
|
|
)
|
|
combine16.add_argument(
|
|
"upper",
|
|
metavar="UPPER",
|
|
type=str,
|
|
help="Upper half of rom file.",
|
|
)
|
|
combine16.add_argument(
|
|
"lower",
|
|
metavar="LOWER",
|
|
type=str,
|
|
help="Lower half of rom file.",
|
|
)
|
|
combine16.add_argument(
|
|
"combined",
|
|
metavar="COMBINED",
|
|
type=str,
|
|
help="Combined output file.",
|
|
)
|
|
|
|
split8 = subparsers.add_parser(
|
|
"split8",
|
|
help="Split one 16bit rom to two 8bit roms.",
|
|
)
|
|
split8.add_argument(
|
|
"combined",
|
|
metavar="COMBINED",
|
|
type=str,
|
|
help="Combined input file.",
|
|
)
|
|
split8.add_argument(
|
|
"upper",
|
|
metavar="UPPER",
|
|
type=str,
|
|
help="Upper half output rom file.",
|
|
)
|
|
split8.add_argument(
|
|
"lower",
|
|
metavar="LOWER",
|
|
type=str,
|
|
help="Lower half output rom file.",
|
|
)
|
|
|
|
split16 = subparsers.add_parser(
|
|
"split16",
|
|
help="Split one 32bit rom to two 16bit roms.",
|
|
)
|
|
split16.add_argument(
|
|
"combined",
|
|
metavar="COMBINED",
|
|
type=str,
|
|
help="Combined input file.",
|
|
)
|
|
split16.add_argument(
|
|
"upper",
|
|
metavar="UPPER",
|
|
type=str,
|
|
help="Upper half output rom file.",
|
|
)
|
|
split16.add_argument(
|
|
"lower",
|
|
metavar="LOWER",
|
|
type=str,
|
|
help="Lower half output rom file.",
|
|
)
|
|
|
|
args = parser.parse_args()
|
|
if args.action == "combine8":
|
|
with open(args.upper, "rb") as fp:
|
|
upper = fp.read()
|
|
with open(args.lower, "rb") as fp:
|
|
lower = fp.read()
|
|
with open(args.combined, "wb") as fp:
|
|
fp.write(ByteUtil.combine8bithalves(upper, lower))
|
|
elif args.action == "combine16":
|
|
with open(args.upper, "rb") as fp:
|
|
upper = fp.read()
|
|
with open(args.lower, "rb") as fp:
|
|
lower = fp.read()
|
|
with open(args.combined, "wb") as fp:
|
|
fp.write(ByteUtil.combine16bithalves(upper, lower))
|
|
elif args.action == "split8":
|
|
with open(args.combined, "rb") as fp:
|
|
combined = fp.read()
|
|
upper, lower = ByteUtil.split8bithalves(combined)
|
|
with open(args.lower, "wb") as fp:
|
|
fp.write(lower)
|
|
with open(args.upper, "wb") as fp:
|
|
fp.write(upper)
|
|
elif args.action == "split16":
|
|
with open(args.combined, "rb") as fp:
|
|
combined = fp.read()
|
|
upper, lower = ByteUtil.split16bithalves(combined)
|
|
with open(args.lower, "wb") as fp:
|
|
fp.write(lower)
|
|
with open(args.upper, "wb") as fp:
|
|
fp.write(upper)
|
|
elif args.action == "byteswap":
|
|
with open(args.old, "rb") as fp:
|
|
old = fp.read()
|
|
with open(args.new, "wb") as fp:
|
|
fp.write(ByteUtil.byteswap(old))
|
|
elif args.action == "wordswap":
|
|
with open(args.old, "rb") as fp:
|
|
old = fp.read()
|
|
with open(args.new, "wb") as fp:
|
|
fp.write(ByteUtil.wordswap(old))
|
|
else:
|
|
print(f"Please specify a valid command!{os.linesep}", file=sys.stderr)
|
|
parser.print_help()
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|
|
|