Clean up matDL_dis.py

Apparently doing (u8) vs &0xFF can affect regalloc in sinit functions, at least in TP.
This commit is contained in:
LagoLunatic
2025-11-24 19:08:53 -05:00
parent 3393a348e1
commit 5b96d21e33
2 changed files with 68 additions and 18 deletions
+61
View File
@@ -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)
+7 -18
View File
@@ -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 = []