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

This commit is contained in:
Drew T
2026-08-29 17:11:08 -06:00
parent d9f78e2550
commit 43ac008311
7 changed files with 484 additions and 20 deletions
+2 -2
View File
@@ -1579,7 +1579,7 @@ ov_SC03_015_ELF := $(ov_SC03_015_OUT).elf
ov_SC03_015_MAPFILE := $(ov_SC03_015_OUT).map
ov_SC03_015_LD_SCRIPT := $(ov_SC03_015_OUT).ld
ov_SC03_015_SPLAT_YAML := config/splat.ov_SC03_015.yaml
ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_80135888.o,tail3.data.o,ov_SC03_015_jr_80135A4C.o,tail4.data.o,ov_SC03_015_jr_80135D20.o,tail5.data.o,ov_SC03_015_jr_801380E0.o,ov_SC03_015_o0e.o,tail6.data.o,ov_SC03_015_jr_8013F350.o,tail7.data.o,ov_SC03_015_jr_8013FFD8.o,tail8.data.o,ov_SC03_015_jr_80140608.o,tail9.data.o,ov_SC03_015_jr_8015444C.o,ov_SC03_015_jr_80154C24.o,ov_SC03_015_jr_801588CC.o,ov_SC03_015_jr_80159C84.o,tail10.data.o,ov_SC03_015_jr_8015A3C8.o,tail11.data.o,ov_SC03_015_jr_8015AE2C.o,tail12.data.o,ov_SC03_015_jr_8015C32C.o,tail13.data.o,ov_SC03_015_jr_8016AB6C.o,tail14.data.o,ov_SC03_015_jr_80171B4C.o,ov_SC03_015_jr_801734BC.o,tail15.data.o,ov_SC03_015_jr_801789AC.o,ov_SC03_015_jr_80178D40.o,tail16.data.o,ov_SC03_015_jr_8017A4AC.o,tail17.data.o,ov_SC03_015_jr_8017AE2C.o,tail18.data.o,ov_SC03_015_jr_8017EB7C.o,tail19.data.o,ov_SC03_015_jr_80184F14.o,ov_SC03_015_jr_80185B44.o,tail20.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
ov_SC03_015_JTBL_INTERLEAVE := --order tail.data.o,ov_SC03_015.o,ov_SC03_015_jr_8012ACE0.o,tail2.data.o,ov_SC03_015_jr_80135888.o,tail3.data.o,ov_SC03_015_jr_80135A4C.o,tail4.data.o,ov_SC03_015_jr_80135D20.o,tail5.data.o,ov_SC03_015_jr_801380E0.o,ov_SC03_015_o0e.o,tail6.data.o,ov_SC03_015_jr_8013F350.o,tail7.data.o,ov_SC03_015_jr_8013FFD8.o,tail8.data.o,ov_SC03_015_jr_80140608.o,tail9.data.o,ov_SC03_015_jr_8015444C.o,ov_SC03_015_jr_80154C24.o,ov_SC03_015_jr_801588CC.o,ov_SC03_015_jr_80159C84.o,tail10.data.o,ov_SC03_015_jr_8015A3C8.o,tail11.data.o,ov_SC03_015_jr_8015AE2C.o,tail12.data.o,ov_SC03_015_jr_8015C32C.o,tail13.data.o,ov_SC03_015_jr_8016AB6C.o,tail14.data.o,ov_SC03_015_jr_80171B4C.o,ov_SC03_015_jr_801734BC.o,tail15.data.o,ov_SC03_015_jr_801789AC.o,ov_SC03_015_jr_80178D40.o,tail16.data.o,ov_SC03_015_jr_8017A4AC.o,tail17.data.o,ov_SC03_015_jr_8017AE2C.o,ov_SC03_015_jr_8017EB7C.o,tail18.data.o,ov_SC03_015_jr_80184F14.o,ov_SC03_015_jr_80185B44.o,tail19.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve
build/src/ov_SC03_015/ov_SC03_015.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14
build/src/ov_SC03_015/ov_SC03_015_jr_8012ACE0.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0xcc,+0xe0
build/src/ov_SC03_015/ov_SC03_015_jr_80135D20.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x18
@@ -1592,7 +1592,7 @@ build/src/ov_SC03_015/ov_SC03_015_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (
build/src/ov_SC03_015/ov_SC03_015_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC03_015/ov_SC03_015_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20
build/src/ov_SC03_015/ov_SC03_015_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178
build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14
build/src/ov_SC03_015/ov_SC03_015_jr_8017AE2C.o: JTBL_PADS := 0,0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x2c
build/src/ov_SC03_015/ov_SC03_015_jr_80185B44.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20,+0x38
build/src/ov_SC03_015/ov_SC03_015_o0e.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118
ov_SC03_015_CHECK_SHA := config/check.ov_SC03_015.sha
+2 -3
View File
@@ -168,12 +168,11 @@ segments:
- [0xc10e0, .rodata, ov_SC03_015_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xc116c, data, tail17]
- [0xc1170, .rodata, ov_SC03_015_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xc1198, data, tail18]
- [0xc11b0, .rodata, ov_SC03_015_jr_8017EB7C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xc11d0, data, tail19]
- [0xc11d0, data, tail18]
- [0xc1308, .rodata, ov_SC03_015_jr_80184F14] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xc1338, .rodata, ov_SC03_015_jr_80185B44] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py)
- [0xc139c, data, tail20]
- [0xc139c, data, tail19]
- [0xC2EE4, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word)
- [0xC2EE7] # EOF marker = the 0.4.dec byte length
# @TRAILING@ (above) is replaced by tools/new_overlay.sh: for a non-4-aligned overlay it becomes
+85 -4
View File
@@ -3317,7 +3317,14 @@ DEFINE_func_8017BEAC() /* dedup: shared engine-core @0x8017BEAC (src/shared) */
DEFINE_func_8017BEB4() /* dedup: shared engine-core @0x8017BEB4 (src/shared) */
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017BEBC);
extern void func_80174684(void *);
extern void func_8017BEE4(void *);
void func_8017BEBC(void) {
func_80174684((void *)func_8017BEE4);
}
extern void (*D_8018EF58[])(void);
@@ -3337,7 +3344,22 @@ void func_8017BF20(void *a0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017BF58);
extern s32 func_80184794(void);
extern void func_80171A1C(u8 *a0);
extern s32 func_80174650(s32);
void func_8017BF58(void *a0) {
s32 v0;
v0 = func_80184794();
if (v0 != 0) {
func_80171A1C((u8 *)a0);
func_80174650((s32)a0);
}
}
DEFINE_func_8017BF98() /* dedup: shared engine-core @0x8017BF98 (src/shared) */
@@ -3370,7 +3392,21 @@ void func_8017C004(void *a0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017C03C);
extern s32 func_8018473C(void);
extern void func_80171A1C(u8 *a0);
extern s32 func_80174650(s32 a0);
void func_8017C03C(void *a0) {
s32 s0 = (s32)a0;
if (func_8018473C() == 0) {
return;
}
func_80171A1C((u8 *)s0);
func_80174650(s0);
}
DEFINE_func_8017C07C() /* dedup: shared engine-core @0x8017C07C (src/shared) */
@@ -4674,7 +4710,52 @@ DEFINE_func_8017DDBC() /* dedup: shared engine-core @0x8017DDBC (src/shared) */
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017DE24);
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017AE2C", func_8017DE8C);
extern s16 D_8011F9C8;
extern s16 D_80126B3A;
extern s32 func_80174650(s32);
extern void func_80029124(s32, s32);
extern void func_80029514(s32);
extern void func_80147060(u8 * a0);
extern void func_80147324(s32 arg0);
extern void func_80171A1C(u8 *a0);
void func_8017DE8C(a0)
u8 *a0;
{
u16 flags = *(u16 *)(a0 + 0xB8);
if (flags & 0x4000) {
func_80147324(0x445);
return;
}
if (!(flags & 0x8000)) {
return;
}
func_80147060(a0);
switch ((s16)(*(u16 *)&D_80126B3A - 2)) {
case 0:
func_80029124(0x16, 1);
func_80029514(0x85);
break;
case 1:
func_80029124(0x17, 1);
break;
case 2:
func_80029124(0x18, 1);
break;
case 3:
func_80029124(0x19, 1);
break;
case 4:
func_80029124(0x1A, 1);
break;
}
(*(s32 *)&D_8011F9C8) = 1;
func_80174650((s32)a0);
func_80171A1C(a0);
}
DEFINE_func_8017DF7C() /* dedup: shared engine-core @0x8017DF7C (src/shared) */
+19 -1
View File
@@ -3798,7 +3798,25 @@ void func_8018089C(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_8017EB7C", func_80180A68);
extern void func_80146CA0(void *a0);
extern s16 D_8018F544;
extern s16 D_8018F542;
extern s16 D_8018F540;
void func_80180A68(void) {
s16 sVar1;
sVar1 = *(u16 *)&D_8018F544 + 8;
D_8018F544 = sVar1;
D_8018F542 = sVar1;
D_8018F540 = sVar1;
if (sVar1 >= 0x101) {
((void (*)(void))func_80146CA0)();
}
}
extern s16 D_8018F540;
extern s16 D_8018F542;
+112 -1
View File
@@ -2750,7 +2750,118 @@ DEFINE_func_801848E4() /* dedup: shared engine-core @0x801848E4 (src/shared) */
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801848E4", func_80184920);
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_801848E4", func_80184A08);
extern s32 func_80029178(s32 arg);
extern s32 func_801789AC(s32 arg0);
extern s32 func_80178B18(s32 param_1, s32 param_2);
extern void func_80178D18(void);
extern s32 func_8014CB58(void);
extern s32 func_8014CB2C(void);
extern void func_8014B598(s32 a0, s32 a1);
extern s32 func_8016F1AC(void);
extern void func_80175454(void);
extern void func_800D0C48(s32 a0);
extern void func_8002D4C8(s32 a0, s32 a1);
extern void func_80184DA4(s32 param_1);
extern void func_80184DF8(s32 param_1);
extern void func_80029124(s32, s32);
extern void func_80175414(s32 _arg0); /* TU-canonical (ov_SC03_014_jr_801848E4.c L1954) */
extern u16 D_8018FE60;
extern u16 D_8018FE70;
extern M2C_UNK D_8018F4F8;
void func_80184A08(s32 a0) {
extern s32 func_8012BD14();
extern s32 func_801842E0();
extern void func_8002959C();
u16 t34;
if (func_8012BD14() < 0x401 || *(u16 *)(a0 + 0x34) == 1 || *(u16 *)(a0 + 0x34) == 2) {
switch (*(u16 *)(a0 + 0x34)) {
case 0:
if ((func_80029178(0x8B) & 0xFF) == 0) {
func_80178B18(a0, (s32)&D_8018FE60);
*(u16 *)(a0 + 0x34) = 2;
} else {
func_80178B18(a0, (s32)&D_8018FE70);
*(u16 *)(a0 + 0x34) = *(u16 *)(a0 + 0x34) + 1;
}
break;
case 1:
if (func_801789AC(a0) == 1) {
((void (*)(s32))func_80178D18)(a0);
*(u16 *)(a0 + 0x34) = 3;
}
break;
case 2:
if (func_801789AC(a0) == 1) {
((void (*)(s32))func_80178D18)(a0);
*(u16 *)(a0 + 0x34) = 4;
}
break;
case 3:
if ((func_80029178(0xB9) & 0xFF) == 0 && func_8014CB58() == 3) {
func_8014B598(3, (s32)&D_8018F4F8);
if (func_8016F1AC() != 0 && (*(u16 *)(a0 + 0x100) & 4) == 0) {
*(u16 *)(a0 + 0x100) |= 4;
*(s32 *)(a0 + 0x1C) = 0;
func_80175454();
}
if (*(u16 *)(a0 + 0x100) & 4) {
*(s32 *)(a0 + 0x1C) = *(s32 *)(a0 + 0x1C) + 1;
}
if ((*(u16 *)(a0 + 0x100) & 2) == 0 && *(s32 *)(a0 + 0x1C) == 0x5A) {
*(u16 *)(a0 + 0x100) |= 2;
func_800D0C48(0);
}
if ((*(u16 *)(a0 + 0x100) & 1) == 0 &&
(func_8014CB2C() & 0x8000007F) == 0x80000003) {
t34 = *(u16 *)(a0 + 0x34) + 1;
*(u16 *)(a0 + 0x100) |= 1;
*(u16 *)(a0 + 0x34) = t34;
func_8002D4C8(0xBD8, 0);
}
}
break;
}
if ((func_80029178(0x8B) & 0xFF) == 0) {
return;
}
/* §165-24: func_80184DF8(a0) is written out on all three paths — gcc cross-jumps the
common tail but leaves the three $a0 arg-setups, which then fill the three branch
delay slots (a single shared call puts the move in the jal's own slot instead). */
if (func_8014CB58() == 3) {
func_80184DA4(a0);
func_80184DF8(a0);
} else {
*(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88;
func_80184DF8(a0);
}
} else {
if ((func_80029178(0x8B) & 0xFF) == 0) {
return;
}
*(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88;
func_80184DF8(a0);
}
if (*(u16 *)(a0 + 0x100) & 1) {
if (func_801842E0() != 0) {
func_80029124(0xB9, 1);
*(u16 *)(a0 + 0x2) = 2;
*(u16 *)(a0 + 0x100) &= ~1;
*(u16 *)(a0 + 0x34) = 0;
*(u8 *)(*(s32 *)(a0 + 0xCC) + 0x27) = 0x88;
*(u8 *)(*(s32 *)(a0 + 0xD0) + 0x27) = 0x89;
func_8002959C();
/* the TU carries `extern void func_80175414(s32 _arg0);` at file scope,
but the .s calls it with an EMPTY delay slot => zero arguments; call
through a cast so the carried decl stays untouched (house style). */
((void (*)(void))func_80175414)();
}
}
}
extern s32 func_801847EC(void);
extern s32 func_8001AAA0(s32 arg);
+148 -3
View File
@@ -3044,7 +3044,55 @@ s32 func_8018558C(void *a0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_801855A0);
/* TU-canonical (src/ov_SC03_014/ov_SC03_014_jr_801848E4.c) */
extern s32 func_8012C354(s32 a0, s32 a1); /* L2928 */
extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); /* L2929 / L2524 */
extern void func_8012A828(s32 a0, void *a1); /* L2930 */
extern s32 func_80029504(void); /* L24 */
extern void func_8012C218(void *a0); /* L2712/3290 */
extern s32 func_801788B8(s32 arg0, s32 arg1); /* L2527 */
extern void func_8012B2CC(s32 a0); /* L2526 */
extern s32 func_801859B0(void *a0); /* L2902, defined earlier in this TU */
extern u8 D_8018B898[]; /* L3981, TU-canonical */
/* Not declared elsewhere in the TU; used only as a bare base address here. */
extern u8 D_8018FEAC[];
extern u8 D_8018FE9C[];
void func_801855A0(s32 a0) {
s32 v1;
if (func_8012C354(a0, (s32)D_8018FEAC) == 0) {
return;
}
if ((u32)func_80029504() >= 0x2C6) {
func_8012C218((void *)a0);
return;
}
*(s16 *)(a0 + 0x2) = 1;
func_8012A828(a0, D_8018B898);
v1 = *(s32 *)(a0 + 0x20);
*(u16 *)(v1 + 0x2C) |= 0x10;
*(u8 *)(a0 + 0x75) = 0;
if (*(s16 *)(a0 + 0x70) == 0) {
*(s32 *)(a0 + 0xD0) = func_801788B8(a0, (s32)func_801859B0);
*(s32 *)(a0 + 0xCC) = func_8012C658(0x241, 1, a0);
return;
}
*(s32 *)(a0 + 0x58) = (s32)D_8018FE9C | 0x40000000 | 0x20000000;
*(s16 *)(a0 + 0xA) -= 0xC0;
*(s16 *)(a0 + 0xE) += 0x80;
*(u32 *)(*(s32 *)(a0 + 0x20) + 4) |= 0x80000000;
func_8012B2CC(a0);
}
DEFINE_func_801856B4() /* dedup: shared engine-core @0x801856B4 (src/shared) */
@@ -3150,7 +3198,32 @@ void func_80185858(s32 arg0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_801858D4);
extern s32 func_80184028();
extern u16 D_80126B66;
extern void func_8002D4C8(s32 a0, s32 a1);
void func_801858D4(s32 a0) {
s32 v0 = *(s16 *)(a0 + 0x84);
if (v0 != 0) {
v0 = func_80184028();
if (v0 == 0x18) {
*(s16 *)(a0 + 0x84) = 0;
}
} else {
s32 a1;
v0 = func_80184028();
if (v0 == 0xF) {
*(s16 *)(a0 + 0x84) = 1;
a1 = -(s16)D_80126B66 >> 3;
if (a1 < 0) a1 = 0;
if (a1 > 0x7F) a1 = 0x7F;
func_8002D4C8(0xBAB, (u16)(a1 | 0x1000));
}
}
}
extern s32 func_80184868(s32 arg);
void func_8018597C(void *a0) {
@@ -3178,4 +3251,76 @@ s32 func_801859B0(void *a0)
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80184F14", func_80185A0C);
extern void func_8001C2C4(s32 a0);
extern void func_80049CAC(s32 a0, s32 a1); /* TU L2637 verbatim */
extern void func_8004914C(void *a0); /* TU L2638 verbatim */
extern void func_800491AC(void *a0); /* TU L2639 verbatim */
extern void RotTransSV(void *a0, void *a1, void *a2); /* TU L2640 verbatim */
extern void func_8012F14C(s32 a0, s32 a1, s32 a2); /* TU L323 verbatim */
extern SV4 D_80190470;
extern SV4 D_80190478;
extern SV4 D_801EAC70;
extern SV4 D_801EAC78;
typedef struct {
s16 m[3][3];
s16 pad;
s32 t[3];
} MtxLocal;
/* The target's stack frame (0xC8) is bigger than the visible locals below account
* for on their own: two byte-ranges (sp+0x28..0x44 and sp+0x64..0x98) never surface
* as a load/store in the target .s, yet the surrounding fields' absolute offsets
* prove the space is reserved. A struct's TOTAL size is BIGGEST_ALIGNMENT(8)-rounded
* as ONE unit (function.c assign_stack_local), but a MEMBER's offset inside that
* struct follows plain C layout rules (no forced 8-byte-per-member rounding) -- so
* folding v0 + the dead region + mtx + the second dead region into ONE aggregate
* local reproduces the exact absolute offsets with a single outer rounding, instead
* of each dead region getting its own independent 8-round (which cannot land on
* mtx's true 0x44 start -- 0x44-0x20=0x24, not a multiple of 8).
*/
typedef struct {
s16 a, b, c, d; /* sp+0x20 : func_80049CAC arg0 (SV4; only a,b,c written) */
u8 _gap1[28]; /* sp+0x28..0x44 : never referenced by an instruction */
MtxLocal mtx; /* sp+0x44 : MATRIX out, t[] at sp+0x58 */
u8 _gap2[52]; /* sp+0x64..0x98 : never referenced by an instruction */
} Frame1;
void func_80185A0C(s32 arg0)
{
s8 unused_buf[16]; /* sp+0x10 : func_8001C2C4 out, never re-read */
Frame1 f; /* sp+0x20 */
SV4 buf1; /* sp+0x98 : RotTransSV #1 out */
SV4 buf2; /* sp+0xA0 : RotTransSV #2 out */
SV4 buf3; /* sp+0xA8 : shared scratch a2 for both RotTransSV */
u8 *p;
func_8001C2C4((s32)&unused_buf[0]);
p = (u8 *)(*(s32 *)(*(s32 *)(arg0 + 0x20) + 0x20) & 0xFEFFFFFF);
p = p + 0x70;
__asm__("" : "=r"(p) : "0"(p));
f.a = *(u16 *)(p + 6);
f.b = p[1] | ((p[0] & 0xF) << 8);
f.c = p[2] | ((p[0] & 0xF0) << 4);
((void (*)(void *, void *))func_80049CAC)(&f, &f.mtx);
f.mtx.t[0] = *(s8 *)(p + 3);
f.mtx.t[1] = *(s8 *)(p + 4);
f.mtx.t[2] = *(s8 *)(p + 5);
func_8004914C(&f.mtx);
func_800491AC(&f.mtx);
RotTransSV(&D_80190470, &buf1, &buf3);
RotTransSV(&D_80190478, &buf2, &buf3);
func_8012F14C(*(s32 *)(arg0 + 0x20) + 0x34, (s32)&buf1, (s32)&D_801EAC70);
func_8012F14C(*(s32 *)(arg0 + 0x20) + 0x34, (s32)&buf2, (s32)&D_801EAC78);
}
+116 -6
View File
@@ -3713,7 +3713,29 @@ void func_80187884(s32 a0) {
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80187A98);
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80187CA8);
void func_80187CA8(s32 a0) {
extern void (*D_801906F8[])(void);
extern void (*D_80190700[])(void);
extern void (*D_80191848[])(void *);
extern s32 D_801EAC80;
extern void func_800599B8();
extern void func_8012B2CC(s32 a0);
extern void func_80185A0C(s32 a0);
s32 idx;
if ((*(s16 *)(a0 + 0x70) == 0) && (D_801EAC80 != 0)) {
idx = (*(u16 *)(a0 + 0x100) + 1) & 7;
*(u16 *)(a0 + 0x100) = idx;
func_800599B8(D_801906F8, D_80190700[idx]);
}
D_80191848[*(u16 *)(a0 + 2)](a0);
if ((*(s16 *)(a0 + 0x70) == 0) && (*(u16 *)(a0 + 2) != 0) && (*(u16 *)(a0 + 2) < 0xD)) {
func_8012B2CC(a0);
func_80185A0C(a0);
}
}
extern void (*D_80191890[])(void);
@@ -4250,7 +4272,16 @@ void func_80188F28(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80188F80);
void func_80188F80(void* arg0)
{
s32 *p = *(s32 **)((s32)arg0 + 0xcc);
*(u16 *)((s32)p + 0x8) = *(u16 *)((s32)arg0 + 0x6);
*(s16 *)((s32)p + 0xa) = *(u16 *)((s32)arg0 + 0xa) - 0xe4;
*(s16 *)((s32)p + 0xc) = *(u16 *)((s32)arg0 + 0xe) - 0x8;
}
@@ -4421,7 +4452,31 @@ DEFINE_func_801892DC() /* dedup: shared engine-core @0x801892DC (src/shared) */
DEFINE_func_801892E4() /* dedup: shared engine-core @0x801892E4 (src/shared) */
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189310);
extern void func_80188B94(void*);
extern int func_80178970(void);
void func_80189310(s32 *a0) {
if (*(u16 *)((s32)a0 + 0x34) == 0) {
func_8012AD80((s32)a0);
if (func_8012BEE8((s32)a0) != 0) {
*(u16 *)((s32)a0 + 0x100) = 0x80;
*(s32 *)((s32)a0 + 0x1C) = 0x30;
(*(u16 *)((s32)a0 + 0x34))++;
func_80188F18(a0);
}
} else {
if (func_8012BEE8((s32)a0) != 0) {
((void (*)(s32))func_80188B94)((s32)a0);
} else {
func_80188F28((s32)a0);
}
}
((int (*)(s32))func_80178970)((s32)a0);
func_8018B128();
}
extern int func_80178970(void);
extern s32 func_8012BEE8(s32 a0);
@@ -4618,7 +4673,31 @@ void func_801897C4(s32 param_1) {
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189824);
extern u8 D_801EAC94;
extern u8 D_801EAC95;
extern u8 D_801EAC96;
void func_80189824(void *arg0) {
s16 *p;
u8 *q;
p = *(s16 **)((s32)arg0 + 0x20);
if (*(s16 *)((s32)p + 0x18) > 0x800) {
*(s16 *)((s32)p + 0x18) = *(s16 *)((s32)p + 0x18) - 0x200;
}
if (*(s16 *)((s32)p + 0x1A) > 0x800) {
*(s16 *)((s32)p + 0x1A) = *(s16 *)((s32)p + 0x1A) - 0x200;
}
q = &D_801EAC94;
if (*q >= 0xC1) {
*q -= 4;
D_801EAC95 -= 8;
D_801EAC96 -= 8;
}
}
DEFINE_func_801898BC() /* dedup: shared engine-core @0x801898BC (src/shared) */
@@ -4679,7 +4758,25 @@ void func_801899F4(int param_1)
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_80189A60);
extern SV4 D_80191BEC;
extern s32 func_80029504(void);
extern s32 func_80029178(s32 arg);
extern void func_80029124(s32, s32);
extern s32 func_801899AC(void *a0, s32 *p);
void func_80189A60(void *a0) {
if (func_80029504() == 0x2DA) {
if ((func_80029178(0x11F) & 0xFF) == 0) {
func_80029124(0x11F, 1);
*(s32 *)((s32)a0 + 0xDC) = func_801899AC(a0, (s32 *)&D_80191BEC);
}
}
}
extern u8 D_80078EAF;
s32 func_80189AC4(s32 arg) {
@@ -5114,7 +5211,20 @@ s32 aF8018A224(param_1)
}
INCLUDE_ASM("asm/ov_SC03_015/nonmatchings/ov_SC03_015_jr_80185B44", func_8018A31C);
typedef struct { s16 x; u16 y; u16 z; s16 w; } Rec8_8018A31C;
void func_8018A31C(s32 a0) {
extern Rec8_8018A31C D_801E3990[];
s32 i = 0;
if (D_801E3990[0].x != 0) {
do {
func_8012C658(0x10D, i, a0);
i++;
} while (D_801E3990[i].x != 0);
}
}
/* func_8018A390 — allocates a GTE-projection slot, seeds a random spread