feat(decomp): family-remap gate — +7 fns x0 propagated (fleet 98.8%)

This commit is contained in:
Drew T
2026-08-29 17:06:25 -06:00
parent 3a706d999e
commit 6a30e7ceca
4 changed files with 332 additions and 7 deletions
+163 -1
View File
@@ -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) */
+71 -2
View File
@@ -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);
+79 -3
View File
@@ -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) */
+19 -1
View File
@@ -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)();
}
}