From 6a30e7ceca5bb2e9693ee7b701b8df0c44a5aa7f Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sat, 29 Aug 2026 17:06:25 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20family-remap=20gate=20=E2=80=94?= =?UTF-8?q?=20+7=20fns=20x0=20propagated=20(fleet=2098.8%)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ov_SC02_037/ov_SC02_037.c | 164 +++++++++++++++++++++- src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c | 73 +++++++++- src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c | 82 ++++++++++- src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c | 20 ++- 4 files changed, 332 insertions(+), 7 deletions(-) diff --git a/src/ov_SC02_037/ov_SC02_037.c b/src/ov_SC02_037/ov_SC02_037.c index fa5f5beee..e5ae690df 100644 --- a/src/ov_SC02_037/ov_SC02_037.c +++ b/src/ov_SC02_037/ov_SC02_037.c @@ -1644,7 +1644,169 @@ DEFINE_func_8012E5CC() /* dedup: shared engine-core @0x8012e5cc (src/shared) */ DEFINE_func_8012E688() /* dedup: shared engine-core @0x8012e688 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_8012E778); +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_ldlv0(r0) __asm__ volatile ( \ + "lhu $13, 4( %0 );" \ + "lhu $12, 0( %0 );" \ + "sll $13, $13, 16;" \ + "or $12, $12, $13;" \ + "mtc2 $12, $0;" \ + "lwc2 $1, 8( %0 )" \ + : \ + : "r"( r0 ) \ + : "$12", "$13" ) +#define gte_rtps() __asm__ volatile ("nop;nop;rtps") +#define gte_stsxy(r0) __asm__ volatile ( \ + "swc2 $14, 0( %0 )" \ + : \ + : "r"( r0 ) \ + : "memory" ) +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_rtps() __asm__ volatile ("nop;nop;rtps") +#define gte_stsxy(r0) __asm__ volatile ( \ + "swc2 $14, 0( %0 )" \ + : \ + : "r"( r0 ) \ + : "memory" ) +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_rtps() __asm__ volatile ("nop;nop;rtps") +#define gte_stsxy(r0) __asm__ volatile ( \ + "swc2 $14, 0( %0 )" \ + : \ + : "r"( r0 ) \ + : "memory" ) +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) + + s32 func_8012E778(param_1, param_2) +int param_1; +int param_2; +{ + MATRIX_L48 *r0; + int iVarX; + int iVarY; + int iVar3; + int iVar4; + int sp[6]; + sp[0] = (int)*(short *)(param_1 + 6); + sp[1] = (int)*(short *)(param_1 + 10); + sp[2] = (int)*(short *)(param_1 + 0xe); + r0 = (MATRIX_L48 *)&D_800AF648; + gte_SetRotMatrix(r0); + gte_SetTransMatrix(r0); + gte_ldlv0((VECTOR *)sp); + gte_rtps(); + gte_stsxy((long *)((int)sp + 0x10)); + iVarX = (int)*(short *)((int)sp + 0x10); + iVar3 = (short)param_2; + if (iVarX >= 0) { + if (iVar3 >= iVarX) goto cy; + return 0; + } + if (iVar3 < -iVarX) return 0; + cy: + iVarY = (int)*(short *)((int)sp + 0x12); + iVar4 = param_2 >> 0x10; + if (iVarY >= 0) { + if (iVar4 >= iVarY) goto c1; + return 0; + } + if (iVar4 < -iVarY) return 0; + c1: + return 1; + } + DEFINE_func_8012E88C() /* dedup: shared engine-core @0x8012e88c (src/shared) */ diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c b/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c index 901fde574..69cb86bbf 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c @@ -2841,7 +2841,34 @@ DEFINE_func_8015B6F4() /* dedup: shared engine-core @0x8015b6f4 (src/shared) */ DEFINE_func_8015B7B4() /* dedup: shared engine-core @0x8015b7b4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8015A3C8", func_8015B858); + + +extern int func_8014A51C(int param_1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80154274(s32 *a0, s32 a1); + +s32 func_8015B858(u8 *a0) +{ + extern u8 D_800D4BE0[]; + extern s32 D_8011F730; + + if (*(u8 *)(a0 + 0x1C6) != 0) { + return 0; + } + if (*(s32 *)(a0 + 0x240) != 0) { + return 0; + } + if (((s32 (*)(void))func_8014A51C)() == 0) { + return 0; + } + *(s32 *)(a0 + 0x23C) = *(s32 *)(a0 + 0xB4); + *(u8 *)(a0 + 0x244) = *(u8 *)(a0 + 0xBC); + func_801477E8((s32 *)a0, 0xFFF20000); + func_80154274((s32 *)a0, (s32)D_800D4BE0); + D_8011F730 |= 2; + return 1; +} + DEFINE_func_8015B8F8() /* dedup: shared engine-core @0x8015b8f8 (src/shared) */ @@ -5447,7 +5474,49 @@ void func_801610FC(void) { DEFINE_func_80161104() /* dedup: shared engine-core @0x80161104 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8015A3C8", func_80161124); + + +extern void func_801483E8(unsigned char *self); +extern void func_8014CBF8(void *a0); +extern void func_801474EC(s32 *a0); +extern void func_80154150(s32 a0, s32 a1); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_80146E90(s32 *a0, s32 a1); +extern s32 func_80149184(s32 a0); +extern void func_801553A8(s32 *a0); +extern s32 func_801725A4(u8 *a0); +extern s32 func_80161A60(s32 a0); +extern void func_80147324(s32 a0); + +void func_80161124(void *a0) +{ + extern s16 D_801152A0; + u8 *self = (u8 *)a0; + + *(s16 *)(self + 0x24A) = 0; + ((void (*)(void))func_801483E8)(); + func_8014CBF8(a0); + func_801474EC((s32 *)a0); + if (*(s32 *)(self + 0x2C) < (s32)0xFFF46000) { + *(s32 *)(self + 0x2C) = 0xFFF46000; + } + if ((*(s32 *)(self + 0x24) | *(s32 *)(self + 0x2C)) != 0) { + func_80154150((s32)self, 0xF); + } else { + func_80154150((s32)self, 0xD); + } + func_80154A74((s32)self, 0x22); + *(s32 *)(self + 0x5C) = 0; + *(s32 *)(self + 0x240) = 0; + func_80146E90((s32 *)self, 4); + D_801152A0 = func_80149184((s32)self); + func_801553A8((s32 *)self); + func_801725A4((u8 *)self); + if (func_80161A60((s32)self) != 0) { + func_80147324(0x8E1); + } +} + extern s32 func_801612B8(void *a0, s32 a1); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c b/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c index 10657f50b..e31a72ca0 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c @@ -4151,9 +4151,67 @@ INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8016AE5C", func_8016D68 DEFINE_func_8016D778() /* dedup: shared engine-core @0x8016d778 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8016AE5C", func_8016D848); -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8016AE5C", func_8016D984); + +extern void func_80146C3C(u8*); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_800D20C0(); +void func_8016D848(s32 *a0) { + s16 sp20[4]; + s16 sp28[4]; + s32 s2; + s32 cnt; + s16 i; + s32 p; + cnt = *(s32 *)((s32)a0 + 0x1C) - 1; + *(s32 *)((s32)a0 + 0x1C) = cnt; + if (cnt == 0) { + ((void (*)(void))func_80146C3C)(); + return; + } + if (cnt < 4) { + s2 = -0xC00; + } else { + s2 = 0x800; + i = 0; + do { + func_80146A6C(0x33, a0, 0, 0, 0, 0x8000, 0); + i = i + 1; + } while (i < 5); + } + p = *(s32 *)((s32)a0 + 0x20); + if ((s2 << 16) == 0) { + *(s16 *)(p + 0x18) = *(u16 *)(p + 0x18) ^ 0x400; + *(s16 *)(p + 0x1A) = *(u16 *)(p + 0x1A) ^ 0x200; + } else { + *(s16 *)(p + 0x18) = *(u16 *)(p + 0x18) + s2; + *(s16 *)(p + 0x1A) = *(u16 *)(p + 0x1A) + s2; + } + sp20[0] = *(u16 *)((s32)a0 + 0x12); + sp20[1] = *(u16 *)((s32)a0 + 0x16); + sp20[2] = *(u16 *)((s32)a0 + 0x1A); + func_800D20C0((s32)sp20, (s32)sp28, 0x6); + *(s16 *)((s32)a0 + 0x6) = sp20[0]; + *(s16 *)((s32)a0 + 0xA) = sp20[1]; + *(s16 *)((s32)a0 + 0xE) = sp20[2]; +} + + + + +extern void func_80146C3C(u8*); +extern void func_800D22E4(s32 a0); +void func_8016D984(s32 *a0) { + if ((--*(s32 *)((char *)a0 + 0x1C)) == 0) { + ((void (*)(void))func_80146C3C)(); + } else { + func_800D22E4((s32)a0); + *(s32 *)((char *)a0 + 0x10) -= *(s32 *)((char *)a0 + 0x10) >> 4; + *(s32 *)((char *)a0 + 0x14) -= *(s32 *)((char *)a0 + 0x14) >> 4; + *(s32 *)((char *)a0 + 0x18) -= *(s32 *)((char *)a0 + 0x18) >> 4; + } +} + DEFINE_func_8016DA04() /* dedup: shared engine-core @0x8016da04 (src/shared) */ @@ -4488,7 +4546,25 @@ DEFINE_func_8016E688() /* dedup: shared engine-core @0x8016e688 (src/shared) */ DEFINE_func_8016E6E4() /* dedup: shared engine-core @0x8016e6e4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8016AE5C", func_8016E728); + + +extern void func_80146C3C(u8*); +extern void func_8016E778(); + +void func_8016E728(u8 *a0) { + s32 v0; + s32 v1; + v0 = (u16)*(u16 *)(a0 + 0x12) + 0x400; + v1 = (u16)*(u16 *)(a0 + 0x16) - 8; + *(u16 *)(a0 + 0x12) = v0; + *(u16 *)(a0 + 0x16) = v1; + if ((s16)v1 <= 0) { + ((void (*)(void))func_80146C3C)(); + } else { + ((void (*)(void))func_8016E778)(); + } +} + DEFINE_func_8016E778() /* dedup: shared engine-core @0x8016e778 (src/shared) */ diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c b/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c index 9dffdd241..f94cce44f 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8017AE2C.c @@ -5202,7 +5202,25 @@ typedef struct { DEFINE_func_8017D4B4() /* dedup: shared engine-core @0x8017D4B4 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8017AE2C", func_8017D588); +extern void func_8017D030(int); +extern void func_80146C3C(u8*); +void func_8017D588(void *a0) +{ + void *obj; + s16 v; + v = *(u16 *)((s32)a0 + 0x12) - 0x100; + obj = *(void **)((s32)a0 + 0x34); + *(s16 *)((s32)a0 + 0x12) = v; + if (v > 0) { + ((void (*)(void *))func_8017D030)(a0); + } else { + *(s16 *)((s32)obj + 0x64) = 0x1000; + *(s16 *)((s32)obj + 0x62) = 0x1000; + *(s16 *)((s32)obj + 0x60) = 0x1000; + ((void (*)(void))func_80146C3C)(); + } +} +