From 5b96d21e337a3131c9c2a31cf4ae49a932d6a747 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Mon, 24 Nov 2025 19:08:53 -0500 Subject: [PATCH] Clean up matDL_dis.py Apparently doing (u8) vs &0xFF can affect regalloc in sinit functions, at least in TP. --- tools/converters/binary_funcs.py | 61 ++++++++++++++++++++++++++++++++ tools/converters/matDL_dis.py | 25 ++++--------- 2 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 tools/converters/binary_funcs.py diff --git a/tools/converters/binary_funcs.py b/tools/converters/binary_funcs.py new file mode 100644 index 000000000..fb5f9943e --- /dev/null +++ b/tools/converters/binary_funcs.py @@ -0,0 +1,61 @@ +import os +import struct +from typing import BinaryIO + +def skip_bytes(binary_file:BinaryIO, byte_count:int) -> None: + binary_file.seek(byte_count, os.SEEK_CUR) + +def read_s8(binary_file: BinaryIO)-> int: + chunk = binary_file.read(1) + if len(chunk) < 1: + raise EOFError() + return struct.unpack(">b", chunk)[0] + +def read_s16(binary_file: BinaryIO) -> int: + chunk = binary_file.read(2) + if len(chunk) < 2: + raise EOFError() + return struct.unpack(">h", chunk)[0] + +def read_s32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">i", chunk)[0] + +def read_u8(binary_file: BinaryIO) -> int: + chunk = binary_file.read(1) + if len(chunk) < 1: + raise EOFError() + return struct.unpack(">B", chunk)[0] + +def read_u16(binary_file: BinaryIO) -> int: + chunk = binary_file.read(2) + if len(chunk) < 2: + raise EOFError() + return struct.unpack(">H", chunk)[0] + +def read_u32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">I", chunk)[0] + +def read_f32(binary_file: BinaryIO) -> int: + chunk = binary_file.read(4) + if len(chunk) < 4: + raise EOFError() + return struct.unpack(">f", chunk)[0] + +def read_bytes_until_null(binary_file: BinaryIO) -> bytes: + begin = binary_file.tell() + while True: + b = binary_file.read(1) + if len(b) == 0: + raise EOFError() + if b[0] == 0: + break + + str_length = binary_file.tell() - begin - 1 + binary_file.seek(begin) + return binary_file.read(str_length) diff --git a/tools/converters/matDL_dis.py b/tools/converters/matDL_dis.py index 56ed3f3f4..2b9fb460c 100755 --- a/tools/converters/matDL_dis.py +++ b/tools/converters/matDL_dis.py @@ -4,6 +4,7 @@ from argparse import ArgumentParser import struct import os from enum import Enum +from binary_funcs import read_u16, read_u8 class GXBPRegs(Enum): @@ -311,27 +312,14 @@ class GXCPRegs(Enum): GX_CP_REG_ARRAYSTRIDE = 0xB0 -def read_u8(binary_file): - chunk = binary_file.read(1) - if len(chunk) < 1: - return None - return struct.unpack(">B", chunk)[0] - -def read_u16(binary_file): - chunk = binary_file.read(2) - if len(chunk) < 1: - return None - return struct.unpack(">H", chunk)[0] - - def convert_binary_to_matDL_c_source(src_path, dest_path, symbol_name, scope): # Load data macro_name = os.path.splitext(os.path.basename(src_path))[0] with open(src_path, "rb") as binary_file, open(dest_path, "w") as c_file: c_file.write("#ifndef LOAD_BP_REG\n") - c_file.write("#define U32_AS_U8(v) ((u8)((v) >> 24)), ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") - c_file.write("#define U24_AS_U8(v) ((u8)((v) >> 16)), ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") - c_file.write("#define U16_AS_U8(v) ((u8)((v) >> 8)), ((u8)((v) >> 0))\n") + c_file.write("#define U32_AS_U8(v) (((v) >> 24) & 0xFF), (((v) >> 16) & 0xFF), (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") + c_file.write("#define U24_AS_U8(v) (((v) >> 16) & 0xFF), (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") + c_file.write("#define U16_AS_U8(v) (((v) >> 8) & 0xFF), (((v) >> 0) & 0xFF)\n") c_file.write("#define IMAGE_ADDR(addr) (u32)(addr) >> 5\n") c_file.write("#define LOAD_BP_REG(reg, value) GX_CMD_LOAD_BP_REG, reg, U24_AS_U8(value)\n") c_file.write("#define LOAD_XF_REG(reg, num_args, ...) GX_CMD_LOAD_XF_REG, U16_AS_U8(num_args-1), U16_AS_U8(reg), __VA_ARGS__\n") @@ -351,8 +339,9 @@ def convert_binary_to_matDL_c_source(src_path, dest_path, symbol_name, scope): write_macro_line(f"{var_def_prefix}u8 {symbol_name}[] ALIGN_DECL(32) = {{") while True: - command_type = read_u8(binary_file) - if command_type is None: + try: + command_type = read_u8(binary_file) + except EOFError: break line_elements = []