mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-28 06:49:47 -04:00
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:
@@ -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) */
|
||||
|
||||
@@ -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) */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user