diff --git a/.clang-format b/.clang-format new file mode 100644 index 00000000..f1e35120 --- /dev/null +++ b/.clang-format @@ -0,0 +1,4 @@ +BasedOnStyle: WebKit +IndentWidth: 4 +ColumnLimit: 120 +PointerAlignment: Right diff --git a/ctx_asd.c b/ctx_asd.c new file mode 100644 index 00000000..37df112c --- /dev/null +++ b/ctx_asd.c @@ -0,0 +1,6525 @@ +#define ATTRIBUTE_ALIGN(num) __attribute__((aligned(num))) +typedef signed char s8; +typedef signed short int s16; +typedef signed long s32; +typedef signed long long int s64; +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned long u32; +typedef unsigned long long int u64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; + +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef double f64; + +typedef volatile f32 vf32; +typedef volatile f64 vf64; +typedef int BOOL; +#define FALSE 0 +#define TRUE 1 + +#define NULL ((void *)0) +#define nullptr NULL + +#define CTR 9 +#define XER 1 +#define LR 8 + +#define UPMC1 937 +#define UPMC2 938 +#define UPMC3 941 +#define UPMC4 942 + +#define USIA 939 + +#define UMMCR0 936 +#define UMMCR1 940 + +#define HID0 1008 +#define HID1 1009 + +#define PVR 287 + +#define IBAT0U 528 +#define IBAT0L 529 +#define IBAT1U 530 +#define IBAT1L 531 +#define IBAT2U 532 +#define IBAT2L 533 +#define IBAT3U 534 +#define IBAT3L 535 + +#define DBAT0U 536 +#define DBAT0L 537 +#define DBAT1U 538 +#define DBAT1L 539 +#define DBAT2U 540 +#define DBAT2L 541 +#define DBAT3U 542 +#define DBAT3L 543 + +#define SDR1 25 + +#define SPRG0 272 +#define SPRG1 273 +#define SPRG2 274 +#define SPRG3 275 + +#define DAR 19 +#define DSISR 18 + +#define SRR0 26 +#define SRR1 27 + +#define EAR 282 + +#define DABR 1013 + +#define TBL 284 +#define TBU 285 + +#define L2CR 1017 + +#define DEC 22 + +#define IABR 1010 + +#define PMC1 953 +#define PMC2 954 +#define PMC3 957 +#define PMC4 958 + +#define SIA 955 + +#define MMCR0 952 +#define MMCR1 956 + +#define THRM1 1020 +#define THRM2 1021 +#define THRM3 1022 + +#define ICTC 1019 + +#define GQR0 912 +#define GQR1 913 +#define GQR2 914 +#define GQR3 915 +#define GQR4 916 +#define GQR5 917 +#define GQR6 918 +#define GQR7 919 + +#define HID2 920 + +#define WPAR 921 + +#define DMA_U 922 +#define DMA_L 923 + +#define MSR_POW 0x00040000 // Power Management +#define MSR_ILE 0x00010000 // Interrupt Little Endian +#define MSR_EE 0x00008000 // external interrupt +#define MSR_PR 0x00004000 // privilege level(should be 0) +#define MSR_FP 0x00002000 // floating point available +#define MSR_ME 0x00001000 // machine check enable +#define MSR_FE0 0x00000800 // floating point exception enable +#define MSR_SE 0x00000400 // single step trace enable +#define MSR_BE 0x00000200 // branch trace enable +#define MSR_FE1 0x00000100 // floating point exception enable +#define MSR_IP 0x00000040 // Exception prefix +#define MSR_IR 0x00000020 // instruction relocate +#define MSR_DR 0x00000010 // data relocate +#define MSR_PM 0x00000004 // Performance monitor marked mode +#define MSR_RI 0x00000002 // Recoverable interrupt +#define MSR_LE 0x00000001 // Little Endian + +#define MSR_POW_BIT 13 // Power Management +#define MSR_ILE_BIT 15 // Interrupt Little Endian +#define MSR_EE_BIT 16 // external interrupt +#define MSR_PR_BIT 17 // privilege level (should be 0) +#define MSR_FP_BIT 18 // floating point available +#define MSR_ME_BIT 19 // machine check enable +#define MSR_FE0_BIT 20 // floating point exception enable +#define MSR_SE_BIT 21 // single step trace enable +#define MSR_BE_BIT 22 // branch trace enable +#define MSR_FE1_BIT 23 // floating point exception enable +#define MSR_IP_BIT 25 // Exception prefix +#define MSR_IR_BIT 26 // instruction relocate +#define MSR_DR_BIT 27 // data relocate +#define MSR_PM_BIT 29 // Performance monitor marked mode +#define MSR_RI_BIT 30 // Recoverable interrupt +#define MSR_LE_BIT 31 // Little Endian + +/*---------------------------------------------------------------------------* + HID0 bits + *---------------------------------------------------------------------------*/ +#define HID0_EMCP 0x80000000 // Enable MCP +#define HID0_DBP 0x40000000 // Enable 60x bus address and data parity chk +#define HID0_EBA 0x20000000 // Enable 60x address parity checking +#define HID0_EBD 0x10000000 // Enable 60x data parity checking +#define HID0_BCLK 0x08000000 // CLK_OUT output enable and clk selection +#define HID0_ECLK 0x02000000 // CLK_OUT output enable and clk selection +#define HID0_PAR 0x01000000 // Disable !ARTRY precharge +#define HID0_DOZE 0x00800000 // Doze mode enable +#define HID0_NAP 0x00400000 // Nap mode enable +#define HID0_SLEEP 0x00200000 // Sleep mode enable +#define HID0_DPM 0x00100000 // Dynamic power management enable +#define HID0_NHR 0x00010000 // Not hard reset (0 hard reset if s/w set it) +#define HID0_ICE 0x00008000 // Instruction cache enable +#define HID0_DCE 0x00004000 // Data cache enable +#define HID0_ILOCK 0x00002000 // ICache lock +#define HID0_DLOCK 0x00001000 // DCache lock +#define HID0_ICFI 0x00000800 // ICache flash invalidate +#define HID0_DCFI 0x00000400 // DCache flash invalidate +#define HID0_SPD 0x00000200 // Speculative cache access enable (0 enable) +#define HID0_IFEM 0x00000100 // Enable M bit on bus for Ifetch +#define HID0_SGE 0x00000080 // Store gathering enable +#define HID0_DCFA 0x00000040 // DCache flush assist - set before a flush +#define HID0_BTIC 0x00000020 // Branch target icache enable +#define HID0_ABE 0x00000008 // Address bcast enable +#define HID0_BHT 0x00000004 // Branch history table enable +#define HID0_NOOPTI 0x00000001 // No-op Dcache touch instructions + +#define HID0_ICE_BIT 16 // Instruction cache enable +#define HID0_DCE_BIT 17 // Data cache enable +#define HID0_ILOCK_BIT 18 // ICache lock +#define HID0_DLOCK_BIT 19 // DCache lock + +#define HID2_LSQE 0x80000000 // L/S quantize enable +#define HID2_WPE 0x40000000 // Write pipe enable +#define HID2_PSE 0x20000000 // Paired single enable +#define HID2_LCE 0x10000000 // Locked cache enable + +#define HID2_DCHERR 0x00800000 // ERROR: dcbz_l cache hit +#define HID2_DNCERR 0x00400000 // ERROR: DMA access to normal cache +#define HID2_DCMERR 0x00200000 // ERROR: DMA cache miss error +#define HID2_DQOERR 0x00100000 // ERROR: DMA queue overflow +#define HID2_DCHEE 0x00080000 // dcbz_l cache hit error enable +#define HID2_DNCEE 0x00040000 // DMA access to normal cache error enable +#define HID2_DCMEE 0x00020000 // DMA cache miss error error enable +#define HID2_DQOEE 0x00010000 // DMA queue overflow error enable + +#define HID2_DMAQL_MASK 0x0F000000 // DMA queue length mask +#define HID2_DMAQL_SHIFT 24 // DMA queue shift + +#define HID2_LSQE_BIT 0 +#define HID2_WPE_BIT 1 +#define HID2_PSE_BIT 2 +#define HID2_LCE_BIT 3 + +#define HID2_DCHERR_BIT 8 +#define HID2_DNCERR_BIT 9 +#define HID2_DCMERR_BIT 10 +#define HID2_DQOERR_BIT 11 +#define HID2_DCHEE_BIT 12 +#define HID2_DNCEE_BIT 13 +#define HID2_DCMEE_BIT 14 +#define HID2_DQOEE_BIT 15 + +#define GQR_LOAD_SCALE_MASK 0x3F000000 // load scale field +#define GQR_LOAD_TYPE_MASK 0x00070000 // load type field +#define GQR_STORE_SCALE_MASK 0x00003F00 // store scale field +#define GQR_STORE_TYPE_MASK 0x00000007 // store type field + +typedef struct +{ + u32 _pad0 :2; + u32 loadScale :6; + u32 _pad1 :5; + u32 loadType :3; + u32 _pad2 :2; + u32 storeScale :6; + u32 _pad3 :5; + u32 storeType :3; +} PPC_GQR_t; + +typedef union +{ + u32 val; + PPC_GQR_t f; +} PPC_GQR_u; + + +#define DMA_U_ADDR_MASK 0xFFFFFFE0 // Start addr in memory +#define DMA_U_LEN_U_MASK 0x0000001F // lines to transfer (U) + +#define DMA_L_LC_ADDR_MASK 0xFFFFFFE0 // Start addr in LC +#define DMA_L_LOAD 0x00000010 // 0 - store, 1 - load +#define DMA_L_STORE 0x00000000 // 0 - store, 1 - load +#define DMA_L_LEN_MASK 0x0000000C // lines to transfer (L) +#define DMA_L_TRIGGER 0x00000002 // 0 - cmd inactive, 1 - cmd rdy +#define DMA_L_FLUSH 0x00000001 // 1 - Flush DMA queue + +typedef struct +{ + u32 memAddr :27; + u32 dmaLenU :5; +} PPC_DMA_U_t; + +typedef union +{ + u32 val; + PPC_DMA_U_t f; +} PPC_DMA_U_u; + + +typedef struct +{ + u32 lcAddr :27; + u32 dmaLd :1; + u32 dmaLenL :2; + u32 dmaTrigger :1; + u32 dmaFlush :1; +} PPC_DMA_L_t; + + +typedef union +{ + u32 val; + PPC_DMA_L_t f; +} PPC_DMA_L_u; + + +#define WPAR_ADDR 0xFFFFFFE0 // 32byte gather address +#define WPAR_BNE 0x00000001 // Buffer not empty (R) + +#define SRR1_DMA_BIT 0x00200000 +#define SRR1_L2DP_BIT 0x00100000 + +#define L2CR_L2E 0x80000000 // L2 Enable +#define L2CR_L2PE 0x40000000 // L2 data parity generation and checking enable + +#define L2CR_L2SIZ_256K 0x10000000 // L2 size 256K +#define L2CR_L2SIZ_512K 0x20000000 // L2 size 512 +#define L2CR_L2SIZ_1M 0x30000000 // L2 size 1M + +#define L2CR_L2CLK_1_0 0x02000000 // L2 clock ratio 1 +#define L2CR_L2CLK_1_5 0x04000000 // L2 clock ratio 1.5 +#define L2CR_L2CLK_2_0 0x08000000 // L2 clock ratio 2 +#define L2CR_L2CLK_2_5 0x0A000000 // L2 clock ratio 2.5 +#define L2CR_L2CLK_3_0 0x0C000000 // L2 clock ratio 3 + +#define L2CR_RAM_FLOW_THRU_BURST 0x00000000 // L2 RAM type flow-through sync. burst SRAM +#define L2CR_RAM_PIPELINE_BURST 0x01000000 // L2 RAM type pipelined sync. burst SRAM +#define L2CR_RAM_PIPELINE_LATE 0x01800000 // L2 RAM type pipelined sync. late-write SRAM + +#define L2CR_L2DO 0x00400000 // Data only +#define L2CR_L2I 0x00200000 // Global invalidate +#define L2CR_L2CTL 0x00100000 // ZZ enable +#define L2CR_L2WT 0x00080000 // L2 write through +#define L2CR_L2TS 0x00040000 // L2 test support + +#define L2CR_L2OH_0_5 0x00000000 // L2 output hold 0.5 ns +#define L2CR_L2OH_1_0 0x00010000 // L2 output hold 1.0 ns + +#define L2CR_L2SL 0x00008000 // L2 DLL slow +#define L2CR_L2DF 0x00004000 // L2 differential clock +#define L2CR_L2BYP 0x00002000 // L2 DLL bypass +#define L2CR_L2CS 0x00000200 // L2 clock stop +#define L2CR_L2DRO 0x00000100 // L2 DLL rollover checkstop enable +#define L2CR_L2CTR_MASK 0x000000FE // L2 counter value mask +#define L2CR_L2IP 0x00000001 // L2 global invalidate in progress + +#define MMCR0_DIS 0x80000000 // Disables counting unconditionally +#define MMCR0_DP 0x40000000 // Disables counting while in supervisor mode +#define MMCR0_DU 0x20000000 // Disables counting while in user mode +#define MMCR0_DMS 0x10000000 // Disables counting while MSR[PM] is set +#define MMCR0_DMR 0x08000000 // Disables counting while MSR[PM] is zero +#define MMCR0_ENINT 0x04000000 // Enables performance monitor interrupt signaling +#define MMCR0_DISCOUNT 0x02000000 // Disables counting of PMCn when a performance monitor interrupt is signaled or... +#define MMCR0_RTCSELECT_MASK 0x01800000 // 64-bit time base, bit selection enable +#define MMCR0_RTCSELECT_63 0x00000000 // Pick bit 63 to count +#define MMCR0_RTCSELECT_55 0x00800000 // Pick bit 55 to count +#define MMCR0_RTCSELECT_51 0x01000000 // Pick bit 51 to count +#define MMCR0_RTCSELECT_47 0x01800000 // Pick bit 47 to count +#define MMCR0_INTONBITTRANS 0x00400000 // Causes interrupt signaling on bit transition from off to on +#define MMCR0_THRESHOLD_MASK 0x003F0000 // Threshold value +#define MMCR0_THRESHOLD(n) ((n) << 16) // Threshold value (0 - 63) +#define MMCR0_PMC1INTCONTROL 0x00008000 // Enables interrupt signaling due to PMC1 counter overflow +#define MMCR0_PMC2INTCONTROL 0x00004000 // Enables interrupt signaling due to PMC2-PMC4 counter overflow +#define MMCR0_PMCTRIGGER 0x00002000 // Can be used to trigger counting of PMC2-PMC4 after PMC1 has overflowed or... +#define MMCR0_PMC1SELECT_MASK 0x00001FC0 // PMC1 input selector +#define MMCR0_PMC2SELECT_MASK 0x0000003F // PMC2 input selector + +#define MMCR1_PMC3SELECT_MASK 0xF8000000 // PMC3 input selector +#define MMCR1_PMC4SELECT_MASK 0x07C00000 // PMC4 input selector + +#define PMC1_OV 0x80000000 // Overflow +#define PMC1_COUNTER 0x7FFFFFFF // Counter value +#define PMC2_OV 0x80000000 // Overflow +#define PMC2_COUNTER 0x7FFFFFFF // Counter value +#define PMC3_OV 0x80000000 // Overflow +#define PMC3_COUNTER 0x7FFFFFFF // Counter value +#define PMC4_OV 0x80000000 // Overflow +#define PMC4_COUNTER 0x7FFFFFFF // Counter value + +/*---------------------------------------------------------------------------* + PMC1 Events + *---------------------------------------------------------------------------*/ +#define MMCR0_PMC1_HOLD 0x00000000 // Register holds current value +#define MMCR0_PMC1_CYCLE 0x00000040 // Processor cycles +#define MMCR0_PMC1_INSTRUCTION 0x00000080 // # of instructions completed. +#define MMCR0_PMC1_TRANSITION 0x000000C0 // # of transitions for 0 to 1 +#define MMCR0_PMC1_DISPATCHED 0x00000100 // # of instructions dispatched +#define MMCR0_PMC1_EIEIO 0x00000140 // # of eieio instructions completed +#define MMCR0_PMC1_ITLB_CYCLE 0x00000180 // # of cycles spent performing table search op. for the ITLB +#define MMCR0_PMC1_L2_HIT 0x000001C0 // # of access that hit the L2. +#define MMCR0_PMC1_EA 0x00000200 // # of valid instruction EAs delivered to the memory subsystem +#define MMCR0_PMC1_IABR 0x00000240 // # of time the address of an instruction matches the IABR +#define MMCR0_PMC1_L1_MISS 0x00000280 // # of loads that miss the L1 +#define MMCR0_PMC1_Bx_UNRESOLVED 0x000002C0 // # of branches that are unresolved when processed +#define MMCR0_PMC1_Bx_STALL_CYCLE 0x00000300 // # of cycles that dispatcher stalls due to a second + // unresolved branch in the instruction stream +#define MMCR0_PMC1_IC_FETCH_MISS 0x00000340 // # of times an instruction fetch missed the L1 Icache +#define MMCR0_PMC2_HOLD 0x00000000 // Register holds current value +#define MMCR0_PMC2_CYCLE 0x00000001 // Processor cycles +#define MMCR0_PMC2_INSTRUCTION 0x00000002 // # of instructions completed +#define MMCR0_PMC2_TRANSITION 0x00000003 // # of time-base (lower) bit transitions +#define MMCR0_PMC2_DISPATCHED 0x00000004 // # of instructions dispatched +#define MMCR0_PMC2_IC_MISS 0x00000005 // # of L1 instruction cache misses +#define MMCR0_PMC2_ITLB_MISS 0x00000006 // # of ITLB misses +#define MMCR0_PMC2_L2_I_MISS 0x00000007 // # of L2 instruction misses +#define MMCR0_PMC2_Bx_FALL_TROUGH 0x00000008 // # of fall-through branches +#define MMCR0_PMC2_PR_SWITCH 0x00000009 // # of MSR[PR] bit toggles +#define MMCR0_PMC2_RESERVED_LOAD 0x0000000A // # of reserved loads completed +#define MMCR0_PMC2_LOAD_STORE 0x0000000B // # of completed loads and stores +#define MMCR0_PMC2_SNOOP 0x0000000C // # of snoops +#define MMCR0_PMC2_L1_CASTOUT 0x0000000D // # of L1 castouts to L2 +#define MMCR0_PMC2_SYSTEM 0x0000000E // # of completed system unit instructions +#define MMCR0_PMC2_IC_FETCH_MISS 0x0000000F // # of instruction fetch misses in the L1 +#define MMCR0_PMC2_Bx_OUT_OF_ORDER 0x00000010 // # of branches allowing out-of-order execution + +/*---------------------------------------------------------------------------* + PMC3 Events + *---------------------------------------------------------------------------*/ +#define MMCR1_PMC3_HOLD 0x00000000 // Register holds current value +#define MMCR1_PMC3_CYCLE 0x08000000 // Processor cycles +#define MMCR1_PMC3_INSTRUCTION 0x10000000 // # of instructions completed +#define MMCR1_PMC3_TRANSITION 0x18000000 // # of time-base (lower) bit transitions +#define MMCR1_PMC3_DISPATCHED 0x20000000 // # of instructions dispatched +#define MMCR1_PMC3_DC_MISS 0x28000000 // # of L1 data cache misses +#define MMCR1_PMC3_DTLB_MISS 0x30000000 // # of DTLB misses +#define MMCR1_PMC3_L2_D_MISS 0x38000000 // # of L2 data misses +#define MMCR1_PMC3_Bx_TAKEN 0x40000000 // # predicted branches that were taken +#define MMCR1_PMC3_PM_SWITCH 0x48000000 // # of transitions between marked and unmarked processes +#define MMCR1_PMC3_COND_STORE 0x50000000 // # of store conditional instructions completed +#define MMCR1_PMC3_FPU 0x58000000 // # of instructions completed from the FPU +#define MMCR1_PMC3_L2_SNOOP_CASTOUT 0x60000000 // # of L2 castout caused by snoops to modified lines +#define MMCR1_PMC3_L2_HIT 0x68000000 // # of cache operations that hit in the L2 cache +#define MMCR1_PMC3_L1_MISS_CYCLE 0x78000000 // # of cycles generated by L1 load misses +#define MMCR1_PMC3_Bx_SECOND 0x80000000 // # of branches in the second speculative branch + // resolved correctly +#define MMCR1_PMC3_BPU_LR_CR 0x88000000 // # of cycles the BPU stalls due to LR or CR unresolved + // dependencies + +#define MMCR1_PMC4_HOLD 0x00000000 // Register holds current value +#define MMCR1_PMC4_CYCLE 0x00400000 // Processor cycles +#define MMCR1_PMC4_INSTRUCTION 0x00800000 // # of instructions completed +#define MMCR1_PMC4_TRANSITION 0x00C00000 // # of time-base (lower) bit transitions +#define MMCR1_PMC4_DISPATCHED 0x01000000 // # of instructions dispatched +#define MMCR1_PMC4_L2_CASTOUT 0x01400000 // # of L2 castouts +#define MMCR1_PMC4_DTLB_CYCLE 0x01800000 // # of cycles spent performing table searches for DTLB accesses +#define MMCR1_PMC4_Bx_MISSED 0x02000000 // # of mispredicted branches +#define MMCR1_PMC4_COND_STORE_INT 0x02800000 // # of store conditional instructions completed + // with reservation intact +#define MMCR1_PMC4_SYNC 0x02C00000 // # of completed sync instructions +#define MMCR1_PMC4_SNOOP_RETRY 0x03000000 // # of snoop request retries +#define MMCR1_PMC4_INTEGER 0x03400000 // # of completed integer operations +#define MMCR1_PMC4_BPU_THIRD 0x03800000 // # of cycles the BPU cannot process new branches + // due to having two unresolved branches +#define MMCR1_PMC4_DC_MISS 0x07C00000 // # of L1 data cache misses + +/*---------------------------------------------------------------------------* + FPSCR bits + *---------------------------------------------------------------------------*/ +#define FPSCR_FX 0x80000000 // Exception summary +#define FPSCR_FEX 0x40000000 // Enabled exception summary +#define FPSCR_VX 0x20000000 // Invalid operation +#define FPSCR_OX 0x10000000 // Overflow exception +#define FPSCR_UX 0x08000000 // Underflow exception +#define FPSCR_ZX 0x04000000 // Zero divide exception +#define FPSCR_XX 0x02000000 // Inexact exception +#define FPSCR_VXSNAN 0x01000000 // SNaN +#define FPSCR_VXISI 0x00800000 // Infinity - Infinity +#define FPSCR_VXIDI 0x00400000 // Infinity / Infinity +#define FPSCR_VXZDZ 0x00200000 // 0 / 0 +#define FPSCR_VXIMZ 0x00100000 // Infinity * 0 +#define FPSCR_VXVC 0x00080000 // Invalid compare +#define FPSCR_FR 0x00040000 // Fraction rounded +#define FPSCR_FI 0x00020000 // Fraction inexact +#define FPSCR_VXSOFT 0x00000400 // Software request +#define FPSCR_VXSQRT 0x00000200 // Invalid square root +#define FPSCR_VXCVI 0x00000100 // Invalid integer convert +#define FPSCR_VE 0x00000080 // Invalid operation exception enable +#define FPSCR_OE 0x00000040 // Overflow exception enable +#define FPSCR_UE 0x00000020 // Underflow exception enable +#define FPSCR_ZE 0x00000010 // Zero divide exception enable +#define FPSCR_XE 0x00000008 // Inexact exception enable +#define FPSCR_NI 0x00000004 // Non-IEEE mode + +#define FPSCR_FX_BIT 0 // Exception summary +#define FPSCR_FEX_BIT 1 // Enabled exception summary +#define FPSCR_VX_BIT 2 // Invalid operation +#define FPSCR_OX_BIT 3 // Overflow exception +#define FPSCR_UX_BIT 4 // Underflow exception +#define FPSCR_ZX_BIT 5 // Zero divide exception +#define FPSCR_XX_BIT 6 // Inexact exception +#define FPSCR_VXSNAN_BIT 7 // SNaN +#define FPSCR_VXISI_BIT 8 // Infinity - Infinity +#define FPSCR_VXIDI_BIT 9 // Infinity / Infinity +#define FPSCR_VXZDZ_BIT 10 // 0 / 0 +#define FPSCR_VXIMZ_BIT 11 // Infinity * 0 +#define FPSCR_VXVC_BIT 12 // Invalid compare +#define FPSCR_FR_BIT 13 // Fraction rounded +#define FPSCR_FI_BIT 14 // Fraction inexact +#define FPSCR_VXSOFT_BIT 21 // Software request +#define FPSCR_VXSQRT_BIT 22 // Invalid square root +#define FPSCR_VXCVI_BIT 23 // Invalid integer convert +#define FPSCR_VE_BIT 24 // Invalid operation exception enable +#define FPSCR_OE_BIT 25 // Overflow exception enable +#define FPSCR_UE_BIT 26 // Underflow exception enable +#define FPSCR_ZE_BIT 27 // Zero divide exception enable +#define FPSCR_XE_BIT 28 // Inexact exception enable +#define FPSCR_NI_BIT 29 // Non-IEEE mode + +u32 PPCMfmsr(); +void PPCMtmsr(u32 newMSR); +u32 PPCOrMsr(u32 value); +u32 PPCMfhid0(); +void PPCMthid0(u32 newHID0); +u32 PPCMfl2cr(); +void PPCMtl2cr(u32 newL2cr); +void PPCMtdec(u32 newDec); +void PPCSync(); +void PPCHalt(); +u32 PPCMffpscr(); +void PPCMtfpscr(u32 newFPSCR); +u32 PPCMfhid2(); +void PPCMthid2(u32 newhid2); +u32 PPCMfwpar(); +void PPCMtwpar(u32 newwpar); +void PPCEnableSpeculation(); +void PPCDisableSpeculation(); +void PPCSetFpIEEEMode(); +void PPCSetFpNonIEEEMode(); + +/* "include\dolphin\db.h" line 3 "types.h" */ +/* end "types.h" */ + +#define OS_DBINTERFACE_ADDR 0x00000040 + +typedef struct DBInterface +{ + u32 bPresent; + u32 exceptionMask; + void (*ExceptionDestination) ( void ); + void *exceptionReturn; +} DBInterface; + +extern DBInterface* __DBInterface; + +void DBInit(void); +void DBInitComm(int* inputFlagPtr, int* mtrCallback); +static void __DBExceptionDestination(void); +void DBPrintf(char* format, ...); + +typedef u8 GXBool; + +#define GX_FALSE ((GXBool)0) +#define GX_TRUE ((GXBool)1) + +#define GX_ENABLE ((GXBool)1) +#define GX_DISABLE ((GXBool)0) + +typedef enum _GXProjectionType { + GX_PERSPECTIVE, + GX_ORTHOGRAPHIC, +} GXProjectionType; + +typedef enum _GXCompare { + GX_NEVER, + GX_LESS, + GX_EQUAL, + GX_LEQUAL, + GX_GREATER, + GX_NEQUAL, + GX_GEQUAL, + GX_ALWAYS, +} GXCompare; + +typedef enum _GXAlphaOp { + GX_AOP_AND, + GX_AOP_OR, + GX_AOP_XOR, + GX_AOP_XNOR, + GX_MAX_ALPHAOP, +} GXAlphaOp; + +typedef enum _GXZFmt16 { + GX_ZC_LINEAR, + GX_ZC_NEAR, + GX_ZC_MID, + GX_ZC_FAR, +} GXZFmt16; + +typedef enum _GXGamma { + GX_GM_1_0, + GX_GM_1_7, + GX_GM_2_2, +} GXGamma; + +typedef enum _GXPixelFmt { + GX_PF_RGB8_Z24, + GX_PF_RGBA6_Z24, + GX_PF_RGB565_Z16, + GX_PF_Z24, + GX_PF_Y8, + GX_PF_U8, + GX_PF_V8, + GX_PF_YUV420, +} GXPixelFmt; + +typedef enum _GXPrimitive { + GX_QUADS = 0x80, + GX_TRIANGLES = 0x90, + GX_TRIANGLESTRIP = 0x98, + GX_TRIANGLEFAN = 0xA0, + GX_LINES = 0xA8, + GX_LINESTRIP = 0xB0, + GX_POINTS = 0xB8, +} GXPrimitive; + +typedef enum _GXVtxFmt { + GX_VTXFMT0, + GX_VTXFMT1, + GX_VTXFMT2, + GX_VTXFMT3, + GX_VTXFMT4, + GX_VTXFMT5, + GX_VTXFMT6, + GX_VTXFMT7, + GX_MAX_VTXFMT, +} GXVtxFmt; + +typedef enum _GXAttr { + GX_VA_PNMTXIDX, + GX_VA_TEX0MTXIDX, + GX_VA_TEX1MTXIDX, + GX_VA_TEX2MTXIDX, + GX_VA_TEX3MTXIDX, + GX_VA_TEX4MTXIDX, + GX_VA_TEX5MTXIDX, + GX_VA_TEX6MTXIDX, + GX_VA_TEX7MTXIDX, + GX_VA_POS, + GX_VA_NRM, + GX_VA_CLR0, + GX_VA_CLR1, + GX_VA_TEX0, + GX_VA_TEX1, + GX_VA_TEX2, + GX_VA_TEX3, + GX_VA_TEX4, + GX_VA_TEX5, + GX_VA_TEX6, + GX_VA_TEX7, + GX_POS_MTX_ARRAY, + GX_NRM_MTX_ARRAY, + GX_TEX_MTX_ARRAY, + GX_LIGHT_ARRAY, + GX_VA_NBT, + GX_VA_MAX_ATTR, + GX_VA_NULL = 0xFF, +} GXAttr; + +#define GX_MAX_VTXDESCLIST_SZ (GX_VA_MAX_ATTR + 1) + +typedef enum _GXAttrType { + GX_NONE, + GX_DIRECT, + GX_INDEX8, + GX_INDEX16, +} GXAttrType; + +#define _GX_TF_CTF 32 +#define _GX_TF_ZTF 16 + +typedef enum _GXTexFmt { + GX_TF_I4 = 0x0, + GX_TF_I8 = 0x1, + GX_TF_IA4 = 0x2, + GX_TF_IA8 = 0x3, + GX_TF_RGB565 = 0x4, + GX_TF_RGB5A3 = 0x5, + GX_TF_RGBA8 = 0x6, + GX_TF_CMPR = 0xE, + + GX_CTF_R4 = 0x0 , + GX_CTF_RA4 = 0x2 , + GX_CTF_RA8 = 0x3 , + GX_CTF_YUVA8 = 0x6 , + GX_CTF_A8 = 0x7 , + GX_CTF_R8 = 0x8 , + GX_CTF_G8 = 0x9 , + GX_CTF_B8 = 0xA , + GX_CTF_RG8 = 0xB , + GX_CTF_GB8 = 0xC , + + GX_TF_Z8 = 0x1 , + GX_TF_Z16 = 0x3 , + GX_TF_Z24X8 = 0x6 , + + GX_CTF_Z4 = 0x0 , + GX_CTF_Z8M = 0x9 , + GX_CTF_Z8L = 0xA , + GX_CTF_Z16L = 0xC , + + GX_TF_A8 = GX_CTF_A8, +} GXTexFmt; + +typedef enum _GXCITexFmt { + GX_TF_C4 = 0x8, + GX_TF_C8 = 0x9, + GX_TF_C14X2 = 0xa, +} GXCITexFmt; + +typedef enum _GXTexWrapMode { + GX_CLAMP, + GX_REPEAT, + GX_MIRROR, + GX_MAX_TEXWRAPMODE, +} GXTexWrapMode; + +typedef enum _GXTexFilter { + GX_NEAR, + GX_LINEAR, + GX_NEAR_MIP_NEAR, + GX_LIN_MIP_NEAR, + GX_NEAR_MIP_LIN, + GX_LIN_MIP_LIN, +} GXTexFilter; + +typedef enum _GXAnisotropy { + GX_ANISO_1, + GX_ANISO_2, + GX_ANISO_4, + GX_MAX_ANISOTROPY, +} GXAnisotropy; + +typedef enum _GXTexMapID { + GX_TEXMAP0, + GX_TEXMAP1, + GX_TEXMAP2, + GX_TEXMAP3, + GX_TEXMAP4, + GX_TEXMAP5, + GX_TEXMAP6, + GX_TEXMAP7, + GX_MAX_TEXMAP, + GX_TEXMAP_NULL = 0xFF, + GX_TEX_DISABLE = 0x100, +} GXTexMapID; + +typedef enum _GXTexCoordID { + GX_TEXCOORD0, + GX_TEXCOORD1, + GX_TEXCOORD2, + GX_TEXCOORD3, + GX_TEXCOORD4, + GX_TEXCOORD5, + GX_TEXCOORD6, + GX_TEXCOORD7, + GX_MAX_TEXCOORD, + GX_TEXCOORD_NULL = 0xFF, +} GXTexCoordID; + +typedef enum _GXTevStageID { + GX_TEVSTAGE0, + GX_TEVSTAGE1, + GX_TEVSTAGE2, + GX_TEVSTAGE3, + GX_TEVSTAGE4, + GX_TEVSTAGE5, + GX_TEVSTAGE6, + GX_TEVSTAGE7, + GX_TEVSTAGE8, + GX_TEVSTAGE9, + GX_TEVSTAGE10, + GX_TEVSTAGE11, + GX_TEVSTAGE12, + GX_TEVSTAGE13, + GX_TEVSTAGE14, + GX_TEVSTAGE15, + GX_MAX_TEVSTAGE, +} GXTevStageID; + +typedef enum _GXTevMode { + GX_MODULATE, + GX_DECAL, + GX_BLEND, + GX_REPLACE, + GX_PASSCLR, +} GXTevMode; + +typedef enum _GXTexMtxType { + GX_MTX3x4, + GX_MTX2x4, +} GXTexMtxType; + +typedef enum _GXTexGenType { + GX_TG_MTX3x4, + GX_TG_MTX2x4, + GX_TG_BUMP0, + GX_TG_BUMP1, + GX_TG_BUMP2, + GX_TG_BUMP3, + GX_TG_BUMP4, + GX_TG_BUMP5, + GX_TG_BUMP6, + GX_TG_BUMP7, + GX_TG_SRTG, +} GXTexGenType; + +typedef enum _GXPosNrmMtx { + GX_PNMTX0 = 0, + GX_PNMTX1 = 3, + GX_PNMTX2 = 6, + GX_PNMTX3 = 9, + GX_PNMTX4 = 12, + GX_PNMTX5 = 15, + GX_PNMTX6 = 18, + GX_PNMTX7 = 21, + GX_PNMTX8 = 24, + GX_PNMTX9 = 27, +} GXPosNrmMtx; + +typedef enum _GXTexMtx { + GX_TEXMTX0 = 30, + GX_TEXMTX1 = 33, + GX_TEXMTX2 = 36, + GX_TEXMTX3 = 39, + GX_TEXMTX4 = 42, + GX_TEXMTX5 = 45, + GX_TEXMTX6 = 48, + GX_TEXMTX7 = 51, + GX_TEXMTX8 = 54, + GX_TEXMTX9 = 57, + GX_IDENTITY = 60, +} GXTexMtx; + +typedef enum _GXChannelID { + GX_COLOR0, + GX_COLOR1, + GX_ALPHA0, + GX_ALPHA1, + GX_COLOR0A0, + GX_COLOR1A1, + GX_COLOR_ZERO, + GX_ALPHA_BUMP, + GX_ALPHA_BUMPN, + GX_COLOR_NULL = 0xFF, +} GXChannelID; + +typedef enum _GXTexGenSrc { + GX_TG_POS, + GX_TG_NRM, + GX_TG_BINRM, + GX_TG_TANGENT, + GX_TG_TEX0, + GX_TG_TEX1, + GX_TG_TEX2, + GX_TG_TEX3, + GX_TG_TEX4, + GX_TG_TEX5, + GX_TG_TEX6, + GX_TG_TEX7, + GX_TG_TEXCOORD0, + GX_TG_TEXCOORD1, + GX_TG_TEXCOORD2, + GX_TG_TEXCOORD3, + GX_TG_TEXCOORD4, + GX_TG_TEXCOORD5, + GX_TG_TEXCOORD6, + GX_TG_COLOR0, + GX_TG_COLOR1, + GX_MAX_TEXGENSRC, +} GXTexGenSrc; + +typedef enum _GXBlendMode { + GX_BM_NONE, + GX_BM_BLEND, + GX_BM_LOGIC, + GX_BM_SUBTRACT, + GX_MAX_BLENDMODE, +} GXBlendMode; + +typedef enum _GXBlendFactor { + GX_BL_ZERO, + GX_BL_ONE, + GX_BL_SRCCLR, + GX_BL_INVSRCCLR, + GX_BL_SRCALPHA, + GX_BL_INVSRCALPHA, + GX_BL_DSTALPHA, + GX_BL_INVDSTALPHA, + GX_BL_DSTCLR = GX_BL_SRCCLR, + GX_BL_INVDSTCLR = GX_BL_INVSRCCLR, +} GXBlendFactor; + +typedef enum _GXLogicOp { + GX_LO_CLEAR, + GX_LO_AND, + GX_LO_REVAND, + GX_LO_COPY, + GX_LO_INVAND, + GX_LO_NOOP, + GX_LO_XOR, + GX_LO_OR, + GX_LO_NOR, + GX_LO_EQUIV, + GX_LO_INV, + GX_LO_REVOR, + GX_LO_INVCOPY, + GX_LO_INVOR, + GX_LO_NAND, + GX_LO_SET, +} GXLogicOp; + +typedef enum _GXCompCnt { + GX_POS_XY = 0, + GX_POS_XYZ = 1, + GX_NRM_XYZ = 0, + GX_NRM_NBT = 1, + GX_NRM_NBT3 = 2, + GX_CLR_RGB = 0, + GX_CLR_RGBA = 1, + GX_TEX_S = 0, + GX_TEX_ST = 1, +} GXCompCnt; + +typedef enum _GXCompType { + GX_U8 = 0, + GX_S8 = 1, + GX_U16 = 2, + GX_S16 = 3, + GX_F32 = 4, + GX_RGB565 = 0, + GX_RGB8 = 1, + GX_RGBX8 = 2, + GX_RGBA4 = 3, + GX_RGBA6 = 4, + GX_RGBA8 = 5, +} GXCompType; + +typedef enum _GXPTTexMtx { + GX_PTTEXMTX0 = 64, + GX_PTTEXMTX1 = 67, + GX_PTTEXMTX2 = 70, + GX_PTTEXMTX3 = 73, + GX_PTTEXMTX4 = 76, + GX_PTTEXMTX5 = 79, + GX_PTTEXMTX6 = 82, + GX_PTTEXMTX7 = 85, + GX_PTTEXMTX8 = 88, + GX_PTTEXMTX9 = 91, + GX_PTTEXMTX10 = 94, + GX_PTTEXMTX11 = 97, + GX_PTTEXMTX12 = 100, + GX_PTTEXMTX13 = 103, + GX_PTTEXMTX14 = 106, + GX_PTTEXMTX15 = 109, + GX_PTTEXMTX16 = 112, + GX_PTTEXMTX17 = 115, + GX_PTTEXMTX18 = 118, + GX_PTTEXMTX19 = 121, + GX_PTIDENTITY = 125, +} GXPTTexMtx; + +typedef enum _GXTevRegID { + GX_TEVPREV, + GX_TEVREG0, + GX_TEVREG1, + GX_TEVREG2, + GX_MAX_TEVREG, +} GXTevRegID; + +typedef enum _GXDiffuseFn { + GX_DF_NONE, + GX_DF_SIGN, + GX_DF_CLAMP, +} GXDiffuseFn; + +typedef enum _GXColorSrc { + GX_SRC_REG, + GX_SRC_VTX, +} GXColorSrc; + +typedef enum _GXAttnFn { + GX_AF_SPEC, + GX_AF_SPOT, + GX_AF_NONE, +} GXAttnFn; + +typedef enum _GXLightID { + GX_LIGHT0 = 0x001, + GX_LIGHT1 = 0x002, + GX_LIGHT2 = 0x004, + GX_LIGHT3 = 0x008, + GX_LIGHT4 = 0x010, + GX_LIGHT5 = 0x020, + GX_LIGHT6 = 0x040, + GX_LIGHT7 = 0x080, + GX_MAX_LIGHT = 0x100, + GX_LIGHT_NULL = 0, +} GXLightID; + +typedef enum _GXTexOffset { + GX_TO_ZERO, + GX_TO_SIXTEENTH, + GX_TO_EIGHTH, + GX_TO_FOURTH, + GX_TO_HALF, + GX_TO_ONE, + GX_MAX_TEXOFFSET, +} GXTexOffset; + +typedef enum _GXSpotFn { + GX_SP_OFF, + GX_SP_FLAT, + GX_SP_COS, + GX_SP_COS2, + GX_SP_SHARP, + GX_SP_RING1, + GX_SP_RING2, +} GXSpotFn; + +typedef enum _GXDistAttnFn { + GX_DA_OFF, + GX_DA_GENTLE, + GX_DA_MEDIUM, + GX_DA_STEEP, +} GXDistAttnFn; + +typedef enum _GXCullMode { + GX_CULL_NONE, + GX_CULL_FRONT, + GX_CULL_BACK, + GX_CULL_ALL, +} GXCullMode; + +typedef enum _GXTevSwapSel { + GX_TEV_SWAP0 = 0, + GX_TEV_SWAP1, + GX_TEV_SWAP2, + GX_TEV_SWAP3, + GX_MAX_TEVSWAP, +} GXTevSwapSel; + +typedef enum _GXTevColorChan { + GX_CH_RED = 0, + GX_CH_GREEN, + GX_CH_BLUE, + GX_CH_ALPHA, +} GXTevColorChan; + +typedef enum _GXFogType { + GX_FOG_NONE = 0, + GX_FOG_PERSP_LIN = 2, + GX_FOG_PERSP_EXP = 4, + GX_FOG_PERSP_EXP2 = 5, + GX_FOG_PERSP_REVEXP = 6, + GX_FOG_PERSP_REVEXP2 = 7, + GX_FOG_ORTHO_LIN = 10, + GX_FOG_ORTHO_EXP = 12, + GX_FOG_ORTHO_EXP2 = 13, + GX_FOG_ORTHO_REVEXP = 14, + GX_FOG_ORTHO_REVEXP2 = 15, + GX_FOG_LIN = GX_FOG_PERSP_LIN, + GX_FOG_EXP = GX_FOG_PERSP_EXP, + GX_FOG_EXP2 = GX_FOG_PERSP_EXP2, + GX_FOG_REVEXP = GX_FOG_PERSP_REVEXP, + GX_FOG_REVEXP2 = GX_FOG_PERSP_REVEXP2, +} GXFogType; + +typedef enum _GXTevColorArg { + GX_CC_CPREV, + GX_CC_APREV, + GX_CC_C0, + GX_CC_A0, + GX_CC_C1, + GX_CC_A1, + GX_CC_C2, + GX_CC_A2, + GX_CC_TEXC, + GX_CC_TEXA, + GX_CC_RASC, + GX_CC_RASA, + GX_CC_ONE, + GX_CC_HALF, + GX_CC_KONST, + GX_CC_ZERO, +} GXTevColorArg; + +typedef enum _GXTevAlphaArg { + GX_CA_APREV, + GX_CA_A0, + GX_CA_A1, + GX_CA_A2, + GX_CA_TEXA, + GX_CA_RASA, + GX_CA_KONST, + GX_CA_ZERO, +} GXTevAlphaArg; + +typedef enum _GXTevOp { + GX_TEV_ADD = 0, + GX_TEV_SUB = 1, + GX_TEV_COMP_R8_GT = 8, + GX_TEV_COMP_R8_EQ = 9, + GX_TEV_COMP_GR16_GT = 10, + GX_TEV_COMP_GR16_EQ = 11, + GX_TEV_COMP_BGR24_GT = 12, + GX_TEV_COMP_BGR24_EQ = 13, + GX_TEV_COMP_RGB8_GT = 14, + GX_TEV_COMP_RGB8_EQ = 15, + GX_TEV_COMP_A8_GT = GX_TEV_COMP_RGB8_GT, + GX_TEV_COMP_A8_EQ = GX_TEV_COMP_RGB8_EQ, +} GXTevOp; + +typedef enum _GXTevBias { + GX_TB_ZERO, + GX_TB_ADDHALF, + GX_TB_SUBHALF, + GX_MAX_TEVBIAS, +} GXTevBias; + +typedef enum _GXTevScale { + GX_CS_SCALE_1, + GX_CS_SCALE_2, + GX_CS_SCALE_4, + GX_CS_DIVIDE_2, + GX_MAX_TEVSCALE, +} GXTevScale; + +typedef enum _GXTevKColorSel { + GX_TEV_KCSEL_8_8 = 0x00, + GX_TEV_KCSEL_7_8 = 0x01, + GX_TEV_KCSEL_6_8 = 0x02, + GX_TEV_KCSEL_5_8 = 0x03, + GX_TEV_KCSEL_4_8 = 0x04, + GX_TEV_KCSEL_3_8 = 0x05, + GX_TEV_KCSEL_2_8 = 0x06, + GX_TEV_KCSEL_1_8 = 0x07, + GX_TEV_KCSEL_1 = GX_TEV_KCSEL_8_8, + GX_TEV_KCSEL_3_4 = GX_TEV_KCSEL_6_8, + GX_TEV_KCSEL_1_2 = GX_TEV_KCSEL_4_8, + GX_TEV_KCSEL_1_4 = GX_TEV_KCSEL_2_8, + GX_TEV_KCSEL_K0 = 0x0C, + GX_TEV_KCSEL_K1 = 0x0D, + GX_TEV_KCSEL_K2 = 0x0E, + GX_TEV_KCSEL_K3 = 0x0F, + GX_TEV_KCSEL_K0_R = 0x10, + GX_TEV_KCSEL_K1_R = 0x11, + GX_TEV_KCSEL_K2_R = 0x12, + GX_TEV_KCSEL_K3_R = 0x13, + GX_TEV_KCSEL_K0_G = 0x14, + GX_TEV_KCSEL_K1_G = 0x15, + GX_TEV_KCSEL_K2_G = 0x16, + GX_TEV_KCSEL_K3_G = 0x17, + GX_TEV_KCSEL_K0_B = 0x18, + GX_TEV_KCSEL_K1_B = 0x19, + GX_TEV_KCSEL_K2_B = 0x1A, + GX_TEV_KCSEL_K3_B = 0x1B, + GX_TEV_KCSEL_K0_A = 0x1C, + GX_TEV_KCSEL_K1_A = 0x1D, + GX_TEV_KCSEL_K2_A = 0x1E, + GX_TEV_KCSEL_K3_A = 0x1F, +} GXTevKColorSel; + +typedef enum _GXTevKAlphaSel { + GX_TEV_KASEL_8_8 = 0x00, + GX_TEV_KASEL_7_8 = 0x01, + GX_TEV_KASEL_6_8 = 0x02, + GX_TEV_KASEL_5_8 = 0x03, + GX_TEV_KASEL_4_8 = 0x04, + GX_TEV_KASEL_3_8 = 0x05, + GX_TEV_KASEL_2_8 = 0x06, + GX_TEV_KASEL_1_8 = 0x07, + GX_TEV_KASEL_1 = GX_TEV_KASEL_8_8, + GX_TEV_KASEL_3_4 = GX_TEV_KASEL_6_8, + GX_TEV_KASEL_1_2 = GX_TEV_KASEL_4_8, + GX_TEV_KASEL_1_4 = GX_TEV_KASEL_2_8, + GX_TEV_KASEL_K0_R = 0x10, + GX_TEV_KASEL_K1_R = 0x11, + GX_TEV_KASEL_K2_R = 0x12, + GX_TEV_KASEL_K3_R = 0x13, + GX_TEV_KASEL_K0_G = 0x14, + GX_TEV_KASEL_K1_G = 0x15, + GX_TEV_KASEL_K2_G = 0x16, + GX_TEV_KASEL_K3_G = 0x17, + GX_TEV_KASEL_K0_B = 0x18, + GX_TEV_KASEL_K1_B = 0x19, + GX_TEV_KASEL_K2_B = 0x1A, + GX_TEV_KASEL_K3_B = 0x1B, + GX_TEV_KASEL_K0_A = 0x1C, + GX_TEV_KASEL_K1_A = 0x1D, + GX_TEV_KASEL_K2_A = 0x1E, + GX_TEV_KASEL_K3_A = 0x1F, +} GXTevKAlphaSel; + +typedef enum _GXTevKColorID { + GX_KCOLOR0 = 0, + GX_KCOLOR1, + GX_KCOLOR2, + GX_KCOLOR3, + GX_MAX_KCOLOR, +} GXTevKColorID; + +typedef enum _GXZTexOp { + GX_ZT_DISABLE, + GX_ZT_ADD, + GX_ZT_REPLACE, + GX_MAX_ZTEXOP, +} GXZTexOp; + +typedef enum _GXIndTexFormat { + GX_ITF_8, + GX_ITF_5, + GX_ITF_4, + GX_ITF_3, + GX_MAX_ITFORMAT, +} GXIndTexFormat; + +typedef enum _GXIndTexBiasSel { + GX_ITB_NONE, + GX_ITB_S, + GX_ITB_T, + GX_ITB_ST, + GX_ITB_U, + GX_ITB_SU, + GX_ITB_TU, + GX_ITB_STU, + GX_MAX_ITBIAS, +} GXIndTexBiasSel; + +typedef enum _GXIndTexAlphaSel { + GX_ITBA_OFF, + GX_ITBA_S, + GX_ITBA_T, + GX_ITBA_U, + GX_MAX_ITBALPHA, +} GXIndTexAlphaSel; + +typedef enum _GXIndTexMtxID { + GX_ITM_OFF, + GX_ITM_0, + GX_ITM_1, + GX_ITM_2, + GX_ITM_S0 = 5, + GX_ITM_S1, + GX_ITM_S2, + GX_ITM_T0 = 9, + GX_ITM_T1, + GX_ITM_T2, +} GXIndTexMtxID; + +typedef enum _GXIndTexWrap { + GX_ITW_OFF, + GX_ITW_256, + GX_ITW_128, + GX_ITW_64, + GX_ITW_32, + GX_ITW_16, + GX_ITW_0, + GX_MAX_ITWRAP, +} GXIndTexWrap; + +typedef enum _GXIndTexStageID { + GX_INDTEXSTAGE0, + GX_INDTEXSTAGE1, + GX_INDTEXSTAGE2, + GX_INDTEXSTAGE3, + GX_MAX_INDTEXSTAGE, +} GXIndTexStageID; + +typedef enum _GXIndTexScale { + GX_ITS_1, + GX_ITS_2, + GX_ITS_4, + GX_ITS_8, + GX_ITS_16, + GX_ITS_32, + GX_ITS_64, + GX_ITS_128, + GX_ITS_256, + GX_MAX_ITSCALE, +} GXIndTexScale; + +typedef enum _GXClipMode { + GX_CLIP_ENABLE = 0, + GX_CLIP_DISABLE = 1, +} GXClipMode; + +typedef enum _GXTlut { + GX_TLUT0 = 0, + GX_TLUT1 = 1, + GX_TLUT2 = 2, + GX_TLUT3 = 3, + GX_TLUT4 = 4, + GX_TLUT5 = 5, + GX_TLUT6 = 6, + GX_TLUT7 = 7, + GX_TLUT8 = 8, + GX_TLUT9 = 9, + GX_TLUT10 = 10, + GX_TLUT11 = 11, + GX_TLUT12 = 12, + GX_TLUT13 = 13, + GX_TLUT14 = 14, + GX_TLUT15 = 15, + GX_BIGTLUT0 = 16, + GX_BIGTLUT1 = 17, + GX_BIGTLUT2 = 18, + GX_BIGTLUT3 = 19, +} GXTlut; + +typedef enum _GXTlutFmt { + GX_TL_IA8, + GX_TL_RGB565, + GX_TL_RGB5A3, + GX_MAX_TLUTFMT, +} GXTlutFmt; + +typedef enum _GXMiscToken { + GX_MT_NULL = 0, + GX_MT_XF_FLUSH = 1, + GX_MT_DL_SAVE_CONTEXT = 2, + GX_MT_ABORT_WAIT_COPYOUT = 3, +} GXMiscToken; + +typedef enum _GXTexCacheSize { + GX_TEXCACHE_32K, + GX_TEXCACHE_128K, + GX_TEXCACHE_512K, + GX_TEXCACHE_NONE +} GXTexCacheSize; + +typedef enum _GXPerf0 { + GX_PERF0_VERTICES, + GX_PERF0_CLIP_VTX, + GX_PERF0_CLIP_CLKS, + GX_PERF0_XF_WAIT_IN, + GX_PERF0_XF_WAIT_OUT, + GX_PERF0_XF_XFRM_CLKS, + GX_PERF0_XF_LIT_CLKS, + GX_PERF0_XF_BOT_CLKS, + GX_PERF0_XF_REGLD_CLKS, + GX_PERF0_XF_REGRD_CLKS, + GX_PERF0_CLIP_RATIO, + + GX_PERF0_TRIANGLES, + GX_PERF0_TRIANGLES_CULLED, + GX_PERF0_TRIANGLES_PASSED, + GX_PERF0_TRIANGLES_SCISSORED, + GX_PERF0_TRIANGLES_0TEX, + GX_PERF0_TRIANGLES_1TEX, + GX_PERF0_TRIANGLES_2TEX, + GX_PERF0_TRIANGLES_3TEX, + GX_PERF0_TRIANGLES_4TEX, + GX_PERF0_TRIANGLES_5TEX, + GX_PERF0_TRIANGLES_6TEX, + GX_PERF0_TRIANGLES_7TEX, + GX_PERF0_TRIANGLES_8TEX, + GX_PERF0_TRIANGLES_0CLR, + GX_PERF0_TRIANGLES_1CLR, + GX_PERF0_TRIANGLES_2CLR, + + GX_PERF0_QUAD_0CVG, + GX_PERF0_QUAD_NON0CVG, + GX_PERF0_QUAD_1CVG, + GX_PERF0_QUAD_2CVG, + GX_PERF0_QUAD_3CVG, + GX_PERF0_QUAD_4CVG, + GX_PERF0_AVG_QUAD_CNT, + + GX_PERF0_CLOCKS, + GX_PERF0_NONE + +} GXPerf0; + +typedef enum _GXPerf1 { + GX_PERF1_TEXELS, + GX_PERF1_TX_IDLE, + GX_PERF1_TX_REGS, + GX_PERF1_TX_MEMSTALL, + GX_PERF1_TC_CHECK1_2, + GX_PERF1_TC_CHECK3_4, + GX_PERF1_TC_CHECK5_6, + GX_PERF1_TC_CHECK7_8, + GX_PERF1_TC_MISS, + + GX_PERF1_VC_ELEMQ_FULL, + GX_PERF1_VC_MISSQ_FULL, + GX_PERF1_VC_MEMREQ_FULL, + GX_PERF1_VC_STATUS7, + GX_PERF1_VC_MISSREP_FULL, + GX_PERF1_VC_STREAMBUF_LOW, + GX_PERF1_VC_ALL_STALLS, + GX_PERF1_VERTICES, + + GX_PERF1_FIFO_REQ, + GX_PERF1_CALL_REQ, + GX_PERF1_VC_MISS_REQ, + GX_PERF1_CP_ALL_REQ, + + GX_PERF1_CLOCKS, + GX_PERF1_NONE + +} GXPerf1; + +typedef enum _GXVCachePerf { + GX_VC_POS, + GX_VC_NRM, + GX_VC_CLR0, + GX_VC_CLR1, + GX_VC_TEX0, + GX_VC_TEX1, + GX_VC_TEX2, + GX_VC_TEX3, + GX_VC_TEX4, + GX_VC_TEX5, + GX_VC_TEX6, + GX_VC_TEX7, + GX_VC_ALL = 0xf + +} GXVCachePerf; + +typedef enum _GXFBClamp { + GX_CLAMP_NONE = 0, + GX_CLAMP_TOP = 1, + GX_CLAMP_BOTTOM = 2, +} GXFBClamp; + +typedef enum _GXCopyMode { + GX_COPY_PROGRESSIVE = 0, + GX_COPY_INTLC_EVEN = 2, + GX_COPY_INTLC_ODD = 3, +} GXCopyMode; + +typedef enum _GXAlphaReadMode { + GX_READ_00 = 0, + GX_READ_FF = 1, + GX_READ_NONE = 2, + +} _GXAlphaReadMode; + +#define VI_INTERLACE 0 +#define VI_NON_INTERLACE 1 +#define VI_PROGRESSIVE 2 +#define VI_3D 3 + +#define VI_NTSC 0 +#define VI_PAL 1 +#define VI_MPAL 2 +#define VI_DEBUG 3 +#define VI_DEBUG_PAL 4 +#define VI_EURGB60 5 +#define VI_GCA 6 + +#define VI_TVMODE(format, interlace) (((format) << 2) + (interlace)) + +typedef enum { + // NTSC + VI_TVMODE_NTSC_INT = VI_TVMODE(VI_NTSC, VI_INTERLACE), + VI_TVMODE_NTSC_DS = VI_TVMODE(VI_NTSC, VI_NON_INTERLACE), + VI_TVMODE_NTSC_PROG = VI_TVMODE(VI_NTSC, VI_PROGRESSIVE), + VI_TVMODE_NTSC_3D = VI_TVMODE(VI_NTSC, VI_3D), + // PAL + VI_TVMODE_PAL_INT = VI_TVMODE(VI_PAL, VI_INTERLACE), + VI_TVMODE_PAL_DS = VI_TVMODE(VI_PAL, VI_NON_INTERLACE), + + // MPAL + VI_TVMODE_MPAL_INT = VI_TVMODE(VI_MPAL, VI_INTERLACE), + VI_TVMODE_MPAL_DS = VI_TVMODE(VI_MPAL, VI_NON_INTERLACE), + + // Debug + VI_TVMODE_DEBUG_INT = VI_TVMODE(VI_DEBUG, VI_INTERLACE), + + // Debug PAL + VI_TVMODE_DEBUG_PAL_INT = VI_TVMODE(VI_DEBUG_PAL, VI_INTERLACE), + VI_TVMODE_DEBUG_PAL_DS = VI_TVMODE(VI_DEBUG_PAL, VI_NON_INTERLACE), + + // EU RGB60 + VI_TVMODE_EURGB60_INT = VI_TVMODE(VI_EURGB60, VI_INTERLACE), + VI_TVMODE_EURGB60_DS = VI_TVMODE(VI_EURGB60, VI_NON_INTERLACE), + + // GCA + VI_TVMODE_GCA_INT = VI_TVMODE(VI_GCA, VI_INTERLACE), + VI_TVMODE_GCA_DS = VI_TVMODE(VI_GCA, VI_NON_INTERLACE), + VI_TVMODE_GCA_PROG = VI_TVMODE(VI_GCA, VI_PROGRESSIVE), +} VITVMode; + +typedef enum { + VI_XFBMODE_SF = 0, + VI_XFBMODE_DF = 1, +} VIXFBMode; + +typedef void (*VIPositionCallback)(s16 x, s16 y); +typedef void (*VIRetraceCallback)(u32 retraceCount); + +// Structure to use with timing in vi.c (size 0x28). +typedef struct VITimingInfo { + u8 equ; // _00 + u16 acv; // _02 + u16 prbOdd; // _04 + u16 prbEven; // _06 + u16 psbOdd; // _08 + u16 psbEven; // _0A + u8 bs1; // _0C + u8 bs2; // _0D + u8 bs3; // _0E + u8 bs4; // _0F + u16 be1; // _10 + u16 be2; // _12 + u16 be3; // _14 + u16 be4; // _16 + u16 numHalfLines; // _18 + u16 hlw; // _1A + u8 hsy; // _1C + u8 hcs; // _1D + u8 hce; // _1E + u8 hbe640; // _1F + u16 hbs640; // _20 + u8 hbeCCIR656; // _24 + u16 hbsCCIR656; // _26 +} VITimingInfo; + +// Structure to use with HorVer in vi.c (size 0x58). +typedef struct VIPositionInfo { + u16 dispPosX; // _00 + u16 dispPosY; // _02 + u16 dispSizeX; // _04 + u16 dispSizeY; // _06 + u16 adjDispPosX; // _08 + u16 adjDispPosY; // _0A + u16 adjDispSizeY; // _0C + u16 adjPanPosY; // _0E + u16 adjPanSizeY; // _10 + u16 fbSizeX; // _12 + u16 fbSizeY; // _14 + u16 panPosX; // _16 + u16 panPosY; // _18 + u16 panSizeX; // _1A + u16 panSizeY; // _1C + VIXFBMode xfbMode; // _20 + u32 nonInter; // _24 + u32 tv; // _28 + u8 wordPerLine; // _2C + u8 std; // _2D + u8 wpl; // _2E + u32 bufAddr; // _30 + u32 tfbb; // _34 + u32 bfbb; // _38 + u8 xof; // _3C + BOOL isBlack; // _40 + BOOL is3D; // _44 + u32 rbufAddr; // _48 + u32 rtfbb; // _4C + u32 rbfbb; // _50 + VITimingInfo* timing; // _54 +} VIPositionInfo; + +typedef struct _GXRenderModeObj { + /*0x00*/ VITVMode viTVmode; + /*0x04*/ u16 fbWidth; + /*0x06*/ u16 efbHeight; + /*0x08*/ u16 xfbHeight; + /*0x0A*/ u16 viXOrigin; + /*0x0C*/ u16 viYOrigin; + /*0x0E*/ u16 viWidth; + /*0x10*/ u16 viHeight; + /*0x14*/ VIXFBMode xFBmode; + /*0x18*/ u8 field_rendering; + u8 aa; + u8 sample_pattern[12][2]; + u8 vfilter[7]; +} GXRenderModeObj; + +typedef struct _GXColor { + u8 r; + u8 g; + u8 b; + u8 a; +} GXColor; + +typedef struct _GXTexObj { + u32 dummy[8]; +} GXTexObj; + +typedef struct _GXTlutObj { + u32 dummy[3]; +} GXTlutObj; + +typedef struct _GXLightObj { + u32 dummy[16]; +} GXLightObj; + +typedef struct _GXVtxDescList { + GXAttr attr; + GXAttrType type; +} GXVtxDescList; + +typedef struct _GXColorS10 { + s16 r; + s16 g; + s16 b; + s16 a; +} GXColorS10; + +typedef struct _GXTexRegion { + u32 dummy[4]; +} GXTexRegion; + +typedef struct _GXTlutRegion { + u32 dummy[4]; +} GXTlutRegion; + +typedef struct _GXVtxAttrFmtList { + // total size: 0x10 + GXAttr attr; // offset 0x0, size 0x4 + GXCompCnt cnt; // offset 0x4, size 0x4 + GXCompType type; // offset 0x8, size 0x4 + u8 frac; // offset 0xC, size 0x1 +} GXVtxAttrFmtList; + +void GXSetTevDirect(GXTevStageID tev_stage); +void GXSetNumIndStages(u8 nIndStages); +void GXSetIndTexMtx(GXIndTexMtxID mtx_sel, f32 offset[2][3], s8 scale_exp); +void GXSetIndTexOrder(GXIndTexStageID ind_stage, GXTexCoordID tex_coord, GXTexMapID tex_map); +void GXSetTevIndirect(GXTevStageID tev_stage, GXIndTexStageID ind_stage, GXIndTexFormat format, + GXIndTexBiasSel bias_sel, GXIndTexMtxID matrix_sel, GXIndTexWrap wrap_s, + GXIndTexWrap wrap_t, GXBool add_prev, GXBool ind_lod, + GXIndTexAlphaSel alpha_sel); +void GXSetTevIndWarp(GXTevStageID tev_stage, GXIndTexStageID ind_stage, GXBool signed_offsets, + GXBool replace_mode, GXIndTexMtxID matrix_sel); + +void GXSetTevIndTile (GXTevStageID tev_stage, GXIndTexStageID ind_stage, + u16 tilesize_s, u16 tilesize_t, + u16 tilespacing_s, u16 tilespacing_t, + GXIndTexFormat format, GXIndTexMtxID matrix_sel, + GXIndTexBiasSel bias_sel, GXIndTexAlphaSel alpha_sel); +void GXSetIndTexCoordScale(GXIndTexStageID ind_state, GXIndTexScale scale_s, GXIndTexScale scale_t); + +#define GX_NOP 0x00 +#define GX_DRAW_QUADS 0x80 +#define GX_DRAW_TRIANGLES 0x90 +#define GX_DRAW_TRIANGLE_STRIP 0x98 +#define GX_DRAW_TRIANGLE_FAN 0xA0 +#define GX_DRAW_LINES 0xA8 +#define GX_DRAW_LINE_STRIP 0xB0 +#define GX_DRAW_POINTS 0xB8 + +#define GX_LOAD_BP_REG 0x61 +#define GX_LOAD_CP_REG 0x08 +#define GX_LOAD_XF_REG 0x10 +#define GX_LOAD_INDX_A 0x20 +#define GX_LOAD_INDX_B 0x28 +#define GX_LOAD_INDX_C 0x30 +#define GX_LOAD_INDX_D 0x38 + +#define GX_CMD_CALL_DL 0x40 +#define GX_CMD_INVL_VC 0x48 + +#define GX_OPCODE_MASK 0xF8 +#define GX_VAT_MASK 0x07 + +void GXSetScissor(u32 left, u32 top, u32 wd, u32 ht); +void GXSetCullMode(GXCullMode mode); +void GXSetCoPlanar(GXBool enable); + +void GXBeginDisplayList(void* list, u32 size); +u32 GXEndDisplayList(void); +void GXCallDisplayList(const void* list, u32 nbytes); + +void GXDrawSphere(u8 numMajor, u8 numMinor); + +typedef struct { + u8 pad[128]; +} GXFifoObj; + +typedef void (*GXBreakPtCallback)(void); + +void GXInitFifoBase(GXFifoObj* fifo, void* base, u32 size); +void GXInitFifoPtrs(GXFifoObj* fifo, void* readPtr, void* writePtr); +void GXGetFifoPtrs(GXFifoObj* fifo, void** readPtr, void** writePtr); +GXFifoObj* GXGetCPUFifo(void); +GXFifoObj* GXGetGPFifo(void); +void GXSetCPUFifo(GXFifoObj* fifo); +void GXSetGPFifo(GXFifoObj* fifo); +void GXSaveCPUFifo(GXFifoObj* fifo); +void GXGetFifoStatus(GXFifoObj* fifo, GXBool* overhi, GXBool* underlow, u32* fifoCount, + GXBool* cpu_write, GXBool* gp_read, GXBool* fifowrap); +void GXGetGPStatus(GXBool* overhi, GXBool* underlow, GXBool* readIdle, GXBool* cmdIdle, + GXBool* brkpt); +void GXInitFifoLimits(GXFifoObj* fifo, u32 hiWaterMark, u32 loWaterMark); +GXBreakPtCallback GXSetBreakPtCallback(GXBreakPtCallback cb); +void GXEnableBreakPt(void* breakPt); +void GXDisableBreakPt(void); + +extern GXRenderModeObj GXNtsc240Ds; +extern GXRenderModeObj GXNtsc240DsAa; +extern GXRenderModeObj GXNtsc240Int; +extern GXRenderModeObj GXNtsc240IntAa; +extern GXRenderModeObj GXNtsc480IntDf; +extern GXRenderModeObj GXNtsc480Int; +extern GXRenderModeObj GXNtsc480IntAa; +extern GXRenderModeObj GXNtsc480Prog; +extern GXRenderModeObj GXNtsc480ProgAa; +extern GXRenderModeObj GXMpal240Ds; +extern GXRenderModeObj GXMpal240DsAa; +extern GXRenderModeObj GXMpal240Int; +extern GXRenderModeObj GXMpal240IntAa; +extern GXRenderModeObj GXMpal480IntDf; +extern GXRenderModeObj GXMpal480Int; +extern GXRenderModeObj GXMpal480IntAa; +extern GXRenderModeObj GXPal264Ds; +extern GXRenderModeObj GXPal264DsAa; +extern GXRenderModeObj GXPal264Int; +extern GXRenderModeObj GXPal264IntAa; +extern GXRenderModeObj GXPal528IntDf; +extern GXRenderModeObj GXPal528Int; +extern GXRenderModeObj GXPal524IntAa; +extern GXRenderModeObj GXEurgb60Hz240Ds; +extern GXRenderModeObj GXEurgb60Hz240DsAa; +extern GXRenderModeObj GXEurgb60Hz240Int; +extern GXRenderModeObj GXEurgb60Hz240IntAa; +extern GXRenderModeObj GXEurgb60Hz480IntDf; +extern GXRenderModeObj GXEurgb60Hz480Int; +extern GXRenderModeObj GXEurgb60Hz480IntAa; + +#define GX_MAX_Z24 0x00FFFFFF + +void GXSetCopyClear(GXColor clear_clr, u32 clear_z); +void GXAdjustForOverscan(GXRenderModeObj* rmin, GXRenderModeObj* rmout, u16 hor, u16 ver); +void GXCopyDisp(void* dest, GXBool clear); +void GXSetDispCopyGamma(GXGamma gamma); +void GXSetDispCopySrc(u16 left, u16 top, u16 wd, u16 ht); +void GXSetDispCopyDst(u16 wd, u16 ht); +u32 GXSetDispCopyYScale(f32 vscale); +void GXSetCopyFilter(GXBool aa, u8 sample_pattern[12][2], GXBool vf, u8 vfilter[7]); +void GXSetPixelFmt(GXPixelFmt pix_fmt, GXZFmt16 z_fmt); +void GXSetTexCopySrc(u16 left, u16 top, u16 wd, u16 ht); +void GXSetTexCopyDst(u16 wd, u16 ht, GXTexFmt fmt, GXBool mipmap); +void GXCopyTex(void* dest, GXBool clear); + +void GXSetVtxDesc(GXAttr attr, GXAttrType type); +void GXSetVtxDescv(GXVtxDescList* list); +void GXClearVtxDesc(void); +void GXSetVtxAttrFmt(GXVtxFmt vtxfmt, GXAttr attr, GXCompCnt cnt, GXCompType type, u8 frac); +void GXSetNumTexGens(u8 nTexGens); +void GXBegin(GXPrimitive type, GXVtxFmt vtxfmt, u16 nverts); +void GXSetTexCoordGen2(GXTexCoordID dst_coord, GXTexGenType func, GXTexGenSrc src_param, u32 mtx, + GXBool normalize, u32 postmtx); +void GXSetLineWidth(u8 width, GXTexOffset texOffsets); +void GXSetPointSize(u8 pointSize, GXTexOffset texOffsets); +void GXEnableTexOffsets(GXTexCoordID coord, GXBool line_enable, GXBool point_enable); +void GXSetArray(GXAttr attr, const void* data, u8 stride); +void GXInvalidateVtxCache(void); + +static inline void GXSetTexCoordGen(GXTexCoordID dst_coord, GXTexGenType func, + GXTexGenSrc src_param, u32 mtx) { + GXSetTexCoordGen2(dst_coord, func, src_param, mtx, GX_FALSE, GX_PTIDENTITY); +} + +GXBool GXGetTexObjMipMap(const GXTexObj* obj); +GXTexFmt GXGetTexObjFmt(const GXTexObj* obj); +u16 GXGetTexObjHeight(const GXTexObj* obj); +u16 GXGetTexObjWidth(const GXTexObj* obj); +GXTexWrapMode GXGetTexObjWrapS(const GXTexObj* obj); +GXTexWrapMode GXGetTexObjWrapT(const GXTexObj* obj); +void* GXGetTexObjData(const GXTexObj* obj); +void GXGetProjectionv(f32* p); +void GXGetLightPos(const GXLightObj* lt_obj, f32* x, f32* y, f32* z); +void GXGetLightColor(const GXLightObj* lt_obj, GXColor* color); +void GXGetVtxAttrFmt(GXVtxFmt idx, GXAttr attr, GXCompCnt* compCnt, GXCompType* compType, + u8* shift); + +void GXSetNumChans(u8 nChans); +void GXSetChanCtrl(GXChannelID chan, GXBool enable, GXColorSrc amb_src, GXColorSrc mat_src, + u32 light_mask, GXDiffuseFn diff_fn, GXAttnFn attn_fn); +void GXSetChanAmbColor(GXChannelID chan, GXColor amb_color); +void GXSetChanMatColor(GXChannelID chan, GXColor mat_color); + +void GXInitLightSpot(GXLightObj* lt_obj, f32 cutoff, GXSpotFn spot_func); +void GXInitLightDistAttn(GXLightObj* lt_obj, f32 ref_distance, f32 ref_brightness, + GXDistAttnFn dist_func); +void GXInitLightPos(GXLightObj* lt_obj, f32 x, f32 y, f32 z); +void GXInitLightDir(GXLightObj* lt_obj, f32 nx, f32 ny, f32 nz); +void GXInitLightColor(GXLightObj* lt_obj, GXColor color); +void GXInitLightAttn(GXLightObj* lt_obj, f32 a0, f32 a1, f32 a2, f32 k0, f32 k1, f32 k2); +void GXInitLightAttnA(GXLightObj* lt_obj, f32 a0, f32 a1, f32 a2); +void GXInitLightAttnK(GXLightObj* lt_obj, f32 k0, f32 k1, f32 k2); +void GXLoadLightObjImm(GXLightObj* lt_obj, GXLightID light); + +typedef void (*GXDrawDoneCallback)(void); +typedef void (*GXDrawSyncCallback)(u16 token); + +GXFifoObj* GXInit(void* base, u32 size); +GXDrawDoneCallback GXSetDrawDoneCallback(GXDrawDoneCallback cb); +void GXSetDrawSync(u16 token); +GXDrawSyncCallback GXSetDrawSyncCallback(GXDrawSyncCallback callback); + +void GXDrawDone(void); +void GXSetDrawDone(void); +void GXFlush(void); +void GXPixModeSync(void); +void GXSetMisc(GXMiscToken token, u32 val); + +extern void GXSetGPMetric(GXPerf0 perf0, GXPerf1 perf1); +extern void GXClearGPMetric(); +extern void GXReadXfRasMetric(u32* xfWaitIn, u32* xfWaitOut, u32* rasBusy, u32* clocks); + +// Unused/inlined in P2. +extern void GXReadGPMetric(u32* count0, u32* count1); +extern u32 GXReadGP0Metric(); +extern u32 GXReadGP1Metric(); +extern void GXReadMemMetric(u32* cpReq, u32* tcReq, u32* cpuReadReq, u32* cpuWriteReq, u32* dspReq, u32* ioReq, u32* viReq, u32* peReq, + u32* rfReq, u32* fiReq); +extern void GXClearMemMetric(); +extern void GXReadPixMetric(u32* topIn, u32* topOut, u32* bottomIn, u32* bottomOut, u32* clearIn, u32* copyClocks); +extern void GXClearPixMetric(); +extern void GXSetVCacheMetric(GXVCachePerf attr); +extern void GXReadVCacheMetric(u32* check, u32* miss, u32* stall); +extern void GXClearVCacheMetric(); +extern void GXInitXfRasMetric(); +extern u32 GXReadClksPerVtx(); + +void GXSetFog(GXFogType type, f32 startz, f32 endz, f32 nearz, f32 farz, GXColor color); +void GXSetFogColor(GXColor color); +// ? GXSetFogRangeAdj(); +void GXSetBlendMode(GXBlendMode type, GXBlendFactor src_factor, GXBlendFactor dst_factor, + GXLogicOp op); +void GXSetColorUpdate(GXBool update_enable); +void GXSetAlphaUpdate(GXBool update_enable); +void GXSetZMode(GXBool compare_enable, GXCompare func, GXBool update_enable); +void GXSetZCompLoc(GXBool before_tex); +void GXSetPixelFmt(GXPixelFmt pix_fmt, GXZFmt16 z_fmt); +void GXSetDither(GXBool dither); +void GXSetDstAlpha(GXBool enable, u8 alpha); +// ? GXSetFieldMask(); +void GXSetFieldMode(u8 field_mode, u8 half_aspect_ratio); + +void GXSetTevOp(GXTevStageID id, GXTevMode mode); +void GXSetTevColorIn(GXTevStageID stage, GXTevColorArg a, GXTevColorArg b, GXTevColorArg c, + GXTevColorArg d); +void GXSetTevAlphaIn(GXTevStageID stage, GXTevAlphaArg a, GXTevAlphaArg b, GXTevAlphaArg c, + GXTevAlphaArg d); +void GXSetTevColorOp(GXTevStageID stage, GXTevOp op, GXTevBias bias, GXTevScale scale, GXBool clamp, + GXTevRegID out_reg); +void GXSetTevAlphaOp(GXTevStageID stage, GXTevOp op, GXTevBias bias, GXTevScale scale, GXBool clamp, + GXTevRegID out_reg); +void GXSetTevColor(GXTevRegID id, GXColor color); +void GXSetTevColorS10(GXTevRegID id, GXColorS10 color); +void GXSetTevKColor(GXTevKColorID id, GXColor color); +void GXSetTevKColorSel(GXTevStageID stage, GXTevKColorSel sel); +void GXSetTevKAlphaSel(GXTevStageID stage, GXTevKAlphaSel sel); +void GXSetTevSwapMode(GXTevStageID stage, GXTevSwapSel ras_sel, GXTevSwapSel tex_sel); +void GXSetTevSwapModeTable(GXTevSwapSel table, GXTevColorChan red, GXTevColorChan green, + GXTevColorChan blue, GXTevColorChan alpha); +void GXSetAlphaCompare(GXCompare comp0, u8 ref0, GXAlphaOp op, GXCompare comp1, u8 ref1); +void GXSetZTexture(GXZTexOp op, GXTexFmt fmt, u32 bias); +void GXSetTevOrder(GXTevStageID stage, GXTexCoordID coord, GXTexMapID map, GXChannelID color); +void GXSetNumTevStages(u8 nStages); + +typedef GXTexRegion* (*GXTexRegionCallback)(const GXTexObj* obj, GXTexMapID id); + +void GXInitTexObj(GXTexObj* obj, const void* data, u16 width, u16 height, u32 format, + GXTexWrapMode wrapS, GXTexWrapMode wrapT, GXBool mipmap); +void GXInitTexObjCI(GXTexObj* obj, const void* data, u16 width, u16 height, GXCITexFmt format, + GXTexWrapMode wrapS, GXTexWrapMode wrapT, GXBool mipmap, u32 tlut); +void GXInitTexObjData(GXTexObj* obj, const void* data); +void GXInitTexObjLOD(GXTexObj* obj, GXTexFilter min_filt, GXTexFilter mag_filt, f32 min_lod, + f32 max_lod, f32 lod_bias, GXBool bias_clamp, GXBool do_edge_lod, + GXAnisotropy max_aniso); +void GXLoadTexObj(GXTexObj* obj, GXTexMapID id); +u32 GXGetTexBufferSize(u16 width, u16 height, u32 format, GXBool mipmap, u8 max_lod); +void GXInvalidateTexAll(); +void GXInitTexObjWrapMode(GXTexObj* obj, GXTexWrapMode s, GXTexWrapMode t); +void GXInitTlutObj(GXTlutObj* obj, void* data, GXTlutFmt format, u16 entries); +void GXLoadTlut(const GXTlutObj* obj, GXTlut idx); +void GXSetTexCoordScaleManually(GXTexCoordID coord, GXBool enable, u16 ss, u16 ts); +void GXInitTexCacheRegion(GXTexRegion* region, GXBool is_32b_mipmap, u32 tmem_even, + GXTexCacheSize size_even, u32 tmem_odd, GXTexCacheSize size_odd); +GXTexRegionCallback GXSetTexRegionCallback(GXTexRegionCallback callback); +void GXInvalidateTexRegion(const GXTexRegion* region); + +void GXSetTexCoordScaleManually(GXTexCoordID coord, GXBool enable, u16 ss, u16 ts); + +#define GX_PROJECTION_SZ 7 + + +void GXSetProjection(f32 mtx[4][4], GXProjectionType type); +void GXLoadPosMtxImm(f32 mtx[3][4], u32 id); +void GXLoadNrmMtxImm(f32 mtx[3][4], u32 id); +void GXLoadTexMtxImm(f32 mtx[][4], u32 id, GXTexMtxType type); + +void GXSetViewport(f32 left, f32 top, f32 wd, f32 ht, f32 nearz, f32 farz); +void GXSetCurrentMtx(u32 id); +void GXSetViewportJitter(f32 left, f32 top, f32 wd, f32 ht, f32 nearz, f32 farz, u32 field); +void GXSetScissorBoxOffset(s32 x_off, s32 y_off); +void GXSetClipMode(GXClipMode mode); + +#define GXFIFO_ADDR 0xCC008000 + +typedef union { + u8 u8; + u16 u16; + u32 u32; + u64 u64; + s8 s8; + s16 s16; + s32 s32; + s64 s64; + f32 f32; + f64 f64; +} PPCWGPipe; + +#define GXWGFifo (*(volatile PPCWGPipe*)GXFIFO_ADDR) + +static inline void GXPosition2f32(const f32 x, const f32 y) { + GXWGFifo.f32 = x; + GXWGFifo.f32 = y; +} + +static inline void GXPosition2u16(const u16 x, const u16 y) { + GXWGFifo.u16 = x; + GXWGFifo.u16 = y; +} + +static inline void GXPosition2s16(const s16 x, const s16 y) { + GXWGFifo.s16 = x; + GXWGFifo.s16 = y; +} + +static inline void GXPosition3s16(const s16 x, const s16 y, const s16 z) { + GXWGFifo.s16 = x; + GXWGFifo.s16 = y; + GXWGFifo.s16 = z; +} + +static inline void GXPosition3f32(const f32 x, const f32 y, const f32 z) { + GXWGFifo.f32 = x; + GXWGFifo.f32 = y; + GXWGFifo.f32 = z; +} + +static inline void GXNormal3f32(const f32 x, const f32 y, const f32 z) { + GXWGFifo.f32 = x; + GXWGFifo.f32 = y; + GXWGFifo.f32 = z; +} + +static inline void GXColor1u32(const u32 v) { + GXWGFifo.u32 = v; +} + +static inline void GXColor3u8(const u8 r, const u8 g, const u8 b) { + GXWGFifo.u8 = r; + GXWGFifo.u8 = g; + GXWGFifo.u8 = b; +} + +static inline void GXColor4u8(const u8 r, const u8 g, const u8 b, const u8 a) { + GXWGFifo.u8 = r; + GXWGFifo.u8 = g; + GXWGFifo.u8 = b; + GXWGFifo.u8 = a; +} + +static inline void GXTexCoord2s16(const s16 u, const s16 v) { + GXWGFifo.s16 = u; + GXWGFifo.s16 = v; +} + +static inline void GXTexCoord2f32(const f32 u, const f32 v) { + GXWGFifo.f32 = u; + GXWGFifo.f32 = v; +} + +static inline void GXPosition1x8(u8 index) { + GXWGFifo.u8 = index; +} + +static inline void GXColor1x8(u8 index) { + GXWGFifo.u8 = index; +} + +static inline void GXPosition1x16(u16 index) { + GXWGFifo.u16 = index; +} + +static inline void GXColor1x16(u16 index) { + GXWGFifo.u16 = index; +} + +static inline void GXTexCoord1x16(u16 index) { + GXWGFifo.u16 = index; +} + +static inline void GXEnd(void) {} + +// Upper words of the masks, since UIMM is only 16 bits +#define OS_CACHED_REGION_PREFIX 0x8000 +#define OS_UNCACHED_REGION_PREFIX 0xC000 +#define OS_PHYSICAL_MASK 0x3FFF + +#define OS_BASE_CACHED (OS_CACHED_REGION_PREFIX << 16) +#define OS_BASE_UNCACHED (OS_UNCACHED_REGION_PREFIX << 16) + +#define AT_ADDRESS + +typedef s64 OSTime; +typedef u32 OSTick; +u32 __OSBusClock(); // sync with OSLoMem.h +u32 __OSCoreClock(); // sync with OSLoMem.h +#define OS_BUS_CLOCK (u32)__OSBusClock +#define OS_CORE_CLOCK __OSCoreClock +#define OS_TIMER_CLOCK (OS_BUS_CLOCK / 4) + +#define OSPhysicalToCached(paddr) ((void*)((u32)(paddr) + OS_BASE_CACHED)) +#define OSPhysicalToUncached(paddr) ((void*)((u32)(paddr) + OS_BASE_UNCACHED)) +#define OSCachedToPhysical(caddr) ((u32)((u8*)(caddr)-OS_BASE_CACHED)) +#define OSUncachedToPhysical(ucaddr) ((u32)((u8*)(ucaddr)-OS_BASE_UNCACHED)) +#define OSCachedToUncached(caddr) ((void*)((u8*)(caddr) + (OS_BASE_UNCACHED - OS_BASE_CACHED))) +#define OSUncachedToCached(ucaddr) ((void*)((u8*)(ucaddr) - (OS_BASE_UNCACHED - OS_BASE_CACHED))) + +#define OSTicksToCycles(ticks) (((ticks) * ((OS_CORE_CLOCK * 2) / OS_TIMER_CLOCK)) / 2) +#define OSTicksToSeconds(ticks) ((ticks) / OS_TIMER_CLOCK) +#define OSTicksToMilliseconds(ticks) ((ticks) / (OS_TIMER_CLOCK / 1000)) +#define OSTicksToMicroseconds(ticks) (((ticks)*8) / (OS_TIMER_CLOCK / 125000)) +#define OSTicksToNanoseconds(ticks) (((ticks)*8000) / (OS_TIMER_CLOCK / 125000)) +#define OSSecondsToTicks(sec) ((sec)*OS_TIMER_CLOCK) +#define OSMillisecondsToTicks(msec) ((msec) * (OS_TIMER_CLOCK / 1000)) +#define OSMicrosecondsToTicks(usec) (((usec) * (OS_TIMER_CLOCK / 125000)) / 8) +#define OSNanosecondsToTicks(nsec) (((nsec) * (OS_TIMER_CLOCK / 125000)) / 8000) + +#define OSDiffTick(tick1, tick0) ((s32)(tick1) - (s32)(tick0)) + +#define OSRoundUp32B(v) (((u32)(v + 31) & ~31)) +#define OSRoundDown32B(x) (((u32)(x)) & ~31) + +void* OSGetArenaHi(void); +void* OSGetArenaLo(void); +void OSSetArenaHi(void* newHi); +void OSSetArenaLo(void* newLo); + +void* OSAllocFromArenaLo(u32 size, u32 align); +void* OSAllocFromArenaHi(u32 size, u32 align); + +void OSInit(); + +OSTime OSGetTime(); +OSTick OSGetTick(); + +typedef struct OSCalendarTime { + int sec; // seconds after the minute [0, 61] + int min; // minutes after the hour [0, 59] + int hour; // hours since midnight [0, 23] + int mday; // day of the month [1, 31] + int mon; // month since January [0, 11] + int year; // years in AD [1, ...] + int wday; // days since Sunday [0, 6] + int yday; // days since January 1 [0, 365] + + int msec; // milliseconds after the second [0,999] + int usec; // microseconds after the millisecond [0,999] +} OSCalendarTime; + +OSTime OSCalendarTimeToTicks(OSCalendarTime* td); +void OSTicksToCalendarTime(OSTime ticks, OSCalendarTime* td); + +typedef struct OSStopwatch { + char* name; + OSTime total; + u32 hits; + OSTime min; + OSTime max; + OSTime last; + BOOL running; +} OSStopwatch; + +void OSInitStopwatch(OSStopwatch* sw, char* name); +void OSStartStopwatch(OSStopwatch* sw); +void OSStopStopwatch(OSStopwatch* sw); +OSTime OSCheckStopwatch(OSStopwatch* sw); +void OSResetStopwatch(OSStopwatch* sw); +void OSDumpStopwatch(OSStopwatch* sw); + +#define OS_CONSOLE_MASK 0xf0000000 +#define OS_CONSOLE_RETAIL 0x00000000 +#define OS_CONSOLE_DEVELOPMENT 0x10000000 +#define OS_CONSOLE_TDEV 0x20000000 + +#define OS_CONSOLE_RETAIL4 0x00000004 +#define OS_CONSOLE_RETAIL3 0x00000003 +#define OS_CONSOLE_RETAIL2 0x00000002 +#define OS_CONSOLE_RETAIL1 0x00000001 +#define OS_CONSOLE_TDEVHW4 0x20000007 +#define OS_CONSOLE_TDEVHW3 0x20000006 +#define OS_CONSOLE_TDEVHW2 0x20000005 +#define OS_CONSOLE_TDEVHW1 0x20000004 +#define OS_CONSOLE_DEVHW4 0x10000007 +#define OS_CONSOLE_DEVHW3 0x10000006 +#define OS_CONSOLE_DEVHW2 0x10000005 +#define OS_CONSOLE_DEVHW1 0x10000004 +#define OS_CONSOLE_MINNOW 0x10000003 +#define OS_CONSOLE_ARTHUR 0x10000002 +#define OS_CONSOLE_PC_EMULATOR 0x10000001 +#define OS_CONSOLE_EMULATOR 0x10000000 + +u32 OSGetConsoleType(); + +#define OS_SOUND_MODE_MONO 0u +#define OS_SOUND_MODE_STEREO 1u + +u32 OSGetSoundMode(void); +void OSSetSoundMode(u32 mode); + +#define OS_PROGRESSIVE_MODE_OFF 0u +#define OS_PROGRESSIVE_MODE_ON 1u + +u32 OSGetProgressiveMode(void); +void OSSetProgressiveMode(u32 on); + +#define OS_LANG_ENGLISH 0u +#define OS_LANG_GERMAN 1u +#define OS_LANG_FRENCH 2u +#define OS_LANG_SPANISH 3u +#define OS_LANG_ITALIAN 4u +#define OS_LANG_DUTCH 5u + +u8 OSGetLanguage(void); +void OSSetLanguage(u8 language); + +#define OS_EURGB60_OFF 0u +#define OS_EURGB60_ON 1u + +u32 OSGetEuRgb60Mode(void); +void OSSetEuRgb60Mode(u32 on); + +void OSRegisterVersion(const char* id); + +BOOL OSDisableInterrupts(void); +BOOL OSEnableInterrupts(void); +BOOL OSRestoreInterrupts(BOOL level); + +#define OSHalt(msg) OSPanic(__FILE__, __LINE__, msg) + + +#define ASSERT(exp) ((void)0) + +void OSReport(const char* msg, ...); +void OSPanic(const char* file, int line, const char* msg, ...); +void OSFatal(GXColor fg, GXColor bg, const char* msg); + +u32 OSGetPhysicalMemSize(void); +u32 OSGetConsoleSimulatedMemSize(void); + +#define __OS_CONTEXT_FRAME 768 + +#define OS_CONTEXT_R0 0 +#define OS_CONTEXT_R1 4 +#define OS_CONTEXT_R2 8 +#define OS_CONTEXT_R3 12 +#define OS_CONTEXT_R4 16 +#define OS_CONTEXT_R5 20 +#define OS_CONTEXT_R6 24 +#define OS_CONTEXT_R7 28 +#define OS_CONTEXT_R8 32 +#define OS_CONTEXT_R9 36 +#define OS_CONTEXT_R10 40 +#define OS_CONTEXT_R11 44 +#define OS_CONTEXT_R12 48 +#define OS_CONTEXT_R13 52 +#define OS_CONTEXT_R14 56 +#define OS_CONTEXT_R15 60 +#define OS_CONTEXT_R16 64 +#define OS_CONTEXT_R17 68 +#define OS_CONTEXT_R18 72 +#define OS_CONTEXT_R19 76 +#define OS_CONTEXT_R20 80 +#define OS_CONTEXT_R21 84 +#define OS_CONTEXT_R22 88 +#define OS_CONTEXT_R23 92 +#define OS_CONTEXT_R24 96 +#define OS_CONTEXT_R25 100 +#define OS_CONTEXT_R26 104 +#define OS_CONTEXT_R27 108 +#define OS_CONTEXT_R28 112 +#define OS_CONTEXT_R29 116 +#define OS_CONTEXT_R30 120 +#define OS_CONTEXT_R31 124 + +#define OS_CONTEXT_CR 128 +#define OS_CONTEXT_LR 132 +#define OS_CONTEXT_CTR 136 +#define OS_CONTEXT_XER 140 + +#define OS_CONTEXT_FPR0 144 +#define OS_CONTEXT_FPR1 152 +#define OS_CONTEXT_FPR2 160 +#define OS_CONTEXT_FPR3 168 +#define OS_CONTEXT_FPR4 176 +#define OS_CONTEXT_FPR5 184 +#define OS_CONTEXT_FPR6 192 +#define OS_CONTEXT_FPR7 200 +#define OS_CONTEXT_FPR8 208 +#define OS_CONTEXT_FPR9 216 +#define OS_CONTEXT_FPR10 224 +#define OS_CONTEXT_FPR11 232 +#define OS_CONTEXT_FPR12 240 +#define OS_CONTEXT_FPR13 248 +#define OS_CONTEXT_FPR14 256 +#define OS_CONTEXT_FPR15 264 +#define OS_CONTEXT_FPR16 272 +#define OS_CONTEXT_FPR17 280 +#define OS_CONTEXT_FPR18 288 +#define OS_CONTEXT_FPR19 296 +#define OS_CONTEXT_FPR20 304 +#define OS_CONTEXT_FPR21 312 +#define OS_CONTEXT_FPR22 320 +#define OS_CONTEXT_FPR23 328 +#define OS_CONTEXT_FPR24 336 +#define OS_CONTEXT_FPR25 344 +#define OS_CONTEXT_FPR26 352 +#define OS_CONTEXT_FPR27 360 +#define OS_CONTEXT_FPR28 368 +#define OS_CONTEXT_FPR29 376 +#define OS_CONTEXT_FPR30 384 +#define OS_CONTEXT_FPR31 392 + +#define OS_CONTEXT_FPSCR 400 + +#define OS_CONTEXT_SRR0 408 +#define OS_CONTEXT_SRR1 412 + +#define OS_CONTEXT_MODE 416 +#define OS_CONTEXT_STATE 418 + +#define OS_CONTEXT_GQR0 420 +#define OS_CONTEXT_GQR1 424 +#define OS_CONTEXT_GQR2 428 +#define OS_CONTEXT_GQR3 432 +#define OS_CONTEXT_GQR4 436 +#define OS_CONTEXT_GQR5 440 +#define OS_CONTEXT_GQR6 444 +#define OS_CONTEXT_GQR7 448 +#define __OSCONTEXT_PADDING 452 + +#define OS_CONTEXT_PSF0 456 +#define OS_CONTEXT_PSF1 464 +#define OS_CONTEXT_PSF2 472 +#define OS_CONTEXT_PSF3 480 +#define OS_CONTEXT_PSF4 488 +#define OS_CONTEXT_PSF5 496 +#define OS_CONTEXT_PSF6 504 +#define OS_CONTEXT_PSF7 512 +#define OS_CONTEXT_PSF8 520 +#define OS_CONTEXT_PSF9 528 +#define OS_CONTEXT_PSF10 536 +#define OS_CONTEXT_PSF11 544 +#define OS_CONTEXT_PSF12 552 +#define OS_CONTEXT_PSF13 560 +#define OS_CONTEXT_PSF14 568 +#define OS_CONTEXT_PSF15 576 +#define OS_CONTEXT_PSF16 584 +#define OS_CONTEXT_PSF17 592 +#define OS_CONTEXT_PSF18 600 +#define OS_CONTEXT_PSF19 608 +#define OS_CONTEXT_PSF20 616 +#define OS_CONTEXT_PSF21 624 +#define OS_CONTEXT_PSF22 632 +#define OS_CONTEXT_PSF23 640 +#define OS_CONTEXT_PSF24 648 +#define OS_CONTEXT_PSF25 656 +#define OS_CONTEXT_PSF26 664 +#define OS_CONTEXT_PSF27 672 +#define OS_CONTEXT_PSF28 680 +#define OS_CONTEXT_PSF29 688 +#define OS_CONTEXT_PSF30 696 +#define OS_CONTEXT_PSF31 704 +#define OS_CONTEXT_STATE_EXC 0x02u + +#define OS_CONTEXT_STATE_FPSAVED 0x01u + +typedef struct OSContext { + u32 gpr[32]; + u32 cr; + u32 lr; + u32 ctr; + u32 xer; + + f64 fpr[32]; + + u32 fpscr_pad; + u32 fpscr; + + u32 srr0; + u32 srr1; + + u16 mode; + u16 state; + + u32 gqr[8]; + u32 psf_pad; + f64 psf[32]; + +} OSContext; + +u32 OSSaveContext(OSContext* context); +void OSClearContext(OSContext* context); +OSContext* OSGetCurrentContext(); +void OSSetCurrentContext(OSContext* context); + +typedef struct OSAlarm OSAlarm; +typedef void (*OSAlarmHandler)(OSAlarm* alarm, OSContext* context); + +struct OSAlarm { + OSAlarmHandler handler; + u32 tag; + OSTime fire; + OSAlarm* prev; + OSAlarm* next; + OSTime period; + OSTime start; +}; + +void OSInitAlarm(void); +void OSSetAlarm(OSAlarm* alarm, OSTime tick, OSAlarmHandler handler); +void OSSetAlarmTag(OSAlarm* alarm, u32 tag); +void OSSetAbsAlarm(OSAlarm* alarm, OSTime time, OSAlarmHandler handler); +void OSSetPeriodicAlarm(OSAlarm* alarm, OSTime start, OSTime period, OSAlarmHandler handler); +void OSCreateAlarm(OSAlarm* alarm); +void OSCancelAlarm(OSAlarm* alarm); +void OSCancelAlarms(u32 tag); + +BOOL OSCheckAlarmQueue(void); + + +typedef int OSHeapHandle; +typedef void (*OSAllocVisitor)(void* obj, u32 size); +void* OSInitAlloc(void* arenaStart, void* arenaEnd, int maxHeaps); +OSHeapHandle OSCreateHeap(void* start, void* end); +void OSDestroyHeap(OSHeapHandle heap); +void OSAddToHeap(OSHeapHandle heap, void* start, void* end); +OSHeapHandle OSSetCurrentHeap(OSHeapHandle heap); +void* OSAllocFromHeap(OSHeapHandle heap, u32 size); +void* OSAllocFixed(void** rstart, void** rend); +void OSFreeToHeap(OSHeapHandle heap, void* ptr); +long OSCheckHeap(OSHeapHandle heap); +void OSDumpHeap(OSHeapHandle heap); +void *OSAllocFixed(void **rstart, void **rend); +u32 OSReferentSize(void* ptr); +void OSVisitAllocated(OSAllocVisitor visitor); +extern volatile OSHeapHandle __OSCurrHeap; +#define OSAlloc(size) OSAllocFromHeap(__OSCurrHeap, (size)) +#define OSFree(ptr) OSFreeToHeap(__OSCurrHeap, (ptr)) + + +void* OSGetArenaHi(void); +void* OSGetArenaLo(void); +void OSSetArenaHi(void* addr); +void OSSetArenaLo(void* addr); +void* OSAllocFromArenaLo(u32 size, u32 align); +void* OSAllocFromArenaLo(u32 size, u32 align); + + +void DCInvalidateRange(void* addr, u32 nBytes); +void DCFlushRange(void* addr, u32 nBytes); +void DCStoreRange(void* addr, u32 nBytes); +void DCFlushRangeNoSync(void* addr, u32 nBytes); +void DCStoreRangeNoSync(void* addr, u32 nBytes); +void DCZeroRange(void* addr, u32 nBytes); +void DCTouchRange(void* addr, u32 nBytes); +void ICInvalidateRange(void* addr, u32 nBytes); + +#define LC_BASE_PREFIX 0xE000 +#define LC_BASE (LC_BASE_PREFIX << 16) +#define LCGetBase() ((void*)LC_BASE) + +void LCEnable(); +void LCDisable(void); +void LCLoadBlocks(void* destTag, void* srcAddr, u32 numBlocks); +void LCStoreBlocks(void* destAddr, void* srcTag, u32 numBlocks); +u32 LCLoadData(void* destAddr, void* srcAddr, u32 nBytes); +u32 LCStoreData(void* destAddr, void* srcAddr, u32 nBytes); +u32 LCQueueLength(void); +void LCQueueWait(u32 len); +void LCFlushQueue(void); + + + +#define OS_ERROR_SYSTEM_RESET 0 +#define OS_ERROR_MACHINE_CHECK 1 +#define OS_ERROR_DSI 2 +#define OS_ERROR_ISI 3 +#define OS_ERROR_EXTERNAL_INTERRUPT 4 +#define OS_ERROR_ALIGNMENT 5 +#define OS_ERROR_PROGRAM 6 +#define OS_ERROR_FLOATING_POINT 7 +#define OS_ERROR_DECREMENTER 8 +#define OS_ERROR_SYSTEM_CALL 9 +#define OS_ERROR_TRACE 10 +#define OS_ERROR_PERFORMACE_MONITOR 11 +#define OS_ERROR_BREAKPOINT 12 +#define OS_ERROR_SYSTEM_INTERRUPT 13 +#define OS_ERROR_THERMAL_INTERRUPT 14 +#define OS_ERROR_PROTECTION 15 +#define OS_ERROR_FPE 16 + +#define OS_ERROR_MAX (OS_ERROR_FPE + 1) + +typedef u16 OSError; +typedef void (*OSErrorHandler)( OSError error, OSContext* context, ... ); + +OSErrorHandler OSSetErrorHandler(OSError code, OSErrorHandler handler); + + + +/* "include\dolphin\os\OSException.h" line 4 "dolphin/os/OSContext.h" */ +/* end "dolphin/os/OSContext.h" */ +/* "include\dolphin\os\OSException.h" line 5 "dolphin/types.h" */ +/* end "dolphin/types.h" */ + +#define __OS_EXCEPTION_SYSTEM_RESET 0 +#define __OS_EXCEPTION_MACHINE_CHECK 1 +#define __OS_EXCEPTION_DSI 2 +#define __OS_EXCEPTION_ISI 3 +#define __OS_EXCEPTION_EXTERNAL_INTERRUPT 4 +#define __OS_EXCEPTION_ALIGNMENT 5 +#define __OS_EXCEPTION_PROGRAM 6 +#define __OS_EXCEPTION_FLOATING_POINT 7 +#define __OS_EXCEPTION_DECREMENTER 8 +#define __OS_EXCEPTION_SYSTEM_CALL 9 +#define __OS_EXCEPTION_TRACE 10 +#define __OS_EXCEPTION_PERFORMACE_MONITOR 11 +#define __OS_EXCEPTION_BREAKPOINT 12 +#define __OS_EXCEPTION_SYSTEM_INTERRUPT 13 +#define __OS_EXCEPTION_THERMAL_INTERRUPT 14 +#define __OS_EXCEPTION_MAX \ + (__OS_EXCEPTION_THERMAL_INTERRUPT+1) + +typedef u8 __OSException; +typedef void (*__OSExceptionHandler)(__OSException exception, OSContext* context); + +#define OS_EXCEPTION_SAVE_GPRS(context) \ + stw r0, OS_CONTEXT_R0(context); \ + stw r1, OS_CONTEXT_R1(context); \ + stw r2, OS_CONTEXT_R2(context); \ + stmw r6, OS_CONTEXT_R6(context); \ + mfspr r0, GQR1; \ + stw r0, OS_CONTEXT_GQR1(context); \ + mfspr r0, GQR2; \ + stw r0, OS_CONTEXT_GQR2(context); \ + mfspr r0, GQR3; \ + stw r0, OS_CONTEXT_GQR3(context); \ + mfspr r0, GQR4; \ + stw r0, OS_CONTEXT_GQR4(context); \ + mfspr r0, GQR5; \ + stw r0, OS_CONTEXT_GQR5(context); \ + mfspr r0, GQR6; \ + stw r0, OS_CONTEXT_GQR6(context); \ + mfspr r0, GQR7; \ + stw r0, OS_CONTEXT_GQR7(context); + + +#define EXI_MEMORY_CARD_59 0x00000004 +#define EXI_MEMORY_CARD_123 0x00000008 +#define EXI_MEMORY_CARD_251 0x00000010 +#define EXI_MEMORY_CARD_507 0x00000020 + +#define EXI_MEMORY_CARD_1019 0x00000040 +#define EXI_MEMORY_CARD_2043 0x00000080 + +#define EXI_MEMORY_CARD_1019A 0x00000140 +#define EXI_MEMORY_CARD_1019B 0x00000240 +#define EXI_MEMORY_CARD_1019C 0x00000340 +#define EXI_MEMORY_CARD_1019D 0x00000440 +#define EXI_MEMORY_CARD_1019E 0x00000540 +#define EXI_MEMORY_CARD_1019F 0x00000640 +#define EXI_MEMORY_CARD_1019G 0x00000740 + +#define EXI_MEMORY_CARD_2043A 0x00000180 +#define EXI_MEMORY_CARD_2043B 0x00000280 +#define EXI_MEMORY_CARD_2043C 0x00000380 +#define EXI_MEMORY_CARD_2043D 0x00000480 +#define EXI_MEMORY_CARD_2043E 0x00000580 +#define EXI_MEMORY_CARD_2043F 0x00000680 +#define EXI_MEMORY_CARD_2043G 0x00000780 + +#define EXI_USB_ADAPTER 0x01010000 +#define EXI_NPDP_GDEV 0x01020000 + +#define EXI_MODEM 0x02020000 +#define EXI_ETHER 0x04020200 +#define EXI_ETHER_VIEWER 0x04220001 +#define EXI_STREAM_HANGER 0x04130000 + +#define EXI_MARLIN 0x03010000 + +#define EXI_IS_VIEWER 0x05070000 + +#define EXI_FREQ_1M 0 +#define EXI_FREQ_2M 1 +#define EXI_FREQ_4M 2 +#define EXI_FREQ_8M 3 +#define EXI_FREQ_16M 4 +#define EXI_FREQ_32M 5 + +#define EXI_READ 0 +#define EXI_WRITE 1 + +#define EXI_STATE_IDLE 0x00 +#define EXI_STATE_DMA 0x01 +#define EXI_STATE_IMM 0x02 +#define EXI_STATE_BUSY (EXI_STATE_DMA | EXI_STATE_IMM) +#define EXI_STATE_SELECTED 0x04 +#define EXI_STATE_ATTACHED 0x08 +#define EXI_STATE_LOCKED 0x10 + +BOOL EXIProbe(s32 chan); +s32 EXIProbeEx(s32 chan); + +s32 EXIGetType(s32 chan, u32 dev, u32* type); +char* EXIGetTypeString(u32 type); +u32 EXIClearInterrupts(s32 chan, BOOL exi, BOOL tc, BOOL ext); +s32 EXIGetID(s32 chan, u32 dev, u32* id); + +typedef void (*EXICallback)(s32 chan, OSContext* context); + + + +#define OS_GQR_F32 0x0000 +#define OS_GQR_U8 0x0004 +#define OS_GQR_U16 0x0005 +#define OS_GQR_S8 0x0006 +#define OS_GQR_S16 0x0007 + +#define OS_FASTCAST_U8 2 +#define OS_FASTCAST_U16 3 +#define OS_FASTCAST_S8 4 +#define OS_FASTCAST_S16 5 +// clang-format off +static inline void OSInitFastCast(void) { +} +// clang-format off + +static inline s16 __OSf32tos16(register f32 inF) +{ + u32 tmp; + register u32* tmpPtr = &tmp; + register s16 out; + // clang-format off + // clang-format on + + return out; +} + +static inline void OSf32tos16(f32 *f, s16 *out) { *out = __OSf32tos16(*f); } + +static inline u8 __OSf32tou8(register f32 inF) +{ + u32 tmp; + register u32 *tmpPtr = &tmp; + register u8 out; + // clang-format off + // clang-format on + + return out; +} + +static inline void OSf32tou8(f32 *f, u8 *out) { *out = __OSf32tou8(*f); } + +static inline s8 __OSf32tos8(register f32 inF) +{ + u32 tmp; + register u32 *tmpPtr = &tmp; + register s8 out; + // clang-format off + // clang-format on + + return out; +} + +static inline void OSf32tos8(f32 *f, s8 *out) { *out = __OSf32tos8(*f); } + +static inline u16 __OSf32tou16(register f32 inF) +{ + u32 tmp; + register u32 *tmpPtr = &tmp; + register u16 out; + // clang-format off + // clang-format on + + return out; +} + +static inline void OSf32tou16(f32 *f, u16 *out) { *out = __OSf32tou16(*f); } + +static inline float __OSs8tof32(register const s8* arg) { + register float ret; + + + return ret; +} + +static inline void OSs8tof32(const s8* in, float* out) { *out = __OSs8tof32(in); } + +static inline float __OSs16tof32(register const s16* arg) { + register float ret; + + + return ret; +} + +static inline void OSs16tof32(const s16* in, float* out) { *out = __OSs16tof32(in); } + +static inline float __OSu8tof32(register const u8* arg) { + register float ret; + + return ret; +} + +static inline void OSu8tof32(const u8* in, float* out) { *out = __OSu8tof32(in); } + +static inline float __OSu16tof32(register const u16* arg) { + register float ret; + + return ret; +} + +static inline void OSu16tof32(const u16* in, float* out) { *out = __OSu16tof32(in); } + +#define OS_FONT_ENCODE_ANSI 0u +#define OS_FONT_ENCODE_SJIS 1u +#define OS_FONT_ENCODE_UTF8 3u // UTF-8 [RFC 3629] +#define OS_FONT_ENCODE_UTF16 4u // UTF-16BE [RFC 2781] +#define OS_FONT_ENCODE_UTF32 5u // UTF-32 +#define OS_FONT_ENCODE_MAX 5u +#define OS_FONT_ENCODE_VOID 0xffffu + +#define OS_FONT_PROPORTIONAL FALSE +#define OS_FONT_FIXED TRUE + +u16 OSGetFontEncode(void); +u16 OSSetFontEncode(u16 encode); + +#define __OS_INTERRUPT_MEM_0 0 +#define __OS_INTERRUPT_MEM_1 1 +#define __OS_INTERRUPT_MEM_2 2 +#define __OS_INTERRUPT_MEM_3 3 +#define __OS_INTERRUPT_MEM_ADDRESS 4 +#define __OS_INTERRUPT_DSP_AI 5 +#define __OS_INTERRUPT_DSP_ARAM 6 +#define __OS_INTERRUPT_DSP_DSP 7 +#define __OS_INTERRUPT_AI_AI 8 +#define __OS_INTERRUPT_EXI_0_EXI 9 +#define __OS_INTERRUPT_EXI_0_TC 10 +#define __OS_INTERRUPT_EXI_0_EXT 11 +#define __OS_INTERRUPT_EXI_1_EXI 12 +#define __OS_INTERRUPT_EXI_1_TC 13 +#define __OS_INTERRUPT_EXI_1_EXT 14 +#define __OS_INTERRUPT_EXI_2_EXI 15 +#define __OS_INTERRUPT_EXI_2_TC 16 +#define __OS_INTERRUPT_PI_CP 17 +#define __OS_INTERRUPT_PI_PE_TOKEN 18 +#define __OS_INTERRUPT_PI_PE_FINISH 19 +#define __OS_INTERRUPT_PI_SI 20 +#define __OS_INTERRUPT_PI_DI 21 +#define __OS_INTERRUPT_PI_RSW 22 +#define __OS_INTERRUPT_PI_ERROR 23 +#define __OS_INTERRUPT_PI_VI 24 +#define __OS_INTERRUPT_PI_DEBUG 25 +#define __OS_INTERRUPT_PI_HSP 26 +#define __OS_INTERRUPT_MAX 32 + +#define OS_INTERRUPTMASK(interrupt) (0x80000000u >> (interrupt)) + +#define OS_INTERRUPTMASK_MEM_0 OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_0) +#define OS_INTERRUPTMASK_MEM_1 OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_1) +#define OS_INTERRUPTMASK_MEM_2 OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_2) +#define OS_INTERRUPTMASK_MEM_3 OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_3) +#define OS_INTERRUPTMASK_MEM_ADDRESS OS_INTERRUPTMASK(__OS_INTERRUPT_MEM_ADDRESS) +#define OS_INTERRUPTMASK_MEM \ + (OS_INTERRUPTMASK_MEM_0 | OS_INTERRUPTMASK_MEM_1 | OS_INTERRUPTMASK_MEM_2 | \ + OS_INTERRUPTMASK_MEM_3 | OS_INTERRUPTMASK_MEM_ADDRESS) +#define OS_INTERRUPTMASK_DSP_AI OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_AI) +#define OS_INTERRUPTMASK_DSP_ARAM OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_ARAM) +#define OS_INTERRUPTMASK_DSP_DSP OS_INTERRUPTMASK(__OS_INTERRUPT_DSP_DSP) +#define OS_INTERRUPTMASK_DSP \ + (OS_INTERRUPTMASK_DSP_AI | OS_INTERRUPTMASK_DSP_ARAM | OS_INTERRUPTMASK_DSP_DSP) +#define OS_INTERRUPTMASK_AI_AI OS_INTERRUPTMASK(__OS_INTERRUPT_AI_AI) +#define OS_INTERRUPTMASK_AI (OS_INTERRUPTMASK_AI_AI) +#define OS_INTERRUPTMASK_EXI_0_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_EXI) +#define OS_INTERRUPTMASK_EXI_0_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_TC) +#define OS_INTERRUPTMASK_EXI_0_EXT OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_0_EXT) +#define OS_INTERRUPTMASK_EXI_0 \ + (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT) +#define OS_INTERRUPTMASK_EXI_1_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_EXI) +#define OS_INTERRUPTMASK_EXI_1_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_TC) +#define OS_INTERRUPTMASK_EXI_1_EXT OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_1_EXT) +#define OS_INTERRUPTMASK_EXI_1 \ + (OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT) +#define OS_INTERRUPTMASK_EXI_2_EXI OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_2_EXI) +#define OS_INTERRUPTMASK_EXI_2_TC OS_INTERRUPTMASK(__OS_INTERRUPT_EXI_2_TC) +#define OS_INTERRUPTMASK_EXI_2 (OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC) +#define OS_INTERRUPTMASK_EXI \ + (OS_INTERRUPTMASK_EXI_0_EXI | OS_INTERRUPTMASK_EXI_0_TC | OS_INTERRUPTMASK_EXI_0_EXT | \ + OS_INTERRUPTMASK_EXI_1_EXI | OS_INTERRUPTMASK_EXI_1_TC | OS_INTERRUPTMASK_EXI_1_EXT | \ + OS_INTERRUPTMASK_EXI_2_EXI | OS_INTERRUPTMASK_EXI_2_TC) +#define OS_INTERRUPTMASK_PI_PE_TOKEN OS_INTERRUPTMASK(__OS_INTERRUPT_PI_PE_TOKEN) +#define OS_INTERRUPTMASK_PI_PE_FINISH OS_INTERRUPTMASK(__OS_INTERRUPT_PI_PE_FINISH) +#define OS_INTERRUPTMASK_PI_PE (OS_INTERRUPTMASK_PI_PE_TOKEN | OS_INTERRUPTMASK_PI_PE_FINISH) +#define OS_INTERRUPTMASK_PI_CP OS_INTERRUPTMASK(__OS_INTERRUPT_PI_CP) +#define OS_INTERRUPTMASK_PI_SI OS_INTERRUPTMASK(__OS_INTERRUPT_PI_SI) +#define OS_INTERRUPTMASK_PI_DI OS_INTERRUPTMASK(__OS_INTERRUPT_PI_DI) +#define OS_INTERRUPTMASK_PI_RSW OS_INTERRUPTMASK(__OS_INTERRUPT_PI_RSW) +#define OS_INTERRUPTMASK_PI_ERROR OS_INTERRUPTMASK(__OS_INTERRUPT_PI_ERROR) +#define OS_INTERRUPTMASK_PI_VI OS_INTERRUPTMASK(__OS_INTERRUPT_PI_VI) +#define OS_INTERRUPTMASK_PI_DEBUG OS_INTERRUPTMASK(__OS_INTERRUPT_PI_DEBUG) +#define OS_INTERRUPTMASK_PI_HSP OS_INTERRUPTMASK(__OS_INTERRUPT_PI_HSP) +#define OS_INTERRUPTMASK_PI \ + (OS_INTERRUPTMASK_PI_CP | OS_INTERRUPTMASK_PI_SI | OS_INTERRUPTMASK_PI_DI | \ + OS_INTERRUPTMASK_PI_RSW | OS_INTERRUPTMASK_PI_ERROR | OS_INTERRUPTMASK_PI_VI | \ + OS_INTERRUPTMASK_PI_PE_TOKEN | OS_INTERRUPTMASK_PI_PE_FINISH | OS_INTERRUPTMASK_PI_DEBUG | \ + OS_INTERRUPTMASK_PI_HSP) + +typedef s16 __OSInterrupt; +typedef void (*__OSInterruptHandler)(__OSInterrupt interrupt, OSContext* context); + +typedef u32 OSInterruptMask; + +extern volatile __OSInterrupt __OSLastInterrupt; +extern volatile u32 __OSLastInterruptSrr0; +extern volatile OSTime __OSLastInterruptTime; + +__OSInterruptHandler __OSSetInterruptHandler(__OSInterrupt interrupt, __OSInterruptHandler handler); + +__OSInterruptHandler __OSGetInterruptHandler(__OSInterrupt interrupt); + +void __OSDispatchInterrupt(__OSException exception, OSContext* context); + +OSInterruptMask OSGetInterruptMask(void); +OSInterruptMask OSSetInterruptMask(OSInterruptMask mask); +OSInterruptMask __OSMaskInterrupts(OSInterruptMask mask); +OSInterruptMask __OSUnmaskInterrupts(OSInterruptMask mask); + + +#define OS_PROTECT_CHAN0 0 +#define OS_PROTECT_CHAN1 1 +#define OS_PROTECT_CHAN2 2 +#define OS_PROTECT_CHAN3 3 + +#define OS_PROTECT_CONTROL_NONE 0x00 +#define OS_PROTECT_CONTROL_READ 0x01 +#define OS_PROTECT_CONTROL_WRITE 0x02 +#define OS_PROTECT_CONTROL_RDWR (OS_PROTECT_CONTROL_READ | OS_PROTECT_CONTROL_WRITE) + +void OSProtectRange(u32 chan, void* addr, u32 nBytes, u32 control); + + +typedef struct OSThread OSThread; +typedef struct OSThreadQueue OSThreadQueue; +typedef struct OSThreadLink OSThreadLink; +typedef s32 OSPriority; // 0 highest, 31 lowest + +typedef struct OSMutex OSMutex; +typedef struct OSMutexQueue OSMutexQueue; +typedef struct OSMutexLink OSMutexLink; +typedef struct OSCond OSCond; + +typedef void (*OSIdleFunction)(void* param); +typedef void (*OSSwitchThreadCallback)(OSThread* from, OSThread* to); + +struct OSThreadQueue { + OSThread* head; + OSThread* tail; +}; + +struct OSThreadLink { + OSThread* next; + OSThread* prev; +}; + +struct OSMutexQueue { + OSMutex* head; + OSMutex* tail; +}; + +struct OSMutexLink { + OSMutex* next; + OSMutex* prev; +}; + +struct OSThread { + OSContext context; + u16 state; + u16 attr; + s32 suspend; + OSPriority priority; + OSPriority base; + void* val; + OSThreadQueue* queue; + OSThreadLink link; + OSThreadQueue queueJoin; + OSMutex* mutex; + OSMutexQueue queueMutex; + OSThreadLink linkActive; + u8* stackBase; + u32* stackEnd; +}; + +enum OS_THREAD_STATE { + OS_THREAD_STATE_READY = 1, + OS_THREAD_STATE_RUNNING = 2, + OS_THREAD_STATE_WAITING = 4, + OS_THREAD_STATE_MORIBUND = 8 +}; + +#define OS_THREAD_ATTR_DETACH 0x0001u + +#define OS_THREAD_STACK_MAGIC 0xDEADBABE + +#define OS_PRIORITY_MIN 0 // highest +#define OS_PRIORITY_MAX 31 // lowest +#define OS_PRIORITY_IDLE OS_PRIORITY_MAX + + +void OSInitThreadQueue(OSThreadQueue* queue); +OSThread* OSGetCurrentThread(void); +BOOL OSIsThreadSuspended(OSThread* thread); +BOOL OSIsThreadTerminated(OSThread* thread); +s32 OSDisableScheduler(void); +s32 OSEnableScheduler(void); +void OSYieldThread(void); +BOOL OSCreateThread(OSThread* thread, void* (*func)(void*), void* param, void* stack, u32 stackSize, + OSPriority priority, u16 attr); +void OSExitThread(void* val); +void OSCancelThread(OSThread* thread); +BOOL OSJoinThread(OSThread* thread, void** val); +void OSDetachThread(OSThread* thread); +s32 OSResumeThread(OSThread* thread); +s32 OSSuspendThread(OSThread* thread); +BOOL OSSetThreadPriority(OSThread* thread, OSPriority priority); +OSPriority OSGetThreadPriority(OSThread* thread); +void OSSleepThread(OSThreadQueue* queue); +void OSWakeupThread(OSThreadQueue* queue); + +OSThread* OSSetIdleFunction(OSIdleFunction idleFunction, void* param, void* stack, u32 stackSize); +OSThread* OSGetIdleFunction(void); +void OSClearStack(u8 val); +long OSCheckActiveThreads(void); + +/* end "dolphin/os/OSThread.h" */ +typedef struct OSMessageQueue OSMessageQueue; +typedef void* OSMessage; + +struct OSMessageQueue { + OSThreadQueue queueSend; + OSThreadQueue queueReceive; + OSMessage* msgArray; + s32 msgCount; + s32 firstIndex; + s32 usedCount; +}; + +// Flags to turn blocking on/off when sending/receiving message +#define OS_MESSAGE_NOBLOCK 0 +#define OS_MESSAGE_BLOCK 1 + +void OSInitMessageQueue(OSMessageQueue* mq, OSMessage* msgArray, s32 msgCount); +BOOL OSSendMessage(OSMessageQueue* mq, OSMessage msg, s32 flags); +BOOL OSJamMessage(OSMessageQueue* mq, OSMessage msg, s32 flags); +BOOL OSReceiveMessage(OSMessageQueue* mq, OSMessage* msg, s32 flags); + + +#define OS_MODULE_VERSION 2 +typedef struct OSModuleHeader OSModuleHeader; + +typedef u32 OSModuleID; +typedef struct OSModuleQueue OSModuleQueue; +typedef struct OSModuleLink OSModuleLink; +typedef struct OSModuleInfo OSModuleInfo; +typedef struct OSSectionInfo OSSectionInfo; +typedef struct OSImportInfo OSImportInfo; +typedef struct OSRel OSRel; + +struct OSModuleQueue { + OSModuleInfo* head; + OSModuleInfo* tail; +}; + +struct OSModuleLink { + OSModuleInfo* next; + OSModuleInfo* prev; +}; + +struct OSModuleInfo { + OSModuleID id; // unique identifier for the module + OSModuleLink link; // doubly linked list of modules + u32 numSections; // # of sections + u32 sectionInfoOffset; // offset to section info table + u32 nameOffset; // offset to module name + u32 nameSize; // size of module name + u32 version; // version number +}; + +struct OSModuleHeader { + // CAUTION: info must be the 1st member + OSModuleInfo info; + + // OS_MODULE_VERSION == 1 + u32 bssSize; // total size of bss sections in bytes + u32 relOffset; + u32 impOffset; + u32 impSize; // size in bytes + u8 prologSection; // section # for prolog function + u8 epilogSection; // section # for epilog function + u8 unresolvedSection; // section # for unresolved function + u8 bssSection; // section # for bss section (set at run-time) + u32 prolog; // prolog function offset + u32 epilog; // epilog function offset + u32 unresolved; // unresolved function offset + + // OS_MODULE_VERSION == 2 + u32 align; // module alignment constraint + u32 bssAlign; // bss alignment constraint + + // OS_MODULE_VERSION == 3 +}; + +#define OSGetSectionInfo(module) ((OSSectionInfo*)(((OSModuleInfo*)(module))->sectionInfoOffset)) + +struct OSSectionInfo { + u32 offset; + u32 size; +}; + +// OSSectionInfo.offset bit +#define OS_SECTIONINFO_EXEC 0x1 +#define OS_SECTIONINFO_OFFSET(offset) ((offset) & ~0x1) + +struct OSImportInfo { + OSModuleID id; // external module id + u32 offset; // offset to OSRel instructions +}; + +struct OSRel { + u16 offset; // byte offset from the previous entry + u8 type; + u8 section; + u32 addend; +}; + +#define R_DOLPHIN_NOP 201 // C9h current offset += OSRel.offset +#define R_DOLPHIN_SECTION 202 // CAh current section = OSRel.section +#define R_DOLPHIN_END 203 // CBh +#define R_DOLPHIN_MRKREF 204 // CCh + +void OSSetStringTable(const void* stringTable); +BOOL OSLink(OSModuleInfo* newModule, void* bss); +BOOL OSUnlink(OSModuleInfo* oldModule); + +OSModuleInfo* OSSearchModule(void* ptr, u32* section, u32* offset); + +// debugger notification +void OSNotifyLink(OSModuleInfo* module); +void OSNotifyUnlink(OSModuleInfo* module); + +struct OSMutex { + OSThreadQueue queue; + OSThread* thread; // the current owner + s32 count; // lock count + OSMutexLink link; // for OSThread.queueMutex +}; + +struct OSCond { + OSThreadQueue queue; +}; + +void OSInitMutex(OSMutex* mutex); +void OSLockMutex(OSMutex* mutex); +void OSUnlockMutex(OSMutex* mutex); +BOOL OSTryLockMutex(OSMutex* mutex); +void OSInitCond(OSCond* cond); +void OSWaitCond(OSCond* cond, OSMutex* mutex); +void OSSignalCond(OSCond* cond); + +#define OS_RESETCODE_RESTART 0x80000000 +#define OS_RESETCODE_SYSTEM 0x40000000 + +#define OS_RESETCODE_EXEC 0xC0000000 +#define OS_RESETCODE_NETCONFIG 0xC0010000 + +#define OS_RESET_TIMEOUT OSMillisecondsToTicks(1000) + +#define OS_RESET_RESTART 0 +#define OS_RESET_HOTRESET 1 +#define OS_RESET_SHUTDOWN 2 + +#define OS_RESET_PRIO_SO 110 +#define OS_RESET_PRIO_IP 111 +#define OS_RESET_PRIO_CARD 127 +#define OS_RESET_PRIO_PAD 127 +#define OS_RESET_PRIO_GX 127 +#define OS_RESET_PRIO_ALARM 4294967295 + +typedef BOOL (*OSResetFunction)(BOOL final); +typedef struct OSResetFunctionInfo OSResetFunctionInfo; + +struct OSResetFunctionInfo { + // public + OSResetFunction func; + u32 priority; + + // private + OSResetFunctionInfo* next; + OSResetFunctionInfo* prev; +}; + +u32 OSGetResetCode(void); + +typedef void (*OSResetCallback)(void); + +BOOL OSGetResetButtonState(void); + +BOOL OSGetResetSwitchState(void); +OSResetCallback OSSetResetCallback(OSResetCallback callback); + +#define SI_MAX_CHAN 4 +#define SI_MAX_COMCSR_INLNGTH 128 +#define SI_MAX_COMCSR_OUTLNGTH 128 +#define SI_ERROR_UNDER_RUN 0x0001 +#define SI_ERROR_OVER_RUN 0x0002 +#define SI_ERROR_COLLISION 0x0004 +#define SI_ERROR_NO_RESPONSE 0x0008 +#define SI_ERROR_WRST 0x0010 +#define SI_ERROR_RDST 0x0020 +#define SI_ERROR_UNKNOWN 0x0040 +#define SI_ERROR_BUSY 0x0080 +#define SI_CHAN0 0 +#define SI_CHAN1 1 +#define SI_CHAN2 2 +#define SI_CHAN3 3 +#define SI_CHAN0_BIT 0x80000000 +#define SI_CHAN1_BIT 0x40000000 +#define SI_CHAN2_BIT 0x20000000 +#define SI_CHAN3_BIT 0x10000000 +#define SI_CHAN_BIT(chan) (SI_CHAN0_BIT >> (chan)) +#define SI_TYPE_MASK 0x18000000u +#define SI_TYPE_N64 0x00000000u +#define SI_TYPE_DOLPHIN 0x08000000u +#define SI_TYPE_GC SI_TYPE_DOLPHIN +#define SI_GC_WIRELESS 0x80000000 +#define SI_GC_NOMOTOR 0x20000000 +#define SI_GC_STANDARD 0x01000000 +#define SI_WIRELESS_RECEIVED 0x40000000 +#define SI_WIRELESS_IR 0x04000000 +#define SI_WIRELESS_STATE 0x02000000 +#define SI_WIRELESS_ORIGIN 0x00200000 +#define SI_WIRELESS_FIX_ID 0x00100000 +#define SI_WIRELESS_TYPE 0x000f0000 +#define SI_WIRELESS_LITE_MASK 0x000c0000 +#define SI_WIRELESS_LITE 0x00040000 +#define SI_WIRELESS_CONT_MASK 0x00080000 +#define SI_WIRELESS_CONT 0x00000000 +#define SI_WIRELESS_ID 0x00c0ff00 +#define SI_WIRELESS_TYPE_ID (SI_WIRELESS_TYPE | SI_WIRELESS_ID) +#define SI_N64_CONTROLLER (SI_TYPE_N64 | 0x05000000) +#define SI_N64_MIC (SI_TYPE_N64 | 0x00010000) +#define SI_N64_KEYBOARD (SI_TYPE_N64 | 0x00020000) +#define SI_N64_MOUSE (SI_TYPE_N64 | 0x02000000) +#define SI_GBA (SI_TYPE_N64 | 0x00040000) +#define SI_GC_CONTROLLER (SI_TYPE_GC | SI_GC_STANDARD) +#define SI_GC_RECEIVER (SI_TYPE_GC | SI_GC_WIRELESS) +#define SI_GC_WAVEBIRD \ + (SI_TYPE_GC | SI_GC_WIRELESS | SI_GC_STANDARD | SI_WIRELESS_STATE | SI_WIRELESS_FIX_ID) +#define SI_GC_KEYBOARD (SI_TYPE_GC | 0x00200000) +#define SI_GC_STEERING (SI_TYPE_GC | 0x00000000) + +u32 SIProbe(s32 chan); +char* SIGetTypeString(u32 type); +void SIRefreshSamplingRate(void); +void SISetSamplingRate(u32 msec); + +#define DVD_MIN_TRANSFER_SIZE 32 + +#define DVD_STATE_FATAL_ERROR -1 +#define DVD_STATE_END 0 +#define DVD_STATE_BUSY 1 +#define DVD_STATE_WAITING 2 +#define DVD_STATE_COVER_CLOSED 3 +#define DVD_STATE_NO_DISK 4 +#define DVD_STATE_COVER_OPEN 5 +#define DVD_STATE_WRONG_DISK 6 +#define DVD_STATE_MOTOR_STOPPED 7 +#define DVD_STATE_PAUSING 8 +#define DVD_STATE_IGNORED 9 +#define DVD_STATE_CANCELED 10 +#define DVD_STATE_RETRY 11 + +#define DVD_FILEINFO_READY 0 +#define DVD_FILEINFO_BUSY 1 + +#define DVD_RESULT_GOOD 0 +#define DVD_RESULT_FATAL_ERROR -1 +#define DVD_RESULT_IGNORED -2 +#define DVD_RESULT_CANCELED -3 + +#define DVD_AIS_SUCCESS 0x0 + +typedef struct DVDDiskID { + char gameName[4]; + char company[2]; + u8 diskNumber; + u8 gameVersion; + u8 streaming; + u8 streamingBufSize; // 0 = default + u8 padding[22]; // 0's are stored +} DVDDiskID; + +typedef struct DVDCommandBlock DVDCommandBlock; + +typedef void (*DVDCBCallback)(s32 result, DVDCommandBlock* block); + +struct DVDCommandBlock { + DVDCommandBlock* next; + DVDCommandBlock* prev; + u32 command; + s32 state; + u32 offset; + u32 length; + void* addr; + u32 currTransferSize; + u32 transferredSize; + DVDDiskID* id; + DVDCBCallback callback; + void* userData; +}; + +typedef struct DVDFileInfo DVDFileInfo; + +typedef void (*DVDCallback)(s32 result, DVDFileInfo* fileInfo); + +struct DVDFileInfo { + DVDCommandBlock cb; + u32 startAddr; + u32 length; + DVDCallback callback; +}; + +typedef struct { + u32 entryNum; + u32 location; + u32 next; +} DVDDir; + +typedef struct { + u32 entryNum; + BOOL isDir; + char* name; +} DVDDirEntry; + +void DVDInit(); +BOOL DVDClose(DVDFileInfo* f); +BOOL DVDSetAutoFatalMessaging(BOOL); +void DVDReset(); +s32 DVDCancel(DVDCommandBlock* block); +BOOL DVDOpen(char* fileName, DVDFileInfo* fileInfo); +BOOL DVDFastOpen(s32 entrynum, DVDFileInfo* fileInfo); +s32 DVDGetCommandBlockStatus(const DVDCommandBlock* block); +BOOL DVDCancelAsync(DVDCommandBlock* block, DVDCBCallback callback); +s32 DVDCancel(DVDCommandBlock* block); +BOOL DVDCancelAllAsync(DVDCBCallback callback); +s32 DVDCancelAll(void); +BOOL DVDPrepareStreamAsync(DVDFileInfo* fInfo, u32 length, u32 offset, DVDCallback callback); +s32 DVDPrepareStream(DVDFileInfo* fInfo, u32 length, u32 offset); + +BOOL DVDCancelStreamAsync(DVDCommandBlock* block, DVDCBCallback callback); +s32 DVDCancelStream(DVDCommandBlock* block); + +BOOL DVDStopStreamAtEndAsync(DVDCommandBlock* block, DVDCBCallback callback); +s32 DVDStopStreamAtEnd(DVDCommandBlock* block); + +BOOL DVDGetStreamErrorStatusAsync(DVDCommandBlock* block, DVDCBCallback callback); +s32 DVDGetStreamErrorStatus(DVDCommandBlock* block); + +BOOL DVDGetStreamPlayAddrAsync(DVDCommandBlock* block, DVDCBCallback callback); +s32 DVDGetStreamPlayAddr(DVDCommandBlock* block); + +s32 DVDGetDriveStatus(); + +s32 DVDConvertPathToEntrynum(char* pathPtr); + +BOOL DVDReadAsyncPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, + DVDCallback callback, s32 prio); + +BOOL DVDReadPrio(DVDFileInfo* fileInfo, void* addr, s32 length, s32 offset, s32 prio); + + +#define DVDReadAsync(fileInfo, addr, length, offset, callback) \ + DVDReadAsyncPrio((fileInfo), (addr), (length), (offset), (callback), 2) +#define DVDRead(fileInfo, addr, length, offset) \ + DVDReadPrio((fileInfo), (addr), (length), (offset), 2) + +#define DVDSeekAsync(fileInfo, offset, callback) \ + DVDSeekAsyncPrio((fileInfo), (offset), (callback), 2) + +extern u32 __PADFixBits; + +#define PAD_SPEC_0 0 +#define PAD_SPEC_1 1 +#define PAD_SPEC_2 2 +#define PAD_SPEC_3 3 +#define PAD_SPEC_4 4 +#define PAD_SPEC_5 5 + +#define PAD_CHAN0 0 +#define PAD_CHAN1 1 +#define PAD_CHAN2 2 +#define PAD_CHAN3 3 +#define PAD_CHANMAX 4 + +#define PAD_MOTOR_STOP 0 +#define PAD_MOTOR_RUMBLE 1 +#define PAD_MOTOR_STOP_HARD 2 + +#define PAD_ERR_NONE 0 +#define PAD_ERR_NO_CONTROLLER -1 +#define PAD_ERR_NOT_READY -2 +#define PAD_ERR_TRANSFER -3 + +#define PAD_BUTTON_LEFT 0x0001 +#define PAD_BUTTON_RIGHT 0x0002 +#define PAD_BUTTON_DOWN 0x0004 +#define PAD_BUTTON_UP 0x0008 +#define PAD_TRIGGER_Z 0x0010 +#define PAD_TRIGGER_R 0x0020 +#define PAD_TRIGGER_L 0x0040 +#define PAD_BUTTON_A 0x0100 +#define PAD_BUTTON_B 0x0200 +#define PAD_BUTTON_X 0x0400 +#define PAD_BUTTON_Y 0x0800 +#define PAD_BUTTON_MENU 0x1000 +#define PAD_BUTTON_START 0x1000 + +#define PAD_CHAN0_BIT 0x80000000 +#define PAD_CHAN1_BIT 0x40000000 +#define PAD_CHAN2_BIT 0x20000000 +#define PAD_CHAN3_BIT 0x10000000 + +#define PADButtonDown(buttonLast, button) ((((buttonLast) ^ (button)) & (button))) + +#define PADButtonUp(buttonLast, button) ((((buttonLast) ^ (button)) & (buttonLast))) + + +typedef void (*PADSamplingCallback)(void); + +typedef struct PADStatus { + u16 button; + s8 stickX; + s8 stickY; + s8 substickX; + s8 substickY; + u8 triggerL; + u8 triggerR; + u8 analogA; + u8 analogB; + s8 err; +} PADStatus; + +BOOL PADInit(); +u32 PADRead(PADStatus* status); +BOOL PADReset(u32 mask); +BOOL PADRecalibrate(u32 mask); +void PADClamp(PADStatus* status); +void PADClampCircle(PADStatus* status); +void PADControlMotor(s32 chan, u32 cmd); +void PADSetSpec(u32 spec); +void PADControlAllMotors(const u32* cmdArr); +void PADSetAnalogMode(u32 mode); +PADSamplingCallback PADSetSamplingCallback(PADSamplingCallback); + + +typedef struct { + f32 x, y, z; +} Vec, *VecPtr, Point3d, *Point3dPtr; + +typedef struct { + s16 x; + s16 y; + s16 z; +} S16Vec, *S16VecPtr; + +typedef struct { + f32 x, y, z, w; +} Quaternion, *QuaternionPtr, Qtrn, *QtrnPtr; + +typedef f32 Mtx[3][4]; + +typedef f32 (*MtxPtr)[4]; + +typedef f32 ROMtx[4][3]; + +typedef f32 (*ROMtxPtr)[3]; + +typedef f32 Mtx44[4][4]; + +typedef f32 (*Mtx44Ptr)[4]; + + + + +#define GEKKO + +#define MTX_USE_PS + +#define MTX_PTR_OFFSET 3 + +#define MTX44_PTR_OFFSET 4 + +typedef struct { + + u32 numMtx; + MtxPtr stackBase; + MtxPtr stackPtr; + +} MtxStack, *MtxStackPtr; + +#define MTXDegToRad(a) ((a)*0.01745329252f) +#define MTXRadToDeg(a) ((a)*57.29577951f) +#define MTXRowCol(m, r, c) ((m)[(r)][(c)]) + +void C_MTXIdentity(Mtx m); +void C_MTXCopy(const Mtx src, Mtx dst); +void C_MTXConcat(const Mtx a, const Mtx b, Mtx ab); +void C_MTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count); +void C_MTXTranspose(const Mtx src, Mtx xPose); +u32 C_MTXInverse(const Mtx src, Mtx inv); +u32 C_MTXInvXpose(const Mtx src, Mtx invX); + +void PSMTXIdentity(Mtx m); +void PSMTXCopy(const Mtx src, Mtx dst); +void PSMTXConcat(const Mtx a, const Mtx b, Mtx ab); +void PSMTXConcatArray(const Mtx a, const Mtx* srcBase, Mtx* dstBase, u32 count); +void PSMTXTranspose(const Mtx src, Mtx xPose); +u32 PSMTXInverse(const Mtx src, Mtx inv); +u32 PSMTXInvXpose(const Mtx src, Mtx invX); + +#define MTXIdentity PSMTXIdentity +#define MTXCopy PSMTXCopy +#define MTXConcat PSMTXConcat +#define MTXConcatArray PSMTXConcatArray +#define MTXTranspose PSMTXTranspose +#define MTXInverse PSMTXInverse +#define MTXInvXpose PSMTXInvXpose + + +void C_MTXMultVec(const Mtx m, const Vec* src, Vec* dst); +void C_MTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); +void C_MTXMultVecSR(const Mtx m, const Vec* src, Vec* dst); +void C_MTXMultVecArraySR(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); + + +void PSMTXMultVec(const Mtx m, const Vec* src, Vec* dst); +void PSMTXMultVecArray(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); +void PSMTXMultVecSR(const Mtx m, const Vec* src, Vec* dst); +void PSMTXMultVecArraySR(const Mtx m, const Vec* srcBase, Vec* dstBase, u32 count); + + +#define MTXMultVec PSMTXMultVec +#define MTXMultVecArray PSMTXMultVecArray +#define MTXMultVecSR PSMTXMultVecSR +#define MTXMultVecArraySR PSMTXMultVecArraySR + + +void C_MTXQuat(Mtx m, const Quaternion* q); +void C_MTXReflect(Mtx m, const Vec* p, const Vec* n); + +void C_MTXTrans(Mtx m, f32 xT, f32 yT, f32 zT); +void C_MTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT); +void C_MTXScale(Mtx m, f32 xS, f32 yS, f32 zS); +void C_MTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS); + +void C_MTXRotRad(Mtx m, char axis, f32 rad); +void C_MTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA); +void C_MTXRotAxisRad(Mtx m, const Vec* axis, f32 rad); + + +void PSMTXQuat(Mtx m, const Quaternion* q); +void PSMTXReflect(Mtx m, const Vec* p, const Vec* n); + +void PSMTXTrans(Mtx m, f32 xT, f32 yT, f32 zT); +void PSMTXTransApply(const Mtx src, Mtx dst, f32 xT, f32 yT, f32 zT); +void PSMTXScale(Mtx m, f32 xS, f32 yS, f32 zS); +void PSMTXScaleApply(const Mtx src, Mtx dst, f32 xS, f32 yS, f32 zS); + +void PSMTXRotRad(Mtx m, char axis, f32 rad); +void PSMTXRotTrig(Mtx m, char axis, f32 sinA, f32 cosA); +void PSMTXRotAxisRad(Mtx m, const Vec* axis, f32 rad); + + + +#define MTXQuat PSMTXQuat +#define MTXReflect PSMTXReflect +#define MTXTrans PSMTXTrans +#define MTXTransApply PSMTXTransApply +#define MTXScale PSMTXScale +#define MTXScaleApply PSMTXScaleApply +#define MTXRotRad PSMTXRotRad +#define MTXRotTrig PSMTXRotTrig +#define MTXRotAxisRad PSMTXRotAxisRad + +#define MTXRotDeg(m, axis, deg) PSMTXRotRad(m, axis, MTXDegToRad(deg)) +#define MTXRotAxisDeg(m, axis, deg) PSMTXRotAxisRad(m, axis, MTXDegToRad(deg)) + +void C_MTXLookAt(Mtx m, const Point3d* camPos, const Vec* camUp, const Point3d* target); + +#define MTXLookAt C_MTXLookAt + +void C_MTXFrustum(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f); +void C_MTXPerspective(Mtx44 m, f32 fovY, f32 aspect, f32 n, f32 f); +void C_MTXOrtho(Mtx44 m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 f); + +#define MTXFrustum C_MTXFrustum +#define MTXPerspective C_MTXPerspective +#define MTXOrtho C_MTXOrtho + +void C_MTXLightFrustum(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 n, f32 scaleS, f32 scaleT, f32 transS, + f32 transT); + +void C_MTXLightPerspective(Mtx m, f32 fovY, f32 aspect, f32 scaleS, f32 scaleT, f32 transS, + f32 transT); + +void C_MTXLightOrtho(Mtx m, f32 t, f32 b, f32 l, f32 r, f32 scaleS, f32 scaleT, f32 transS, + f32 transT); + +#define MTXLightFrustum C_MTXLightFrustum +#define MTXLightPerspective C_MTXLightPerspective +#define MTXLightOrtho C_MTXLightOrtho + +void C_VECAdd(const Vec* a, const Vec* b, Vec* ab); +void C_VECSubtract(const Vec* a, const Vec* b, Vec* a_b); +void C_VECScale(const Vec* src, Vec* dst, f32 scale); +void C_VECNormalize(const Vec* src, Vec* unit); +f32 C_VECSquareMag(const Vec* v); +f32 C_VECMag(const Vec* v); +f32 C_VECDotProduct(const Vec* a, const Vec* b); +void C_VECCrossProduct(const Vec* a, const Vec* b, Vec* axb); +f32 C_VECSquareDistance(const Vec* a, const Vec* b); +f32 C_VECDistance(const Vec* a, const Vec* b); +void C_VECReflect(const Vec* src, const Vec* normal, Vec* dst); +void C_VECHalfAngle(const Vec* a, const Vec* b, Vec* half); + +void PSVECAdd(const Vec* a, const Vec* b, Vec* ab); +void PSVECSubtract(const Vec* a, const Vec* b, Vec* a_b); +void PSVECScale(const Vec* src, Vec* dst, f32 scale); +void PSVECNormalize(const Vec* src, Vec* unit); +f32 PSVECSquareMag(const Vec* v); +f32 PSVECMag(const Vec* v); +f32 PSVECDotProduct(const Vec* a, const Vec* b); +void PSVECCrossProduct(const Vec* a, const Vec* b, Vec* axb); +f32 PSVECSquareDistance(const Vec* a, const Vec* b); +f32 PSVECDistance(const Vec* a, const Vec* b); + + +// TODO + +#define VECAdd PSVECAdd +#define VECSubtract PSVECSubtract +#define VECScale PSVECScale +#define VECNormalize PSVECNormalize +#define VECSquareMag PSVECSquareMag +#define VECMag PSVECMag +#define VECDotProduct PSVECDotProduct +#define VECCrossProduct PSVECCrossProduct +#define VECSquareDistance PSVECSquareDistance +#define VECDistance PSVECDistance + + +#define VECReflect C_VECReflect +#define VECHalfAngle C_VECHalfAngle + +void C_QUATAdd(const Quaternion* p, const Quaternion* q, Quaternion* r); +void C_QUATSubtract(const Quaternion* p, const Quaternion* q, Quaternion* r); +void C_QUATMultiply(const Quaternion* p, const Quaternion* q, Quaternion* pq); +void C_QUATDivide(const Quaternion* p, const Quaternion* q, Quaternion* r); +void C_QUATScale(const Quaternion* q, Quaternion* r, f32 scale); +f32 C_QUATDotProduct(const Quaternion* p, const Quaternion* q); +void C_QUATNormalize(const Quaternion* src, Quaternion* unit); +void C_QUATInverse(const Quaternion* src, Quaternion* inv); +void C_QUATExp(const Quaternion* q, Quaternion* r); +void C_QUATLogN(const Quaternion* q, Quaternion* r); + +void C_QUATMakeClosest(const Quaternion* q, const Quaternion* qto, Quaternion* r); +void C_QUATRotAxisRad(Quaternion* r, const Vec* axis, f32 rad); +void C_QUATMtx(Quaternion* r, const Mtx m); + +void C_QUATLerp(const Quaternion* p, const Quaternion* q, Quaternion* r, f32 t); +void C_QUATSlerp(const Quaternion* p, const Quaternion* q, Quaternion* r, f32 t); +void C_QUATSquad(const Quaternion* p, const Quaternion* a, const Quaternion* b, const Quaternion* q, + Quaternion* r, f32 t); +void C_QUATCompA(const Quaternion* qprev, const Quaternion* q, const Quaternion* qnext, + Quaternion* a); + + +void PSQUATAdd(const Quaternion* p, const Quaternion* q, Quaternion* r); +void PSQUATSubtract(const Quaternion* p, const Quaternion* q, Quaternion* r); +void PSQUATMultiply(const Quaternion* p, const Quaternion* q, Quaternion* pq); +void PSQUATDivide(const Quaternion* p, const Quaternion* q, Quaternion* r); +void PSQUATScale(const Quaternion* q, Quaternion* r, f32 scale); +f32 PSQUATDotProduct(const Quaternion* p, const Quaternion* q); +void PSQUATNormalize(const Quaternion* src, Quaternion* unit); +void PSQUATInverse(const Quaternion* src, Quaternion* inv); + + + +#define QUATAdd PSQUATAdd +#define QUATSubtract PSQUATSubtract +#define QUATMultiply PSQUATMultiply +#define QUATDivide PSQUATDivide +#define QUATScale PSQUATScale +#define QUATDotProduct PSQUATDotProduct +#define QUATNormalize PSQUATNormalize +#define QUATInverse PSQUATInverse + +#define QUATExp C_QUATExp +#define QUATLogN C_QUATLogN +#define QUATMakeClosest C_QUATMakeClosest +#define QUATRotAxisRad C_QUATRotAxisRad +#define QUATMtx C_QUATMtx +#define QUATLerp C_QUATLerp +#define QUATSlerp C_QUATSlerp +#define QUATSquad C_QUATSquad +#define QUATCompA C_QUATCompA + +void PSMTXReorder(const Mtx src, ROMtx dest); +void PSMTXROMultVecArray(const ROMtx m, const Vec* srcBase, Vec* dstBase, u32 count); +void PSMTXROSkin2VecArray(const ROMtx m0, const ROMtx m1, const f32* wtBase, const Vec* srcBase, + Vec* dstBase, u32 count); +void PSMTXMultS16VecArray(const Mtx m, const S16Vec* srcBase, Vec* dstBase, u32 count); +void PSMTXROMultS16VecArray(const ROMtx m, const S16Vec* srcBase, Vec* dstBase, u32 count); + +void MTXInitStack(MtxStack* sPtr, u32 numMtx); +MtxPtr MTXPush(MtxStack* sPtr, const Mtx m); +MtxPtr MTXPushFwd(MtxStack* sPtr, const Mtx m); +MtxPtr MTXPushInv(MtxStack* sPtr, const Mtx m); +MtxPtr MTXPushInvXpose(MtxStack* sPtr, const Mtx m); +MtxPtr MTXPop(MtxStack* sPtr); +MtxPtr MTXGetStackPtr(const MtxStack* sPtr); + +#define MTXAllocStack(sPtr, numMtx) \ + (((MtxStackPtr)(sPtr))->stackBase = (MtxPtr)OSAlloc(((numMtx) * sizeof(Mtx)))) + +#define MTXFreeStack(sPtr) (OSFree((void*)(((MtxStackPtr)(sPtr))->stackBase))) + + + + +/* end "dolphin/mtx.h" */ +/* "include\dolphin.h" line 10 "dolphin/gx.h" */ +/* end "dolphin/gx.h" */ +/* "include\dolphin.h" line 11 "dolphin/vi.h" */ + +#define _DOLPHIN_VI + +/* "include\dolphin\vi.h" line 3 "dolphin/gx/GXStruct.h" */ +/* end "dolphin/gx/GXStruct.h" */ +/* "include\dolphin\vi.h" line 4 "dolphin/vifuncs.h" */ + +#define _DOLPHIN_VIFUNCS + +/* "include\dolphin\vifuncs.h" line 3 "dolphin/types.h" */ +/* end "dolphin/types.h" */ + +/* "include\dolphin\vifuncs.h" line 5 "dolphin/vitypes.h" */ +/* end "dolphin/vitypes.h" */ + + +u32 VIGetNextField(void); +u32 VIGetRetraceCount(); +VIRetraceCallback VISetPreRetraceCallback(VIRetraceCallback callback); +VIRetraceCallback VISetPostRetraceCallback(VIRetraceCallback callback); +void __VIGetCurrentPosition(s16* x, s16* y); +u32 VIGetDTVStatus(void); + + +void VIInit(void); +void VIConfigure(const GXRenderModeObj* rm); +void VIFlush(void); +u32 VIGetTvFormat(void); +void VISetNextFrameBuffer(void* fb); +void VIWaitForRetrace(void); +void VISetBlack(BOOL black); + + + + +/* end "dolphin/vi.h" */ +/* "include\dolphin.h" line 12 "dolphin/ai.h" */ + +#define _DOLPHIN_AI + +/* "include\dolphin\ai.h" line 3 "types.h" */ +/* end "types.h" */ + + +typedef void (*AISCallback)(u32 count); +typedef void (*AIDCallback)(); + +AIDCallback AIRegisterDMACallback(AIDCallback callback); +void AIInitDMA(u32 start_addr, u32 length); +BOOL AIGetDMAEnableFlag(); +void AIStartDMA(); +void AIStopDMA(); +u32 AIGetDMABytesLeft(); +u32 AIGetDMAStartAddr(); +u32 AIGetDMALength(); +u32 AIGetDSPSampleRate(); +void AISetDSPSampleRate(u32 rate); +AISCallback AIRegisterStreamCallback(AISCallback callback); +u32 AIGetStreamSampleCount(); +void AIResetStreamSampleCount(); +void AISetStreamTrigger(u32 trigger); +u32 AIGetStreamTrigger(); +void AISetStreamPlayState(u32 state); +u32 AIGetStreamPlayState(); +void AISetStreamSampleRate(u32 rate); +u32 AIGetStreamSampleRate(); +void AISetStreamVolLeft(u8 vol); +void AISetStreamVolRight(u8 vol); +u8 AIGetStreamVolLeft(); +u8 AIGetStreamVolRight(); +void AIInit(u8* stack); +BOOL AICheckInit(); +void AIReset(); + + +/* end "dolphin/ai.h" */ +/* "include\dolphin.h" line 13 "dolphin/ar.h" */ + +#define _DOLPHIN_AR + +/* "include\dolphin\ar.h" line 3 "types.h" */ +/* end "types.h" */ + + +#define AR_STACK_INDEX_ENTRY_SIZE sizeof(u32) + +#define ARAM_DIR_MRAM_TO_ARAM 0x00 +#define ARAM_DIR_ARAM_TO_MRAM 0x01 + +#define AR_CLEAR_INTERNAL_ALL 0x00 +#define AR_CLEAR_INTERNAL_USER 0x01 +#define AR_CLEAR_EXPANSION 0x02 + +typedef void (*ARCallback)(void); + +ARCallback ARRegisterDMACallback(ARCallback callback); +u32 ARGetDMAStatus(void); +void ARStartDMA(u32 type, u32 mainmem_addr, u32 aram_addr, u32 length); +u32 ARInit(u32* stack_index_addr, u32 num_entries); +u32 ARGetBaseAddress(void); +BOOL ARCheckInit(void); +void ARReset(void); +u32 ARAlloc(u32 length); +u32 ARFree(u32* length); +u32 ARGetSize(void); +u32 ARGetInternalSize(void); +void ARSetSize(void); +void ARClear(u32 flag); + +void __ARClearInterrupt(void); +u16 __ARGetInterruptStatus(void); + +#define ARStartDMARead(mmem, aram, len) ARStartDMA(ARAM_DIR_ARAM_TO_MRAM, mmem, aram, len) +#define ARStartDMAWrite(mmem, aram, len) ARStartDMA(ARAM_DIR_MRAM_TO_ARAM, mmem, aram, len) + + + +/* end "dolphin/ar.h" */ +/* "include\dolphin.h" line 14 "dolphin/arq.h" */ + +#define _DOLPHIN_ARQ + +/* "include\dolphin\arq.h" line 3 "types.h" */ +/* end "types.h" */ + +/* "include\dolphin\arq.h" line 5 "dolphin/ar.h" */ +/* end "dolphin/ar.h" */ + + + +/* "include\dolphin\arq.h" line 11 "dolphin/ar.h" */ +/* end "dolphin/ar.h" */ + +#define ARQ_DMA_ALIGNMENT 32 +#define ARQ_CHUNK_SIZE_DEFAULT 4096 + +#define ARQ_TYPE_MRAM_TO_ARAM ARAM_DIR_MRAM_TO_ARAM +#define ARQ_TYPE_ARAM_TO_MRAM ARAM_DIR_ARAM_TO_MRAM + +#define ARQ_PRIORITY_LOW 0 +#define ARQ_PRIORITY_HIGH 1 + +typedef void (*ARQCallback)(u32 pointerToARQRequest); + +typedef struct ARQRequest { + + struct ARQRequest* next; + u32 owner; + u32 type; + u32 priority; + u32 source; + u32 dest; + u32 length; + ARQCallback callback; + +} ARQRequest; + +void ARQInit(void); +void ARQReset(void); +void ARQPostRequest(ARQRequest* task, u32 owner, u32 type, u32 priority, u32 source, u32 dest, + u32 length, ARQCallback callback); +void ARQRemoveRequest(ARQRequest* task); +void ARQRemoveOwnerRequest(u32 owner); +void ARQFlushQueue(void); +void ARQSetChunkSize(u32 size); +u32 ARQGetChunkSize(void); +BOOL ARQCheckInit(void); + + + +/* end "dolphin/arq.h" */ +/* "include\dolphin.h" line 15 "dolphin/dsp.h" */ + +#define _DOLPHIN_DSP + +/* "include\dolphin\dsp.h" line 3 "types.h" */ +/* end "types.h" */ +/* "include\dolphin\dsp.h" line 4 "dolphin/os.h" */ +/* end "dolphin/os.h" */ + + +#define DSP_TASK_FLAG_CLEARALL 0x00000000 +#define DSP_TASK_FLAG_ATTACHED 0x00000001 +#define DSP_TASK_FLAG_CANCEL 0x00000002 + +#define DSP_TASK_STATE_INIT 0 +#define DSP_TASK_STATE_RUN 1 +#define DSP_TASK_STATE_YIELD 2 +#define DSP_TASK_STATE_DONE 3 + +typedef void (*DSPCallback)(void* task); + +typedef struct STRUCT_DSP_TASK { + vu32 state; + vu32 priority; + vu32 flags; + u16* iram_mmem_addr; + u32 iram_length; + u32 iram_addr; + + u16* dram_mmem_addr; + u32 dram_length; + u32 dram_addr; + + u16 dsp_init_vector; + u16 dsp_resume_vector; + + DSPCallback init_cb; + DSPCallback res_cb; + DSPCallback done_cb; + DSPCallback req_cb; + + struct STRUCT_DSP_TASK* next; + struct STRUCT_DSP_TASK* prev; + + OSTime t_context; + OSTime t_task; + +} DSPTaskInfo; + +void DSPInit(); +void DSPReset(); +void DSPHalt(); +void DSPSendMailToDSP(u32 mail); +u32 DSPCheckMailToDSP(); +u32 DSPCheckMailFromDSP(); +u32 DSPGetDMAStatus(); + +DSPTaskInfo* DSPAddTask(DSPTaskInfo* task); + +void __DSP_exec_task(DSPTaskInfo* curr, DSPTaskInfo* next); +void __DSP_boot_task(DSPTaskInfo* task); +void __DSP_remove_task(DSPTaskInfo* task); +void __DSP_add_task(DSPTaskInfo* task); +void __DSP_debug_printf(const char* fmt, ...); + + +#define CARD_ENCODE_ANSI 0u +#define CARD_ENCODE_SJIS 1u + +/* Sizes */ +#define CARD_WORKAREA_SIZE (5 * 8 * 1024) +#define CARD_READ_SIZE 512 +#define CARD_MAX_FILE 127 +#define CARD_COMMENT_SIZE 64 +#define CARD_FILENAME_MAX 32 +#define CARD_ICON_MAX 8 +#define CARD_ICON_WIDTH 32 +#define CARD_ICON_HEIGHT 32 +#define CARD_BANNER_WIDTH 96 +#define CARD_BANNER_HEIGHT 32 + +/* Icon animation */ +#define CARD_MODE_NORMAL 0 +#define CARD_MODE_FAST 1 + +#define CARDGetBannerFormat(stat) (((stat)->bannerFormat) & CARD_STAT_BANNER_MASK) +#define CARDGetIconAnim(stat) (((stat)->bannerFormat) & CARD_STAT_ANIM_MASK) +#define CARDGetIconFormat(stat, n) (((stat)->iconFormat >> (2 * (n))) & CARD_STAT_ICON_MASK) +#define CARDGetIconSpeed(stat, n) (((stat)->iconSpeed >> (2 * (n))) & CARD_STAT_SPEED_MASK) +#define CARDSetBannerFormat(stat, f) \ + ((stat)->bannerFormat = (u8)(((stat)->bannerFormat & ~CARD_STAT_BANNER_MASK) | (f))) +#define CARDSetIconAnim(stat, f) \ + ((stat)->bannerFormat = (u8)(((stat)->bannerFormat & ~CARD_STAT_ANIM_MASK) | (f))) +#define CARDSetIconFormat(stat, n, f) \ + ((stat)->iconFormat = \ + (u16)(((stat)->iconFormat & ~(CARD_STAT_ICON_MASK << (2 * (n)))) | ((f) << (2 * (n))))) +#define CARDSetIconSpeed(stat, n, f) \ + ((stat)->iconSpeed = \ + (u16)(((stat)->iconSpeed & ~(CARD_STAT_SPEED_MASK << (2 * (n)))) | ((f) << (2 * (n))))) +#define CARDSetIconAddress(stat, addr) ((stat)->iconAddr = (u32)(addr)) +#define CARDSetCommentAddress(stat, addr) ((stat)->commentAddr = (u32)(addr)) +#define CARDGetFileNo(fileInfo) ((fileInfo)->fileNo) + +#define CARD_RESULT_UNLOCKED 1 +#define CARD_RESULT_READY 0 +#define CARD_RESULT_BUSY -1 +#define CARD_RESULT_WRONGDEVICE -2 +#define CARD_RESULT_NOCARD -3 +#define CARD_RESULT_NOFILE -4 +#define CARD_RESULT_IOERROR -5 +#define CARD_RESULT_BROKEN -6 +#define CARD_RESULT_EXIST -7 +#define CARD_RESULT_NOENT -8 +#define CARD_RESULT_INSSPACE -9 +#define CARD_RESULT_NOPERM -10 +#define CARD_RESULT_LIMIT -11 +#define CARD_RESULT_NAMETOOLONG -12 +#define CARD_RESULT_ENCODING -13 +#define CARD_RESULT_CANCELED -14 +#define CARD_RESULT_FATAL_ERROR -128 + +#define CARD_STAT_ICON_NONE 0 +#define CARD_STAT_ICON_C8 1 +#define CARD_STAT_ICON_RGB5A3 2 +#define CARD_STAT_ICON_MASK 3 + +#define CARD_STAT_BANNER_NONE 0 +#define CARD_STAT_BANNER_C8 1 +#define CARD_STAT_BANNER_RGB5A3 2 +#define CARD_STAT_BANNER_MASK 3 + +#define CARD_STAT_ANIM_LOOP 0x00 +#define CARD_STAT_ANIM_BOUNCE 0x04 +#define CARD_STAT_ANIM_MASK 0x04 + +#define CARD_STAT_SPEED_END 0 +#define CARD_STAT_SPEED_FAST 1 +#define CARD_STAT_SPEED_MIDDLE 2 +#define CARD_STAT_SPEED_SLOW 3 +#define CARD_STAT_SPEED_MASK 3 + +#define CARD_ATTR_PUBLIC 0x04u +#define CARD_ATTR_NO_COPY 0x08u +#define CARD_ATTR_NO_MOVE 0x10u +#define CARD_ATTR_GLOBAL 0x20u +#define CARD_ATTR_COMPANY 0x40u + +typedef struct CARDFileInfo { + s32 chan; + s32 fileNo; + + s32 offset; + s32 length; + u16 iBlock; + u16 __padding; +} CARDFileInfo; + +typedef struct CARDStat { + char fileName[CARD_FILENAME_MAX]; + u32 length; + u32 time; // seconds since 01/01/2000 midnight + u8 gameName[4]; + u8 company[2]; + + u8 bannerFormat; + u8 __padding; + u32 iconAddr; // offset to the banner, bannerTlut, icon, iconTlut data set. + u16 iconFormat; + u16 iconSpeed; + u32 commentAddr; // offset to the pair of 32 byte character strings. + + u32 offsetBanner; + u32 offsetBannerTlut; + u32 offsetIcon[CARD_ICON_MAX]; + u32 offsetIconTlut; + u32 offsetData; +} CARDStat; + +typedef void (*CARDCallback)(s32 chan, s32 result); + +void CARDInit(void); +BOOL CARDGetFastMode(void); +BOOL CARDSetFastMode(BOOL enable); + +s32 CARDCheck(s32 chan); +s32 CARDCheckAsync(s32 chan, CARDCallback callback); +s32 CARDCheckEx(s32 chan, s32* xferBytes); +s32 CARDCheckExAsync(s32 chan, s32* xferBytes, CARDCallback callback); +s32 CARDCreate(s32 chan, const char* fileName, u32 size, CARDFileInfo* fileInfo); +s32 CARDCreateAsync(s32 chan, const char* fileName, u32 size, CARDFileInfo* fileInfo, + CARDCallback callback); +s32 CARDDelete(s32 chan, const char* fileName); +s32 CARDDeleteAsync(s32 chan, const char* fileName, CARDCallback callback); +s32 CARDFastDelete(s32 chan, s32 fileNo); +s32 CARDFastDeleteAsync(s32 chan, s32 fileNo, CARDCallback callback); +s32 CARDFastOpen(s32 chan, s32 fileNo, CARDFileInfo* fileInfo); +s32 CARDFormat(s32 chan); +s32 CARDFormatAsync(s32 chan, CARDCallback callback); +s32 CARDFreeBlocks(s32 chan, s32* byteNotUsed, s32* filesNotUsed); +s32 CARDGetAttributes(s32 chan, s32 fileNo, u8* attr); +s32 CARDGetEncoding(s32 chan, u16* encode); +s32 CARDGetMemSize(s32 chan, u16* size); +s32 CARDGetResultCode(s32 chan); +s32 CARDGetSectorSize(s32 chan, u32* size); +s32 CARDGetSerialNo(s32 chan, u64* serialNo); +s32 CARDGetStatus(s32 chan, s32 fileNo, CARDStat* stat); +s32 CARDGetXferredBytes(s32 chan); +s32 CARDMount(s32 chan, void* workArea, CARDCallback detachCallback); +s32 CARDMountAsync(s32 chan, void* workArea, CARDCallback detachCallback, + CARDCallback attachCallback); +s32 CARDOpen(s32 chan, const char* fileName, CARDFileInfo* fileInfo); +BOOL CARDProbe(s32 chan); +s32 CARDProbeEx(s32 chan, s32* memSize, s32* sectorSize); +s32 CARDRename(s32 chan, const char* oldName, const char* newName); +s32 CARDRenameAsync(s32 chan, const char* oldName, const char* newName, CARDCallback callback); +s32 CARDSetAttributesAsync(s32 chan, s32 fileNo, u8 attr, CARDCallback callback); +s32 CARDSetAttributes(s32 chan, s32 fileNo, u8 attr); +s32 CARDSetStatus(s32 chan, s32 fileNo, CARDStat* stat); +s32 CARDSetStatusAsync(s32 chan, s32 fileNo, CARDStat* stat, CARDCallback callback); +s32 CARDUnmount(s32 chan); +s32 CARDGetCurrentMode(s32 chan, u32* mode); +s32 CARDCancel(CARDFileInfo* fileInfo); +s32 CARDClose(CARDFileInfo* fileInfo); +s32 CARDRead(CARDFileInfo* fileInfo, void* addr, s32 length, s32 offset); +s32 CARDReadAsync(CARDFileInfo* fileInfo, void* addr, s32 length, s32 offset, + CARDCallback callback); +s32 CARDWrite(CARDFileInfo* fileInfo, const void* addr, s32 length, s32 offset); +s32 CARDWriteAsync(CARDFileInfo* fileInfo, const void* addr, s32 length, s32 offset, + CARDCallback callback); + + +typedef struct jump_buf { + u32 lr; + u32 cr; + u32 sp; + u32 r2; + u32 pad; + u32 regs[19]; + double flt_regs[19]; +} jmp_buf; + +int gcsetjmp(jmp_buf *jump); +int gclongjmp(jmp_buf *jump, int status); + + +/* end "game/jmp.h" */ +/* "include\game\process.h" line 4 "dolphin/types.h" */ +/* end "dolphin/types.h" */ + +#define PROCESS_STAT_PAUSE 0x1 +#define PROCESS_STAT_UPAUSE 0x2 +#define PROCESS_STAT_PAUSE_EN 0x4 +#define PROCESS_STAT_UPAUSE_EN 0x8 + +typedef struct process { + struct process *next; + struct process *prev; + struct process *child; + struct process *parent; + struct process *next_child; + struct process *first_child; + void *heap; + u16 exec; + u16 stat; + u16 prio; + int sleep_time; + u32 base_sp; + jmp_buf jump; + void (*dtor)(void); + void *user_data; +} Process; + +void HuPrcInit(void); +void HuPrcEnd(void); +Process *HuPrcCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size); +void HuPrcChildLink(Process *parent, Process *child); +void HuPrcChildUnlink(Process *process); +Process *HuPrcChildCreate(void (*func)(void), u16 prio, u32 stack_size, s32 extra_size, Process *parent); +void HuPrcChildWatch(void); +Process *HuPrcCurrentGet(void); +int HuPrcKill(Process *process); +void HuPrcChildKill(Process *process); +void HuPrcSleep(int time); +void HuPrcVSleep(); +void HuPrcWakeup(Process *process); +void HuPrcDestructorSet2(Process *process, void (*func)(void)); +void HuPrcDestructorSet(void (*func)(void)); +void HuPrcCall(int tick); +void *HuPrcMemAlloc(s32 size); +void HuPrcMemFree(void *ptr); +void HuPrcSetStat(Process *process, u16 value); +void HuPrcResetStat(Process *process, u16 value); +void HuPrcAllPause(int flag); +void HuPrcAllUPause(int flag); + + + +#define MEMORY_DEFAULT_NUM 0x10000000 + +typedef enum { + HEAP_SYSTEM, + HEAP_MUSIC, + HEAP_DATA, + HEAP_DVD, + HEAP_MISC, + HEAP_MAX +} HeapID; + +void HuMemInitAll(void); +void *HuMemInit(void *ptr, s32 size); +void HuMemDCFlushAll(); +void HuMemDCFlush(HeapID heap); +void *HuMemDirectMalloc(HeapID heap, s32 size); +void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num); +void HuMemDirectFree(void *ptr); +void HuMemDirectFreeNum(HeapID heap, u32 num); +s32 HuMemUsedMallocSizeGet(HeapID heap); +s32 HuMemUsedMallocBlockGet(HeapID heap); +u32 HuMemHeapSizeGet(HeapID heap); +void *HuMemHeapPtrGet(HeapID heap); + +void *HuMemHeapInit(void *ptr, s32 size); +void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr); +void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, u32 retaddr); +void HuMemMemoryFree(void *ptr, u32 retaddr); +void HuMemMemoryFreeNum(void *heap_ptr, u32 num, u32 retaddr); +s32 HuMemUsedMemorySizeGet(void *heap_ptr); +s32 HuMemUsedMemoryBlockGet(void *heap_ptr); +s32 HuMemMemorySizeGet(void *ptr); +s32 HuMemMemoryAllocSizeGet(s32 size); +void HuMemHeapDump(void *heap_ptr, s16 status); + + + +typedef struct data_read_stat DataReadStat; + +typedef struct file_list_entry { + char *name; + s32 file_id; +} FileListEntry; + +void *HuDvdDataRead(char *path); +void **HuDvdDataReadMulti(char **paths); +void *HuDvdDataReadDirect(char *path, HeapID heap); +void *HuDvdDataFastRead(s32 entrynum); +void *HuDvdDataFastReadNum(s32 entrynum, s32 num); +void *HuDvdDataFastReadAsync(s32 entrynum, DataReadStat *stat); +void HuDvdDataClose(void *ptr); +void HuDvdErrorWatch(); + + + + +#define OM_DLL_MAX 20 + +typedef enum { + OVL_INVALID = -1, +/* "include\game\object.h" line 13 "ovl_table.h" */ +OVL__MINI, +OVL_BOOT, +OVL_E3SETUP, +OVL_INST, +OVL_M300, +OVL_M302, +OVL_M303, +OVL_M330, +OVL_M333, +OVL_M401, +OVL_M402, +OVL_M403, +OVL_M404, +OVL_M405, +OVL_M406, +OVL_M407, +OVL_M408, +OVL_M409, +OVL_M410, +OVL_M411, +OVL_M412, +OVL_M413, +OVL_M414, +OVL_M415, +OVL_M416, +OVL_M417, +OVL_M418, +OVL_M419, +OVL_M420, +OVL_M421, +OVL_M422, +OVL_M423, +OVL_M424, +OVL_M425, +OVL_M426, +OVL_M427, +OVL_M428, +OVL_M429, +OVL_M430, +OVL_M431, +OVL_M432, +OVL_M433, +OVL_M434, +OVL_M435, +OVL_M436, +OVL_M437, +OVL_M438, +OVL_M439, +OVL_M440, +OVL_M441, +OVL_M442, +OVL_M443, +OVL_M444, +OVL_M445, +OVL_M446, +OVL_M447, +OVL_M448, +OVL_M449, +OVL_M450, +OVL_M451, +OVL_M453, +OVL_M455, +OVL_M456, +OVL_M457, +OVL_M458, +OVL_M459, +OVL_M460, +OVL_M461, +OVL_M462, +OVL_M463, +OVL_MENT, +OVL_MESS, +OVL_MGMODE, +OVL_MODELTEST, +OVL_MODESEL, +OVL_MPEX, +OVL_MSETUP, +OVL_MSTORY2, +OVL_MSTORY3, +OVL_MSTORY4, +OVL_MSTORY, +OVL_NIS, +OVL_OPTION, +OVL_PRESENT, +OVL_RESULT, +OVL_SAF, +OVL_SELMENU, +OVL_STAFF, +OVL_SUBCHRSEL, +OVL_W01, +OVL_W02, +OVL_W03, +OVL_W04, +OVL_W05, +OVL_W06, +OVL_W10, +OVL_W20, +OVL_W21, +OVL_ZTAR, + OVL_COUNT +} OverlayID; + +#define OM_STAT_DELETED 0x1 +#define OM_STAT_DISABLED 0x2 +#define OM_STAT_ACTIVE 0x4 +#define OM_STAT_PAUSED 0x10 +#define OM_STAT_NOPAUSE 0x20 +#define OM_STAT_MODEL_PAUSED 0x100 + + +#define OM_GET_WORK_PTR(object, type) ((type *)(&((object)->work[0]))) +#define OM_GET_DATA_PTR(object, type) ((type *)(((object)->data))) + +typedef void (*omObjFunc)(struct om_obj_data *); + +typedef struct om_ovl_his_data { + OverlayID overlay; + int event; + int stat; +} omOvlHisData; + +typedef struct om_obj_data { +/* 0x00 */ u16 stat; +/* 0x02 */ s16 next_idx_alloc; +/* 0x04 */ s16 prio; +/* 0x06 */ s16 prev; +/* 0x08 */ s16 next; +/* 0x0A */ s16 next_idx; +/* 0x0C */ s16 group; +/* 0x0E */ u16 group_idx; +/* 0x10 */ u32 unk10; +/* 0x14 */ omObjFunc func; +/* 0x18 */ Vec trans; +/* 0x24 */ Vec rot; +/* 0x30 */ Vec scale; +/* 0x3C */ u16 mdlcnt; +/* 0x40 */ s16 *model; +/* 0x44 */ u16 mtncnt; +/* 0x48 */ s16 *motion; +/* 0x4C */ u32 work[4]; +/* 0x5C */ void *data; +} omObjData; + +typedef struct om_dll_data { + char *name; + OSModuleHeader *module; + void *bss; + s32 ret; +} omDllData; + +void omMasterInit(int prio, FileListEntry *ovl_list, int ovl_count, OverlayID start_ovl); +void omOvlCallEx(OverlayID overlay, s16 arg2, int event, int stat); +void omOvlGotoEx(OverlayID overlay, s16 arg2, int event, int stat); +void omOvlReturnEx(s16 level, s16 arg2); +void omOvlKill(s16 arg); +void omOvlHisChg(s32 level, OverlayID overlay, int event, int stat); +omOvlHisData *omOvlHisGet(s32 level); +Process *omInitObjMan(s16 max_objs, int prio); +void omDestroyObjMan(void); +omObjData *omAddObjEx(Process *objman_process, s16 prio, u16 mdlcnt, u16 mtncnt, s16 group, omObjFunc func); +void omAddMember(Process *objman_process, u16 group, omObjData *object); +void omDelObjEx(Process *objman_process, omObjData *object); +void omDelMember(Process *objman_process, omObjData *object); +void omMakeGroupEx(Process *objman_process, u16 group, u16 max_objs); +omObjData **omGetGroupMemberListEx(Process *objman_process, s16 group); +void omSetStatBit(omObjData *obj, u16 stat); +void omResetStatBit(omObjData *obj, u16 stat); +void omSetTra(omObjData *obj, float x, float y, float z); +void omSetRot(omObjData *obj, float x, float y, float z); +void omSetSca(omObjData *obj, float x, float y, float z); +void omMain(void); +void omAllPause(BOOL pause); +char omPauseChk(void); +OverlayID omCurrentOvlGet(void); + + +void omDLLDBGOut(void); +void omDLLInit(FileListEntry *ovl_list); +int omDLLStart(s16 overlay, s16 flag); +void omDLLNumEnd(s16 overlay, s16 flag); +void omDLLEnd(s16 dllno, s16 flag); +omDllData *omDLLLink(omDllData **dll_ptr, s16 overlay, s16 flag); +void omDLLUnlink(omDllData *dll_ptr, s16 flag); +s32 omDLLSearch(s16 overlay); +void omDLLInfoDump(OSModuleInfo *module); +void omDLLHeaderDump(OSModuleHeader *module); + +void omOutView(omObjData *object); +void omOutViewMulti(omObjData *object); +void omSystemKeyCheckSetup(Process *objman); +void omSystemKeyCheck(omObjData *object); +void omSysPauseEnable(u8 flag); +void omSysPauseCtrl(s16 flag); + +extern omObjData *omDBGSysKeyObj; +extern Process *omwatchproc; +extern OverlayID omnextovl; +extern OverlayID omcurovl; +extern int omcurdll; +extern int omovlhisidx; +extern int omovlevtno; +extern int omnextovlevtno; +extern int omovlstat; +extern char omUPauseFlag; +extern s16 omSysExitReq; +extern s16 omdispinfo; +extern u8 omSysPauseEnableFlag; +extern OverlayID omprevovl; + +extern omDllData *omDLLinfoTbl[OM_DLL_MAX]; + +extern Vec CRot; +extern Vec Center; +extern float CZoom; +extern Vec CRotM[16]; +extern Vec CenterM[16]; +extern float CZoomM[16]; +extern s16 omDBGMenuButton; + + + +typedef struct hu_snd_grp_data { + /* 0x00 */ s16 ovl; + /* 0x02 */ s16 grpset; + /* 0x04 */ s32 auxANo; + /* 0x08 */ s32 auxBNo; + /* 0x0C */ s8 auxAVol; + /* 0x0D */ s8 auxBVol; +} HuSndGrpData; + +void HuAudInit(void); +s32 HuAudStreamPlay(void); +void HuAudStreamVolSet(s16 vol); +void HuAudStreamPauseOn(void); +void HuAudStreamPauseOff(void); +void HuAudStreamFadeOut(void); +void HuAudAllStop(void); +void HuAudFadeOut(s32 arg0); +s32 HuAudFXPlay(s32 arg0); +s32 HuAudFXPlayVol(s32 arg0, s16 arg1); +s32 HuAudFXPlayVolPan(s32 arg0, s16 arg1, s16 arg2); +void HuAudFXStop(s32 arg0); +void HuAudFXAllStop(void); +void HuAudFXFadeOut(s32 arg0, s32 arg1); +void HuAudFXPanning(s32 arg0, s16 arg1); +void HuAudFXListnerSet(Vec* arg0, Vec* arg1, float arg2, float arg3); +void HuAudFXListnerSetEX(Vec* arg0, Vec* arg1, float sndDist, float sndSpeed, float arg4, float arg5, float arg6); +void HuAudFXListnerUpdate(Vec *arg0, Vec *arg1); +s32 HuAudFXEmiterPlay(s32 arg0, Vec *arg1); +void HuAudFXEmiterUpDate(s32 arg0, Vec *arg1); +void HuAudFXListnerKill(void); +void HuAudFXPauseAll(s32 arg0); +s32 HuAudFXStatusGet(s32 arg0); +s32 HuAudFXPitchSet(s32 arg0, s16 arg1); +s32 HuAudFXVolSet(s32 arg0, s16 arg1); +s32 HuAudSeqPlay(s16 arg0); +void HuAudSeqStop(s32 arg0); +void HuAudSeqFadeOut(s32 arg0, s32 arg1); +void HuAudSeqAllFadeOut(s32 arg0); +void HuAudSeqAllStop(void); +void HuAudSeqPauseAll(s32 arg0); +void HuAudSeqPause(s32 arg0, s32 arg1, s32 arg2); +s32 HuAudSeqMidiCtrlGet(s32 arg0, s8 arg1, s8 arg2); +s32 HuAudSStreamPlay(s16 arg0); +void HuAudSStreamStop(s32 arg0); +void HuAudSStreamFadeOut(s32 arg0, s32 arg1); +void HuAudSStreamAllFadeOut(s32 arg0); +void HuAudSStreamAllStop(void); +s32 HuAudSStreamStatGet(s32 arg0); +void HuAudDllSndGrpSet(u16 ovl); +void HuAudSndGrpSetSet(s16 arg0); +void HuAudSndGrpSet(s16 arg0); +void HuAudSndCommonGrpSet(s16 arg0, s32 arg1); +void HuAudAUXSet(s32 arg0, s32 arg1); +void HuAudAUXVolSet(s8 arg0, s8 arg1); +void HuAudVoiceInit(s16 ovl); +s32 HuAudPlayerVoicePlay(s16 arg0, s16 arg1); +s32 HuAudPlayerVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); +void HuAudPlayerVoicePlayEntry(s16 arg0, s16 arg1); +s32 HuAudCharVoicePlay(s16 arg0, s16 arg1); +s32 HuAudCharVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); +void HuAudCharVoicePlayEntry(s16 arg0, s16 arg1); + +extern float Snd3DBackSurDisOffset; +extern float Snd3DFrontSurDisOffset; +extern float Snd3DStartDisOffset; +extern float Snd3DSpeedOffset; +extern float Snd3DDistOffset; +extern s32 musicOffF; +extern u8 fadeStat; + +extern HuSndGrpData HuSndGrpTbl[]; + + +/* "include\game\flag.h" line 3 "dolphin/types.h" */ +/* end "dolphin/types.h" */ + +#define FLAG_ID_MAKE(group, index) (((group) << 16)|(index)) + +s32 _CheckFlag(u32 flag); +void _SetFlag(u32 flag); +void _ClearFlag(u32 flag); +void _InitFlag(void); + + +//HACK: to prevent prototype errors +extern void HuPadRumbleAllStop(void); + +typedef struct player_config { + s16 character; + s16 pad_idx; + s16 diff; + s16 group; + s16 iscom; +} PlayerConfig; + +typedef struct system_state { +/* 0x00 */ struct { + u8 party : 1; + u8 team : 1; + }; +/* 0x01 */ u8 diff_story; +/* 0x02 */ struct { + u16 bonus_star : 1; + u16 explain_mg : 1; + u16 show_com_mg : 1; + u16 mg_list : 2; + u16 mess_speed : 2; + u16 save_mode : 2; + }; +/* 0x04 */ u8 turn; +/* 0x05 */ u8 max_turn; +/* 0x06 */ u8 star_flag; +/* 0x07 */ u8 star_total; +/* 0x08 */ struct { + u8 star_pos : 3; + u8 board : 5; +}; +/* 0x09 */ s8 last5_effect; +/* 0x0A */ s8 player_curr; +/* 0x0B */ s8 unk0B[3]; +/* 0x0E */ s16 block_pos; +/* 0x10 */ u8 board_data[32]; +/* 0x30 */ u8 mess_delay; +/* 0x31 */ struct { + u8 bowser_loss : 4; + u8 bowser_event : 4; + }; +/* 0x32 */ s8 lucky_value; +/* 0x34 */ u16 mg_next; +/* 0x36 */ s16 mg_type; +/* 0x38 */ u16 unk_38; +/* 0x3A */ u8 flag[3][16]; +/* 0x6A */ u8 unk_6A[0x72]; +} SystemState; //8018fcf8, sizeof 0xDC + +typedef struct player_state { +/* 0x00 */ struct { + u16 diff : 2; + u16 com : 1; + u16 character : 4; + u16 auto_size : 2; + u16 draw_ticket : 1; + u16 ticket_player : 6; + }; +/* 0x02 */ struct { + u8 team : 1; + u8 spark : 1; + u8 player_idx : 2; + }; +/* 0x03 */ s8 handicap; +/* 0x04 */ s8 port; +/* 0x05 */ s8 items[3]; +/* 0x08 */ struct { + u16 color : 2; + u16 moving : 1; + u16 jump : 1; + u16 show_next : 1; + u16 size : 2; + u16 num_dice : 2; + u16 rank : 2; + u16 bowser_suit : 1; + u16 team_backup : 1; + }; +/* 0x0A */ s8 roll; +/* 0x0C */ s16 space_curr; +/* 0x0E */ s16 space_prev; +/* 0x10 */ s16 space_next; +/* 0x12 */ s16 space_shock; +/* 0x14 */ s8 blue_count; +/* 0x15 */ s8 red_count; +/* 0x16 */ s8 question_count; +/* 0x17 */ s8 fortune_count; +/* 0x18 */ s8 bowser_count; +/* 0x19 */ s8 battle_count; +/* 0x1A */ s8 mushroom_count; +/* 0x1B */ s8 warp_count; +/* 0x1C */ s16 coins; +/* 0x1E */ s16 coins_mg; +/* 0x20 */ s16 coins_total; +/* 0x22 */ s16 coins_max; +/* 0x24 */ s16 coins_battle; +/* 0x26 */ s16 coin_collect; +/* 0x28 */ s16 coin_win; +/* 0x2A */ s16 stars; +/* 0x2C */ s16 stars_max; +/* 0x2E */ char unk_2E[2]; +} PlayerState; //size of 0x30 + +typedef struct pause_backup_config { + u8 explain_mg : 1; + u8 show_com_mg : 1; + u8 mg_list : 2; + u8 mess_speed : 2; + u8 save_mode : 2; +} PauseBackupConfig; + +typedef struct game_stat { +/* 0x0 */ s16 unk_00; +/* 0x2 */ u8 language; +/* 0x3 */ u8 sound_mode; +/* 0x4 */ s8 rumble; +/* 0x6 */ u16 total_stars; +/* 0x8 */ OSTime create_time; +/* 0x10 */ u32 mg_custom[2]; +/* 0x18 */ u32 mg_avail[2]; +/* 0x20 */ u32 mg_record[15]; +/* 0x5C */ u8 board_win_count[9][8]; +/* 0xA4 */ u8 board_play_count[9]; +/* 0xAE */ u16 board_max_stars[9]; +/* 0xC0 */ u16 board_max_coins[9]; +/* 0xD2 */ u8 present[60]; +/* 0x10E */ struct { + u8 story_continue : 1; + u8 party_continue : 1; + u8 open_w06 : 1; + u8 field10E_bit4 : 1; + u8 field10E_bit5 : 1; + u8 field10E_bit6 : 1; + }; +/* 0x10F */ PauseBackupConfig story_pause; +/* 0x110 */ PauseBackupConfig party_pause; +} GameStat; + +extern PlayerConfig GWPlayerCfg[4]; +extern PlayerState GWPlayer[4]; +extern SystemState GWSystem; +extern GameStat GWGameStat; + +static inline s32 GWTeamGet(void) +{ + return GWSystem.team; +} + +static inline s32 GWMGTypeGet(void) +{ + return GWSystem.mg_type; +} + +static inline void GWMGTypeSet(s32 type) +{ + GWSystem.mg_type = type; +} + +static inline s32 GWPartyGet(void) +{ + return GWSystem.party; +} + +static inline s32 GWLanguageGet(void) +{ + return GWGameStat.language; +} + +static inline s32 GWRumbleGet(void) +{ + return GWGameStat.rumble; +} + +static inline void GWRumbleSet(s32 value) +{ + GWGameStat.rumble = value; + if(value == 0) { + HuPadRumbleAllStop(); + } +} + +static inline s32 GWMGExplainGet(void) +{ + return GWSystem.explain_mg; +} + +static inline void GWMGExplainSet(s32 value) +{ + GWSystem.explain_mg = value; +} + +static inline s32 GWMGShowComGet(void) +{ + return GWSystem.show_com_mg; +} + +static inline void GWMGShowComSet(s32 value) +{ + GWSystem.show_com_mg = value; +} + +static inline s32 GWMGListGet(void) +{ + if (GWSystem.mg_list == 3) { + GWSystem.mg_list = 0; + } + return GWSystem.mg_list; +} + +static inline void GWMGListSet(s32 value) +{ + GWSystem.mg_list = value; +} + +static inline s32 GWMessSpeedGet(void) +{ + if (GWSystem.mess_speed == 3) { + GWSystem.mess_speed = 1; + } + return GWSystem.mess_speed; +} + +static inline void GWMessSpeedSet(s32 value) +{ + GWSystem.mess_speed = value; + switch(value) { + case 0: + GWSystem.mess_delay = 16; + break; + + case 2: + GWSystem.mess_delay = 48; + break; + + default: + GWSystem.mess_delay = 32; + break; + } +} + +static inline void GWSaveModeSet(s32 value) +{ + GWSystem.save_mode = value; +} + +static inline s32 GWSaveModeGet(void) +{ + if (GWSystem.save_mode == 3) { + GWSaveModeSet(1); + } + return GWSystem.save_mode; +} + +static inline s32 GWTurnGet(void) +{ + return GWSystem.turn; +} + +static inline s32 GWBoardGet(void) +{ + return GWSystem.board; +} + +static inline s32 GWPlayerTeamGet(s32 player) +{ + return GWPlayer[player].team; +} + +static inline s32 GWLuckyValueGet(void) +{ + return GWSystem.lucky_value; +} + +static inline void GWLuckyValueSet(s32 value) +{ + GWSystem.lucky_value = value; +} + +static inline s16 GWPlayerCoinBattleGet(s32 player) +{ + return GWPlayer[player].coins_battle; +} + +static inline s16 GWPlayerCoinCollectGet(s32 player) +{ + return GWPlayer[player].coin_collect; +} + +static inline void GWPlayerCoinCollectSet(s32 player, s16 value) +{ + GWPlayer[player].coin_collect = value; +} + +static inline s16 GWPlayerCoinWinGet(s32 player) +{ + return GWPlayer[player].coin_win; +} + +static inline void GWPlayerCoinWinSet(s32 player, s16 value) +{ + if (_CheckFlag(0x1000C) == 0) { + GWPlayer[player].coin_win = value; + } +} + +#define GWPlayerCoinWinAdd(player, value) GWPlayerCoinWinSet((player), GWPlayerCoinWinGet((player))+(value)) +#define GWPlayerCoinCollectAdd(player, value) GWPlayerCoinCollectSet((player), GWPlayerCoinCollectGet((player))+(value)) + +/* end "game/gamework_data.h" */ +/* "src\REL\E3setupDLL\main.c" line 3 "game/hsfman.h" */ + +#define _GAME_HSFMAN_H + +/* "include\game\hsfman.h" line 3 "game/hsfanim.h" */ + +#define GAME_HSFANIM_H + +/* "include\game\hsfanim.h" line 3 "game/hsfformat.h" */ + +#define _GAME_HSFFORMAT_H + +/* "include\game\hsfformat.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ +/* "include\game\hsfformat.h" line 4 "game/animdata.h" */ + +#define _GAME_ANIMDATA_H + +/* "include\game\animdata.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ + +#define ANIM_BMP_RGBA8 0 +#define ANIM_BMP_RGB5A3 1 +#define ANIM_BMP_RGB5A3_DUPE 2 +#define ANIM_BMP_C8 3 +#define ANIM_BMP_C4 4 +#define ANIM_BMP_IA8 5 +#define ANIM_BMP_IA4 6 +#define ANIM_BMP_I8 7 +#define ANIM_BMP_I4 8 +#define ANIM_BMP_A8 9 +#define ANIM_BMP_CMPR 10 + +#define ANIM_BMP_FMTMASK 0xF +#define ANIM_BMP_ALLOC 0x8000 +#define ANIM_BMP_NUM_MASK 0x7FFF + +#define ANIM_LAYER_FLIPX 0x1 +#define ANIM_LAYER_FLIPY 0x2 + +typedef struct anim_frame_data { + s16 pat; + s16 time; + s16 shiftX; + s16 shiftY; + s16 flip; + s16 pad; +} AnimFrameData; + +typedef struct anim_bank_data { + s16 timeNum; + s16 unk; + AnimFrameData *frame; +} AnimBankData; + +typedef struct anim_layer_data { + u8 alpha; + u8 flip; + s16 bmpNo; + s16 startX; + s16 startY; + s16 sizeX; + s16 sizeY; + s16 shiftX; + s16 shiftY; + s16 vtx[8]; +} AnimLayerData; + +typedef struct anim_pat_data { + s16 layerNum; + s16 centerX; + s16 centerY; + s16 sizeX; + s16 sizeY; + AnimLayerData *layer; +} AnimPatData; + +typedef struct anim_bmp_data { + u8 pixSize; + u8 dataFmt; + s16 palNum; + s16 sizeX; + s16 sizeY; + u32 dataSize; + void *palData; + void *data; +} AnimBmpData; + +typedef struct anim_data { + s16 bankNum; + s16 patNum; + s16 bmpNum; + s16 useNum; + AnimBankData *bank; + AnimPatData *pat; + AnimBmpData *bmp; +} AnimData; + + +#define HSF_OBJ_NULL1 0 +#define HSF_OBJ_REPLICA 1 +#define HSF_OBJ_MESH 2 +#define HSF_OBJ_ROOT 3 +#define HSF_OBJ_JOINT 4 +#define HSF_OBJ_NULL2 5 +#define HSF_OBJ_NULL3 6 +#define HSF_OBJ_NONE1 7 +#define HSF_OBJ_NONE2 8 +#define HSF_OBJ_MAP 9 + +#define HSF_TRACK_TRANSFORM 2 +#define HSF_TRACK_MORPH 3 +#define HSF_TRACK_CLUSTER 5 +#define HSF_TRACK_CLUSTER_WEIGHT 6 +#define HSF_TRACK_MATERIAL 9 +#define HSF_TRACK_ATTRIBUTE 10 + +#define HSF_CURVE_STEP 0 +#define HSF_CURVE_LINEAR 1 +#define HSF_CURVE_BEZIER 2 +#define HSF_CURVE_BITMAP 3 +#define HSF_CURVE_CONST 4 + +typedef struct hsf_vector3f { + float x; + float y; + float z; +} HsfVector3f; + +typedef struct hsf_vector2f { + float x; + float y; +} HsfVector2f; + +typedef struct hsf_section { + s32 ofs; + s32 count; +} HsfSection; + +typedef struct hsf_header { + char magic[8]; + HsfSection scene; + HsfSection color; + HsfSection material; + HsfSection attribute; + HsfSection vertex; + HsfSection normal; + HsfSection st; + HsfSection face; + HsfSection object; + HsfSection bitmap; + HsfSection palette; + HsfSection motion; + HsfSection cenv; + HsfSection skeleton; + HsfSection part; + HsfSection cluster; + HsfSection shape; + HsfSection mapAttr; + HsfSection matrix; + HsfSection symbol; + HsfSection string; +} HsfHeader; + +typedef struct hsf_scene { + GXFogType fogType; + f32 start; + f32 end; + GXColor color; +} HsfScene; + +typedef struct hsf_bitmap { + char *name; + u32 maxLod; + u8 dataFmt; + u8 pixSize; + s16 sizeX; + s16 sizeY; + s16 palSize; + GXColor tint; + void *palData; + u32 unk; + void *data; +} HsfBitmap; + +typedef struct hsf_palette { + char *name; + s32 unk; + u32 palSize; + u16 *data; +} HsfPalette; + +typedef struct hsf_attribute { + char *name; + void *unk04; + u8 unk8[4]; + float unk0C; + u8 unk10[4]; + float unk14; + u8 unk18[8]; + float unk20; + u8 unk24[4]; + float unk28; + float unk2C; + float unk30; + float unk34; + u8 unk38[44]; + u32 wrap_s; + u32 wrap_t; + u8 unk6C[12]; + u32 unk78; + u32 flag; + HsfBitmap *bitmap; +} HsfAttribute; + +typedef struct hsf_material { + char *name; + u8 unk4[4]; + u16 pass; + u8 vtxMode; + u8 litColor[3]; + u8 color[3]; + u8 shadowColor[3]; + float hilite_scale; + float unk18; + float invAlpha; + float unk20[2]; + float refAlpha; + float unk2C; + u32 flags; + u32 numAttrs; + s32 *attrs; +} HsfMaterial; + +typedef struct hsf_vertex_buf { + char *name; + s32 count; + void *data; +} HsfBuffer; + +typedef struct hsf_face { + s16 type; + s16 mat; + union { + struct { + s16 indices[3][4]; + u32 count; + s16 *data; + } strip; + s16 indices[4][4]; + }; + float nbt[3]; +} HsfFace; + +typedef struct hsf_const_data { + u32 flags; + s16 hook; + u8 unk6[2]; + void *unk08; + void *unk0C; + Mtx unk10; + AnimData *hilite_map; +} HsfConstData; + +typedef struct hsf_transform { + Vec pos; + Vec rot; + Vec scale; +} HsfTransform; + +typedef struct hsf_cenv_single { + u32 target; + u16 pos; + u16 posCnt; + u16 normal; + u16 normalCnt; +} HsfCenvSingle; + +typedef struct hsf_cenv_dual_weight { + float weight; + u16 pos; + u16 posCnt; + u16 normal; + u16 normalCnt; +} HsfCenvDualWeight; + +typedef struct hsf_cenv_dual { + u32 target1; + u32 target2; + u32 weightCnt; + HsfCenvDualWeight *weight; +} HsfCenvDual; + +typedef struct hsf_cenv_multi_weight { + u32 target; + float value; +} HsfCenvMultiWeight; + +typedef struct hsf_cenv_multi { + u32 weightCnt; + u16 pos; + u16 posCnt; + u16 normal; + u16 normalCnt; + HsfCenvMultiWeight *weight; +} HsfCenvMulti; + +typedef struct hsf_cenv { + char *name; + HsfCenvSingle *singleData; + HsfCenvDual *dualData; + HsfCenvMulti *multiData; + u32 singleCount; + u32 dualCount; + u32 multiCount; + u32 vtxCount; + u32 copyCount; +} HsfCenv; + +typedef struct hsf_part { + char *name; + u32 count; + u16 *vertex; +} HsfPart; + +typedef struct hsf_cluster { + char *name[2]; + union { + char *targetName; + s32 target; + }; + HsfPart *part; + float unk10; + float unk14[1]; // unknown array size + u8 unk18[124]; + u8 adjusted; + u8 unk95; + u16 type; + u32 vertexCnt; + HsfBuffer **vertex; +} HsfCluster; + +typedef struct hsf_shape { + char *name; + union { + u16 count16[2]; + u32 vertexCnt; + }; + HsfBuffer **vertex; +} HsfShape; + +typedef struct hsf_object_data { + struct hsf_object *parent; + u32 childrenCount; + struct hsf_object **children; + HsfTransform base; + HsfTransform curr; + union { + struct { + HsfVector3f min; + HsfVector3f max; + float baseMorph; + float morphWeight[33]; + } mesh; + struct hsf_object *replica; + }; + + HsfBuffer *face; + HsfBuffer *vertex; + HsfBuffer *normal; + HsfBuffer *color; + HsfBuffer *st; + HsfMaterial *material; + HsfAttribute *attribute; + u8 unk120[2]; + u8 shapeType; + u8 unk123; + u32 vertexShapeCnt; + HsfBuffer **vertexShape; + u32 clusterCnt; + HsfCluster **cluster; + u32 cenvCnt; + HsfCenv *cenv; + void *file[2]; +} HsfObjectData; + +typedef struct hsf_camera { + HsfVector3f target; + HsfVector3f pos; + float aspect_dupe; + float fov; + float near; + float far; +} HsfCamera; + +typedef struct hsf_light { + HsfVector3f pos; + HsfVector3f target; + u8 type; + u8 r; + u8 g; + u8 b; + float unk2C; + float ref_distance; + float ref_brightness; + float cutoff; +} HsfLight; +typedef struct hsf_object { + char *name; + u32 type; + HsfConstData *constData; + u32 flags; + union { + HsfObjectData data; + HsfCamera camera; + HsfLight light; + }; +} HsfObject; + +typedef struct hsf_skeleton { + char *name; + HsfTransform transform; +} HsfSkeleton; + +typedef struct hsf_bitmap_keyframe { + float time; + HsfBitmap *data; +} HsfBitmapKey; + +typedef struct hsf_track { + u8 type; + u8 start; + union { + u16 target; + s16 target_s16; + }; + union { + s32 unk04; + struct { + union { + s16 param; + u16 param_u16; + }; + union { + u16 channel; + s16 channel_s16; + }; + }; + }; + u16 curveType; + u16 numKeyframes; + union { + float value; + void *data; + }; +} HsfTrack; + +typedef struct hsf_motion { + char *name; + s32 numTracks; + HsfTrack *track; + float len; +} HsfMotion; + +typedef struct hsf_map_attr { + float minX; + float minZ; + float maxX; + float maxZ; + u16 *data; + u32 dataLen; +} HsfMapAttr; + +typedef struct hsf_matrix { + u32 base_idx; + u32 count; + Mtx *data; +} HsfMatrix; + +typedef struct hsf_data { + u8 magic[8]; + HsfScene *scene; + HsfAttribute *attribute; + HsfMaterial *material; + HsfBuffer *vertex; + HsfBuffer *normal; + HsfBuffer *st; + HsfBuffer *color; + HsfBuffer *face; + HsfBitmap *bitmap; + HsfPalette *palette; + HsfObject *root; + HsfCenv *cenv; + HsfSkeleton *skeleton; + HsfCluster *cluster; + HsfPart *part; + HsfShape *shape; + HsfMotion *motion; + HsfObject *object; + HsfMapAttr *mapAttr; + HsfMatrix *matrix; + s16 sceneCnt; + s16 attributeCnt; + s16 materialCnt; + s16 vertexCnt; + s16 normalCnt; + s16 stCnt; + s16 colorCnt; + s16 faceCnt; + s16 bitmapCnt; + s16 paletteCnt; + s16 objectCnt; + s16 cenvCnt; + s16 skeletonCnt; + s16 clusterCnt; + s16 partCnt; + s16 shapeCnt; + s16 mapAttrCnt; + s16 motionCnt; + s16 matrixCnt; +} HsfData; + +/* end "game/hsfformat.h" */ +/* "include\game\hsfanim.h" line 4 "game/hsfman.h" */ +/* end "game/hsfman.h" */ +/* "include\game\hsfanim.h" line 5 "game/animdata.h" */ +/* end "game/animdata.h" */ + +typedef struct model_data ModelData; +typedef struct particle_data ParticleData; + +typedef void (*ParticleHook)(ModelData *model, ParticleData *particle, Mtx matrix); + +typedef struct { + /* 0x00 */ union { + u16 unk00; + s16 unk00_s16; + }; + /* 0x02 */ s16 unk02; + /* 0x04 */ s16 unk04; + /* 0x06 */ s16 unk06; + /* 0x08 */ Vec unk08; + /* 0x14 */ Vec unk14; + /* 0x20 */ float unk20; + /* 0x24 */ float unk24; + /* 0x28 */ float unk28; + /* 0x2C */ float unk2C; + /* 0x30 */ float unk30; + /* 0x34 */ Vec unk34; + /* 0x40 */ GXColor unk40; +} HsfanimStruct01; // Size 0x44 + +typedef struct particle_data { + /* 0x00 */ s16 unk_00; + /* 0x02 */ s16 unk_02; + /* 0x04 */ float unk_04; + /* 0x08 */ char unk_08[0x14]; + /* 0x1C */ void *unk_1C; + /* 0x20 */ s16 unk_20; + /* 0x22 */ s16 unk_22; + /* 0x24 */ float unk_24; + /* 0x28 */ float unk_28; + /* 0x2C */ u8 unk_2C; + /* 0x2D */ u8 unk_2D; + /* 0x2E */ char unk_2E[2]; + /* 0x30 */ s16 unk_30; + /* 0x32 */ char unk_32[2]; + /* 0x34 */ u32 unk_34; + /* 0x38 */ s32 unk_38; + /* 0x3C */ u32 unk_3C; + /* 0x40 */ s32 unk_40; + /* 0x44 */ AnimData *unk_44; + /* 0x48 */ HsfanimStruct01 *unk_48; + /* 0x4C */ Vec *unk_4C; + /* 0x50 */ void *unk_50; + /* 0x54 */ ParticleHook unk_54; +} ParticleData; // Size 0x58 + +typedef struct { + /* 0x00 */ s16 unk00; + /* 0x02 */ char unk02[2]; + /* 0x04 */ float unk04; + /* 0x08 */ float unk08; + /* 0x0C */ float unk0C; + /* 0x10 */ Vec unk10; + /* 0x1C */ float unk1C; + /* 0x20 */ float unk20; + /* 0x24 */ float unk24; + /* 0x28 */ float unk28; + /* 0x2C */ s16 unk2C; + /* 0x2E */ GXColor unk2E[4]; + /* 0x3E */ GXColor unk3E[4]; +} HsfanimStruct00; // Size unknown + +typedef struct { + /* 0x00 */ u16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ s16 unk04; + /* 0x06 */ s16 unk06; + /* 0x08 */ float unk08; + /* 0x0C */ float unk0C; + /* 0x10 */ AnimData *unk10; +} Hu3DTexAnimDataStruct; // Size 0x14 + +typedef struct { + /* 0x00 */ u16 unk00; + /* 0x02 */ s16 unk02; + /* 0x04 */ Vec unk04; + /* 0x10 */ char unk10[0xC]; + /* 0x1C */ Vec unk1C; + /* 0x28 */ char unk28[0xC]; + /* 0x34 */ float unk34; + /* 0x38 */ float unk38; + /* 0x3C */ Mtx unk3C; +} Hu3DTexScrDataStruct; // Size 0x6C + +void Hu3DAnimInit(void); +s16 Hu3DAnimCreate(void *arg0, s16 arg1, char *arg2); +s16 Hu3DAnimLink(s16 arg0, s16 arg1, char *arg2); +void Hu3DAnimKill(s16 arg0); +void Hu3DAnimModelKill(s16 arg0); +void Hu3DAnimAllKill(void); +void Hu3DAnimAttrSet(s16 arg0, u16 arg1); +void Hu3DAnimAttrReset(s16 arg0, s32 arg1); +void Hu3DAnimSpeedSet(s16 arg0, float arg1); +void Hu3DAnimBankSet(s16 arg0, s32 arg1); +void Hu3DAnmNoSet(s16 arg0, u16 arg1); +s32 Hu3DAnimSet(ModelData *arg0, HsfAttribute *arg1, s16 arg2); +void Hu3DAnimExec(void); +s16 Hu3DTexScrollCreate(s16 arg0, char *arg1); +void Hu3DTexScrollKill(s16 arg0); +void Hu3DTexScrollAllKill(void); +void Hu3DTexScrollPosSet(s16 arg0, float arg1, float arg2, float arg3); +void Hu3DTexScrollPosMoveSet(s16 arg0, float arg1, float arg2, float arg3); +void Hu3DTexScrollRotSet(s16 arg0, float arg1); +void Hu3DTexScrollRotMoveSet(s16 arg0, float arg1); +void Hu3DTexScrollPauseDisableSet(s16 arg0, s32 arg1); +s16 Hu3DParticleCreate(AnimData *arg0, s16 arg1); +void Hu3DParticleScaleSet(s16 arg0, float arg1); +void Hu3DParticleZRotSet(s16 arg0, float arg1); +void Hu3DParticleColSet(s16 arg0, u8 arg1, u8 arg2, u8 arg3); +void Hu3DParticleTPLvlSet(s16 arg0, float arg1); +void Hu3DParticleBlendModeSet(s16 arg0, u8 arg1); +void Hu3DParticleHookSet(s16 arg0, ParticleHook arg1); +void Hu3DParticleAttrSet(s16 arg0, u8 arg1); +void Hu3DParticleAttrReset(s16 arg0, u8 arg1); +void Hu3DParticleAnimModeSet(s16 arg0, s16 arg1); +void Hu3DParManInit(void); +s16 Hu3DParManCreate(AnimData *arg0, s16 arg1, HsfanimStruct00 *arg2); +s16 Hu3DParManLink(s16 arg0, HsfanimStruct00 *arg1); +void Hu3DParManKill(s16 arg0); +void Hu3DParManAllKill(void); +void *Hu3DParManPtrGet(s16 arg0); +void Hu3DParManPosSet(s16 arg0, float arg1, float arg2, float arg3); +void Hu3DParManVecSet(s16 arg0, float arg1, float arg2, float arg3); +void Hu3DParManRotSet(s16 arg0, float arg1, float arg2, float arg3); +void Hu3DParManAttrSet(s16 arg0, s32 arg1); +void Hu3DParManAttrReset(s16 arg0, s32 arg1); +s16 Hu3DParManModelIDGet(s16 arg0); +void Hu3DParManTimeLimitSet(s16 arg0, s32 arg1); +void Hu3DParManVacumeSet(s16 arg0, float arg1, float arg2, float arg3, float arg4); +void Hu3DParManColorSet(s16 arg0, s16 arg1); + +extern Hu3DTexAnimDataStruct Hu3DTexAnimData[256]; +extern Hu3DTexScrDataStruct Hu3DTexScrData[16]; + +/* end "game/hsfanim.h" */ +/* "include\game\hsfman.h" line 4 "game/hsfformat.h" */ +/* end "game/hsfformat.h" */ +/* "include\game\hsfman.h" line 5 "game/memory.h" */ +/* end "game/memory.h" */ +/* "include\game\hsfman.h" line 6 "game/data.h" */ + +#define _GAME_DATA_H + +/* "include\game\data.h" line 3 "game/dvd.h" */ +/* end "game/dvd.h" */ + +/* "include\game\data.h" line 5 "datadir_enum.h" */ + +#define DATADIR_ENUM + + +enum { +/* "include\datadir_enum.h" line 6 "datadir_table.h" */ +DATADIR_ID_E3SETUP, +DATADIR_ID_BBATTLE, +DATADIR_ID_BGUEST, +DATADIR_ID_BKOOPA, +DATADIR_ID_BKOOPASUIT, +DATADIR_ID_BKUJIYA, +DATADIR_ID_BLAST5, +DATADIR_ID_BOARD, +DATADIR_ID_BPAUSE, +DATADIR_ID_BYOKODORI, +DATADIR_ID_DAISY, +DATADIR_ID_DAISYMDL0, +DATADIR_ID_DAISYMDL1, +DATADIR_ID_DAISYMOT, +DATADIR_ID_DONKEY, +DATADIR_ID_DONKEYMDL0, +DATADIR_ID_DONKEYMDL1, +DATADIR_ID_DONKEYMOT, +DATADIR_ID_EFFECT, +DATADIR_ID_GAMEMES, +DATADIR_ID_INST, +DATADIR_ID_INSTFONT, +DATADIR_ID_INSTPIC, +DATADIR_ID_LUIGI, +DATADIR_ID_LUIGIMDL0, +DATADIR_ID_LUIGIMDL1, +DATADIR_ID_LUIGIMOT, +DATADIR_ID_M300, +DATADIR_ID_M302, +DATADIR_ID_M303, +DATADIR_ID_M330, +DATADIR_ID_M333, +DATADIR_ID_M401, +DATADIR_ID_M402, +DATADIR_ID_M403, +DATADIR_ID_M404, +DATADIR_ID_M405, +DATADIR_ID_M406, +DATADIR_ID_M407, +DATADIR_ID_M408, +DATADIR_ID_M409, +DATADIR_ID_M410, +DATADIR_ID_M411, +DATADIR_ID_M412, +DATADIR_ID_M413, +DATADIR_ID_M414, +DATADIR_ID_M415, +DATADIR_ID_M416, +DATADIR_ID_M417, +DATADIR_ID_M418, +DATADIR_ID_M419, +DATADIR_ID_M420, +DATADIR_ID_M421, +DATADIR_ID_M422, +DATADIR_ID_M423, +DATADIR_ID_M424, +DATADIR_ID_M425, +DATADIR_ID_M426, +DATADIR_ID_M427, +DATADIR_ID_M428, +DATADIR_ID_M429, +DATADIR_ID_M430, +DATADIR_ID_M431, +DATADIR_ID_M432, +DATADIR_ID_M433, +DATADIR_ID_M434, +DATADIR_ID_M435, +DATADIR_ID_M436, +DATADIR_ID_M437, +DATADIR_ID_M438, +DATADIR_ID_M439, +DATADIR_ID_M440, +DATADIR_ID_M441, +DATADIR_ID_M442, +DATADIR_ID_M443, +DATADIR_ID_M444, +DATADIR_ID_M445, +DATADIR_ID_M446, +DATADIR_ID_M447, +DATADIR_ID_M448, +DATADIR_ID_M449, +DATADIR_ID_M450, +DATADIR_ID_M451, +DATADIR_ID_M453, +DATADIR_ID_M455, +DATADIR_ID_M456, +DATADIR_ID_M457, +DATADIR_ID_M458, +DATADIR_ID_M459, +DATADIR_ID_M460, +DATADIR_ID_M461, +DATADIR_ID_M462, +DATADIR_ID_MARIO, +DATADIR_ID_MARIOMDL0, +DATADIR_ID_MARIOMDL1, +DATADIR_ID_MARIOMOT, +DATADIR_ID_MENT, +DATADIR_ID_MGCONST, +DATADIR_ID_MGMODE, +DATADIR_ID_MODESEL, +DATADIR_ID_MPEX, +DATADIR_ID_MSTORY, +DATADIR_ID_MSTORY2, +DATADIR_ID_MSTORY3, +DATADIR_ID_MSTORY4, +DATADIR_ID_OPTION, +DATADIR_ID_PEACH, +DATADIR_ID_PEACHMDL0, +DATADIR_ID_PEACHMDL1, +DATADIR_ID_PEACHMOT, +DATADIR_ID_PRESENT, +DATADIR_ID_RESULT, +DATADIR_ID_SAF, +DATADIR_ID_SELMENU, +DATADIR_ID_SETUP, +DATADIR_ID_STAFF, +DATADIR_ID_TITLE, +DATADIR_ID_W01, +DATADIR_ID_W02, +DATADIR_ID_W03, +DATADIR_ID_W04, +DATADIR_ID_W05, +DATADIR_ID_W06, +DATADIR_ID_W10, +DATADIR_ID_W20, +DATADIR_ID_W21, +DATADIR_ID_WALUIGI, +DATADIR_ID_WALUIGIMDL0, +DATADIR_ID_WALUIGIMDL1, +DATADIR_ID_WALUIGIMOT, +DATADIR_ID_WARIO, +DATADIR_ID_WARIOMDL0, +DATADIR_ID_WARIOMDL1, +DATADIR_ID_WARIOMOT, +DATADIR_ID_WIN, +DATADIR_ID_YOSHI, +DATADIR_ID_YOSHIMDL0, +DATADIR_ID_YOSHIMDL1, +DATADIR_ID_YOSHIMOT, +DATADIR_ID_ZTAR, + DATADIR_ID_MAX +}; + + +#define DATADIR_DEFINE(name, path) DATADIR_##name = (DATADIR_ID_##name) << 16, + + +#define DATA_MAKE_NUM(dir, file) ((dir)+(file)) + +#define DATA_DECODE_NONE 0 +#define DATA_DECODE_LZ 1 +#define DATA_DECODE_SLIDE 2 +#define DATA_DECODE_FSLIDE_ALT 3 +#define DATA_DECODE_FSLIDE 4 +#define DATA_DECODE_RLE 5 + +#define DATA_NUM_LISTEND -1 + +/* "include\game\data.h" line 16 "dolphin/types.h" */ +/* end "dolphin/types.h" */ + + +typedef struct data_read_stat { + s32 dir_id; + void *dir; + void *file; + u32 raw_len; + u32 comp_type; + BOOL used; + s32 num; + u32 status; + DVDFileInfo file_info; +} DataReadStat; + +void HuDataInit(void); +int HuDataReadChk(s32 data_num); +DataReadStat *HuDataGetStatus(void *dir_ptr); +void *HuDataGetDirPtr(s32 data_num); +DataReadStat *HuDataDirRead(s32 data_num); +DataReadStat *HuDataDirReadNum(s32 data_num, s32 num); +DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num); +void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo* fileInfo); +s32 HuDataDirReadAsync(s32 data_num); +s32 HuDataDirReadNumAsync(s32 data_num, s32 num); +BOOL HuDataGetAsyncStat(s32 status); +void *HuDataRead(s32 data_num); +void *HuDataReadNum(s32 data_num, s32 num); +void *HuDataSelHeapRead(s32 data_num, HeapID heap); +void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap); +void **HuDataReadMulti(s32 *data_ids); +s32 HuDataGetSize(s32 data_num); +void HuDataClose(void *ptr); +void HuDataCloseMulti(void **ptrs); +void HuDataDirClose(s32 data_id); +void HuDataDirCloseNum(s32 num); +void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap); + +void HuDecodeData(void *src, void *dst, u32 size, int decode_type); + +extern u32 DirDataSize; + + +#define Hu3DModelCreateFile(data_id) (Hu3DModelCreate(HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) + +typedef struct particle_data ParticleData; + +typedef void (*ModelHookFunc)(struct model_data *, Mtx); + +typedef struct model_data { + u8 unk_00; + u8 unk_01; + u8 unk_02; + u8 unk_03; + s8 unk_04; + s8 unk_05; + s16 layer; + s16 unk_08; + s16 unk_0A; + s16 unk_0C; + s16 unk_0E; + s16 unk_10[4]; + s16 cluster_attr[4]; + s16 unk_20; + u16 camera; + s16 unk_24; + u16 unk_26; + u16 unk_28[8]; + s16 unk_38[8]; + HsfData *unk_48; + HsfData *unk_4C; + u32 attr; + u32 motion_attr; + Point3d unk_58; + f32 unk_64; + f32 unk_68; + f32 unk_6C; + f32 unk_70; + f32 unk_74; + f32 unk_78; + f32 unk_7C; + f32 unk_80; + f32 unk_84; + f32 unk_88; + f32 unk_8C; + f32 unk_90; + f32 unk_94; + f32 unk_98; + f32 unk_9C; + f32 unk_A0; + f32 unk_A4[4]; + f32 unk_B4[4]; + union { + HsfData *hsfData; + ModelHookFunc hook; + }; + HsfData *unk_C8; + Vec pos; + Vec rot; + Vec scale; + Mtx unk_F0; + ParticleData *unk_120; +} ModelData; // sizeof 0x124 +typedef struct camera_data { + f32 fov; + f32 near; + f32 far; + f32 aspect; + f32 aspect_dupe; + Vec pos; + Vec up; + Vec target; + s16 scissor_x; + s16 scissor_y; + s16 scissor_w; + s16 scissor_h; + f32 viewport_x; + f32 viewport_y; + f32 viewport_w; + f32 viewport_h; + f32 near_z; + f32 far_z; +} CameraData; // sizeof 0x58 +typedef struct ThreeDProjectionStruct { + u8 unk_00; + char unk_01[0x3]; + void *unk_04; + Vec unk_08; + Point3d unk_14; + Point3d unk_20; + Vec unk_2C; + Mtx unk_38; + Mtx unk_68; +} ThreeDProjectionStruct; // sizeof 0x98 +typedef struct shadow_data { + u8 unk_00; + u8 unk_01; + u16 unk_02; + void* unk_04; + Vec unk_08; + Vec unk_14; + Vec unk_20; + Vec unk_2C; + Mtx unk_38; + Mtx unk_68; +} ShadowData; // sizeof 0x98 +typedef struct light_data { + s16 unk_00; + s16 unk_02; + f32 unk_04; + f32 unk_08; + char unk_0C[0x10]; + Vec unk_1C; + Vec unk_28; + Vec unk_34; + GXColor color; +} LightData; + +extern void GXWaitDrawDone(); /* extern */ +extern void GXInitSpecularDir(GXLightObj*, f32, f32, f32); + +void Hu3DInit(void); +void Hu3DPreProc(void); +void Hu3DExec(void); +void Hu3DAllKill(void); +void Hu3DBGColorSet(u8, u8, u8); +void Hu3DLayerHookSet(s16, void (*)(s16)); +void Hu3DPauseSet(s32); +void Hu3DNoSyncSet(s32); +s16 Hu3DModelCreate(void *); +s16 Hu3DModelLink(s16); +s16 Hu3DHookFuncCreate(ModelHookFunc); +void Hu3DModelKill(s16); +void Hu3DModelAllKill(void); +void Hu3DModelPosSet(s16, f32, f32, f32); +void Hu3DModelPosSetV(s16, Vec *); +void Hu3DModelRotSet(s16, f32, f32, f32); +void Hu3DModelRotSetV(s16, Vec *); +void Hu3DModelScaleSet(s16, f32, f32, f32); +void Hu3DModelScaleSetV(s16, Vec *); +void Hu3DModelAttrSet(s16, u32); +void Hu3DModelAttrReset(s16, u32); +u32 Hu3DModelAttrGet(s16); +u32 Hu3DModelMotionAttrGet(s16); +void Hu3DModelClusterAttrSet(s16, s16, s32); +void Hu3DModelClusterAttrReset(s16, s16, s32); +void Hu3DModelCameraSet(s16, u16); +void Hu3DModelLayerSet(s16, s16); +HsfObject* Hu3DModelObjPtrGet(s16, char *); +void Hu3DModelTPLvlSet(s16, f32); +void Hu3DModelHiliteMapSet(s16, AnimData*); +void Hu3DModelShadowSet(s16); +void Hu3DModelShadowReset(s16); +void Hu3DModelShadowDispOn(s16); +void Hu3DModelShadowDispOff(s16); +void Hu3DModelShadowMapSet(s16); +void Hu3DModelShadowMapObjSet(s16, char *); +void Hu3DModelAmbSet(s16, f32, f32, f32); +void Hu3DModelHookSet(s16, char *, s16); +void Hu3DModelHookReset(s16); +void Hu3DModelHookObjReset(s16, char *); +void Hu3DModelProjectionSet(s16, s16); +void Hu3DModelProjectionReset(s16, s16); +void Hu3DModelHiliteTypeSet(s16, s16); +void Hu3DModelReflectTypeSet(s16, s16); +void Hu3DCameraCreate(s32); +void Hu3DCameraPerspectiveSet(s32, f32, f32, f32, f32); +void Hu3DCameraViewportSet(s32, f32, f32, f32, f32, f32, f32); +void Hu3DCameraScissorSet(s32, u32, u32, u32, u32); +void Hu3DCameraPosSet(s32, f32, f32, f32, f32, f32, f32, f32, f32, f32); +void Hu3DCameraPosSetV(s32 cam, Vec *pos, Vec *up, Vec *target); +void Hu3DCameraKill(s32); +void Hu3DCameraAllKill(void); +void Hu3DCameraSet(s32, Mtx); +BOOL Hu3DModelCameraInfoSet(s16, u16); +s16 Hu3DModelCameraCreate(s16, u16); +void Hu3DCameraMotionOn(s16, s8); +void Hu3DCameraMotionStart(s16, u16); +void Hu3DCameraMotionOff(s16); +void Hu3DLighInit(void); +s16 Hu3DGLightCreate(f32, f32, f32, f32, f32, f32, u8, u8, u8); +s16 Hu3DGLightCreateV(Vec*, Vec*, GXColor*); +s16 Hu3DLLightCreate(s16, f32, f32, f32, f32, f32, f32, u8, u8, u8); +s16 Hu3DLLightCreateV(s16, Vec*, Vec*, GXColor*); +void Hu3DGLightSpotSet(s16, u16, f32); +void Hu3DLLightSpotSet(s16, s16, u16, f32); +void Hu3DGLightInfinitytSet(s16); +void Hu3DLLightInfinitytSet(s16, s16); +void Hu3DGLightPointSet(s16, u16, f32, f32); +void Hu3DLLightPointSet(s16, s16, u16, f32, f32); +void Hu3DGLightKill(s16); +void Hu3DLLightKill(s16, s16); +void Hu3DLightAllKill(void); +void Hu3DGLightColorSet(s16, u8, u8, u8, u8); +void Hu3DLLightColorSet(s16, s16, u8, u8, u8, u8); +void Hu3DGLightPosSetV(s16, Vec*, Point3d*); +void Hu3DLLightPosSetV(s16, s16, Vec*, Point3d*); +void Hu3DGLightPosSet(s16, f32, f32, f32, f32, f32, f32); +void Hu3DLLightPosSet(s16, s16, f32, f32, f32, f32, f32, f32); +void Hu3DGLightPosAimSetV(s16, Point3d*, Point3d*); +void Hu3DLLightPosAimSetV(s16, s16, Point3d*, Point3d*); +void Hu3DGLightPosAimSet(s16, f32, f32, f32, f32, f32, f32); +void Hu3DLLightPosAimSet(s16, s16, f32, f32, f32, f32, f32, f32); +void Hu3DGLightStaticSet(s16, s32); +void Hu3DLLightStaticSet(s16, s16, s32); +s32 Hu3DModelLightInfoSet(s16, s16); +s16 Hu3DLightSet(ModelData*, Mtx*, Mtx*, f32); +void lightSet(LightData* arg0, s16 arg1, Mtx *arg2, Mtx *arg3, f32 arg8); +void Hu3DReflectMapSet(AnimData* arg0); +void Hu3DReflectNoSet(s16 arg0); +void Hu3DFogSet(f32, f32, u8, u8, u8); +void Hu3DFogClear(void); +void Hu3DShadowCreate(f32, f32, f32); +void Hu3DShadowPosSet(Vec*, Vec*, Vec*); +void Hu3DShadowTPLvlSet(f32); +void Hu3DShadowSizeSet(u16); +void Hu3DShadowExec(void); +s16 Hu3DProjectionCreate(void*, f32, f32, f32); +void Hu3DProjectionKill(s16); +void Hu3DProjectionPosSet(s16, Vec*, Vec*, Vec*); +void Hu3DProjectionTPLvlSet(s16, f32); +void Hu3DMipMapSet(char*, s16, s32, f32); + +extern ModelData Hu3DData[0x200]; +extern CameraData Hu3DCamera[0x10]; +extern AnimData *reflectAnim[5]; +extern AnimData *hiliteAnim[4]; +extern ThreeDProjectionStruct Hu3DProjection[4]; +extern ShadowData Hu3DShadowData; +extern Mtx Hu3DCameraMtx; +extern Mtx Hu3DCameraMtxXPose; +extern LightData Hu3DGlobalLight[0x8]; +extern s16 reflectMapNo; +extern AnimData *toonAnim; +extern s16 Hu3DShadowCamBit; +extern s32 Hu3DShadowF; +extern s32 shadowModelDrawF; +extern s16 Hu3DCameraNo; +extern s16 Hu3DCameraBit; +extern s16 Hu3DPauseF; + + +/* end "game/hsfman.h" */ +/* "src\REL\E3setupDLL\main.c" line 4 "game/wipe.h" */ + +#define _GAME_WIPE_H + +/* "include\game\wipe.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ + +#define WIPE_TYPE_NORMAL 0 +#define WIPE_TYPE_CROSS 1 +#define WIPE_TYPE_DUMMY 2 +#define WIPE_MODE_IN 1 +#define WIPE_MODE_OUT 2 +#define WIPE_MODE_BLANK 3 + +typedef struct wipe_state { + u32 unk00; + u32 unk04; + void *copy_data; + u32 unk0C; + void *unk10[8]; + float time; + float duration; + u32 unk38; + u16 w; + u16 h; + u16 x; + u16 y; + GXColor color; + volatile u8 type; + u8 mode; + u8 stat; + u8 keep_copy; +} WipeState; + +void WipeInit(GXRenderModeObj *rmode); +void WipeExecAlways(void); +void WipeCreate(s16 mode, s16 type, s16 duration); +void WipeColorSet(u8 r, u8 g, u8 b); +u8 WipeStatGet(void); + +extern WipeState wipeData; +extern BOOL wipeFadeInF; + + +/* "src\REL\E3setupDLL\main.c" line 5 "game/pad.h" */ + +#define _GAME_PAD_H + +/* "include\game\pad.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ + +#define PAD_BUTTON_DIR (PAD_BUTTON_LEFT | PAD_BUTTON_RIGHT | PAD_BUTTON_UP | PAD_BUTTON_DOWN) + +#define PAD_BUTTON_TRIGGER_L 0x4000 +#define PAD_BUTTON_TRIGGER_R 0x2000 + +extern u16 HuPadBtn[4]; +extern u16 HuPadBtnDown[4]; +extern u16 HuPadBtnRep[4]; +extern s8 HuPadStkX[4]; +extern s8 HuPadStkY[4]; +extern s8 HuPadSubStkX[4]; +extern s8 HuPadSubStkY[4]; +extern u8 HuPadTrigL[4]; +extern u8 HuPadTrigR[4]; +extern u8 HuPadDStk[4]; +extern u8 HuPadDStkRep[4]; +extern s8 HuPadErr[4]; +extern u16 _PadBtn[4]; +extern u16 _PadBtnDown[4]; +extern s32 VCounter; + +void HuPadInit(void); +void HuPadRead(void); +void HuPadRumbleSet(s16 pad, s16 duration, s16 off, s16 on); +void HuPadRumbleStop(s16 pad); +void HuPadRumbleAllStop(void); +s16 HuPadStatGet(s16 pad); +u32 HuPadRumbleGet(void); + + +/* "src\REL\E3setupDLL\main.c" line 6 "game/hsfmotion.h" */ + +#define _GAME_HSFMOTION_H + +/* "include\game\hsfmotion.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ +/* "include\game\hsfmotion.h" line 4 "game/hsfformat.h" */ +/* end "game/hsfformat.h" */ + +#define Hu3DJointMotionFile(model, data_id) (Hu3DJointMotion((model), HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) + + +typedef struct motion_data { + s16 unk_00; + s16 unk_02; + HsfData *unk_04; +} MotionData; + +typedef struct { + /* 0x00 */ float unk00; + /* 0x04 */ HsfBitmap *unk04; +} UnknownHsfMotionStruct01; // Size 8 + +void Hu3DMotionInit(void); +s16 Hu3DMotionCreate(void *arg0); +s16 Hu3DMotionModelCreate(s16 arg0); +s32 Hu3DMotionKill(s16 arg0); +void Hu3DMotionAllKill(void); +void Hu3DMotionSet(s16 arg0, s16 arg1); +void Hu3DMotionOverlaySet(s16 arg0, s16 arg1); +void Hu3DMotionOverlayReset(s16 arg0); +float Hu3DMotionOverlayTimeGet(s16 arg0); +void Hu3DMotionOverlayTimeSet(s16 arg0, float arg1); +void Hu3DMotionOverlaySpeedSet(s16 arg0, float arg1); +void Hu3DMotionShiftSet(s16 arg0, s16 arg1, float arg2, float arg3, u32 arg4); +void Hu3DMotionShapeSet(s16 arg0, s16 arg1); +s16 Hu3DMotionShapeIDGet(s16 arg0); +void Hu3DMotionShapeSpeedSet(s16 arg0, float arg1); +void Hu3DMotionShapeTimeSet(s16 arg0, float arg1); +float Hu3DMotionShapeMaxTimeGet(s16 arg0); +void Hu3DMotionShapeStartEndSet(s16 arg0, float arg1, float arg2); +s16 Hu3DMotionClusterSet(s16 arg0, s16 arg1); +s16 Hu3DMotionClusterNoSet(s16 arg0, s16 arg1, s16 arg2); +void Hu3DMotionShapeReset(s16 arg0); +void Hu3DMotionClusterReset(s16 arg0, s16 arg1); +s16 Hu3DMotionIDGet(s16 arg0); +s16 Hu3DMotionShiftIDGet(s16 arg0); +void Hu3DMotionTimeSet(s16 arg0, float arg1); +float Hu3DMotionTimeGet(s16 arg0); +float Hu3DMotionShiftTimeGet(s16 arg0); +float Hu3DMotionMaxTimeGet(s16 arg0); +float Hu3DMotionShiftMaxTimeGet(s16 arg0); +void Hu3DMotionShiftStartEndSet(s16 arg0, float arg1, float arg2); +float Hu3DMotionMotionMaxTimeGet(s16 arg0); +void Hu3DMotionStartEndSet(s16 arg0, float arg1, float arg2); +s32 Hu3DMotionEndCheck(s16 arg0); +void Hu3DMotionSpeedSet(s16 arg0, float arg1); +void Hu3DMotionShiftSpeedSet(s16 arg0, float arg1); +void Hu3DMotionNoMotSet(s16 arg0, char *arg1, u32 arg2); +void Hu3DMotionNoMotReset(s16 arg0, char *arg1, u32 arg2); +void Hu3DMotionForceSet(s16 arg0, char *arg1, u32 arg2, float arg3); +void Hu3DMotionNext(s16 arg0); +void Hu3DMotionExec(s16 arg0, s16 arg1, float arg2, s32 arg3); +void Hu3DCameraMotionExec(s16 arg0); +void Hu3DSubMotionExec(s16 arg0); +float *GetObjTRXPtr(HsfObject *arg0, u16 arg1); +void SetObjMatMotion(s16 arg0, HsfTrack *arg1, float arg2); +void SetObjAttrMotion(s16 arg0, HsfTrack *arg1, float arg2); +void SetObjCameraMotion(s16 arg0, HsfTrack *arg1, float arg2); +void SetObjLightMotion(s16 arg0, HsfTrack *arg1, float arg2); +float GetCurve(HsfTrack *arg0, float arg1); +float GetConstant(s32 arg0, float *arg1, float arg2); +float GetLinear(s32 arg0, float arg1[][2], float arg2); +float GetBezier(s32 arg0, HsfTrack *arg1, float arg2); +HsfBitmap *GetBitMap(s32 arg0, UnknownHsfMotionStruct01 *arg1, float arg2); +s16 Hu3DJointMotion(s16 arg0, void *arg1); +void JointModel_Motion(s16 arg0, s16 arg1); +void Hu3DMotionCalc(s16 arg0); + +extern MotionData Hu3DMotion[256]; + + +/* end "game/hsfmotion.h" */ +/* "src\REL\E3setupDLL\main.c" line 7 "game/init.h" */ + +#define _GAME_INIT_H + +/* "include\game\init.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ + +extern GXRenderModeObj *RenderMode; +extern OSHeapHandle currentHeapHandle; + +extern void *DemoFrameBuffer1; +extern void *DemoFrameBuffer2; +extern void *DemoCurrentBuffer; +extern u32 minimumVcount; +extern float minimumVcountf; +extern u32 worstVcount; + +void HuSysInit(GXRenderModeObj *mode); +void HuSysBeforeRender(); +void HuSysDoneRender(s32 retrace_count); + + +/* "src\REL\E3setupDLL\main.c" line 8 "game/minigame_seq.h" */ + +#define _GAME_MINIGAME_SEQ_H + +/* "include\game\minigame_seq.h" line 3 "game/object.h" */ +/* end "game/object.h" */ +/* "include\game\minigame_seq.h" line 4 "stdarg.h" */ + +#define STDARG_H + +typedef struct { + char gpr; + char fpr; + char reserved[2]; + char* input_arg_area; + char* reg_save_area; +} __va_list[1]; +typedef __va_list va_list; + +void* __va_arg(va_list v_list, unsigned char type); + +#define va_start(ap, fmt) ((void) fmt, __builtin_va_info(&ap)) +#define va_arg(ap, t) (*((t*) __va_arg(ap, _var_arg_typeof(t)))) +#define va_end(ap) (void) 0 + + + +#define MG_SEQ_TYPE_TIMER 1 +#define MG_SEQ_TYPE_AUTO 3 +#define MG_SEQ_TYPE_1VS3 4 +#define MG_SEQ_TYPE_WIN 5 +#define MG_SEQ_TYPE_BATTLE 6 +#define MG_SEQ_TYPE_STORY 7 +#define MG_SEQ_TYPE_4P 8 +#define MG_SEQ_TYPE_2VS2 9 +#define MG_SEQ_TYPE_PINBALL 10 +#define MG_SEQ_TYPE_BOWSER 11 +#define MG_SEQ_TYPE_ALTWIN 12 +#define MG_SEQ_TYPE_DRAW 13 +#define MG_SEQ_TYPE_RECORD 14 + +#define MG_SEQ_WIN_TYPE_WIN 3 +#define MG_SEQ_WIN_TYPE_LOSE 4 +#define MG_SEQ_WIN_TYPE_CHAMPION 5 + +#define MG_SEQ_WORD_START 0 +#define MG_SEQ_WORD_FINISH 1 +#define MG_SEQ_WORD_DRAW 2 + +#define MGSeqTimerCreate(value) MGSeqCreate(MG_SEQ_TYPE_TIMER, (value), -1, -1) +#define MGSeqTimerCreateXY(value, x, y) MGSeqCreate(MG_SEQ_TYPE_TIMER, (value), (int)(x), (int)(y)) +#define MGSeqStartCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_START) +#define MGSeqFinishCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_FINISH) +#define MGSeqDrawCreate() MGSeqCreate(MG_SEQ_TYPE_AUTO, MG_SEQ_WORD_DRAW) +#define MGSeqStartCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_START) +#define MGSeqFinishCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_FINISH) +#define MGSeqDrawCreateType(type) MGSeqCreate((type), MG_SEQ_WORD_DRAW) +#define MGSeqWinCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_WIN, MG_SEQ_WIN_TYPE_WIN, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqLoseCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_WIN, MG_SEQ_WIN_TYPE_LOSE, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqChampionCreate(player_1, player_2, player_3, player_4) MGSeqCreate(MG_SEQ_TYPE_ALTWIN, MG_SEQ_WIN_TYPE_CHAMPION, (player_1), (player_2), (player_3), (player_4)) +#define MGSeqRecordCreate(value) MGSeqCreate(MG_SEQ_TYPE_RECORD, (value)) + + + +typedef struct seq_work SeqWork; + +typedef int (*SeqUpdateFunc)(SeqWork *work); +typedef int (*SeqInitFunc)(SeqWork *work, va_list params); + +typedef struct seq_work { + SeqUpdateFunc update; + char *data; + float x; + float y; + float scale_x; + float scale_y; + float unk_18; + float angle; + float win_scale; + float unk_24; + s16 time; + s16 time_max; + s16 timer_val; + s16 state; + s16 alt_word_len; + s16 word_len; + s16 param[2]; + s16 type; + s16 spr_grp[16]; + s16 sprite[16]; + u8 seq_no; + u8 stat; + u8 unk_7C; + u8 unk_7D; +} SeqWork; + +void MGSeqInit(void); +void MGSeqMain(void); +s16 MGSeqCreate(s16 type, ...); +u8 MGSeqStatGet(s16 id); +void MGSeqPosSet(s16 id, float x, float y); +void MGSeqParamSet(s16 id, s16 param1, s16 param2); +void MGSeqSprKill(SeqWork *work); +void MGSeqKill(s16 id); +void MGSeqKillAll(void); +s32 MGSeqDoneCheck(void); +void MGSeqStub(void); +void MGSeqPauseInit(void); +void MGSeqPauseEnableCtrl(s32 flag); +void MGSeqPracticeInit(void); +void MGSeqPracticeExitCheck(omObjData *object); + +extern OverlayID mgSeqOvlPrev; + + +/* end "game/minigame_seq.h" */ +/* "src\REL\E3setupDLL\main.c" line 9 "game/chrman.h" */ + +#define _GAME_CHRMAN_H + +/* "include\game\chrman.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ + +void CharManInit(void); +void *CharAMemPtrGet(s16 character); +void CharARAMOpen(s16 character); +void CharARAMClose(s16 character); +void CharKill(s16 arg0); +void CharKillAll(void); +s16 CharModelCreate(s16 character, s16 lod); +s16 CharModelMotionCreate(s16 character, s32 arg1); +void CharModelMotionIndexSet(s16 character, s16 arg1, s32 arg2); +void CharModelMotionKill(s16 character, u32 motion); +void CharModelMotionDataClose(s16 character); +void CharModelDataClose(s16 arg0); +void CharModelKill(s16 character); +void CharModelMotionSet(s16 character, s16 motion); +void CharModelTexAnimSet(s16 character); +char **CharModelTexNameGet(s16 arg0, s16 arg1); +char *CharModelHookNameGet(s16 arg0, s16 arg1, s16 arg2); +void CharModelMotionTimeSet(s16 character, float time); +float CharModelMotionTimeGet(s16 character); +float CharModelMotionMaxTimeGet(s16 character); +s32 CharModelMotionEndCheck(s16 character); +s16 CharModelMotionShiftIDGet(s16 character); +void CharModelMotionShiftSet(s16 character, s16 motion, float time, float shift_time, u32 attr); +float CharModelMotionShiftTimeGet(s16 character); +void CharModelMotionSpeedSet(s16 character, float speed); +void CharModelLayerSetAll(s16 arg0); +void CharModelItemHookCreate(s16 character, char *arg1); +void CharModelEffectCreate(s16 arg0, Vec *arg1); +void CharModelCoinEffectCreate(s16 arg0, Vec *arg1); +void fn_8004EC74(s16 character); +void fn_8004EDA4(s16 arg0, Vec *arg1, Vec *arg2); +void fn_8004F058(s16 character); +void fn_8004F13C(s16 arg0, Vec *arg1, Vec *arg2); +void CharModelLayerSetAll2(s16 arg0); +void CharModelVoiceEnableSet(s16 character, s16 motion, s32 flag); +void fn_8004F52C(s16 character, s32 arg1); +void CharModelEffectEnableSet(s16 character, s32 arg1); +s32 CharModelEffectNpcInit(s16 arg0, s16 arg1, s16 arg2, s16 arg3); +s32 CharModelEffectNpcInitSilent(s16 arg0, s16 arg1, s16 arg2); +s32 CharModelStepTypeSet(s16 character, s32 arg1); + + +/* end "game/chrman.h" */ +/* "src\REL\E3setupDLL\main.c" line 10 "game/sprite.h" */ + +#define _GAME_SPRITE_H + +/* "include\game\sprite.h" line 3 "dolphin.h" */ +/* end "dolphin.h" */ +/* "include\game\sprite.h" line 4 "game/data.h" */ +/* end "game/data.h" */ +/* "include\game\sprite.h" line 5 "game/memory.h" */ +/* end "game/memory.h" */ + +#define HUSPR_MAX 384 +#define HUSPR_GRP_MAX 256 + +#define HUSPR_NONE -1 +#define HUSPR_GRP_NONE -1 + +#define HUSPR_ATTR_NOANIM 0x1 +#define HUSPR_ATTR_LOOP 0x2 +#define HUSPR_ATTR_DISPOFF 0x4 +#define HUSPR_ATTR_LINEAR 0x8 +#define HUSPR_ATTR_FUNC 0x10 +#define HUSPR_ATTR_NOPAUSE 0x20 +#define HUSPR_ATTR_REVERSE 0x40 +#define HUSPR_ATTR_ADDCOL 0x80 +#define HUSPR_ATTR_INVCOL 0x100 + +/* "include\game\sprite.h" line 23 "game/animdata.h" */ +/* end "game/animdata.h" */ + +typedef void (*HuSprFunc)(struct hu_sprite *); + +typedef struct hu_sprite { + u8 r; + u8 g; + u8 b; + u8 draw_no; + s16 frame; + s16 bank; + s16 attr; + s16 dirty_flag; + s16 prio; + float time; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float speed; + float a; + GXTexWrapMode wrap_s; + GXTexWrapMode wrap_t; + s16 tex_scale_x; + s16 tex_scale_y; + Mtx *group_mtx; + union { + AnimData *data; + HuSprFunc func; + }; + AnimPatData *pat_data; + AnimFrameData *frame_data; + s16 work[4]; + AnimData *bg; + u16 bg_bank; + s16 scissor_x; + s16 scissor_y; + s16 scissor_w; + s16 scissor_h; +} HuSprite; + +typedef struct hu_spr_grp { + s16 capacity; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float center_x; + float center_y; + s16 *members; + Mtx mtx; +} HuSprGrp; + +extern HuSprite HuSprData[HUSPR_MAX]; +extern HuSprGrp HuSprGrpData[HUSPR_GRP_MAX]; + +#define HuSprAnimReadFile(data_id) (HuSprAnimRead(HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) + +void HuSprInit(void); +void HuSprClose(void); +void HuSprExec(s16 draw_no); +void HuSprBegin(void); +HuSprite *HuSprCall(void); +void HuSprFinish(void); +void HuSprPauseSet(BOOL value); +AnimData *HuSprAnimRead(void *data); +void HuSprAnimLock(AnimData *anim); +s16 HuSprCreate(AnimData *anim, s16 prio, s16 bank); +s16 HuSprFuncCreate(HuSprFunc func, s16 prio); +s16 HuSprGrpCreate(s16 capacity); +s16 HuSprGrpCopy(s16 group); +void HuSprGrpMemberSet(s16 group, s16 member, s16 sprite); +void HuSprGrpMemberKill(s16 group, s16 member); +void HuSprGrpKill(s16 group); +void HuSprKill(s16 sprite); +void HuSprAnimKill(AnimData *anim); +void HuSprAttrSet(s16 group, s16 member, s32 attr); +void HuSprAttrReset(s16 group, s16 member, s32 attr); +void HuSprPosSet(s16 group, s16 member, float x, float y); +void HuSprZRotSet(s16 group, s16 member, float z_rot); +void HuSprScaleSet(s16 group, s16 member, float x, float y); +void HuSprTPLvlSet(s16 group, s16 member, float tp_lvl); +void HuSprColorSet(s16 group, s16 member, u8 r, u8 g, u8 b); +void HuSprSpeedSet(s16 group, s16 member, float speed); +void HuSprBankSet(s16 group, s16 member, s16 bank); +void HuSprGrpPosSet(s16 group, float x, float y); +void HuSprGrpCenterSet(s16 group, float x, float y); +void HuSprGrpZRotSet(s16 group, float z_rot); +void HuSprGrpScaleSet(s16 group, float x, float y); +void HuSprGrpTPLvlSet(s16 group, float tp_lvl); + +void HuSprGrpDrawNoSet(s16 group, s32 draw_no); + +void HuSprDrawNoSet(s16 group, s16 member, s32 draw_no); +void HuSprPriSet(s16 group, s16 member, s16 prio); +void HuSprGrpScissorSet(s16 group, s16 x, s16 y, s16 w, s16 h); +void HuSprScissorSet(s16 group, s16 member, s16 x, s16 y, s16 w, s16 h); +AnimData *HuSprAnimMake(s16 sizeX, s16 sizeY, s16 dataFmt); +void HuSprBGSet(s16 group, s16 member, AnimData *bg, s16 bg_bank); +void HuSprSprBGSet(s16 sprite, AnimData *bg, s16 bg_bank); +void AnimDebug(AnimData *anim); + +void HuSprDispInit(void); +void HuSprDisp(HuSprite *sprite); +void HuSprTexLoad(AnimData *anim, s16 bmp, s16 slot, GXTexWrapMode wrap_s, GXTexWrapMode wrap_t, GXTexFilter filter); +void HuSprExecLayerSet(s16 draw_no, s16 layer); + + +/* "src\REL\E3setupDLL\main.c" line 11 "game/window.h" */ + +#define _GAME_WINDOW_H + +/* "include\game\window.h" line 3 "game/animdata.h" */ +/* end "game/animdata.h" */ +/* "include\game\window.h" line 4 "dolphin.h" */ +/* end "dolphin.h" */ + +#define MAKE_MESSID(bank, mess) (((bank) << 16)+(mess)) +#define MAKE_MESSID_PTR(ptr) ((u32)(ptr)) + +typedef struct { + /* 0x00 */ u8 color; + /* 0x01 */ u8 fade; + /* 0x02 */ s16 x; + /* 0x04 */ s16 y; + /* 0x06 */ s16 character; +} WinChar; // Size 8 + +typedef struct { + /* 0x00 */ u8 stat; + /* 0x02 */ s16 x; + /* 0x04 */ s16 y; +} WinChoice; // Size 6 + +typedef struct { + /* 0x000 */ u8 stat; + /* 0x001 */ u8 active_pad; + /* 0x002 */ u8 player_disable; + /* 0x003 */ u8 color_key; + /* 0x004 */ s16 group; + /* 0x006 */ s16 sprite_id[30]; + /* 0x042 */ s16 speed; + /* 0x044 */ s16 mess_time; + /* 0x046 */ s16 advance_sprite; + /* 0x048 */ s16 prio; + /* 0x04C */ u32 attr; + /* 0x050 */ AnimData *frame; + /* 0x054 */ s16 mess_rect_x; + /* 0x056 */ s16 mess_rect_w; + /* 0x058 */ s16 mess_rect_y; + /* 0x05A */ s16 mess_rect_h; + /* 0x05C */ s16 mess_x; + /* 0x05E */ s16 mess_y; + /* 0x060 */ s16 mess_color; + /* 0x062 */ s16 mess_shadow_color; + /* 0x064 */ s16 spacing_x; + /* 0x066 */ s16 spacing_y; + /* 0x068 */ s16 w; + /* 0x06A */ s16 h; + /* 0x06C */ float pos_x; + /* 0x070 */ float pos_y; + /* 0x074 */ float scale_x; + /* 0x078 */ float scale_y; + /* 0x07C */ float z_rot; + /* 0x080 */ s16 num_chars; + /* 0x082 */ s16 max_chars; + /* 0x084 */ WinChar *char_data; + /* 0x088 */ s16 mess_stackptr; + /* 0x08C */ s32 unk8C; + /* 0x090 */ u8 *mess; + /* 0x094 */ u8 *mess_stack[8]; + /* 0x0B4 */ u8 *insert_mess[8]; + /* 0x0D4 */ s16 num_choices; + /* 0x0D6 */ s16 choice; + /* 0x0D8 */ s16 cursor_sprite; + /* 0x0DA */ u8 choice_disable[16]; + /* 0x0EA */ WinChoice choice_data[16]; + /* 0x14A */ s16 scissor_x; + /* 0x14C */ s16 scissor_y; + /* 0x14E */ s16 scissor_w; + /* 0x150 */ s16 scissor_h; + /* 0x152 */ s16 tab_w; + /* 0x154 */ s16 push_key; + /* 0x156 */ s16 key_down; + /* 0x158 */ s16 key_auto; + /* 0x160 */ u8 mess_pal[10][3]; +} WindowData; // Size 0x180 + +extern WindowData winData[32]; +extern void *messDataPtr; + +void HuWindowInit(void); +void HuWinInit(s32 mess_data_no); +s16 HuWinCreate(float x, float y, s16 w, s16 h, s16 frame); +void HuWinKill(s16 window); +void HuWinAllKill(void); +void HuWinHomeClear(s16 window); +void HuWinKeyWaitEntry(s16 window); +u32 HuWinActivePadGet(WindowData *window); +u32 HuWinActiveKeyGetX(WindowData *window); +void HuWinPosSet(s16 window, float x, float y); +void HuWinScaleSet(s16 window, float x, float y); +void HuWinZRotSet(s16 window, float z_rot); +void HuWinCenterPosSet(s16 window, float x, float y); +void HuWinDrawNoSet(s16 window, s16 draw_no); +void HuWinScissorSet(s16 window, s16 x, s16 y, s16 w, s16 h); +void HuWinPriSet(s16 window, s16 prio); +void HuWinAttrSet(s16 window, u32 attr); +void HuWinAttrReset(s16 window, u32 attr); +s16 HuWinStatGet(s16 window); +void HuWinMesColSet(s16 window, u8 color); +void HuWinMesPalSet(s16 window, u8 index, u8 r, u8 g, u8 b); +void HuWinBGTPLvlSet(s16 window, float tp_level); +void HuWinBGColSet(s16 window, GXColor *bg_color); +void HuWinMesSpeedSet(s16 window, s16 speed); +void HuWinMesRead(s32 mess_data_no); +void HuWinMesSet(s16 window, u32 mess); +void HuWinInsertMesSet(s16 window, u32 mess, s16 index); +s16 HuWinChoiceGet(s16 window, s16 start_choice); +s16 HuWinChoiceNumGet(s16 window); +void HuWinChoiceDisable(s16 window, s16 choice); +s16 HuWinChoiceNowGet(s16 window); +void HuWinMesWait(s16 window); +s16 HuWinAnimSet(s16 window, AnimData *anim, s16 bank, float x, float y); +s16 HuWinSprSet(s16 window, s16 sprite, float x, float y); +void HuWinSprPosSet(s16 window, s16 index, float x, float y); +void HuWinSprPriSet(s16 window, s16 index, s16 prio); +s16 HuWinSprIDGet(s16 window, s16 index); +void HuWinSprKill(s16 window, s16 index); +void HuWinDispOff(s16 window); +void HuWinDispOn(s16 window); +void HuWinComKeyWait(s32 player_1, s32 player_2, s32 player_3, s32 player_4, s16 delay); +void HuWinComKeySet(s32 player_1, s32 player_2, s32 player_3, s32 player_4); +void _HuWinComKeySet(s32 player_1, s32 player_2, s32 player_3, s32 player_4, s16 delay); +void HuWinComKeyGet(s16 window, u32 *data); +void HuWinComKeyReset(void); +void HuWinMesMaxSizeGet(s16 mess_num, float *size, ...); +void HuWinInsertMesSizeGet(u32 mess, s16 index); +void HuWinMesSizeCancelCRSet(s32 cancel_cr); +void HuWinMesMaxSizeBetGet(float *size, u32 start, u32 end); +s16 HuWinKeyWaitNumGet(u32 mess); +void HuWinPushKeySet(s16 window, s16 push_key); +void HuWinDisablePlayerSet(s16 window, u8 player); +void HuWinDisablePlayerReset(s16 window, u8 player); +s16 HuWinExCreate(float x, float y, s16 w, s16 h, s16 portrait); +s16 HuWinExCreateStyled(float x, float y, s16 w, s16 h, s16 portrait, s16 frame); +void HuWinExAnimIn(s16 window); +void HuWinExAnimOut(s16 window); +void HuWinExCleanup(s16 window); +void HuWinExAnimPopIn(s16 window, s16 portrait); +void *MessData_MesPtrGet(void *data, u32 index); + +extern void *messDataPtr; + + +/* end "game/window.h" */ +/* "src\REL\E3setupDLL\main.c" line 12 "ext_math.h" */ + +#define _EXT_MATH_H + +/* "include\ext_math.h" line 3 "math.h" */ + +#define _MATH_H + +#define M_PI 3.141592653589793 + + +#define _MATH_INLINE static inline + + +extern inline float sqrtf(float x) +{ + volatile float y; + if(x > 0.0f) + { + double guess = __frsqrte((double)x); // returns an approximation to + guess = 0.5*guess*(3.0 - guess*guess*x); // now have 12 sig bits + guess = 0.5*guess*(3.0 - guess*guess*x); // now have 24 sig bits + guess = 0.5*guess*(3.0 - guess*guess*x); // now have 32 sig bits + y=(float)(x*guess); + return y; + } + return x; +} + +double atan(double x); +double copysign(double x, double y); +double cos(double x); +double floor(double x); +double frexp(double x, int *exp); +double ldexp(double x, int exp); +double modf(double x, double *intpart); +double sin(double x); +double tan(double x); +double acos(double x); +double asin(double x); +double atan2(double y, double x); +double fmod(double x, double y); +double log(double x); +double pow(double x, double y); +float tanf(float x); +float sinf(float x); +float cosf(float x); +float atan2f(float y, float x); +float acosf(float x); + +extern inline double fabs(double x) +{ + return __fabs(x); +} + + +/* end "math.h" */ +/* "include\ext_math.h" line 4 "dolphin/mtx.h" */ +/* end "dolphin/mtx.h" */ + +typedef struct vec2f { + float x; + float y; +} Vec2f; + +#define ABS(x) (((x) < 0) ? -(x) : (x)) + +#define VECDistanceXZ(a, b) sqrtf((((a)->x-(b)->x)*((a)->x-(b)->x))+(((a)->z-(b)->z)*((a)->z-(b)->z))) +#define VECDistanceAlt(a, b) sqrtf((((a)->x-(b)->x)*((a)->x-(b)->x))+(((a)->y-(b)->y)*((a)->y-(b)->y))+(((a)->z-(b)->z)*((a)->z-(b)->z))) + +#define VECMagXZ(a) sqrtf(((a)->x*(a)->x)+((a)->z*(a)->z)) + +#define sind(x) sin(M_PI*(x)/180.0) +#define cosd(x) cos(M_PI*(x)/180.0) +#define atan2d(y, x) (180.0*(atan2((y), (x)) / M_PI)) diff --git a/ctx_working.c b/ctx_working.c new file mode 100644 index 00000000..c1752823 --- /dev/null +++ b/ctx_working.c @@ -0,0 +1,2402 @@ +typedef signed char s8; +typedef signed short int s16; +typedef signed long s32; +typedef signed long long int s64; +typedef unsigned char u8; +typedef unsigned short int u16; +typedef unsigned long u32; +typedef unsigned long long int u64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; + +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef double f64; + +typedef volatile f32 vf32; +typedef volatile f64 vf64; +typedef int BOOL; +#define FALSE 0 +#define TRUE 1 + +#define NULL ((void *)0) +#define nullptr NULL + +typedef enum _GXCITexFmt { + GX_TF_C4 = 0x8, + GX_TF_C8 = 0x9, + GX_TF_C14X2 = 0xa, +} GXCITexFmt; + +typedef enum _GXTexWrapMode { + GX_CLAMP, + GX_REPEAT, + GX_MIRROR, + GX_MAX_TEXWRAPMODE, +} GXTexWrapMode; + +typedef enum _GXTexFilter { + GX_NEAR, + GX_LINEAR, + GX_NEAR_MIP_NEAR, + GX_LIN_MIP_NEAR, + GX_NEAR_MIP_LIN, + GX_LIN_MIP_LIN, +} GXTexFilter; + +typedef enum _GXAnisotropy { + GX_ANISO_1, + GX_ANISO_2, + GX_ANISO_4, + GX_MAX_ANISOTROPY, +} GXAnisotropy; + +typedef enum _GXTexMapID { + GX_TEXMAP0, + GX_TEXMAP1, + GX_TEXMAP2, + GX_TEXMAP3, + GX_TEXMAP4, + GX_TEXMAP5, + GX_TEXMAP6, + GX_TEXMAP7, + GX_MAX_TEXMAP, + GX_TEXMAP_NULL = 0xFF, + GX_TEX_DISABLE = 0x100, +} GXTexMapID; + +typedef enum _GXTexCoordID { + GX_TEXCOORD0, + GX_TEXCOORD1, + GX_TEXCOORD2, + GX_TEXCOORD3, + GX_TEXCOORD4, + GX_TEXCOORD5, + GX_TEXCOORD6, + GX_TEXCOORD7, + GX_MAX_TEXCOORD, + GX_TEXCOORD_NULL = 0xFF, +} GXTexCoordID; + +typedef enum _GXTevStageID { + GX_TEVSTAGE0, + GX_TEVSTAGE1, + GX_TEVSTAGE2, + GX_TEVSTAGE3, + GX_TEVSTAGE4, + GX_TEVSTAGE5, + GX_TEVSTAGE6, + GX_TEVSTAGE7, + GX_TEVSTAGE8, + GX_TEVSTAGE9, + GX_TEVSTAGE10, + GX_TEVSTAGE11, + GX_TEVSTAGE12, + GX_TEVSTAGE13, + GX_TEVSTAGE14, + GX_TEVSTAGE15, + GX_MAX_TEVSTAGE, +} GXTevStageID; + +typedef enum _GXTevMode { + GX_MODULATE, + GX_DECAL, + GX_BLEND, + GX_REPLACE, + GX_PASSCLR, +} GXTevMode; + +typedef enum _GXTexMtxType { + GX_MTX3x4, + GX_MTX2x4, +} GXTexMtxType; + +typedef enum _GXTexGenType { + GX_TG_MTX3x4, + GX_TG_MTX2x4, + GX_TG_BUMP0, + GX_TG_BUMP1, + GX_TG_BUMP2, + GX_TG_BUMP3, + GX_TG_BUMP4, + GX_TG_BUMP5, + GX_TG_BUMP6, + GX_TG_BUMP7, + GX_TG_SRTG, +} GXTexGenType; + +typedef enum _GXPosNrmMtx { + GX_PNMTX0 = 0, + GX_PNMTX1 = 3, + GX_PNMTX2 = 6, + GX_PNMTX3 = 9, + GX_PNMTX4 = 12, + GX_PNMTX5 = 15, + GX_PNMTX6 = 18, + GX_PNMTX7 = 21, + GX_PNMTX8 = 24, + GX_PNMTX9 = 27, +} GXPosNrmMtx; + +typedef enum _GXTexMtx { + GX_TEXMTX0 = 30, + GX_TEXMTX1 = 33, + GX_TEXMTX2 = 36, + GX_TEXMTX3 = 39, + GX_TEXMTX4 = 42, + GX_TEXMTX5 = 45, + GX_TEXMTX6 = 48, + GX_TEXMTX7 = 51, + GX_TEXMTX8 = 54, + GX_TEXMTX9 = 57, + GX_IDENTITY = 60, +} GXTexMtx; + +typedef enum _GXChannelID { + GX_COLOR0, + GX_COLOR1, + GX_ALPHA0, + GX_ALPHA1, + GX_COLOR0A0, + GX_COLOR1A1, + GX_COLOR_ZERO, + GX_ALPHA_BUMP, + GX_ALPHA_BUMPN, + GX_COLOR_NULL = 0xFF, +} GXChannelID; + +typedef enum _GXTexGenSrc { + GX_TG_POS, + GX_TG_NRM, + GX_TG_BINRM, + GX_TG_TANGENT, + GX_TG_TEX0, + GX_TG_TEX1, + GX_TG_TEX2, + GX_TG_TEX3, + GX_TG_TEX4, + GX_TG_TEX5, + GX_TG_TEX6, + GX_TG_TEX7, + GX_TG_TEXCOORD0, + GX_TG_TEXCOORD1, + GX_TG_TEXCOORD2, + GX_TG_TEXCOORD3, + GX_TG_TEXCOORD4, + GX_TG_TEXCOORD5, + GX_TG_TEXCOORD6, + GX_TG_COLOR0, + GX_TG_COLOR1, + GX_MAX_TEXGENSRC, +} GXTexGenSrc; + +typedef enum _GXBlendMode { + GX_BM_NONE, + GX_BM_BLEND, + GX_BM_LOGIC, + GX_BM_SUBTRACT, + GX_MAX_BLENDMODE, +} GXBlendMode; + +typedef enum _GXBlendFactor { + GX_BL_ZERO, + GX_BL_ONE, + GX_BL_SRCCLR, + GX_BL_INVSRCCLR, + GX_BL_SRCALPHA, + GX_BL_INVSRCALPHA, + GX_BL_DSTALPHA, + GX_BL_INVDSTALPHA, + GX_BL_DSTCLR = GX_BL_SRCCLR, + GX_BL_INVDSTCLR = GX_BL_INVSRCCLR, +} GXBlendFactor; + +#define GX_FALSE ((GXBool)0) +#define GX_TRUE ((GXBool)1) + +#define GX_ENABLE ((GXBool)1) +#define GX_DISABLE ((GXBool)0) + +typedef enum _GXProjectionType { + GX_PERSPECTIVE, + GX_ORTHOGRAPHIC, +} GXProjectionType; + +typedef enum _GXCompare { + GX_NEVER, + GX_LESS, + GX_EQUAL, + GX_LEQUAL, + GX_GREATER, + GX_NEQUAL, + GX_GEQUAL, + GX_ALWAYS, +} GXCompare; + +typedef enum _GXAlphaOp { + GX_AOP_AND, + GX_AOP_OR, + GX_AOP_XOR, + GX_AOP_XNOR, + GX_MAX_ALPHAOP, +} GXAlphaOp; + +typedef enum _GXZFmt16 { + GX_ZC_LINEAR, + GX_ZC_NEAR, + GX_ZC_MID, + GX_ZC_FAR, +} GXZFmt16; + +typedef enum _GXGamma { + GX_GM_1_0, + GX_GM_1_7, + GX_GM_2_2, +} GXGamma; + +typedef enum _GXPixelFmt { + GX_PF_RGB8_Z24, + GX_PF_RGBA6_Z24, + GX_PF_RGB565_Z16, + GX_PF_Z24, + GX_PF_Y8, + GX_PF_U8, + GX_PF_V8, + GX_PF_YUV420, +} GXPixelFmt; + +typedef enum _GXPrimitive { + GX_QUADS = 0x80, + GX_TRIANGLES = 0x90, + GX_TRIANGLESTRIP = 0x98, + GX_TRIANGLEFAN = 0xA0, + GX_LINES = 0xA8, + GX_LINESTRIP = 0xB0, + GX_POINTS = 0xB8, +} GXPrimitive; + +typedef enum _GXVtxFmt { + GX_VTXFMT0, + GX_VTXFMT1, + GX_VTXFMT2, + GX_VTXFMT3, + GX_VTXFMT4, + GX_VTXFMT5, + GX_VTXFMT6, + GX_VTXFMT7, + GX_MAX_VTXFMT, +} GXVtxFmt; + +typedef enum _GXAttr { + GX_VA_PNMTXIDX, + GX_VA_TEX0MTXIDX, + GX_VA_TEX1MTXIDX, + GX_VA_TEX2MTXIDX, + GX_VA_TEX3MTXIDX, + GX_VA_TEX4MTXIDX, + GX_VA_TEX5MTXIDX, + GX_VA_TEX6MTXIDX, + GX_VA_TEX7MTXIDX, + GX_VA_POS, + GX_VA_NRM, + GX_VA_CLR0, + GX_VA_CLR1, + GX_VA_TEX0, + GX_VA_TEX1, + GX_VA_TEX2, + GX_VA_TEX3, + GX_VA_TEX4, + GX_VA_TEX5, + GX_VA_TEX6, + GX_VA_TEX7, + GX_POS_MTX_ARRAY, + GX_NRM_MTX_ARRAY, + GX_TEX_MTX_ARRAY, + GX_LIGHT_ARRAY, + GX_VA_NBT, + GX_VA_MAX_ATTR, + GX_VA_NULL = 0xFF, +} GXAttr; + +#define GX_MAX_VTXDESCLIST_SZ (GX_VA_MAX_ATTR + 1) + +typedef enum _GXAttrType { + GX_NONE, + GX_DIRECT, + GX_INDEX8, + GX_INDEX16, +} GXAttrType; + +#define _GX_TF_CTF 0x20 +#define _GX_TF_ZTF 0x10 + +typedef enum _GXTexFmt { + GX_TF_I4 = 0x0, + GX_TF_I8 = 0x1, + GX_TF_IA4 = 0x2, + GX_TF_IA8 = 0x3, + GX_TF_RGB565 = 0x4, + GX_TF_RGB5A3 = 0x5, + GX_TF_RGBA8 = 0x6, + GX_TF_CMPR = 0xE, + + GX_CTF_R4 = 0x0 , + GX_CTF_RA4 = 0x2 , + GX_CTF_RA8 = 0x3 , + GX_CTF_YUVA8 = 0x6 , + GX_CTF_A8 = 0x7 , + GX_CTF_R8 = 0x8 , + GX_CTF_G8 = 0x9 , + GX_CTF_B8 = 0xA , + GX_CTF_RG8 = 0xB , + GX_CTF_GB8 = 0xC , + + GX_TF_Z8 = 0x1 , + GX_TF_Z16 = 0x3 , + GX_TF_Z24X8 = 0x6 , + + GX_CTF_Z4 = 0x0 , + GX_CTF_Z8M = 0x9 , + GX_CTF_Z8L = 0xA, + GX_CTF_Z16L = 0xC, + + GX_TF_A8 = GX_CTF_A8, +} GXTexFmt; + +typedef enum _GXCITexFmt { + GX_TF_C4 = 0x8, + GX_TF_C8 = 0x9, + GX_TF_C14X2 = 0xa, +} GXCITexFmt; + +typedef enum _GXTexWrapMode { + GX_CLAMP, + GX_REPEAT, + GX_MIRROR, + GX_MAX_TEXWRAPMODE, +} GXTexWrapMode; + +typedef enum _GXTexFilter { + GX_NEAR, + GX_LINEAR, + GX_NEAR_MIP_NEAR, + GX_LIN_MIP_NEAR, + GX_NEAR_MIP_LIN, + GX_LIN_MIP_LIN, +} GXTexFilter; + +typedef enum _GXAnisotropy { + GX_ANISO_1, + GX_ANISO_2, + GX_ANISO_4, + GX_MAX_ANISOTROPY, +} GXAnisotropy; + +typedef enum _GXTexMapID { + GX_TEXMAP0, + GX_TEXMAP1, + GX_TEXMAP2, + GX_TEXMAP3, + GX_TEXMAP4, + GX_TEXMAP5, + GX_TEXMAP6, + GX_TEXMAP7, + GX_MAX_TEXMAP, + GX_TEXMAP_NULL = 0xFF, + GX_TEX_DISABLE = 0x100, +} GXTexMapID; + +typedef enum _GXTexCoordID { + GX_TEXCOORD0, + GX_TEXCOORD1, + GX_TEXCOORD2, + GX_TEXCOORD3, + GX_TEXCOORD4, + GX_TEXCOORD5, + GX_TEXCOORD6, + GX_TEXCOORD7, + GX_MAX_TEXCOORD, + GX_TEXCOORD_NULL = 0xFF, +} GXTexCoordID; + +typedef enum _GXTevStageID { + GX_TEVSTAGE0, + GX_TEVSTAGE1, + GX_TEVSTAGE2, + GX_TEVSTAGE3, + GX_TEVSTAGE4, + GX_TEVSTAGE5, + GX_TEVSTAGE6, + GX_TEVSTAGE7, + GX_TEVSTAGE8, + GX_TEVSTAGE9, + GX_TEVSTAGE10, + GX_TEVSTAGE11, + GX_TEVSTAGE12, + GX_TEVSTAGE13, + GX_TEVSTAGE14, + GX_TEVSTAGE15, + GX_MAX_TEVSTAGE, +} GXTevStageID; + +typedef enum _GXTevMode { + GX_MODULATE, + GX_DECAL, + GX_BLEND, + GX_REPLACE, + GX_PASSCLR, +} GXTevMode; + +typedef enum _GXTexMtxType { + GX_MTX3x4, + GX_MTX2x4, +} GXTexMtxType; + +typedef enum _GXTexGenType { + GX_TG_MTX3x4, + GX_TG_MTX2x4, + GX_TG_BUMP0, + GX_TG_BUMP1, + GX_TG_BUMP2, + GX_TG_BUMP3, + GX_TG_BUMP4, + GX_TG_BUMP5, + GX_TG_BUMP6, + GX_TG_BUMP7, + GX_TG_SRTG, +} GXTexGenType; + +typedef enum _GXPosNrmMtx { + GX_PNMTX0 = 0, + GX_PNMTX1 = 3, + GX_PNMTX2 = 6, + GX_PNMTX3 = 9, + GX_PNMTX4 = 12, + GX_PNMTX5 = 15, + GX_PNMTX6 = 18, + GX_PNMTX7 = 21, + GX_PNMTX8 = 24, + GX_PNMTX9 = 27, +} GXPosNrmMtx; + +typedef enum _GXTexMtx { + GX_TEXMTX0 = 30, + GX_TEXMTX1 = 33, + GX_TEXMTX2 = 36, + GX_TEXMTX3 = 39, + GX_TEXMTX4 = 42, + GX_TEXMTX5 = 45, + GX_TEXMTX6 = 48, + GX_TEXMTX7 = 51, + GX_TEXMTX8 = 54, + GX_TEXMTX9 = 57, + GX_IDENTITY = 60, +} GXTexMtx; + +typedef enum _GXChannelID { + GX_COLOR0, + GX_COLOR1, + GX_ALPHA0, + GX_ALPHA1, + GX_COLOR0A0, + GX_COLOR1A1, + GX_COLOR_ZERO, + GX_ALPHA_BUMP, + GX_ALPHA_BUMPN, + GX_COLOR_NULL = 0xFF, +} GXChannelID; + +typedef enum _GXTexGenSrc { + GX_TG_POS, + GX_TG_NRM, + GX_TG_BINRM, + GX_TG_TANGENT, + GX_TG_TEX0, + GX_TG_TEX1, + GX_TG_TEX2, + GX_TG_TEX3, + GX_TG_TEX4, + GX_TG_TEX5, + GX_TG_TEX6, + GX_TG_TEX7, + GX_TG_TEXCOORD0, + GX_TG_TEXCOORD1, + GX_TG_TEXCOORD2, + GX_TG_TEXCOORD3, + GX_TG_TEXCOORD4, + GX_TG_TEXCOORD5, + GX_TG_TEXCOORD6, + GX_TG_COLOR0, + GX_TG_COLOR1, + GX_MAX_TEXGENSRC, +} GXTexGenSrc; + +typedef enum _GXBlendMode { + GX_BM_NONE, + GX_BM_BLEND, + GX_BM_LOGIC, + GX_BM_SUBTRACT, + GX_MAX_BLENDMODE, +} GXBlendMode; + +typedef enum _GXBlendFactor { + GX_BL_ZERO, + GX_BL_ONE, + GX_BL_SRCCLR, + GX_BL_INVSRCCLR, + GX_BL_SRCALPHA, + GX_BL_INVSRCALPHA, + GX_BL_DSTALPHA, + GX_BL_INVDSTALPHA, + GX_BL_DSTCLR = GX_BL_SRCCLR, + GX_BL_INVDSTCLR = GX_BL_INVSRCCLR, +} GXBlendFactor; + +typedef enum _GXLogicOp { + GX_LO_CLEAR, + GX_LO_AND, + GX_LO_REVAND, + GX_LO_COPY, + GX_LO_INVAND, + GX_LO_NOOP, + GX_LO_XOR, + GX_LO_OR, + GX_LO_NOR, + GX_LO_EQUIV, + GX_LO_INV, + GX_LO_REVOR, + GX_LO_INVCOPY, + GX_LO_INVOR, + GX_LO_NAND, + GX_LO_SET, +} GXLogicOp; + +typedef enum _GXCompCnt { + GX_POS_XY = 0, + GX_POS_XYZ = 1, + GX_NRM_XYZ = 0, + GX_NRM_NBT = 1, + GX_NRM_NBT3 = 2, + GX_CLR_RGB = 0, + GX_CLR_RGBA = 1, + GX_TEX_S = 0, + GX_TEX_ST = 1, +} GXCompCnt; + +typedef enum _GXCompType { + GX_U8 = 0, + GX_S8 = 1, + GX_U16 = 2, + GX_S16 = 3, + GX_F32 = 4, + GX_RGB565 = 0, + GX_RGB8 = 1, + GX_RGBX8 = 2, + GX_RGBA4 = 3, + GX_RGBA6 = 4, + GX_RGBA8 = 5, +} GXCompType; + +typedef enum _GXPTTexMtx { + GX_PTTEXMTX0 = 64, + GX_PTTEXMTX1 = 67, + GX_PTTEXMTX2 = 70, + GX_PTTEXMTX3 = 73, + GX_PTTEXMTX4 = 76, + GX_PTTEXMTX5 = 79, + GX_PTTEXMTX6 = 82, + GX_PTTEXMTX7 = 85, + GX_PTTEXMTX8 = 88, + GX_PTTEXMTX9 = 91, + GX_PTTEXMTX10 = 94, + GX_PTTEXMTX11 = 97, + GX_PTTEXMTX12 = 100, + GX_PTTEXMTX13 = 103, + GX_PTTEXMTX14 = 106, + GX_PTTEXMTX15 = 109, + GX_PTTEXMTX16 = 112, + GX_PTTEXMTX17 = 115, + GX_PTTEXMTX18 = 118, + GX_PTTEXMTX19 = 121, + GX_PTIDENTITY = 125, +} GXPTTexMtx; + +typedef enum _GXTevRegID { + GX_TEVPREV, + GX_TEVREG0, + GX_TEVREG1, + GX_TEVREG2, + GX_MAX_TEVREG, +} GXTevRegID; + +typedef enum _GXDiffuseFn { + GX_DF_NONE, + GX_DF_SIGN, + GX_DF_CLAMP, +} GXDiffuseFn; + +typedef enum _GXColorSrc { + GX_SRC_REG, + GX_SRC_VTX, +} GXColorSrc; + +typedef enum _GXAttnFn { + GX_AF_SPEC, + GX_AF_SPOT, + GX_AF_NONE, +} GXAttnFn; + +typedef enum _GXLightID { + GX_LIGHT0 = 0x001, + GX_LIGHT1 = 0x002, + GX_LIGHT2 = 0x004, + GX_LIGHT3 = 0x008, + GX_LIGHT4 = 0x010, + GX_LIGHT5 = 0x020, + GX_LIGHT6 = 0x040, + GX_LIGHT7 = 0x080, + GX_MAX_LIGHT = 0x100, + GX_LIGHT_NULL = 0, +} GXLightID; + +typedef enum _GXTexOffset { + GX_TO_ZERO, + GX_TO_SIXTEENTH, + GX_TO_EIGHTH, + GX_TO_FOURTH, + GX_TO_HALF, + GX_TO_ONE, + GX_MAX_TEXOFFSET, +} GXTexOffset; + +typedef enum _GXSpotFn { + GX_SP_OFF, + GX_SP_FLAT, + GX_SP_COS, + GX_SP_COS2, + GX_SP_SHARP, + GX_SP_RING1, + GX_SP_RING2, +} GXSpotFn; + +typedef enum _GXDistAttnFn { + GX_DA_OFF, + GX_DA_GENTLE, + GX_DA_MEDIUM, + GX_DA_STEEP, +} GXDistAttnFn; + +typedef enum _GXCullMode { + GX_CULL_NONE, + GX_CULL_FRONT, + GX_CULL_BACK, + GX_CULL_ALL, +} GXCullMode; + +typedef enum _GXTevSwapSel { + GX_TEV_SWAP0 = 0, + GX_TEV_SWAP1, + GX_TEV_SWAP2, + GX_TEV_SWAP3, + GX_MAX_TEVSWAP, +} GXTevSwapSel; + +typedef enum _GXTevColorChan { + GX_CH_RED = 0, + GX_CH_GREEN, + GX_CH_BLUE, + GX_CH_ALPHA, +} GXTevColorChan; + +typedef enum _GXFogType { + GX_FOG_NONE = 0, + GX_FOG_PERSP_LIN = 2, + GX_FOG_PERSP_EXP = 4, + GX_FOG_PERSP_EXP2 = 5, + GX_FOG_PERSP_REVEXP = 6, + GX_FOG_PERSP_REVEXP2 = 7, + GX_FOG_ORTHO_LIN = 10, + GX_FOG_ORTHO_EXP = 12, + GX_FOG_ORTHO_EXP2 = 13, + GX_FOG_ORTHO_REVEXP = 14, + GX_FOG_ORTHO_REVEXP2 = 15, + GX_FOG_LIN = GX_FOG_PERSP_LIN, + GX_FOG_EXP = GX_FOG_PERSP_EXP, + GX_FOG_EXP2 = GX_FOG_PERSP_EXP2, + GX_FOG_REVEXP = GX_FOG_PERSP_REVEXP, + GX_FOG_REVEXP2 = GX_FOG_PERSP_REVEXP2, +} GXFogType; + +typedef enum _GXTevColorArg { + GX_CC_CPREV, + GX_CC_APREV, + GX_CC_C0, + GX_CC_A0, + GX_CC_C1, + GX_CC_A1, + GX_CC_C2, + GX_CC_A2, + GX_CC_TEXC, + GX_CC_TEXA, + GX_CC_RASC, + GX_CC_RASA, + GX_CC_ONE, + GX_CC_HALF, + GX_CC_KONST, + GX_CC_ZERO, +} GXTevColorArg; + +typedef enum _GXTevAlphaArg { + GX_CA_APREV, + GX_CA_A0, + GX_CA_A1, + GX_CA_A2, + GX_CA_TEXA, + GX_CA_RASA, + GX_CA_KONST, + GX_CA_ZERO, +} GXTevAlphaArg; + +typedef enum _GXTevOp { + GX_TEV_ADD = 0, + GX_TEV_SUB = 1, + GX_TEV_COMP_R8_GT = 8, + GX_TEV_COMP_R8_EQ = 9, + GX_TEV_COMP_GR16_GT = 10, + GX_TEV_COMP_GR16_EQ = 11, + GX_TEV_COMP_BGR24_GT = 12, + GX_TEV_COMP_BGR24_EQ = 13, + GX_TEV_COMP_RGB8_GT = 14, + GX_TEV_COMP_RGB8_EQ = 15, + GX_TEV_COMP_A8_GT = GX_TEV_COMP_RGB8_GT, + GX_TEV_COMP_A8_EQ = GX_TEV_COMP_RGB8_EQ, +} GXTevOp; + +typedef enum _GXTevBias { + GX_TB_ZERO, + GX_TB_ADDHALF, + GX_TB_SUBHALF, + GX_MAX_TEVBIAS, +} GXTevBias; + +typedef enum _GXTevScale { + GX_CS_SCALE_1, + GX_CS_SCALE_2, + GX_CS_SCALE_4, + GX_CS_DIVIDE_2, + GX_MAX_TEVSCALE, +} GXTevScale; + +typedef enum _GXTevKColorSel { + GX_TEV_KCSEL_8_8 = 0x00, + GX_TEV_KCSEL_7_8 = 0x01, + GX_TEV_KCSEL_6_8 = 0x02, + GX_TEV_KCSEL_5_8 = 0x03, + GX_TEV_KCSEL_4_8 = 0x04, + GX_TEV_KCSEL_3_8 = 0x05, + GX_TEV_KCSEL_2_8 = 0x06, + GX_TEV_KCSEL_1_8 = 0x07, + GX_TEV_KCSEL_1 = GX_TEV_KCSEL_8_8, + GX_TEV_KCSEL_3_4 = GX_TEV_KCSEL_6_8, + GX_TEV_KCSEL_1_2 = GX_TEV_KCSEL_4_8, + GX_TEV_KCSEL_1_4 = GX_TEV_KCSEL_2_8, + GX_TEV_KCSEL_K0 = 0x0C, + GX_TEV_KCSEL_K1 = 0x0D, + GX_TEV_KCSEL_K2 = 0x0E, + GX_TEV_KCSEL_K3 = 0x0F, + GX_TEV_KCSEL_K0_R = 0x10, + GX_TEV_KCSEL_K1_R = 0x11, + GX_TEV_KCSEL_K2_R = 0x12, + GX_TEV_KCSEL_K3_R = 0x13, + GX_TEV_KCSEL_K0_G = 0x14, + GX_TEV_KCSEL_K1_G = 0x15, + GX_TEV_KCSEL_K2_G = 0x16, + GX_TEV_KCSEL_K3_G = 0x17, + GX_TEV_KCSEL_K0_B = 0x18, + GX_TEV_KCSEL_K1_B = 0x19, + GX_TEV_KCSEL_K2_B = 0x1A, + GX_TEV_KCSEL_K3_B = 0x1B, + GX_TEV_KCSEL_K0_A = 0x1C, + GX_TEV_KCSEL_K1_A = 0x1D, + GX_TEV_KCSEL_K2_A = 0x1E, + GX_TEV_KCSEL_K3_A = 0x1F, +} GXTevKColorSel; + +typedef enum _GXTevKAlphaSel { + GX_TEV_KASEL_8_8 = 0x00, + GX_TEV_KASEL_7_8 = 0x01, + GX_TEV_KASEL_6_8 = 0x02, + GX_TEV_KASEL_5_8 = 0x03, + GX_TEV_KASEL_4_8 = 0x04, + GX_TEV_KASEL_3_8 = 0x05, + GX_TEV_KASEL_2_8 = 0x06, + GX_TEV_KASEL_1_8 = 0x07, + GX_TEV_KASEL_1 = GX_TEV_KASEL_8_8, + GX_TEV_KASEL_3_4 = GX_TEV_KASEL_6_8, + GX_TEV_KASEL_1_2 = GX_TEV_KASEL_4_8, + GX_TEV_KASEL_1_4 = GX_TEV_KASEL_2_8, + GX_TEV_KASEL_K0_R = 0x10, + GX_TEV_KASEL_K1_R = 0x11, + GX_TEV_KASEL_K2_R = 0x12, + GX_TEV_KASEL_K3_R = 0x13, + GX_TEV_KASEL_K0_G = 0x14, + GX_TEV_KASEL_K1_G = 0x15, + GX_TEV_KASEL_K2_G = 0x16, + GX_TEV_KASEL_K3_G = 0x17, + GX_TEV_KASEL_K0_B = 0x18, + GX_TEV_KASEL_K1_B = 0x19, + GX_TEV_KASEL_K2_B = 0x1A, + GX_TEV_KASEL_K3_B = 0x1B, + GX_TEV_KASEL_K0_A = 0x1C, + GX_TEV_KASEL_K1_A = 0x1D, + GX_TEV_KASEL_K2_A = 0x1E, + GX_TEV_KASEL_K3_A = 0x1F, +} GXTevKAlphaSel; + +typedef enum _GXTevKColorID { + GX_KCOLOR0 = 0, + GX_KCOLOR1, + GX_KCOLOR2, + GX_KCOLOR3, + GX_MAX_KCOLOR, +} GXTevKColorID; + +typedef enum _GXZTexOp { + GX_ZT_DISABLE, + GX_ZT_ADD, + GX_ZT_REPLACE, + GX_MAX_ZTEXOP, +} GXZTexOp; + +typedef enum _GXIndTexFormat { + GX_ITF_8, + GX_ITF_5, + GX_ITF_4, + GX_ITF_3, + GX_MAX_ITFORMAT, +} GXIndTexFormat; + +typedef enum _GXIndTexBiasSel { + GX_ITB_NONE, + GX_ITB_S, + GX_ITB_T, + GX_ITB_ST, + GX_ITB_U, + GX_ITB_SU, + GX_ITB_TU, + GX_ITB_STU, + GX_MAX_ITBIAS, +} GXIndTexBiasSel; + +typedef enum _GXIndTexAlphaSel { + GX_ITBA_OFF, + GX_ITBA_S, + GX_ITBA_T, + GX_ITBA_U, + GX_MAX_ITBALPHA, +} GXIndTexAlphaSel; + +typedef enum _GXIndTexMtxID { + GX_ITM_OFF, + GX_ITM_0, + GX_ITM_1, + GX_ITM_2, + GX_ITM_S0 = 5, + GX_ITM_S1, + GX_ITM_S2, + GX_ITM_T0 = 9, + GX_ITM_T1, + GX_ITM_T2, +} GXIndTexMtxID; + +typedef enum _GXIndTexWrap { + GX_ITW_OFF, + GX_ITW_256, + GX_ITW_128, + GX_ITW_64, + GX_ITW_32, + GX_ITW_16, + GX_ITW_0, + GX_MAX_ITWRAP, +} GXIndTexWrap; + +typedef enum _GXIndTexStageID { + GX_INDTEXSTAGE0, + GX_INDTEXSTAGE1, + GX_INDTEXSTAGE2, + GX_INDTEXSTAGE3, + GX_MAX_INDTEXSTAGE, +} GXIndTexStageID; + +typedef enum _GXIndTexScale { + GX_ITS_1, + GX_ITS_2, + GX_ITS_4, + GX_ITS_8, + GX_ITS_16, + GX_ITS_32, + GX_ITS_64, + GX_ITS_128, + GX_ITS_256, + GX_MAX_ITSCALE, +} GXIndTexScale; + +typedef enum _GXClipMode { + GX_CLIP_ENABLE = 0, + GX_CLIP_DISABLE = 1, +} GXClipMode; + +typedef enum _GXTlut { + GX_TLUT0 = 0, + GX_TLUT1 = 1, + GX_TLUT2 = 2, + GX_TLUT3 = 3, + GX_TLUT4 = 4, + GX_TLUT5 = 5, + GX_TLUT6 = 6, + GX_TLUT7 = 7, + GX_TLUT8 = 8, + GX_TLUT9 = 9, + GX_TLUT10 = 10, + GX_TLUT11 = 11, + GX_TLUT12 = 12, + GX_TLUT13 = 13, + GX_TLUT14 = 14, + GX_TLUT15 = 15, + GX_BIGTLUT0 = 16, + GX_BIGTLUT1 = 17, + GX_BIGTLUT2 = 18, + GX_BIGTLUT3 = 19, +} GXTlut; + +typedef enum _GXTlutFmt { + GX_TL_IA8, + GX_TL_RGB565, + GX_TL_RGB5A3, + GX_MAX_TLUTFMT, +} GXTlutFmt; + +typedef enum _GXMiscToken { + GX_MT_NULL = 0, + GX_MT_XF_FLUSH = 1, + GX_MT_DL_SAVE_CONTEXT = 2, + GX_MT_ABORT_WAIT_COPYOUT = 3, +} GXMiscToken; + +typedef enum _GXTexCacheSize { + GX_TEXCACHE_32K, + GX_TEXCACHE_128K, + GX_TEXCACHE_512K, + GX_TEXCACHE_NONE +} GXTexCacheSize; + +typedef enum _GXPerf0 { + GX_PERF0_VERTICES, + GX_PERF0_CLIP_VTX, + GX_PERF0_CLIP_CLKS, + GX_PERF0_XF_WAIT_IN, + GX_PERF0_XF_WAIT_OUT, + GX_PERF0_XF_XFRM_CLKS, + GX_PERF0_XF_LIT_CLKS, + GX_PERF0_XF_BOT_CLKS, + GX_PERF0_XF_REGLD_CLKS, + GX_PERF0_XF_REGRD_CLKS, + GX_PERF0_CLIP_RATIO, + + GX_PERF0_TRIANGLES, + GX_PERF0_TRIANGLES_CULLED, + GX_PERF0_TRIANGLES_PASSED, + GX_PERF0_TRIANGLES_SCISSORED, + GX_PERF0_TRIANGLES_0TEX, + GX_PERF0_TRIANGLES_1TEX, + GX_PERF0_TRIANGLES_2TEX, + GX_PERF0_TRIANGLES_3TEX, + GX_PERF0_TRIANGLES_4TEX, + GX_PERF0_TRIANGLES_5TEX, + GX_PERF0_TRIANGLES_6TEX, + GX_PERF0_TRIANGLES_7TEX, + GX_PERF0_TRIANGLES_8TEX, + GX_PERF0_TRIANGLES_0CLR, + GX_PERF0_TRIANGLES_1CLR, + GX_PERF0_TRIANGLES_2CLR, + + GX_PERF0_QUAD_0CVG, + GX_PERF0_QUAD_NON0CVG, + GX_PERF0_QUAD_1CVG, + GX_PERF0_QUAD_2CVG, + GX_PERF0_QUAD_3CVG, + GX_PERF0_QUAD_4CVG, + GX_PERF0_AVG_QUAD_CNT, + + GX_PERF0_CLOCKS, + GX_PERF0_NONE + +} GXPerf0; + +typedef enum _GXPerf1 { + GX_PERF1_TEXELS, + GX_PERF1_TX_IDLE, + GX_PERF1_TX_REGS, + GX_PERF1_TX_MEMSTALL, + GX_PERF1_TC_CHECK1_2, + GX_PERF1_TC_CHECK3_4, + GX_PERF1_TC_CHECK5_6, + GX_PERF1_TC_CHECK7_8, + GX_PERF1_TC_MISS, + + GX_PERF1_VC_ELEMQ_FULL, + GX_PERF1_VC_MISSQ_FULL, + GX_PERF1_VC_MEMREQ_FULL, + GX_PERF1_VC_STATUS7, + GX_PERF1_VC_MISSREP_FULL, + GX_PERF1_VC_STREAMBUF_LOW, + GX_PERF1_VC_ALL_STALLS, + GX_PERF1_VERTICES, + + GX_PERF1_FIFO_REQ, + GX_PERF1_CALL_REQ, + GX_PERF1_VC_MISS_REQ, + GX_PERF1_CP_ALL_REQ, + + GX_PERF1_CLOCKS, + GX_PERF1_NONE + +} GXPerf1; + +typedef enum _GXVCachePerf { + GX_VC_POS, + GX_VC_NRM, + GX_VC_CLR0, + GX_VC_CLR1, + GX_VC_TEX0, + GX_VC_TEX1, + GX_VC_TEX2, + GX_VC_TEX3, + GX_VC_TEX4, + GX_VC_TEX5, + GX_VC_TEX6, + GX_VC_TEX7, + GX_VC_ALL = 0xf + +} GXVCachePerf; + +typedef enum _GXFBClamp { + GX_CLAMP_NONE = 0, + GX_CLAMP_TOP = 1, + GX_CLAMP_BOTTOM = 2, +} GXFBClamp; + +typedef enum _GXCopyMode { + GX_COPY_PROGRESSIVE = 0, + GX_COPY_INTLC_EVEN = 2, + GX_COPY_INTLC_ODD = 3, +} GXCopyMode; + +typedef enum _GXAlphaReadMode { + GX_READ_00 = 0, + GX_READ_FF = 1, + GX_READ_NONE = 2, + +} _GXAlphaReadMode; + +typedef enum _GXLogicOp { + GX_LO_CLEAR, + GX_LO_AND, + GX_LO_REVAND, + GX_LO_COPY, + GX_LO_INVAND, + GX_LO_NOOP, + GX_LO_XOR, + GX_LO_OR, + GX_LO_NOR, + GX_LO_EQUIV, + GX_LO_INV, + GX_LO_REVOR, + GX_LO_INVCOPY, + GX_LO_INVOR, + GX_LO_NAND, + GX_LO_SET, +} GXLogicOp; + +typedef enum _GXCompCnt { + GX_POS_XY = 0, + GX_POS_XYZ = 1, + GX_NRM_XYZ = 0, + GX_NRM_NBT = 1, + GX_NRM_NBT3 = 2, + GX_CLR_RGB = 0, + GX_CLR_RGBA = 1, + GX_TEX_S = 0, + GX_TEX_ST = 1, +} GXCompCnt; + +typedef enum _GXCompType { + GX_U8 = 0, + GX_S8 = 1, + GX_U16 = 2, + GX_S16 = 3, + GX_F32 = 4, + GX_RGB565 = 0, + GX_RGB8 = 1, + GX_RGBX8 = 2, + GX_RGBA4 = 3, + GX_RGBA6 = 4, + GX_RGBA8 = 5, +} GXCompType; + +typedef enum _GXPTTexMtx { + GX_PTTEXMTX0 = 64, + GX_PTTEXMTX1 = 67, + GX_PTTEXMTX2 = 70, + GX_PTTEXMTX3 = 73, + GX_PTTEXMTX4 = 76, + GX_PTTEXMTX5 = 79, + GX_PTTEXMTX6 = 82, + GX_PTTEXMTX7 = 85, + GX_PTTEXMTX8 = 88, + GX_PTTEXMTX9 = 91, + GX_PTTEXMTX10 = 94, + GX_PTTEXMTX11 = 97, + GX_PTTEXMTX12 = 100, + GX_PTTEXMTX13 = 103, + GX_PTTEXMTX14 = 106, + GX_PTTEXMTX15 = 109, + GX_PTTEXMTX16 = 112, + GX_PTTEXMTX17 = 115, + GX_PTTEXMTX18 = 118, + GX_PTTEXMTX19 = 121, + GX_PTIDENTITY = 125, +} GXPTTexMtx; + +typedef struct _GXColor { + u8 r; + u8 g; + u8 b; + u8 a; +} GXColor; + +typedef struct _GXTexObj { + u32 dummy[8]; +} GXTexObj; + +typedef struct _GXTlutObj { + u32 dummy[3]; +} GXTlutObj; + +typedef struct _GXLightObj { + u32 dummy[16]; +} GXLightObj; + +typedef struct _GXVtxDescList { + GXAttr attr; + GXAttrType type; +} GXVtxDescList; + +typedef struct _GXColorS10 { + s16 r; + s16 g; + s16 b; + s16 a; +} GXColorS10; + +typedef struct _GXTexRegion { + u32 dummy[4]; +} GXTexRegion; + +typedef struct _GXTlutRegion { + u32 dummy[4]; +} GXTlutRegion; + +typedef struct _GXVtxAttrFmtList { + // total size: 0x10 + GXAttr attr; // offset 0x0, size 0x4 + GXCompCnt cnt; // offset 0x4, size 0x4 + GXCompType type; // offset 0x8, size 0x4 + u8 frac; // offset 0xC, size 0x1 +} GXVtxAttrFmtList; + +typedef enum _GXTevRegID { + GX_TEVPREV, + GX_TEVREG0, + GX_TEVREG1, + GX_TEVREG2, + GX_MAX_TEVREG, +} GXTevRegID; + +typedef enum _GXDiffuseFn { + GX_DF_NONE, + GX_DF_SIGN, + GX_DF_CLAMP, +} GXDiffuseFn; + +typedef enum _GXColorSrc { + GX_SRC_REG, + GX_SRC_VTX, +} GXColorSrc; + +typedef enum _GXAttnFn { + GX_AF_SPEC, + GX_AF_SPOT, + GX_AF_NONE, +} GXAttnFn; + +typedef enum _GXLightID { + GX_LIGHT0 = 0x001, + GX_LIGHT1 = 0x002, + GX_LIGHT2 = 0x004, + GX_LIGHT3 = 0x008, + GX_LIGHT4 = 0x010, + GX_LIGHT5 = 0x020, + GX_LIGHT6 = 0x040, + GX_LIGHT7 = 0x080, + GX_MAX_LIGHT = 0x100, + GX_LIGHT_NULL = 0, +} GXLightID; + +typedef enum _GXTexOffset { + GX_TO_ZERO, + GX_TO_SIXTEENTH, + GX_TO_EIGHTH, + GX_TO_FOURTH, + GX_TO_HALF, + GX_TO_ONE, + GX_MAX_TEXOFFSET, +} GXTexOffset; + +typedef enum _GXSpotFn { + GX_SP_OFF, + GX_SP_FLAT, + GX_SP_COS, + GX_SP_COS2, + GX_SP_SHARP, + GX_SP_RING1, + GX_SP_RING2, +} GXSpotFn; + +typedef enum _GXDistAttnFn { + GX_DA_OFF, + GX_DA_GENTLE, + GX_DA_MEDIUM, + GX_DA_STEEP, +} GXDistAttnFn; + +typedef enum _GXCullMode { + GX_CULL_NONE, + GX_CULL_FRONT, + GX_CULL_BACK, + GX_CULL_ALL, +} GXCullMode; + +typedef enum _GXTevSwapSel { + GX_TEV_SWAP0 = 0, + GX_TEV_SWAP1, + GX_TEV_SWAP2, + GX_TEV_SWAP3, + GX_MAX_TEVSWAP, +} GXTevSwapSel; + +typedef enum _GXTevColorChan { + GX_CH_RED = 0, + GX_CH_GREEN, + GX_CH_BLUE, + GX_CH_ALPHA, +} GXTevColorChan; + +typedef enum _GXFogType { + GX_FOG_NONE = 0, + GX_FOG_PERSP_LIN = 2, + GX_FOG_PERSP_EXP = 4, + GX_FOG_PERSP_EXP2 = 5, + GX_FOG_PERSP_REVEXP = 6, + GX_FOG_PERSP_REVEXP2 = 7, + GX_FOG_ORTHO_LIN = 10, + GX_FOG_ORTHO_EXP = 12, + GX_FOG_ORTHO_EXP2 = 13, + GX_FOG_ORTHO_REVEXP = 14, + GX_FOG_ORTHO_REVEXP2 = 15, + GX_FOG_LIN = GX_FOG_PERSP_LIN, + GX_FOG_EXP = GX_FOG_PERSP_EXP, + GX_FOG_EXP2 = GX_FOG_PERSP_EXP2, + GX_FOG_REVEXP = GX_FOG_PERSP_REVEXP, + GX_FOG_REVEXP2 = GX_FOG_PERSP_REVEXP2, +} GXFogType; + +typedef enum _GXTevColorArg { + GX_CC_CPREV, + GX_CC_APREV, + GX_CC_C0, + GX_CC_A0, + GX_CC_C1, + GX_CC_A1, + GX_CC_C2, + GX_CC_A2, + GX_CC_TEXC, + GX_CC_TEXA, + GX_CC_RASC, + GX_CC_RASA, + GX_CC_ONE, + GX_CC_HALF, + GX_CC_KONST, + GX_CC_ZERO, +} GXTevColorArg; + +typedef enum _GXTevAlphaArg { + GX_CA_APREV, + GX_CA_A0, + GX_CA_A1, + GX_CA_A2, + GX_CA_TEXA, + GX_CA_RASA, + GX_CA_KONST, + GX_CA_ZERO, +} GXTevAlphaArg; + +typedef enum _GXTevOp { + GX_TEV_ADD = 0, + GX_TEV_SUB = 1, + GX_TEV_COMP_R8_GT = 8, + GX_TEV_COMP_R8_EQ = 9, + GX_TEV_COMP_GR16_GT = 10, + GX_TEV_COMP_GR16_EQ = 11, + GX_TEV_COMP_BGR24_GT = 12, + GX_TEV_COMP_BGR24_EQ = 13, + GX_TEV_COMP_RGB8_GT = 14, + GX_TEV_COMP_RGB8_EQ = 15, + GX_TEV_COMP_A8_GT = GX_TEV_COMP_RGB8_GT, + GX_TEV_COMP_A8_EQ = GX_TEV_COMP_RGB8_EQ, +} GXTevOp; + +typedef enum _GXTevBias { + GX_TB_ZERO, + GX_TB_ADDHALF, + GX_TB_SUBHALF, + GX_MAX_TEVBIAS, +} GXTevBias; + +typedef enum _GXTevScale { + GX_CS_SCALE_1, + GX_CS_SCALE_2, + GX_CS_SCALE_4, + GX_CS_DIVIDE_2, + GX_MAX_TEVSCALE, +} GXTevScale; + +typedef enum _GXTevKColorSel { + GX_TEV_KCSEL_8_8 = 0x00, + GX_TEV_KCSEL_7_8 = 0x01, + GX_TEV_KCSEL_6_8 = 0x02, + GX_TEV_KCSEL_5_8 = 0x03, + GX_TEV_KCSEL_4_8 = 0x04, + GX_TEV_KCSEL_3_8 = 0x05, + GX_TEV_KCSEL_2_8 = 0x06, + GX_TEV_KCSEL_1_8 = 0x07, + GX_TEV_KCSEL_1 = GX_TEV_KCSEL_8_8, + GX_TEV_KCSEL_3_4 = GX_TEV_KCSEL_6_8, + GX_TEV_KCSEL_1_2 = GX_TEV_KCSEL_4_8, + GX_TEV_KCSEL_1_4 = GX_TEV_KCSEL_2_8, + GX_TEV_KCSEL_K0 = 0x0C, + GX_TEV_KCSEL_K1 = 0x0D, + GX_TEV_KCSEL_K2 = 0x0E, + GX_TEV_KCSEL_K3 = 0x0F, + GX_TEV_KCSEL_K0_R = 0x10, + GX_TEV_KCSEL_K1_R = 0x11, + GX_TEV_KCSEL_K2_R = 0x12, + GX_TEV_KCSEL_K3_R = 0x13, + GX_TEV_KCSEL_K0_G = 0x14, + GX_TEV_KCSEL_K1_G = 0x15, + GX_TEV_KCSEL_K2_G = 0x16, + GX_TEV_KCSEL_K3_G = 0x17, + GX_TEV_KCSEL_K0_B = 0x18, + GX_TEV_KCSEL_K1_B = 0x19, + GX_TEV_KCSEL_K2_B = 0x1A, + GX_TEV_KCSEL_K3_B = 0x1B, + GX_TEV_KCSEL_K0_A = 0x1C, + GX_TEV_KCSEL_K1_A = 0x1D, + GX_TEV_KCSEL_K2_A = 0x1E, + GX_TEV_KCSEL_K3_A = 0x1F, +} GXTevKColorSel; + +typedef enum _GXTevKAlphaSel { + GX_TEV_KASEL_8_8 = 0x00, + GX_TEV_KASEL_7_8 = 0x01, + GX_TEV_KASEL_6_8 = 0x02, + GX_TEV_KASEL_5_8 = 0x03, + GX_TEV_KASEL_4_8 = 0x04, + GX_TEV_KASEL_3_8 = 0x05, + GX_TEV_KASEL_2_8 = 0x06, + GX_TEV_KASEL_1_8 = 0x07, + GX_TEV_KASEL_1 = GX_TEV_KASEL_8_8, + GX_TEV_KASEL_3_4 = GX_TEV_KASEL_6_8, + GX_TEV_KASEL_1_2 = GX_TEV_KASEL_4_8, + GX_TEV_KASEL_1_4 = GX_TEV_KASEL_2_8, + GX_TEV_KASEL_K0_R = 0x10, + GX_TEV_KASEL_K1_R = 0x11, + GX_TEV_KASEL_K2_R = 0x12, + GX_TEV_KASEL_K3_R = 0x13, + GX_TEV_KASEL_K0_G = 0x14, + GX_TEV_KASEL_K1_G = 0x15, + GX_TEV_KASEL_K2_G = 0x16, + GX_TEV_KASEL_K3_G = 0x17, + GX_TEV_KASEL_K0_B = 0x18, + GX_TEV_KASEL_K1_B = 0x19, + GX_TEV_KASEL_K2_B = 0x1A, + GX_TEV_KASEL_K3_B = 0x1B, + GX_TEV_KASEL_K0_A = 0x1C, + GX_TEV_KASEL_K1_A = 0x1D, + GX_TEV_KASEL_K2_A = 0x1E, + GX_TEV_KASEL_K3_A = 0x1F, +} GXTevKAlphaSel; + +typedef enum _GXTevKColorID { + GX_KCOLOR0 = 0, + GX_KCOLOR1, + GX_KCOLOR2, + GX_KCOLOR3, + GX_MAX_KCOLOR, +} GXTevKColorID; + +typedef enum _GXZTexOp { + GX_ZT_DISABLE, + GX_ZT_ADD, + GX_ZT_REPLACE, + GX_MAX_ZTEXOP, +} GXZTexOp; + +typedef enum _GXIndTexFormat { + GX_ITF_8, + GX_ITF_5, + GX_ITF_4, + GX_ITF_3, + GX_MAX_ITFORMAT, +} GXIndTexFormat; + +typedef enum _GXIndTexBiasSel { + GX_ITB_NONE, + GX_ITB_S, + GX_ITB_T, + GX_ITB_ST, + GX_ITB_U, + GX_ITB_SU, + GX_ITB_TU, + GX_ITB_STU, + GX_MAX_ITBIAS, +} GXIndTexBiasSel; + +typedef enum _GXIndTexAlphaSel { + GX_ITBA_OFF, + GX_ITBA_S, + GX_ITBA_T, + GX_ITBA_U, + GX_MAX_ITBALPHA, +} GXIndTexAlphaSel; + +typedef enum _GXIndTexMtxID { + GX_ITM_OFF, + GX_ITM_0, + GX_ITM_1, + GX_ITM_2, + GX_ITM_S0 = 5, + GX_ITM_S1, + GX_ITM_S2, + GX_ITM_T0 = 9, + GX_ITM_T1, + GX_ITM_T2, +} GXIndTexMtxID; + +typedef enum _GXIndTexWrap { + GX_ITW_OFF, + GX_ITW_256, + GX_ITW_128, + GX_ITW_64, + GX_ITW_32, + GX_ITW_16, + GX_ITW_0, + GX_MAX_ITWRAP, +} GXIndTexWrap; + +typedef enum _GXIndTexStageID { + GX_INDTEXSTAGE0, + GX_INDTEXSTAGE1, + GX_INDTEXSTAGE2, + GX_INDTEXSTAGE3, + GX_MAX_INDTEXSTAGE, +} GXIndTexStageID; + +typedef enum _GXIndTexScale { + GX_ITS_1, + GX_ITS_2, + GX_ITS_4, + GX_ITS_8, + GX_ITS_16, + GX_ITS_32, + GX_ITS_64, + GX_ITS_128, + GX_ITS_256, + GX_MAX_ITSCALE, +} GXIndTexScale; + +typedef enum _GXClipMode { + GX_CLIP_ENABLE = 0, + GX_CLIP_DISABLE = 1, +} GXClipMode; + +typedef enum _GXTlut { + GX_TLUT0 = 0, + GX_TLUT1 = 1, + GX_TLUT2 = 2, + GX_TLUT3 = 3, + GX_TLUT4 = 4, + GX_TLUT5 = 5, + GX_TLUT6 = 6, + GX_TLUT7 = 7, + GX_TLUT8 = 8, + GX_TLUT9 = 9, + GX_TLUT10 = 10, + GX_TLUT11 = 11, + GX_TLUT12 = 12, + GX_TLUT13 = 13, + GX_TLUT14 = 14, + GX_TLUT15 = 15, + GX_BIGTLUT0 = 16, + GX_BIGTLUT1 = 17, + GX_BIGTLUT2 = 18, + GX_BIGTLUT3 = 19, +} GXTlut; + +typedef enum _GXTlutFmt { + GX_TL_IA8, + GX_TL_RGB565, + GX_TL_RGB5A3, + GX_MAX_TLUTFMT, +} GXTlutFmt; + +typedef enum _GXMiscToken { + GX_MT_NULL = 0, + GX_MT_XF_FLUSH = 1, + GX_MT_DL_SAVE_CONTEXT = 2, + GX_MT_ABORT_WAIT_COPYOUT = 3, +} GXMiscToken; + +typedef enum _GXTexCacheSize { + GX_TEXCACHE_32K, + GX_TEXCACHE_128K, + GX_TEXCACHE_512K, + GX_TEXCACHE_NONE +} GXTexCacheSize; + +typedef enum _GXPerf0 { + GX_PERF0_VERTICES, + GX_PERF0_CLIP_VTX, + GX_PERF0_CLIP_CLKS, + GX_PERF0_XF_WAIT_IN, + GX_PERF0_XF_WAIT_OUT, + GX_PERF0_XF_XFRM_CLKS, + GX_PERF0_XF_LIT_CLKS, + GX_PERF0_XF_BOT_CLKS, + GX_PERF0_XF_REGLD_CLKS, + GX_PERF0_XF_REGRD_CLKS, + GX_PERF0_CLIP_RATIO, + + GX_PERF0_TRIANGLES, + GX_PERF0_TRIANGLES_CULLED, + GX_PERF0_TRIANGLES_PASSED, + GX_PERF0_TRIANGLES_SCISSORED, + GX_PERF0_TRIANGLES_0TEX, + GX_PERF0_TRIANGLES_1TEX, + GX_PERF0_TRIANGLES_2TEX, + GX_PERF0_TRIANGLES_3TEX, + GX_PERF0_TRIANGLES_4TEX, + GX_PERF0_TRIANGLES_5TEX, + GX_PERF0_TRIANGLES_6TEX, + GX_PERF0_TRIANGLES_7TEX, + GX_PERF0_TRIANGLES_8TEX, + GX_PERF0_TRIANGLES_0CLR, + GX_PERF0_TRIANGLES_1CLR, + GX_PERF0_TRIANGLES_2CLR, + + GX_PERF0_QUAD_0CVG, + GX_PERF0_QUAD_NON0CVG, + GX_PERF0_QUAD_1CVG, + GX_PERF0_QUAD_2CVG, + GX_PERF0_QUAD_3CVG, + GX_PERF0_QUAD_4CVG, + GX_PERF0_AVG_QUAD_CNT, + + GX_PERF0_CLOCKS, + GX_PERF0_NONE + +} GXPerf0; + +typedef enum _GXPerf1 { + GX_PERF1_TEXELS, + GX_PERF1_TX_IDLE, + GX_PERF1_TX_REGS, + GX_PERF1_TX_MEMSTALL, + GX_PERF1_TC_CHECK1_2, + GX_PERF1_TC_CHECK3_4, + GX_PERF1_TC_CHECK5_6, + GX_PERF1_TC_CHECK7_8, + GX_PERF1_TC_MISS, + + GX_PERF1_VC_ELEMQ_FULL, + GX_PERF1_VC_MISSQ_FULL, + GX_PERF1_VC_MEMREQ_FULL, + GX_PERF1_VC_STATUS7, + GX_PERF1_VC_MISSREP_FULL, + GX_PERF1_VC_STREAMBUF_LOW, + GX_PERF1_VC_ALL_STALLS, + GX_PERF1_VERTICES, + + GX_PERF1_FIFO_REQ, + GX_PERF1_CALL_REQ, + GX_PERF1_VC_MISS_REQ, + GX_PERF1_CP_ALL_REQ, + + GX_PERF1_CLOCKS, + GX_PERF1_NONE + +} GXPerf1; + +typedef enum _GXVCachePerf { + GX_VC_POS, + GX_VC_NRM, + GX_VC_CLR0, + GX_VC_CLR1, + GX_VC_TEX0, + GX_VC_TEX1, + GX_VC_TEX2, + GX_VC_TEX3, + GX_VC_TEX4, + GX_VC_TEX5, + GX_VC_TEX6, + GX_VC_TEX7, + GX_VC_ALL = 0xf + +} GXVCachePerf; + +typedef enum _GXFBClamp { + GX_CLAMP_NONE = 0, + GX_CLAMP_TOP = 1, + GX_CLAMP_BOTTOM = 2, +} GXFBClamp; + +typedef enum _GXCopyMode { + GX_COPY_PROGRESSIVE = 0, + GX_COPY_INTLC_EVEN = 2, + GX_COPY_INTLC_ODD = 3, +} GXCopyMode; + +typedef enum _GXAlphaReadMode { + GX_READ_00 = 0, + GX_READ_FF = 1, + GX_READ_NONE = 2, + +} _GXAlphaReadMode; + +#define ANIM_BMP_RGBA8 0 +#define ANIM_BMP_RGB5A3 1 +#define ANIM_BMP_RGB5A3_DUPE 2 +#define ANIM_BMP_C8 3 +#define ANIM_BMP_C4 4 +#define ANIM_BMP_IA8 5 +#define ANIM_BMP_IA4 6 +#define ANIM_BMP_I8 7 +#define ANIM_BMP_I4 8 +#define ANIM_BMP_A8 9 +#define ANIM_BMP_CMPR 10 + +#define ANIM_BMP_FMTMASK 0xF +#define ANIM_BMP_ALLOC 0x8000 +#define ANIM_BMP_NUM_MASK 0x7FFF + +#define ANIM_LAYER_FLIPX 0x1 +#define ANIM_LAYER_FLIPY 0x2 + +typedef struct anim_frame_data { + s16 pat; + s16 time; + s16 shiftX; + s16 shiftY; + s16 flip; + s16 pad; +} AnimFrameData; + +typedef struct anim_bank_data { + s16 timeNum; + s16 unk; + AnimFrameData *frame; +} AnimBankData; + +typedef struct anim_layer_data { + u8 alpha; + u8 flip; + s16 bmpNo; + s16 startX; + s16 startY; + s16 sizeX; + s16 sizeY; + s16 shiftX; + s16 shiftY; + s16 vtx[8]; +} AnimLayerData; + +typedef struct anim_pat_data { + s16 layerNum; + s16 centerX; + s16 centerY; + s16 sizeX; + s16 sizeY; + AnimLayerData *layer; +} AnimPatData; + +typedef struct anim_bmp_data { + u8 pixSize; + u8 dataFmt; + s16 palNum; + s16 sizeX; + s16 sizeY; + u32 dataSize; + void *palData; + void *data; +} AnimBmpData; + +typedef struct anim_data { + s16 bankNum; + s16 patNum; + s16 bmpNum; + s16 useNum; + AnimBankData *bank; + AnimPatData *pat; + AnimBmpData *bmp; +} AnimData; + +typedef struct { + f32 x, y, z; +} Vec, *VecPtr, Point3d, *Point3dPtr; + +typedef struct { + s16 x; + s16 y; + s16 z; +} S16Vec, *S16VecPtr; + +typedef struct { + f32 x, y, z, w; +} Quaternion, *QuaternionPtr, Qtrn, *QtrnPtr; + +typedef f32 Mtx[3][4]; + +typedef f32 (*MtxPtr)[4]; + +typedef f32 ROMtx[4][3]; + +typedef f32 (*ROMtxPtr)[3]; + +typedef f32 Mtx44[4][4]; + +typedef f32 (*Mtx44Ptr)[4]; + +#define HUSPR_MAX 384 +#define HUSPR_GRP_MAX 256 + +#define HUSPR_NONE -1 +#define HUSPR_GRP_NONE -1 + +#define HUSPR_ATTR_NOANIM 0x1 +#define HUSPR_ATTR_LOOP 0x2 +#define HUSPR_ATTR_DISPOFF 0x4 +#define HUSPR_ATTR_LINEAR 0x8 +#define HUSPR_ATTR_FUNC 0x10 +#define HUSPR_ATTR_NOPAUSE 0x20 +#define HUSPR_ATTR_REVERSE 0x40 +#define HUSPR_ATTR_ADDCOL 0x80 +#define HUSPR_ATTR_INVCOL 0x100 + +typedef void (*HuSprFunc)(struct hu_sprite *); + +typedef struct hu_sprite { + u8 r; + u8 g; + u8 b; + u8 draw_no; + s16 frame; + s16 bank; + s16 attr; + s16 dirty_flag; + s16 prio; + float time; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float speed; + float a; + GXTexWrapMode wrap_s; + GXTexWrapMode wrap_t; + s16 tex_scale_x; + s16 tex_scale_y; + Mtx *group_mtx; + union { + AnimData *data; + HuSprFunc func; + }; + AnimPatData *pat_data; + AnimFrameData *frame_data; + s16 work[4]; + AnimData *bg; + u16 bg_bank; + s16 scissor_x; + s16 scissor_y; + s16 scissor_w; + s16 scissor_h; +} HuSprite; + +typedef struct hu_spr_grp { + s16 capacity; + float x; + float y; + float z_rot; + float scale_x; + float scale_y; + float center_x; + float center_y; + s16 *members; + Mtx mtx; +} HuSprGrp; + +extern HuSprite HuSprData[HUSPR_MAX]; +extern HuSprGrp HuSprGrpData[HUSPR_GRP_MAX]; + +#define HuSprAnimReadFile(data_id) \ + (HuSprAnimRead( \ + HuDataSelHeapReadNum((data_id), MEMORY_DEFAULT_NUM, HEAP_DATA))) + +void HuSprInit(void); +void HuSprClose(void); +void HuSprExec(s16 draw_no); +void HuSprBegin(void); +HuSprite *HuSprCall(void); +void HuSprFinish(void); +void HuSprPauseSet(BOOL value); +AnimData *HuSprAnimRead(void *data); +void HuSprAnimLock(AnimData *anim); +s16 HuSprCreate(AnimData *anim, s16 prio, s16 bank); +s16 HuSprFuncCreate(HuSprFunc func, s16 prio); +s16 HuSprGrpCreate(s16 capacity); +s16 HuSprGrpCopy(s16 group); +void HuSprGrpMemberSet(s16 group, s16 member, s16 sprite); +void HuSprGrpMemberKill(s16 group, s16 member); +void HuSprGrpKill(s16 group); +void HuSprKill(s16 sprite); +void HuSprAnimKill(AnimData *anim); +void HuSprAttrSet(s16 group, s16 member, s32 attr); +void HuSprAttrReset(s16 group, s16 member, s32 attr); +void HuSprPosSet(s16 group, s16 member, float x, float y); +void HuSprZRotSet(s16 group, s16 member, float z_rot); +void HuSprScaleSet(s16 group, s16 member, float x, float y); +void HuSprTPLvlSet(s16 group, s16 member, float tp_lvl); +void HuSprColorSet(s16 group, s16 member, u8 r, u8 g, u8 b); +void HuSprSpeedSet(s16 group, s16 member, float speed); +void HuSprBankSet(s16 group, s16 member, s16 bank); +void HuSprGrpPosSet(s16 group, float x, float y); +void HuSprGrpCenterSet(s16 group, float x, float y); +void HuSprGrpZRotSet(s16 group, float z_rot); +void HuSprGrpScaleSet(s16 group, float x, float y); +void HuSprGrpTPLvlSet(s16 group, float tp_lvl); +void HuSprGrpDrawNoSet(s16 group, s32 draw_no); +void HuSprDrawNoSet(s16 group, s16 member, s32 draw_no); +void HuSprPriSet(s16 group, s16 member, s16 prio); +void HuSprGrpScissorSet(s16 group, s16 x, s16 y, s16 w, s16 h); +void HuSprScissorSet(s16 group, s16 member, s16 x, s16 y, s16 w, s16 h); +AnimData *HuSprAnimMake(s16 sizeX, s16 sizeY, s16 dataFmt); +void HuSprBGSet(s16 group, s16 member, AnimData *bg, s16 bg_bank); +void HuSprSprBGSet(s16 sprite, AnimData *bg, s16 bg_bank); +void AnimDebug(AnimData *anim); + +void HuSprDispInit(void); +void HuSprDisp(HuSprite *sprite); +void HuSprTexLoad(AnimData *anim, s16 bmp, s16 slot, GXTexWrapMode wrap_s, + GXTexWrapMode wrap_t, GXTexFilter filter); +void HuSprExecLayerSet(s16 draw_no, s16 layer); + +#define MEMORY_DEFAULT_NUM 0x10000000 + +typedef enum { + HEAP_SYSTEM, + HEAP_MUSIC, + HEAP_DATA, + HEAP_DVD, + HEAP_MISC, + HEAP_MAX +} HeapID; + +void HuMemInitAll(void); +void *HuMemInit(void *ptr, s32 size); +void HuMemDCFlushAll(); +void HuMemDCFlush(HeapID heap); +void *HuMemDirectMalloc(HeapID heap, s32 size); +void *HuMemDirectMallocNum(HeapID heap, s32 size, u32 num); +void HuMemDirectFree(void *ptr); +void HuMemDirectFreeNum(HeapID heap, u32 num); +s32 HuMemUsedMallocSizeGet(HeapID heap); +s32 HuMemUsedMallocBlockGet(HeapID heap); +u32 HuMemHeapSizeGet(HeapID heap); +void *HuMemHeapPtrGet(HeapID heap); + +void *HuMemHeapInit(void *ptr, s32 size); +void *HuMemMemoryAlloc(void *heap_ptr, s32 size, u32 retaddr); +void *HuMemMemoryAllocNum(void *heap_ptr, s32 size, u32 num, u32 retaddr); +void HuMemMemoryFree(void *ptr, u32 retaddr); +void HuMemMemoryFreeNum(void *heap_ptr, u32 num, u32 retaddr); +s32 HuMemUsedMemorySizeGet(void *heap_ptr); +s32 HuMemUsedMemoryBlockGet(void *heap_ptr); +s32 HuMemMemorySizeGet(void *ptr); +s32 HuMemMemoryAllocSizeGet(s32 size); +void HuMemHeapDump(void *heap_ptr, s16 status); + +#define DVD_MIN_TRANSFER_SIZE 32 + +#define DVD_STATE_FATAL_ERROR -1 +#define DVD_STATE_END 0 +#define DVD_STATE_BUSY 1 +#define DVD_STATE_WAITING 2 +#define DVD_STATE_COVER_CLOSED 3 +#define DVD_STATE_NO_DISK 4 +#define DVD_STATE_COVER_OPEN 5 +#define DVD_STATE_WRONG_DISK 6 +#define DVD_STATE_MOTOR_STOPPED 7 +#define DVD_STATE_PAUSING 8 +#define DVD_STATE_IGNORED 9 +#define DVD_STATE_CANCELED 10 +#define DVD_STATE_RETRY 11 + +#define DVD_FILEINFO_READY 0 +#define DVD_FILEINFO_BUSY 1 + +#define DVD_RESULT_GOOD 0 +#define DVD_RESULT_FATAL_ERROR -1 +#define DVD_RESULT_IGNORED -2 +#define DVD_RESULT_CANCELED -3 + +#define DVD_AIS_SUCCESS 0x0 + +typedef struct DVDDiskID { + char gameName[4]; + char company[2]; + u8 diskNumber; + u8 gameVersion; + u8 streaming; + u8 streamingBufSize; // 0 = default + u8 padding[22]; // 0's are stored +} DVDDiskID; + +typedef struct DVDCommandBlock DVDCommandBlock; + +typedef void (*DVDCBCallback)(s32 result, DVDCommandBlock *block); + +struct DVDCommandBlock { + DVDCommandBlock *next; + DVDCommandBlock *prev; + u32 command; + s32 state; + u32 offset; + u32 length; + void *addr; + u32 currTransferSize; + u32 transferredSize; + DVDDiskID *id; + DVDCBCallback callback; + void *userData; +}; + +typedef struct DVDFileInfo DVDFileInfo; + +typedef void (*DVDCallback)(s32 result, DVDFileInfo *fileInfo); + +struct DVDFileInfo { + DVDCommandBlock cb; + u32 startAddr; + u32 length; + DVDCallback callback; +}; + +typedef struct { + u32 entryNum; + u32 location; + u32 next; +} DVDDir; + +typedef struct { + u32 entryNum; + BOOL isDir; + char *name; +} DVDDirEntry; + +void DVDInit(); +BOOL DVDClose(DVDFileInfo *f); +BOOL DVDSetAutoFatalMessaging(BOOL); +void DVDReset(); +s32 DVDCancel(DVDCommandBlock *block); +BOOL DVDOpen(char *fileName, DVDFileInfo *fileInfo); +BOOL DVDFastOpen(s32 entrynum, DVDFileInfo *fileInfo); +s32 DVDGetCommandBlockStatus(const DVDCommandBlock *block); +BOOL DVDCancelAsync(DVDCommandBlock *block, DVDCBCallback callback); +s32 DVDCancel(DVDCommandBlock *block); +BOOL DVDCancelAllAsync(DVDCBCallback callback); +s32 DVDCancelAll(void); +BOOL DVDPrepareStreamAsync(DVDFileInfo *fInfo, u32 length, u32 offset, + DVDCallback callback); +s32 DVDPrepareStream(DVDFileInfo *fInfo, u32 length, u32 offset); + +BOOL DVDCancelStreamAsync(DVDCommandBlock *block, DVDCBCallback callback); +s32 DVDCancelStream(DVDCommandBlock *block); + +BOOL DVDStopStreamAtEndAsync(DVDCommandBlock *block, DVDCBCallback callback); +s32 DVDStopStreamAtEnd(DVDCommandBlock *block); + +BOOL DVDGetStreamErrorStatusAsync(DVDCommandBlock *block, + DVDCBCallback callback); +s32 DVDGetStreamErrorStatus(DVDCommandBlock *block); + +BOOL DVDGetStreamPlayAddrAsync(DVDCommandBlock *block, DVDCBCallback callback); +s32 DVDGetStreamPlayAddr(DVDCommandBlock *block); + +s32 DVDGetDriveStatus(); + +s32 DVDConvertPathToEntrynum(char *pathPtr); + +BOOL DVDReadAsyncPrio(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset, + DVDCallback callback, s32 prio); + +BOOL DVDReadPrio(DVDFileInfo *fileInfo, void *addr, s32 length, s32 offset, + s32 prio); + +#define DVDReadAsync(fileInfo, addr, length, offset, callback) \ + DVDReadAsyncPrio((fileInfo), (addr), (length), (offset), (callback), 2) +#define DVDRead(fileInfo, addr, length, offset) \ + DVDReadPrio((fileInfo), (addr), (length), (offset), 2) + +#define DVDSeekAsync(fileInfo, offset, callback) \ + DVDSeekAsyncPrio((fileInfo), (offset), (callback), 2) + +#define DATA_DECODE_NONE 0 +#define DATA_DECODE_LZ 1 +#define DATA_DECODE_SLIDE 2 +#define DATA_DECODE_FSLIDE_ALT 3 +#define DATA_DECODE_FSLIDE 4 +#define DATA_DECODE_RLE 5 + +#define DATA_NUM_LISTEND -1 + +typedef struct data_read_stat { + s32 dir_id; + void *dir; + void *file; + u32 raw_len; + u32 comp_type; + BOOL used; + s32 num; + u32 status; + DVDFileInfo file_info; +} DataReadStat; + +void HuDataInit(void); +int HuDataReadChk(s32 data_num); +DataReadStat *HuDataGetStatus(void *dir_ptr); +void *HuDataGetDirPtr(s32 data_num); +DataReadStat *HuDataDirRead(s32 data_num); +DataReadStat *HuDataDirReadNum(s32 data_num, s32 num); +DataReadStat *HuDataDirSet(void *dir_ptr, s32 data_num); +void HuDataDirReadAsyncCallBack(s32 result, DVDFileInfo *fileInfo); +s32 HuDataDirReadAsync(s32 data_num); +s32 HuDataDirReadNumAsync(s32 data_num, s32 num); +BOOL HuDataGetAsyncStat(s32 status); +void *HuDataRead(s32 data_num); +void *HuDataReadNum(s32 data_num, s32 num); +void *HuDataSelHeapRead(s32 data_num, HeapID heap); +void *HuDataSelHeapReadNum(s32 data_num, s32 num, HeapID heap); +void **HuDataReadMulti(s32 *data_ids); +s32 HuDataGetSize(s32 data_num); +void HuDataClose(void *ptr); +void HuDataCloseMulti(void **ptrs); +void HuDataDirClose(s32 data_id); +void HuDataDirCloseNum(s32 num); +void *HuDataReadNumHeapShortForce(s32 data_id, s32 num, HeapID heap); + +void HuDecodeData(void *src, void *dst, u32 size, int decode_type); + +extern u32 DirDataSize; + +typedef struct { + /* 0x00 */ u8 color; + /* 0x01 */ u8 fade; + /* 0x02 */ s16 x; + /* 0x04 */ s16 y; + /* 0x06 */ s16 character; +} WinChar; // Size 8 + +typedef struct { + /* 0x00 */ u8 stat; + /* 0x02 */ s16 x; + /* 0x04 */ s16 y; +} WinChoice; // Size 6 + +typedef struct { + /* 0x000 */ u8 stat; + /* 0x001 */ u8 active_pad; + /* 0x002 */ u8 player_disable; + /* 0x003 */ u8 color_key; + /* 0x004 */ s16 group; + /* 0x006 */ s16 sprite_id[30]; + /* 0x042 */ s16 speed; + /* 0x044 */ s16 mess_time; + /* 0x046 */ s16 advance_sprite; + /* 0x048 */ s16 prio; + /* 0x04C */ u32 attr; + /* 0x050 */ AnimData *frame; + /* 0x054 */ s16 mess_rect_x; + /* 0x056 */ s16 mess_rect_w; + /* 0x058 */ s16 mess_rect_y; + /* 0x05A */ s16 mess_rect_h; + /* 0x05C */ s16 mess_x; + /* 0x05E */ s16 mess_y; + /* 0x060 */ s16 mess_color; + /* 0x062 */ s16 mess_shadow_color; + /* 0x064 */ s16 spacing_x; + /* 0x066 */ s16 spacing_y; + /* 0x068 */ s16 w; + /* 0x06A */ s16 h; + /* 0x06C */ float pos_x; + /* 0x070 */ float pos_y; + /* 0x074 */ float scale_x; + /* 0x078 */ float scale_y; + /* 0x07C */ float z_rot; + /* 0x080 */ s16 num_chars; + /* 0x082 */ s16 max_chars; + /* 0x084 */ WinChar *char_data; + /* 0x088 */ s16 mess_stackptr; + /* 0x08C */ s32 unk8C; + /* 0x090 */ u8 *mess; + /* 0x094 */ u8 *mess_stack[8]; + /* 0x0B4 */ u8 *insert_mess[8]; + /* 0x0D4 */ s16 num_choices; + /* 0x0D6 */ s16 choice; + /* 0x0D8 */ s16 cursor_sprite; + /* 0x0DA */ u8 choice_disable[16]; + /* 0x0EA */ WinChoice choice_data[16]; + /* 0x14A */ s16 scissor_x; + /* 0x14C */ s16 scissor_y; + /* 0x14E */ s16 scissor_w; + /* 0x150 */ s16 scissor_h; + /* 0x152 */ s16 tab_w; + /* 0x154 */ s16 push_key; + /* 0x156 */ s16 key_down; + /* 0x158 */ s16 key_auto; + /* 0x160 */ u8 mess_pal[10][3]; +} WindowData; // Size 0x180 + +extern WindowData winData[32]; +extern void *messDataPtr; + +void HuWindowInit(void); +void HuWinInit(s32 mess_data_no); +s16 HuWinCreate(float x, float y, s16 w, s16 h, s16 frame); +void HuWinKill(s16 window); +void HuWinAllKill(void); +void HuWinHomeClear(s16 window); +void HuWinKeyWaitEntry(s16 window); +u32 HuWinActivePadGet(WindowData *window); +u32 HuWinActiveKeyGetX(WindowData *window); +void HuWinPosSet(s16 window, float x, float y); +void HuWinScaleSet(s16 window, float x, float y); +void HuWinZRotSet(s16 window, float z_rot); +void HuWinCenterPosSet(s16 window, float x, float y); +void HuWinDrawNoSet(s16 window, s16 draw_no); +void HuWinScissorSet(s16 window, s16 x, s16 y, s16 w, s16 h); +void HuWinPriSet(s16 window, s16 prio); +void HuWinAttrSet(s16 window, u32 attr); +void HuWinAttrReset(s16 window, u32 attr); +s16 HuWinStatGet(s16 window); +void HuWinMesColSet(s16 window, u8 color); +void HuWinMesPalSet(s16 window, u8 index, u8 r, u8 g, u8 b); +void HuWinBGTPLvlSet(s16 window, float tp_level); +void HuWinBGColSet(s16 window, GXColor *bg_color); +void HuWinMesSpeedSet(s16 window, s16 speed); +void HuWinMesRead(s32 mess_data_no); +void HuWinMesSet(s16 window, u32 mess); +void HuWinInsertMesSet(s16 window, u32 mess, s16 index); +s16 HuWinChoiceGet(s16 window, s16 start_choice); +s16 HuWinChoiceNumGet(s16 window); +void HuWinChoiceDisable(s16 window, s16 choice); +s16 HuWinChoiceNowGet(s16 window); +void HuWinMesWait(s16 window); +s16 HuWinAnimSet(s16 window, AnimData *anim, s16 bank, float x, float y); +s16 HuWinSprSet(s16 window, s16 sprite, float x, float y); +void HuWinSprPosSet(s16 window, s16 index, float x, float y); +void HuWinSprPriSet(s16 window, s16 index, s16 prio); +s16 HuWinSprIDGet(s16 window, s16 index); +void HuWinSprKill(s16 window, s16 index); +void HuWinDispOff(s16 window); +void HuWinDispOn(s16 window); +void HuWinComKeyWait(s32 player_1, s32 player_2, s32 player_3, s32 player_4, + s16 delay); +void HuWinComKeySet(s32 player_1, s32 player_2, s32 player_3, s32 player_4); +void _HuWinComKeySet(s32 player_1, s32 player_2, s32 player_3, s32 player_4, + s16 delay); +void HuWinComKeyGet(s16 window, u32 *data); +void HuWinComKeyReset(void); +void HuWinMesMaxSizeGet(s16 mess_num, float *size, ...); +void HuWinInsertMesSizeGet(u32 mess, s16 index); +void HuWinMesSizeCancelCRSet(s32 cancel_cr); +void HuWinMesMaxSizeBetGet(float *size, u32 start, u32 end); +s16 HuWinKeyWaitNumGet(u32 mess); +void HuWinPushKeySet(s16 window, s16 push_key); +void HuWinDisablePlayerSet(s16 window, u8 player); +void HuWinDisablePlayerReset(s16 window, u8 player); +s16 HuWinExCreate(float x, float y, s16 w, s16 h, s16 portrait); +s16 HuWinExCreateStyled(float x, float y, s16 w, s16 h, s16 portrait, + s16 frame); +void HuWinExAnimIn(s16 window); +void HuWinExAnimOut(s16 window); +void HuWinExCleanup(s16 window); +void HuWinExAnimPopIn(s16 window, s16 portrait); +void *MessData_MesPtrGet(void *data, u32 index); + +extern void *messDataPtr; + +typedef void (*omObjFunc)(struct om_obj_data *); + +typedef struct om_obj_data { + /* 0x00 */ u16 stat; + /* 0x02 */ s16 next_idx_alloc; + /* 0x04 */ s16 prio; + /* 0x06 */ s16 prev; + /* 0x08 */ s16 next; + /* 0x0A */ s16 next_idx; + /* 0x0C */ s16 group; + /* 0x0E */ u16 group_idx; + /* 0x10 */ u32 unk10; + /* 0x14 */ omObjFunc func; + /* 0x18 */ Vec trans; + /* 0x24 */ Vec rot; + /* 0x30 */ Vec scale; + /* 0x3C */ u16 mdlcnt; + /* 0x40 */ s16 *model; + /* 0x44 */ u16 mtncnt; + /* 0x48 */ s16 *motion; + /* 0x4C */ u32 work[4]; + /* 0x5C */ void *data; +} omObjData; + + +typedef struct hu_snd_grp_data { + /* 0x00 */ s16 ovl; + /* 0x02 */ s16 grpset; + /* 0x04 */ s32 auxANo; + /* 0x08 */ s32 auxBNo; + /* 0x0C */ s8 auxAVol; + /* 0x0D */ s8 auxBVol; +} HuSndGrpData; + +void HuAudInit(void); +s32 HuAudStreamPlay(void); +void HuAudStreamVolSet(s16 vol); +void HuAudStreamPauseOn(void); +void HuAudStreamPauseOff(void); +void HuAudStreamFadeOut(void); +void HuAudAllStop(void); +void HuAudFadeOut(s32 arg0); +s32 HuAudFXPlay(s32 arg0); +s32 HuAudFXPlayVol(s32 arg0, s16 arg1); +s32 HuAudFXPlayVolPan(s32 arg0, s16 arg1, s16 arg2); +void HuAudFXStop(s32 arg0); +void HuAudFXAllStop(void); +void HuAudFXFadeOut(s32 arg0, s32 arg1); +void HuAudFXPanning(s32 arg0, s16 arg1); +void HuAudFXListnerSet(Vec* arg0, Vec* arg1, float arg2, float arg3); +void HuAudFXListnerSetEX(Vec* arg0, Vec* arg1, float sndDist, float sndSpeed, float arg4, float arg5, float arg6); +void HuAudFXListnerUpdate(Vec *arg0, Vec *arg1); +s32 HuAudFXEmiterPlay(s32 arg0, Vec *arg1); +void HuAudFXEmiterUpDate(s32 arg0, Vec *arg1); +void HuAudFXListnerKill(void); +void HuAudFXPauseAll(s32 arg0); +s32 HuAudFXStatusGet(s32 arg0); +s32 HuAudFXPitchSet(s32 arg0, s16 arg1); +s32 HuAudFXVolSet(s32 arg0, s16 arg1); +s32 HuAudSeqPlay(s16 arg0); +void HuAudSeqStop(s32 arg0); +void HuAudSeqFadeOut(s32 arg0, s32 arg1); +void HuAudSeqAllFadeOut(s32 arg0); +void HuAudSeqAllStop(void); +void HuAudSeqPauseAll(s32 arg0); +void HuAudSeqPause(s32 arg0, s32 arg1, s32 arg2); +s32 HuAudSeqMidiCtrlGet(s32 arg0, s8 arg1, s8 arg2); +s32 HuAudSStreamPlay(s16 arg0); +void HuAudSStreamStop(s32 arg0); +void HuAudSStreamFadeOut(s32 arg0, s32 arg1); +void HuAudSStreamAllFadeOut(s32 arg0); +void HuAudSStreamAllStop(void); +s32 HuAudSStreamStatGet(s32 arg0); +void HuAudDllSndGrpSet(u16 ovl); +void HuAudSndGrpSetSet(s16 arg0); +void HuAudSndGrpSet(s16 arg0); +void HuAudSndCommonGrpSet(s16 arg0, s32 arg1); +void HuAudAUXSet(s32 arg0, s32 arg1); +void HuAudAUXVolSet(s8 arg0, s8 arg1); +void HuAudVoiceInit(s16 ovl); +s32 HuAudPlayerVoicePlay(s16 arg0, s16 arg1); +s32 HuAudPlayerVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); +void HuAudPlayerVoicePlayEntry(s16 arg0, s16 arg1); +s32 HuAudCharVoicePlay(s16 arg0, s16 arg1); +s32 HuAudCharVoicePlayPos(s16 arg0, s16 arg1, Vec *arg2); +void HuAudCharVoicePlayEntry(s16 arg0, s16 arg1); + +extern float Snd3DBackSurDisOffset; +extern float Snd3DFrontSurDisOffset; +extern float Snd3DStartDisOffset; +extern float Snd3DSpeedOffset; +extern float Snd3DDistOffset; +extern s32 musicOffF; +extern u8 fadeStat; + +extern HuSndGrpData HuSndGrpTbl[]; + +void GWInit(void); +void GWGameStatReset(void); +s32 GWMessSpeedGet(void); +s32 GWMessDelayGet(void); +void GWMGRecordSet(int index, s32 value); +s32 GWMGRecordGet(int index); +void GWCharColorGet(int character, GXColor *color); +void GWBoardPlayCountSet(int board, u8 value); +void GWBoardPlayCountAdd(int board, u8 value); +u8 GWBoardPlayCountGet(int board); +void GWBoardMaxStarsSet(int board, int value); +u16 GWBoardMaxStarsGet(int board); +void GWBoardMaxCoinsSet(int board, int value); +u16 GWBoardMaxCoinsGet(int board); +int GWBoardWinCountInc(int character, int board); +int GWBoardWinCountGet(int character, int board); +void GWBoardWinCountSet(int character, int board, int value); +int GWMGAvailGet(int id); +int GWMGAvailSet(int id); +int GWMGCustomGet(int id); +int GWMGCustomSet(int id); +int GWMGCustomReset(int id); +s16 GWCoinsGet(int player); +void GWCoinsSet(int player, s16 value); +void GWCoinsAdd(int player, s16 amount); +void GWStarsSet(int player, s16 value); +void GWStarsAdd(int player, s16 amount); +s32 GWStarsGet(int player); +void GWTotalStarsSet(s16 value); +void GWTotalStarsAdd(s16 amount); +u16 GWTotalStarsGet(void); diff --git a/src/REL/E3setupDLL/mgselect.c b/src/REL/E3setupDLL/mgselect.c index 73e333da..1c9213b4 100644 --- a/src/REL/E3setupDLL/mgselect.c +++ b/src/REL/E3setupDLL/mgselect.c @@ -405,7 +405,7 @@ static void CreateMGSelect(omObjData *object) var_r26++; } object->work[3] = 1; - object->func = &UpdateMGSelect; + object->func = UpdateMGSelect; } static void UpdateMGPic(omObjData *object) @@ -456,7 +456,7 @@ static void CreateMGPic(omObjData *object) index2++; object->work[1] = object->work[0]; HuSprAttrReset(temp_r3, object->work[1], 4); - object->func = &UpdateMGPic; + object->func = UpdateMGPic; } static void UpdateMGInterface(omObjData *object) { void *sp8 = object->data; } diff --git a/tools/permuter_settings.toml b/tools/permuter_settings.toml new file mode 100644 index 00000000..d0170ed0 --- /dev/null +++ b/tools/permuter_settings.toml @@ -0,0 +1,2 @@ +build_system = "ninja" +compiler_type = "mwcc"