From d2dd5b052c9c1387cd0632e02d2d32fe8cb1ed78 Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Wed, 7 Aug 2024 17:20:13 -0400 Subject: [PATCH] add first_diff.py --- first_diff.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 first_diff.py diff --git a/first_diff.py b/first_diff.py new file mode 100755 index 00000000..2428dd0b --- /dev/null +++ b/first_diff.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python3 + +import argparse +from pathlib import Path + +import rabbitizer +import mapfile_parser + + +def decodeInstruction(bytesDiff: bytes, mapFile: mapfile_parser.MapFile) -> str: + word = (bytesDiff[0] << 24) | (bytesDiff[1] << 16) | (bytesDiff[2] << 8) | (bytesDiff[3] << 0) + instr = rabbitizer.Instruction(word) + immOverride = None + + if instr.isJumpWithAddress(): + # Instruction is a function call (jal) + + # Get the embedded address of the function call + symAddress = instr.getInstrIndexAsVram() + + # Search for the address in the mapfile + symInfo = mapFile.findSymbolByVramOrVrom(symAddress) + if symInfo is not None: + # Use the symbol from the mapfile instead of a raw value + immOverride = symInfo.symbol.name + + return instr.disassemble(immOverride=immOverride, extraLJust=-20) + +def firstDiffMain(): + parser = argparse.ArgumentParser(description="Find the first difference(s) between the built ROM and the base ROM.") + + parser.add_argument("-c", "--count", type=int, default=5, help="find up to this many instruction difference(s)") + parser.add_argument("-a", "--add-colons", action='store_true', help="Add colon between bytes" ) + + args = parser.parse_args() + + buildFolder = Path("build") + + BUILTROM = buildFolder / f"pokestadium.z64" + BUILTMAP = buildFolder / f"pokestadium.map" + + EXPECTEDROM = Path(f"baserom.z64") + EXPECTEDMAP = "expected" / BUILTMAP + + mapfile_parser.frontends.first_diff.doFirstDiff(BUILTMAP, EXPECTEDMAP, BUILTROM, EXPECTEDROM, args.count, mismatchSize=True, addColons=args.add_colons, bytesConverterCallback=decodeInstruction) + +if __name__ == "__main__": + firstDiffMain()