From 164cc637701815af45a54a6e6a616aa4b37525f4 Mon Sep 17 00:00:00 2001 From: Diamond Lewis Date: Sat, 10 Jan 2026 04:49:18 -0600 Subject: [PATCH] Match 17300 --- src/17300.c | 100 ++++++++++++---------- src/3FB0.c | 2 +- src/C970.c | 212 ++++++++++++++++++++++++++++++++++++++++++++++ src/C970.h | 2 +- src/memmap.c | 8 ++ src/memmap.h | 10 --- src/unk_bss.c | 2 +- yamls/us/rom.yaml | 3 +- 8 files changed, 278 insertions(+), 61 deletions(-) diff --git a/src/17300.c b/src/17300.c index 54ca7de..235f31e 100644 --- a/src/17300.c +++ b/src/17300.c @@ -3,6 +3,11 @@ #include "src/F420.h" #include "src/18140.h" +typedef struct unk_func_80016B30_arg0 { + /* 0x00 */ Vec3s vec; + /* 0x06 */ s16 unk_06; +} unk_func_80016B30_arg0; // size = 0x8 + static unk_D_800ABCC0 D_800ABCC0[2]; static s32 D_800ABCF0; @@ -74,23 +79,11 @@ f32 func_80016848(unk_D_800ABCC0* arg0, s32 arg1) { return var_fv1; } -#ifdef NON_MATCHING f32 func_80016934(Vec3s* arg0, s16 arg1, s16 arg2) { + f32 y; s32 i; - f32 sp4; - Vec3s* temp_a1; - Vec3s* temp_v0; - Vec3s* var_a1; - f32 temp_fa0; - f32 temp_fa1; - f32 temp_ft3; - f32 temp_ft4; - f32 temp_ft5; - f32 temp_fv0; + f32 x; f32 var_fv1; - s16 temp_v1_2; - s32 temp_v1; - s32 var_v0; if (arg0->x >= arg2) { var_fv1 = arg0->y; @@ -104,28 +97,47 @@ f32 func_80016934(Vec3s* arg0, s16 arg1, s16 arg2) { } } - temp_fv0 = (arg2 - arg0[i].x) / 30.0f; - temp_fa0 = 30.0f / (arg0[i + 1].x - arg0[i].x); - temp_ft4 = CB(temp_fv0) * SQ(temp_fa0); - temp_ft5 = 2.0f * SQ(temp_fv0); - temp_ft3 = 3.0f * SQ(temp_fv0) * SQ(temp_fa0); + x = (arg2 - arg0[i].x) / 30.0f; + y = 30.0f / (arg0[i + 1].x - arg0[i].x); - var_fv1 = (arg0[i + 1].z * (temp_ft4 - (SQ(temp_fv0) * temp_fa0))) + - ((arg0[i].y * (((temp_ft5 * temp_fv0 * CB(temp_fa0)) - temp_ft3) + 1.0f)) + - (arg0[i + 1].y * ((-2.0f * CB(temp_fv0) * CB(temp_fa0)) + temp_ft3)) + - (arg0[i].z * ((temp_ft4 - (temp_ft5 * temp_fa0)) + temp_fv0))); + var_fv1 = (arg0[i].y * (((2.0f * x * x * x * y * y * y) - 3.0f * x * x * y * y) + 1.0f)) + + (arg0[i + 1].y * ((-2.0f * x * x * x * y * y * y) + 3.0f * x * x * y * y)) + + (arg0[i].z * ((x * x * x * y * y - (2.0f * x * x * y)) + x)) + + (arg0[i + 1].z * (x * x * x * y * y - (x * x * y))); } } return var_fv1; } -#else -f32 func_80016934(Vec3s* arg0, s16 arg1, s16 arg2); -#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016934.s") -#endif -#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016B30.s") +f32 func_80016B30(unk_func_80016B30_arg0* arg0, s16 arg1, s16 arg2) { + f32 y; + s32 i; + f32 x; + f32 var_fv1; -f32 func_80016B30(Vec3s*, s16, s16); + if (arg0->vec.x >= arg2) { + var_fv1 = arg0->vec.y; + } else { + if (arg2 >= arg0[arg1 - 1].vec.x) { + var_fv1 = arg0[arg1 - 1].vec.y; + } else { + for (i = 0; i < arg1 - 2; i++) { + if (arg2 < arg0[i + 1].vec.x) { + break; + } + } + + x = (arg2 - arg0[i].vec.x) / 30.0f; + y = 30.0f / (arg0[i + 1].vec.x - arg0[i].vec.x); + + var_fv1 = (arg0[i].vec.y * (((2.0f * x * x * x * y * y * y) - 3.0f * x * x * y * y) + 1.0f)) + + (arg0[i + 1].vec.y * ((-2.0f * x * x * x * y * y * y) + 3.0f * x * x * y * y)) + + (arg0[i].unk_06 * ((x * x * x * y * y - (2.0f * x * x * y)) + x)) + + (arg0[i + 1].vec.z * (x * x * x * y * y - (x * x * y))); + } + } + return var_fv1; +} f32 func_80016D20(unk_D_800ABCC0* arg0, s32 arg1) { f32 var_fv1; @@ -173,7 +185,7 @@ s16 func_80016DE0(unk_D_800ABCC0* arg0, s32 arg1) { } f32 func_80016F20(unk_D_800ABCC0* arg0, s32 arg1) { - Vec3s* temp_a0; + s16* temp_a0; f32 var_fv0; f32 var_fv1; unk_D_800ABCC0_008* temp_v0 = &arg0->unk_08[arg1]; @@ -192,36 +204,34 @@ f32 func_80016F20(unk_D_800ABCC0* arg0, s32 arg1) { return var_fv1; } -typedef union arg1_func_80010CA8_test { +typedef union unk_D_86002F58_004_000_040_raw_08 { struct { s16 unk_00; s16 unk_02; }; s32 raw; -} arg1_func_80010CA8_test; // size = 0x4 +} unk_D_86002F58_004_000_040_raw_08; // size = 0x4 -typedef struct unk_D_86002F58_004_000_040_test { +typedef struct unk_D_86002F58_004_000_040_raw { /* 0x00 */ s16 unk_00; /* 0x04 */ unk_D_86002F58_004_000_040_004* unk_04; - /* 0x08 */ arg1_func_80010CA8_test unk_08; + /* 0x08 */ unk_D_86002F58_004_000_040_raw_08 unk_08; /* 0x0C */ s32 unk_0C; /* 0x10 */ char unk10[0x2]; /* 0x12 */ u16 unk_12; -} unk_D_86002F58_004_000_040_test; // size >= 0x14 +} unk_D_86002F58_004_000_040_raw; // size >= 0x14 -#ifdef NON_MATCHING -s32 func_80016FBC(unk_D_86002F58_004_000_040_test* arg0, u16 arg1) { - arg1_func_80010CA8_test spC; - arg1_func_80010CA8_test* ptr; +s32 func_80016FBC(unk_D_86002F58_004_000_040_raw* arg0, u16 arg1) { + unk_D_86002F58_004_000_040_raw_08 spC; + unk_D_86002F58_004_000_040_raw_08* ptr; unk_D_86002F58_004_000_040_004* temp_v0; - spC = arg0->unk_08; + ptr = &spC; temp_v0 = arg0->unk_04; - - if (arg1 != arg0->unk_12) { + spC.raw = arg0->unk_08.raw; + if (arg0->unk_12 != arg1) { spC.raw += arg0->unk_0C; if (arg0->unk_0C >= 0) { - ptr = &spC; if (ptr->unk_00 >= temp_v0->unk_0A) { if (temp_v0->unk_00 & 2) { ptr->unk_00 = temp_v0->unk_0A - 1; @@ -230,7 +240,6 @@ s32 func_80016FBC(unk_D_86002F58_004_000_040_test* arg0, u16 arg1) { } } } else { - ptr = &spC; if (ptr->unk_00 < temp_v0->unk_06) { if (temp_v0->unk_00 & 2) { ptr->unk_00 = temp_v0->unk_06; @@ -243,9 +252,6 @@ s32 func_80016FBC(unk_D_86002F58_004_000_040_test* arg0, u16 arg1) { return spC.raw; } -#else -#pragma GLOBAL_ASM("asm/us/nonmatchings/17300/func_80016FBC.s") -#endif void func_80017080(void) { D_800ABCF0 = -1; diff --git a/src/3FB0.c b/src/3FB0.c index bce53a3..80b1041 100644 --- a/src/3FB0.c +++ b/src/3FB0.c @@ -144,7 +144,7 @@ s32 func_80003680(u32 addr, s32 arg1, u8* arg2) { unk_func_80003680_sp300 sp300; u8 sp200[2][0x80]; unk_func_80003680_spB0 spB0[4]; - u8* temp_s0; + u16* temp_s0; u8* temp_s3; unk_func_80003680_sp90 sp90; unk_func_80003680_sp27 sp74; diff --git a/src/C970.c b/src/C970.c index a0c299c..9284a98 100644 --- a/src/C970.c +++ b/src/C970.c @@ -1,17 +1,229 @@ #include "C970.h" +typedef struct unk_func_8000C104_arg1 { + /* 0x000 */ u8 value; + /* 0x001 */ u8 pad01[0x0F]; + /* 0x010 */ u16 unk_10; + /* 0x012 */ u8 pad12[0xEE]; + /* 0x100 */ u16 unk_100; +} unk_func_8000C104_arg1; // size >= 0x102 + +#ifdef NON_MATCHING +void func_8000BD70(u8* in_quantization_tables, u8* out_quantization_tables, s32 num_tables) { + u8* src; + u8* dst; + s32 i; + s32 j; + s32 count; + + src = in_quantization_tables; + count = num_tables & 0xFF; + + for (i = 0; i < count; i++) { + src++; + + for (j = 0; j < 0x40; j++) { + dst = out_quantization_tables + (i << 7) + (j * 2); + *(s16*)dst = (s16)*src; + src++; + } + } +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BD70.s") +#endif +#ifdef NON_MATCHING +s16 func_8000BDD8(u8* arg0, u16* arg1) { + s16 var_a2; + s16 var_v1; + s8 i; + s8 var_v0; + u8* temp_a1; + + var_v0 = 1; + var_v1 = 0; + var_a2 = 1; + for (i = 1; i < 0x11; i = (var_v0 + 1) & 0xFF) { + temp_a1 = &arg0[i]; + if ((s32) temp_a1[-1] > 0) { + do { + arg1[var_v1] = var_v0; + var_a2 += 1; + var_v1 += 1; + } while ((s32) temp_a1[-1] >= var_a2); + var_a2 = 1; + } + var_v0 = i; + } + arg1[var_v1] = 0; + return var_v1; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BDD8.s") +#endif +#ifdef NON_MATCHING +s16 func_8000BE5C(u8* arg0, u16* arg1) { + s16 var_v0; + s16 var_v1; + s32 temp_t6; + u8 temp_t0; + u8 var_a2; + u8 var_a3; + + var_a2 = *arg0; + var_v1 = 0; + var_v0 = 0; + var_a3 = var_a2; + + while(1) { + temp_t6 = var_v1 * 2; + var_v1 += 1; + arg1[temp_t6] = var_v0; + temp_t0 = arg0[var_v1]; + var_v0 = (var_v0 + 1) & 0xFFFF; + if (var_a3 == temp_t0) { + continue; + } + if (temp_t0 != 0) { + do { + var_a3 = (var_a2 + 1) & 0xFF; + var_v0 = (var_v0 * 2) & 0xFFFF; + var_a2 = var_a3; + } while (temp_t0 != var_a3); + continue; + } + break; + } + return var_v1; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BE5C.s") +#endif +#ifdef NON_MATCHING +s8 func_8000BEC8(u8* arg0, unk_func_80003680_spB0* arg1, u16* arg2) { + s32 i; + s32 temp_t4; + s8 var_v1; + + var_v1 = 0; + for (i = 0; i < 16; i = (i + 1) & 0xFF) { + if (arg0[i] != 0) { + arg1->unk_00[i] = var_v1; + arg1->unk_10[i] = arg2[var_v1]; + temp_t4 = ((var_v1 + arg0[i]) - 1) & 0xFFFF; + var_v1 = (temp_t4 + 1); + arg1->unk_30[i] = arg2[temp_t4]; + } else { + arg1->unk_30[i] = 0xFFFF; + } + } + return var_v1; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BEC8.s") +#endif +#ifdef NON_MATCHING +s16 func_8000BF70(u8* arg0, unk_func_80003680_spB0* arg1, u8* arg2, u16* arg3, u8 arg4) { + s16 temp_v0; + + temp_v0 = func_8000BDD8(arg2, arg3); + if ((temp_v0 == 0) || ((arg4 != 0) && (temp_v0 >= 0x101)) || ((arg4 == 0) && (temp_v0 >= 0x11))) { + return 0; + } + if (func_8000BE5C(arg2, arg3) != temp_v0) { + return 0; + } + if (temp_v0 != func_8000BEC8(arg0, arg1, arg3)) { + return 0; + } + return temp_v0; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000BF70.s") +#endif +#ifdef NON_MATCHING +s32 func_8000C02C(u8* arg0, unk_func_80003680_spB0* arg1, u8* arg2, u16* arg3, s32 arg4) { + s32 temp_at; + s32 temp_lo; + s32 temp_t8; + s32 temp_v0; + s32 var_s1; + u8* var_s0; + u8* temp_s0; + u8* temp_s0_2; + + var_s0 = arg0; + var_s1 = 0; + if ((s32) arg4 > 0) { + while(1) { + temp_lo = var_s1 * 0x54; + temp_s0 = var_s0 + 1; + temp_v0 = func_8000BF70(temp_s0, &arg1[temp_lo], arg2, arg3, (s32) *var_s0 >> 4); + temp_s0_2 = temp_s0 + 0x10; + if (temp_v0 == 0) { + return 1; + } + temp_t8 = (var_s1 + 1) & 0xFF; + temp_at = temp_t8 < (s32) arg4; + arg1[temp_lo].unk_50 = temp_s0_2; + var_s1 = temp_t8; + var_s0 = temp_s0_2 + temp_v0; + if (temp_at == 0) { + return 0; + } + } + } + return 0; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C02C.s") +#endif +#ifdef NON_MATCHING +void func_8000C104(u8* arg0, unk_func_8000C104_arg1* arg1, u8* arg2, u16* arg3, s16 arg4, u8 arg5) { + s16 i; + u8 temp_v1; + + for (i = 0; i < arg4; i++) { + temp_v1 = arg0[i]; + if (arg5 != 0) { + arg1[temp_v1 * 2].unk_100 = arg3[i]; + arg1[temp_v1].value = arg2[i]; + } else { + arg1[temp_v1 * 2].unk_10 = arg3[i]; + arg1[temp_v1].value = arg2[i]; + } + } +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C104.s") +#endif +#ifdef NON_MATCHING +s32 func_8000C1AC(u8* arg0, unk_func_8000C104_arg1* arg1, u8* arg2, u16* arg3) { + u8 sp2F; + s16 sp2C; + s16 temp_v0; + u8* temp_s0; + + temp_s0 = arg0 + 1; + sp2F = (u8) ((s32) *arg0 >> 4); + temp_v0 = func_8000BDD8(temp_s0, arg2); + if ((temp_v0 == 0) || ((sp2F != 0) && (temp_v0 >= 0x101)) || ((sp2F == 0) && (temp_v0 >= 0x11))) { + return 1; + } + sp2C = temp_v0; + if (func_8000BE5C(arg2, arg3) != temp_v0) { + return 1; + } + func_8000C104((u8*)temp_s0 + 0x10, arg1, arg2, arg3, temp_v0, sp2F); + return 0; +} +#else #pragma GLOBAL_ASM("asm/us/nonmatchings/C970/func_8000C1AC.s") +#endif diff --git a/src/C970.h b/src/C970.h index 235680e..24bfc0f 100644 --- a/src/C970.h +++ b/src/C970.h @@ -11,6 +11,6 @@ typedef struct unk_func_80003680_spB0 { } unk_func_80003680_spB0; // size = 0x54 void func_8000BD70(u8* in_quantization_tables, u8* out_quantization_tables, s32 num_tables); -void func_8000C02C(u8* in_huffman_table, unk_func_80003680_spB0*, u8*, u8*, s32); +s32 func_8000C02C(u8*, unk_func_80003680_spB0*, u8*, u16*, s32); #endif // _C970_H_ diff --git a/src/memmap.c b/src/memmap.c index b5c9a43..a46c369 100644 --- a/src/memmap.c +++ b/src/memmap.c @@ -1,6 +1,14 @@ #include "global.h" #include "memmap.h" +struct MemoryMap { + uintptr_t vaddr; + size_t size; +}; + +struct MemoryMap gSegments[16]; +struct MemoryMap gFragments[240]; + /* * Set the base virtual address and size of the specified segment memmap. */ diff --git a/src/memmap.h b/src/memmap.h index ef65927..4d056b9 100644 --- a/src/memmap.h +++ b/src/memmap.h @@ -7,16 +7,6 @@ #define RELOCATIONS_SIZE #endif -struct MemoryMap { - uintptr_t vaddr; - size_t size; -}; - -// these are probably .bss symbols in memmap.c, but until I have more -// of bss mapped, not 100% sure if they go in that file. TODO: Migrate -extern struct MemoryMap gSegments[16]; -extern struct MemoryMap gFragments[240]; - /* MIPS Relocation Types */ #define R_MIPS_32 2 #define R_MIPS_26 4 diff --git a/src/unk_bss.c b/src/unk_bss.c index 7163a40..64846b4 100644 --- a/src/unk_bss.c +++ b/src/unk_bss.c @@ -2,4 +2,4 @@ #include // used for padding. Splat cant auto gen these I guess -UNUSED static u8 unk_bss[0x800A6070 - 0x80083CA0]; +UNUSED static u8 unk_bss[0x800A5870 - 0x80083CA0]; diff --git a/yamls/us/rom.yaml b/yamls/us/rom.yaml index 77bc859..b107e9b 100644 --- a/yamls/us/rom.yaml +++ b/yamls/us/rom.yaml @@ -57,7 +57,7 @@ - [0xF420, c] # - [0x11BA0, c] # - [0x12D80, c] # - - [0x17300, c] # + - [0x17300, c, 17300] # - [0x18140, c] # dp model animations - [0x18480, c, geo_layout] # dp model animations - [0x19840, c] # alternative pkm textures @@ -493,6 +493,7 @@ - {vram: 0x8007F190, type: .bss, name: main} - {vram: 0x80081900, type: .bss, name: rsp} - {vram: 0x80083CA0, type: bss, name: unk_bss} + - {vram: 0x800A5870, type: .bss, name: memmap} - {vram: 0x800A6070, type: .bss, name: memory_main} - {vram: 0x800A60B0, type: bss, name: unk_bss_4} - {vram: 0x800A60C0, type: .bss, name: 3FB0}