def RealRepoint(rom: _io.BufferedReader, offsetTuples: [(int, int, str)]): pointerList = [] pointerDict = {} for tup in offsetTuples: # Format is (Double Pointer, New Pointer, Symbol) offset = tup[0] rom.seek(offset) pointer = ExtractPointer(rom.read(4)) pointerList.append(pointer) pointerDict[pointer] = (tup[1] + 0x08000000, tup[2]) offset = 0 offsetList = [] while offset < 0xFFFFFD: if offset in IGNORED_OFFSETS: offset += 4 continue rom.seek(offset) word = ExtractPointer(rom.read(4)) rom.seek(offset) for pointer in pointerList: if word == pointer: offsetList.append((offset, pointerDict[pointer][1])) rom.write(bytes(pointerDict[pointer][0].to_bytes(4, 'little'))) break offset += 4 return offsetList
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 ReplaceBytes(rom: _io.BufferedReader, offset: int, data: str): ar = offset words = data.split() for i in range(0, len(words)): rom.seek(ar) intByte = int(words[i], 16) rom.write(bytes(intByte.to_bytes(1, 'big'))) ar += 1
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))
def extract_file_bitstream(self, file_object: _io.BufferedReader) -> str: """ Converts a file object into a string of 0's and 1's for easy processing down the road :param file_object: :return bitstream: """ bitstream = "" while (byte := file_object.read(1)): bitstream += "{0:08b}".format(int.from_bytes(byte, byteorder='big'))
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 _wget_stderr_parser(self, fileobj: _io.BufferedReader): """ 解析 wget 输出的生成器. """ # 头部 while True: line = fileobj.readline().strip() # type: bytes if line.startswith(b'Length: '): split = line.split() if len(split) >= 1 and split[1].isdigit(): self._total_size = int(split[1]) elif line.startswith(b'Saving to: '): break yield # 点状的进度条 # 0K .......... .......... .......... .......... .......... 0% 4.45M 14s while True: line = fileobj.readline().strip() # type: bytes if b'K' not in line: continue line_2 = line[line.index(b'K') + 2:] if b'=' in line_2[54:]: # the end break line_3 = line_2[:54] # 50 dots and 4 spaces self._downloaded_size += line_3.count(b'.') * 1024 yield # 根据最后输出修正已下载的字节数 # 上述代码根据每个点代表 1K 来粗略计算已下载的字节数, 实际文件可能并不是 # 1K 的整数倍. lines = fileobj.readlines() for line in lines: if b'saved ' in line: r = re.search(b'saved \[(\d+)/\d+\]', line) if r: actual_downloaded_size = r.group(1) if actual_downloaded_size.isdigit(): self._downloaded_size = int(actual_downloaded_size)
def _load_header_rest( stream: _io.BufferedReader) -> typing.Tuple[typing.List[str], int]: header_parts: typing.List[str] = [] offset: int = 0 while True: block: bytes = stream.read(BLOCK_SIZE) if not block: break header_parts.append(block) if END_CARD in block: break offset = offset + BLOCK_SIZE if not END_CARD in header_parts[-1]: raise NotImplementedError(f'Invalid FITS file') return header_parts, offset
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