#!/usr/bin/env python3 import os import shutil import sys ############ #Options go here. ############ ROM_NAME = "BPRE0.gba" #The name of your rom OFFSET_TO_PUT = 0x1800000 SEARCH_FREE_SPACE = False # Set to True if you want the script to search for free space # Set to False if you don't want to search for free space as you for example update the engine ############# # Options end here. ############# ############### # Functions start here. ############### def MakeOffset0x100Aligned(offset: int) -> int: while offset % 16 != 0: offset += 1 return offset def FindOffsetToPut(rom, neededBytes: int, startOffset: int) -> int: offset = startOffset rom.seek(0, 2) maxPosition = rom.tell() numFoundBytes = 0 while numFoundBytes < neededBytes: if offset + numFoundBytes >= maxPosition: print("End of file reached. Not enough free space.") return 0 numFoundBytes += 1 rom.seek(offset + numFoundBytes) if rom.read(1) != b'\xFF': offset = MakeOffset0x100Aligned(offset + numFoundBytes) numFoundBytes = 0 return offset def ChangeFileLine(filePath: str, lineToChange: int, replacement: str): with open(filePath, 'r') as file: copy = file.read() file.seek(0x0) lineNum = 1 for line in file: if lineNum == lineToChange: copy = copy.replace(line, replacement) break lineNum += 1 with open(filePath, 'w') as file: file.write(copy) def EditLinker(offset: int): ChangeFileLine("linker.ld", 4, "\t\trom : ORIGIN = (0x08000000 + " + hex(offset) + "), LENGTH = 32M\n") def EditInsert(offset: int): ChangeFileLine("./scripts/insert.py", 10, "OFFSET_TO_PUT = " + hex(offset) + '\n') ChangeFileLine("./scripts/insert.py", 11, 'SOURCE_ROM = "' + ROM_NAME + '"\n') def BuildCode(): if shutil.which('python3') is not None: result = os.system("python3 scripts/build.py") else: result = os.system("python scripts/build.py") if result != 0: # Build wasn't sucessful sys.exit(1) def InsertCode(): if shutil.which('python3') is not None: os.system("python3 scripts/insert.py") else: os.system("python scripts/insert.py") def ClearFromTo(rom, from_: int, to_: int): rom.seek(from_) for i in range(0, to_ - from_): rom.write(b'\xFF') ############## # Functions end here. ############## def main(): try: with open(ROM_NAME, 'rb+') as rom: offset = OFFSET_TO_PUT if SEARCH_FREE_SPACE is True: offset = FindOffsetToPut(rom, 0x50000, MakeOffset0x100Aligned(offset)) EditLinker(offset) EditInsert(offset) BuildCode() InsertCode() rom.close() except FileNotFoundError: print('Error: Could not find source rom: "' + ROM_NAME + '".\n' + 'Please make sure a rom with this name exists in the root.') if __name__ == '__main__': main()