def Hook(rom: _io.BufferedReader, space: int, hookAt: int, register=0): # Align 2 if hookAt & 1: hookAt -= 1 rom.seek(hookAt) register &= 7 if hookAt % 4: data = bytes([0x01, 0x48 | register, 0x00 | (register << 3), 0x47, 0x0, 0x0]) else: data = bytes([0x00, 0x48 | register, 0x00 | (register << 3), 0x47]) space += 0x08000001 data += (space.to_bytes(4, 'little')) rom.write(bytes(data))
def RamRepoint(rom: _io.BufferedReader, offsetTuples: [(int, int)]): pointerList = [] pointerDict = {} for tup in offsetTuples: # Format is (Old Pointer, New Pointer) pointer = tup[0] pointerList.append(pointer) pointerDict[pointer] = tup[1] offset = 0 while offset < 0xFFFFFD: rom.seek(offset) word = ExtractRamPointer(rom.read(4)) rom.seek(offset) for pointer in pointerList: if word == pointer: rom.write(bytes(pointerDict[pointer].to_bytes(4, 'little'))) break offset += 4
def FunctionWrap(rom: _io.BufferedReader, space: int, hookAt: int, numParams: int, isReturning: int): # Align 2 if hookAt & 1: hookAt -= 1 rom.seek(hookAt) numParams = numParams - 1 if numParams < 4: data = bytes([ 0x10, 0xB5, 0x3, 0x4C, 0x0, 0xF0, 0x3, 0xF8, 0x10, 0xBC, (isReturning + 1), 0xBC, (isReturning << 3), 0x47, 0x20, 0x47 ]) else: k = numParams - 3 data = bytes([0x10, 0xB5, 0x82, 0xB0]) for i in range(k + 2): data += bytes([i + 2, 0x9C, i, 0x94]) data += bytes([ 0x0, 0x9C, numParams - 1, 0x94, 0x1, 0x9C, numParams, 0x94, 0x2, 0xB0, k + 8, 0x4C, 0x0, 0xF0, (k << 1) + 13, 0xF8, 0x82, 0xB0, numParams, 0x9C, 0x1, 0x94, numParams - 1, 0x9C, 0x0, 0x94 ]) for i in reversed(range(k + 2)): data += bytes([i, 0x9C, i + 2, 0x94]) data += bytes([ 0x2, 0xB0, 0x10, 0xBC, isReturning + 1, 0xBC, isReturning << 3, 0x47, 0x20, 0x47 ]) space += 0x08000001 data += (space.to_bytes(4, 'little')) rom.write(bytes(data))
def Repoint(rom: _io.BufferedReader, space: int, repointAt: int, slideFactor=0): rom.seek(repointAt) space += (0x08000000 + slideFactor) data = (space.to_bytes(4, 'little')) rom.write(bytes(data))