core_decoder/holly.py
2025-02-11 18:31:17 -06:00

231 lines
9.6 KiB
Python

from dataclasses import dataclass
import struct
@dataclass
class Holly:
ID: int
REVISION: int
SOFTRESET: int
STARTRENDER: int
TEST_SELECT: int
PARAM_BASE: int
REGION_BASE: int
SPAN_SORT_CFG: int
VO_BORDER_COL: int
FB_R_CTRL: int
FB_W_CTRL: int
FB_W_LINESTRIDE: int
FB_R_SOF1: int
FB_R_SOF2: int
FB_R_SIZE: int
FB_W_SOF1: int
FB_W_SOF2: int
FB_X_CLIP: int
FB_Y_CLIP: int
FPU_SHAD_SCALE: int
FPU_CULL_VAL: int
FPU_PARAM_CFG: int
HALF_OFFSET: int
FPU_PERP_VAL: int
ISP_BACKGND_D: int
ISP_BACKGND_T: int
ISP_FEED_CFG: int
SDRAM_REFRESH: int
SDRAM_ARB_CFG: int
SDRAM_CFG: int
FOG_COL_RAM: int
FOG_COL_VERT: int
FOG_DENSITY: int
FOG_CLAMP_MAX: int
FOG_CLAMP_MIN: int
SPG_TRIGGER_POS: int
SPG_HBLANK_INT: int
SPG_VBLANK_INT: int
SPG_CONTROL: int
SPG_HBLANK: int
SPG_LOAD: int
SPG_VBLANK: int
SPG_WIDTH: int
TEXT_CONTROL: int
VO_CONTROL: int
VO_STARTX: int
VO_STARTY: int
SCALER_CTL: int
PAL_RAM_CTRL: int
SPG_STATUS: int
FB_BURSTCTRL: int
FB_C_SOF: int
Y_COEFF: int
PT_ALPHA_REF: int
TA_OL_BASE: int
TA_ISP_BASE: int
TA_OL_LIMIT: int
TA_ISP_LIMIT: int
TA_NEXT_OPB: int
TA_ITP_CURRENT: int
TA_GLOB_TILE_CLIP: int
TA_ALLOC_CTRL: int
TA_LIST_INIT: int
TA_YUV_TEX_BASE: int
TA_YUV_TEX_CTRL: int
TA_YUV_TEX_CNT: int
TA_LIST_CONT: int
TA_NEXT_OPB_INIT: int
FOG_TABLE: list[int]
TA_OL_POINTERS: list[int]
PALETTE_RAM: list[int]
def __init__(self):
pass
def __repr__(self):
return (f"{self.__class__.__qualname__}(" +
",\n ".join([
f"ID={self.ID:08x}",
f"REVISION={self.REVISION:08x}",
f"SOFTRESET={self.SOFTRESET:08x}",
f"STARTRENDER={self.STARTRENDER:08x}",
f"TEST_SELECT={self.TEST_SELECT:08x}",
f"PARAM_BASE={self.PARAM_BASE:08x}",
f"REGION_BASE={self.REGION_BASE:08x}",
f"SPAN_SORT_CFG={self.SPAN_SORT_CFG:08x}",
f"VO_BORDER_COL={self.VO_BORDER_COL:08x}",
f"FB_R_CTRL={self.FB_R_CTRL:08x}",
f"FB_W_CTRL={self.FB_W_CTRL:08x}",
f"FB_W_LINESTRIDE={self.FB_W_LINESTRIDE:08x}",
f"FB_R_SOF1={self.FB_R_SOF1:08x}",
f"FB_R_SOF2={self.FB_R_SOF2:08x}",
f"FB_R_SIZE={self.FB_R_SIZE:08x}",
f"FB_W_SOF1={self.FB_W_SOF1:08x}",
f"FB_W_SOF2={self.FB_W_SOF2:08x}",
f"FB_X_CLIP={self.FB_X_CLIP:08x}",
f"FB_Y_CLIP={self.FB_Y_CLIP:08x}",
f"FPU_SHAD_SCALE={self.FPU_SHAD_SCALE:08x}",
f"FPU_CULL_VAL={self.FPU_CULL_VAL:08x}",
f"FPU_PARAM_CFG={self.FPU_PARAM_CFG:08x}",
f"HALF_OFFSET={self.HALF_OFFSET:08x}",
f"FPU_PERP_VAL={self.FPU_PERP_VAL:08x}",
f"ISP_BACKGND_D={self.ISP_BACKGND_D:08x}",
f"ISP_BACKGND_T={self.ISP_BACKGND_T:08x}",
f"ISP_FEED_CFG={self.ISP_FEED_CFG:08x}",
f"SDRAM_REFRESH={self.SDRAM_REFRESH:08x}",
f"SDRAM_ARB_CFG={self.SDRAM_ARB_CFG:08x}",
f"SDRAM_CFG={self.SDRAM_CFG:08x}",
f"FOG_COL_RAM={self.FOG_COL_RAM:08x}",
f"FOG_COL_VERT={self.FOG_COL_VERT:08x}",
f"FOG_DENSITY={self.FOG_DENSITY:08x}",
f"FOG_CLAMP_MAX={self.FOG_CLAMP_MAX:08x}",
f"FOG_CLAMP_MIN={self.FOG_CLAMP_MIN:08x}",
f"SPG_TRIGGER_POS={self.SPG_TRIGGER_POS:08x}",
f"SPG_HBLANK_INT={self.SPG_HBLANK_INT:08x}",
f"SPG_VBLANK_INT={self.SPG_VBLANK_INT:08x}",
f"SPG_CONTROL={self.SPG_CONTROL:08x}",
f"SPG_HBLANK={self.SPG_HBLANK:08x}",
f"SPG_LOAD={self.SPG_LOAD:08x}",
f"SPG_VBLANK={self.SPG_VBLANK:08x}",
f"SPG_WIDTH={self.SPG_WIDTH:08x}",
f"TEXT_CONTROL={self.TEXT_CONTROL:08x}",
f"VO_CONTROL={self.VO_CONTROL:08x}",
f"VO_STARTX={self.VO_STARTX:08x}",
f"VO_STARTY={self.VO_STARTY:08x}",
f"SCALER_CTL={self.SCALER_CTL:08x}",
f"PAL_RAM_CTRL={self.PAL_RAM_CTRL:08x}",
f"SPG_STATUS={self.SPG_STATUS:08x}",
f"FB_BURSTCTRL={self.FB_BURSTCTRL:08x}",
f"FB_C_SOF={self.FB_C_SOF:08x}",
f"Y_COEFF={self.Y_COEFF:08x}",
f"PT_ALPHA_REF={self.PT_ALPHA_REF:08x}",
f"TA_OL_BASE={self.TA_OL_BASE:08x}",
f"TA_ISP_BASE={self.TA_ISP_BASE:08x}",
f"TA_OL_LIMIT={self.TA_OL_LIMIT:08x}",
f"TA_ISP_LIMIT={self.TA_ISP_LIMIT:08x}",
f"TA_NEXT_OPB={self.TA_NEXT_OPB:08x}",
f"TA_ITP_CURRENT={self.TA_ITP_CURRENT:08x}",
f"TA_GLOB_TILE_CLIP={self.TA_GLOB_TILE_CLIP:08x}",
f"TA_ALLOC_CTRL={self.TA_ALLOC_CTRL:08x}",
f"TA_LIST_INIT={self.TA_LIST_INIT:08x}",
f"TA_YUV_TEX_BASE={self.TA_YUV_TEX_BASE:08x}",
f"TA_YUV_TEX_CTRL={self.TA_YUV_TEX_CTRL:08x}",
f"TA_YUV_TEX_CNT={self.TA_YUV_TEX_CNT:08x}",
f"TA_LIST_CONT={self.TA_LIST_CONT:08x}",
f"TA_NEXT_OPB_INIT={self.TA_NEXT_OPB_INIT:08x}",
]) +
")")
def decode_holly(buf: bytes) -> Holly:
mem = memoryview(buf)
holly = Holly()
holly.ID, = struct.unpack('<I', mem[0x0:0x4])
holly.REVISION, = struct.unpack('<I', mem[0x4:0x8])
holly.SOFTRESET, = struct.unpack('<I', mem[0x8:0xc])
holly.STARTRENDER, = struct.unpack('<I', mem[0x14:0x18])
holly.TEST_SELECT, = struct.unpack('<I', mem[0x18:0x1c])
holly.PARAM_BASE, = struct.unpack('<I', mem[0x20:0x24])
holly.REGION_BASE, = struct.unpack('<I', mem[0x2c:0x30])
holly.SPAN_SORT_CFG, = struct.unpack('<I', mem[0x30:0x34])
holly.VO_BORDER_COL, = struct.unpack('<I', mem[0x40:0x44])
holly.FB_R_CTRL, = struct.unpack('<I', mem[0x44:0x48])
holly.FB_W_CTRL, = struct.unpack('<I', mem[0x48:0x4c])
holly.FB_W_LINESTRIDE, = struct.unpack('<I', mem[0x4c:0x50])
holly.FB_R_SOF1, = struct.unpack('<I', mem[0x50:0x54])
holly.FB_R_SOF2, = struct.unpack('<I', mem[0x54:0x58])
holly.FB_R_SIZE, = struct.unpack('<I', mem[0x5c:0x60])
holly.FB_W_SOF1, = struct.unpack('<I', mem[0x60:0x64])
holly.FB_W_SOF2, = struct.unpack('<I', mem[0x64:0x68])
holly.FB_X_CLIP, = struct.unpack('<I', mem[0x68:0x6c])
holly.FB_Y_CLIP, = struct.unpack('<I', mem[0x6c:0x70])
holly.FPU_SHAD_SCALE, = struct.unpack('<I', mem[0x74:0x78])
holly.FPU_CULL_VAL, = struct.unpack('<I', mem[0x78:0x7c])
holly.FPU_PARAM_CFG, = struct.unpack('<I', mem[0x7c:0x80])
holly.HALF_OFFSET, = struct.unpack('<I', mem[0x80:0x84])
holly.FPU_PERP_VAL, = struct.unpack('<I', mem[0x84:0x88])
holly.ISP_BACKGND_D, = struct.unpack('<I', mem[0x88:0x8c])
holly.ISP_BACKGND_T, = struct.unpack('<I', mem[0x8c:0x90])
holly.ISP_FEED_CFG, = struct.unpack('<I', mem[0x98:0x9c])
holly.SDRAM_REFRESH, = struct.unpack('<I', mem[0xa0:0xa4])
holly.SDRAM_ARB_CFG, = struct.unpack('<I', mem[0xa4:0xa8])
holly.SDRAM_CFG, = struct.unpack('<I', mem[0xa8:0xac])
holly.FOG_COL_RAM, = struct.unpack('<I', mem[0xb0:0xb4])
holly.FOG_COL_VERT, = struct.unpack('<I', mem[0xb4:0xb8])
holly.FOG_DENSITY, = struct.unpack('<I', mem[0xb8:0xbc])
holly.FOG_CLAMP_MAX, = struct.unpack('<I', mem[0xbc:0xc0])
holly.FOG_CLAMP_MIN, = struct.unpack('<I', mem[0xc0:0xc4])
holly.SPG_TRIGGER_POS, = struct.unpack('<I', mem[0xc4:0xc8])
holly.SPG_HBLANK_INT, = struct.unpack('<I', mem[0xc8:0xcc])
holly.SPG_VBLANK_INT, = struct.unpack('<I', mem[0xcc:0xd0])
holly.SPG_CONTROL, = struct.unpack('<I', mem[0xd0:0xd4])
holly.SPG_HBLANK, = struct.unpack('<I', mem[0xd4:0xd8])
holly.SPG_LOAD, = struct.unpack('<I', mem[0xd8:0xdc])
holly.SPG_VBLANK, = struct.unpack('<I', mem[0xdc:0xe0])
holly.SPG_WIDTH, = struct.unpack('<I', mem[0xe0:0xe4])
holly.TEXT_CONTROL, = struct.unpack('<I', mem[0xe4:0xe8])
holly.VO_CONTROL, = struct.unpack('<I', mem[0xe8:0xec])
holly.VO_STARTX, = struct.unpack('<I', mem[0xec:0xf0])
holly.VO_STARTY, = struct.unpack('<I', mem[0xf0:0xf4])
holly.SCALER_CTL, = struct.unpack('<I', mem[0xf4:0xf8])
holly.PAL_RAM_CTRL, = struct.unpack('<I', mem[0x108:0x10c])
holly.SPG_STATUS, = struct.unpack('<I', mem[0x10c:0x110])
holly.FB_BURSTCTRL, = struct.unpack('<I', mem[0x110:0x114])
holly.FB_C_SOF, = struct.unpack('<I', mem[0x114:0x118])
holly.Y_COEFF, = struct.unpack('<I', mem[0x118:0x11c])
holly.PT_ALPHA_REF, = struct.unpack('<I', mem[0x11c:0x120])
holly.TA_OL_BASE, = struct.unpack('<I', mem[0x124:0x128])
holly.TA_ISP_BASE, = struct.unpack('<I', mem[0x128:0x12c])
holly.TA_OL_LIMIT, = struct.unpack('<I', mem[0x12c:0x130])
holly.TA_ISP_LIMIT, = struct.unpack('<I', mem[0x130:0x134])
holly.TA_NEXT_OPB, = struct.unpack('<I', mem[0x134:0x138])
holly.TA_ITP_CURRENT, = struct.unpack('<I', mem[0x138:0x13c])
holly.TA_GLOB_TILE_CLIP, = struct.unpack('<I', mem[0x13c:0x140])
holly.TA_ALLOC_CTRL, = struct.unpack('<I', mem[0x140:0x144])
holly.TA_LIST_INIT, = struct.unpack('<I', mem[0x144:0x148])
holly.TA_YUV_TEX_BASE, = struct.unpack('<I', mem[0x148:0x14c])
holly.TA_YUV_TEX_CTRL, = struct.unpack('<I', mem[0x14c:0x150])
holly.TA_YUV_TEX_CNT, = struct.unpack('<I', mem[0x150:0x154])
holly.TA_LIST_CONT, = struct.unpack('<I', mem[0x160:0x164])
holly.TA_NEXT_OPB_INIT, = struct.unpack('<I', mem[0x164:0x168])
holly.FOG_TABLE = struct.unpack('<' + ('I' * 128), mem[0x200:0x400])
holly.TA_OL_POINTERS = struct.unpack('<' + ('I' * 600), mem[0x600:0xf60])
holly.PALETTE_RAM = struct.unpack('<' + ('I' * 1024), mem[0x1000:0x2000])
return holly