feat(phase-29 wave2/fable): bank x1 — 8014FFDC (wave2, x276) + 8012956C (fable sched1/loop crack)

8014FFDC clean; 8012956C reconcile: uniquified Blk16/Ent local typedefs, func_801299C8 4-arg
fn-ptr cast, reverted a reconcile over-cast (&(u8*)& invalid lvalue on already-canonical D_800B9A78).
This commit is contained in:
Drew T
2026-07-18 11:39:11 -06:00
parent 5a059d6219
commit 7f61d347b5
2 changed files with 177 additions and 2 deletions
+135 -1
View File
@@ -522,7 +522,141 @@ DEFINE_func_8012943C() /* dedup: shared engine-core @0x8012943C (src/shared) */
DEFINE_func_8012944C() /* dedup: shared engine-core @0x8012944C (src/shared) */
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_a", func_8012956C);
#include "common.h"
typedef struct { s32 a, b, c, d; } Blk16_956C;
typedef struct {
u8 pad0[0x1C];
s16 f1C;
s16 f1E;
u8 pad20[0x14];
u16 f34;
u16 f36;
u16 f38;
u16 f3A;
u8 pad3C[2];
s16 f3E;
u16 f40;
u16 f42;
u8 pad44[0x10];
} Ent_956C;
extern s32 D_801D9484;
extern void func_801299C8();
extern void func_80015B6C(s32, s16, s32, s16, s32, s32, s32, s32, s32, s32);
extern void GsSortBg(s32 *, void *, u16, s32 *);
extern void GsSortFastBg(s32 *, void *, u16, s32 *);
void func_8012956C(void) {
extern s16 D_80114EE0;
extern u8 D_800B9A78;
extern u8 D_801D9485[];
extern u8 D_801D9486[];
extern u8 D_801D9488[];
extern u8 D_801D9489[];
extern u8 D_801D948A[];
extern u8 D_801DAAA0;
extern u8 D_800AF630[];
extern u8 D_800A6518[];
register s32 *sp10 __asm__("$21");
register u8 *afbase __asm__("$22");
register s32 *sp0 __asm__("$23");
Ent_956C *base;
s32 i;
s16 a1;
register u32 temp_a3 __asm__("$7");
register u32 arg0 __asm__("$4");
register u32 s __asm__("$2");
register u32 s2 __asm__("$3");
register u32 t6 __asm__("$8");
s32 code;
sp10 = (s32 *)0x1F800010;
sp0 = (s32 *)0x1F800000;
afbase = (u8 *)&D_800AF630;
if (D_80114EE0 == 0) {
return;
}
base = (Ent_956C *)&D_800B9A78;
__asm__("" : "=r"(base) : "0"(base));
i = 0;
do {
s32 idx = i * 8 + 4;
code = base->f34;
if (code == 0x7FFE) {
goto case_7FFE;
}
if (code < 0x7FFF) {
a1 = i + 3;
if (code == 0x7FFD) {
goto case_7FFD;
}
goto do_default;
}
a1 = i + 3;
if (code != 0x7FFF) {
goto do_default;
}
goto next;
case_7FFD:
if (i == 0) {
func_801299C8(D_801DAAA0, 1, base);
}
func_80015B6C(-0xA0, -0x74, 0x140, 0x8C,
D_801D9488[0], D_801D9488[1], D_801D9488[2],
D_801D9488[4], D_801D9488[5], D_801D9488[6]);
func_80015B6C(-0xA0, 0x18, 0x140, 0x3C,
D_801D9488[4], D_801D9488[5], D_801D9488[6],
D_801D9488[8], D_801D9488[9], D_801D9488[0xA]);
func_80015B6C(-0xA0, 0x54, 0x140, 0x28,
D_801D9488[8], D_801D9488[9], D_801D9488[0xA],
D_801D9488[0xC], D_801D9488[0xD], D_801D9488[0xE]);
goto next;
case_7FFE:
func_801299C8(D_801DAAA0, (s16)(i * 2), base);
func_80015B6C(-0xA0, *(s16 *)&base->f3A, 0x140, base->f3E,
((u8 *)&D_801D9484)[idx], D_801D9485[idx], D_801D9486[idx],
D_801D9488[idx], D_801D9489[idx], D_801D948A[idx]);
goto next;
do_default:
__asm__("");
arg0 = D_801DAAA0;
s = base->f40;
temp_a3 = base->f38;
s += temp_a3;
base->f1C = s;
s2 = base->f42;
t6 = base->f3A;
s2 += t6;
base->f1E = s2;
((void (*)(s32, s32, void *, s32))func_801299C8)(arg0, a1, base, temp_a3);
*(Blk16_956C *)sp0 = *(Blk16_956C *)base;
{
s32 *dst = sp10;
s32 *src = (s32 *)((u8 *)base + 0x10);
s32 *end = (s32 *)((u8 *)base + 0x30);
do {
*(Blk16_956C *)dst = *(Blk16_956C *)src;
src += 4;
dst += 4;
} while (src != end);
*dst = *src;
sp10[5] = (s32)sp0;
if (base->f36 == 0) {
GsSortFastBg(sp10, &D_800A6518[(*(u16 *)(afbase + 0xA3D2)) * 0x14], base->f34, dst);
} else {
GsSortBg(sp10, &D_800A6518[(*(u16 *)(afbase + 0xA3D2)) * 0x14], base->f34, dst);
}
}
next:
base += 1;
i += 1;
} while (i < 2);
}
DEFINE_func_801298F4() /* dedup: shared engine-core @0x801298F4 (src/shared) */
+42 -1
View File
@@ -2259,7 +2259,48 @@ s32 func_8014FE60(void *e) {
return 0;
}
INCLUDE_ASM("asm/ov_SC01_077/nonmatchings/ov_SC01_077_after", func_8014FFDC);
#include "common.h"
extern s32 func_80135D20(s32 a0, s32 a1, void *a2);
typedef struct { s16 unk0, unk2, unk4, unk6; } Vec8;
s32 func_8014FFDC(s32 e, void *a1, void *a2) {
extern u8 D_801202A0[];
extern u8 D_80126720[];
extern u8 D_801152A8[];
Vec8 save;
Vec8 test;
s32 found;
u8 *p;
found = 0;
__builtin_memcpy(&save, a1, 8);
*(s16 *)((s32)a1 + 2) = 0x7fff;
p = D_801202A0;
if (p < p + 0x6480) {
do {
if (*(u16 *)p != 0) {
if ((*(u16 *)(p + 0x5C) & 0x400) != 0) {
if (*(s32 *)(p + 0x58) != 0) {
test = save;
if (func_80135D20(*(s32 *)(p + 0x20), *(s32 *)(p + 0x58), &test) != 0) {
found = 1;
if (test.unk2 < *(s16 *)((s32)a1 + 2)) {
__builtin_memcpy(a1, &test, 8);
__builtin_memcpy(a2, D_801152A8, 8);
}
}
}
}
}
p += 0x10C;
} while (p < D_80126720);
}
return found;
}
DEFINE_func_80150150() /* dedup: shared engine-core @0x80150150 (src/shared) */