From 9c2db69fc83b3336ba216ed9dcde65feb257b00f Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:07:48 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-26):=20h=5Fseq=20family=20sweep=20?= =?UTF-8?q?=E2=80=94=2026=20member-matches=20banked=20via=20remap=5Fhseq?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ov_MAIN_012/ov_MAIN_012.c | 9 +- src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c | 65 +++++++- src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c | 21 ++- src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c | 185 +++++++++++++++++++--- src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c | 121 +++++++++++++- src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c | 11 +- src/ov_SC02_037/ov_SC02_037.c | 28 +++- src/ov_SC02_037/ov_SC02_037_jr_80131340.c | 65 +++++++- src/ov_SC02_037/ov_SC02_037_jr_801380E0.c | 21 ++- src/ov_SC02_037/ov_SC02_037_jr_8013F350.c | 185 +++++++++++++++++++--- src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c | 117 +++++++++++++- src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c | 11 +- src/ov_SC03_107/ov_SC03_107.c | 9 +- src/ov_SC03_107/ov_SC03_107_jr_80131340.c | 65 +++++++- src/ov_SC03_107/ov_SC03_107_jr_801380E0.c | 21 ++- src/ov_SC03_107/ov_SC03_107_jr_8013F350.c | 185 +++++++++++++++++++--- src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c | 121 +++++++++++++- src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c | 11 +- src/ov_SC06_020/ov_SC06_020_jr_80180B04.c | 88 +++++++++- src/ov_SC06_022/ov_SC06_022_jr_80184A28.c | 88 +++++++++- src/ov_SC06_024/ov_SC06_024_jr_80186F00.c | 88 +++++++++- src/ov_SC06_033/ov_SC06_033_jr_80184CF8.c | 88 +++++++++- 22 files changed, 1496 insertions(+), 107 deletions(-) diff --git a/src/ov_MAIN_012/ov_MAIN_012.c b/src/ov_MAIN_012/ov_MAIN_012.c index 585048a2e5..e2e44ee2e3 100644 --- a/src/ov_MAIN_012/ov_MAIN_012.c +++ b/src/ov_MAIN_012/ov_MAIN_012.c @@ -2186,7 +2186,14 @@ DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130af0 (src/shared) */ DEFINE_func_80130C08() /* dedup: shared engine-core @0x80130c08 (src/shared) */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012", func_80130D0C); + + +void func_80130D0C(void *a0) { + + extern void (*D_8017E710[])(void); + D_8017E710[*(u8 *)((s32)a0 + 0xC1)](); +} + INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012", func_80130D48); diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c b/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c index caeab4d551..2196ed6f37 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_80131340.c @@ -2403,7 +2403,70 @@ block_14: DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134fb8 (src/shared) */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_80131340", func_80135004); + typedef struct { s8 c[8]; } Blk8_80135004; + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype aD8017E914_80135004 + aD8017E910_80135004 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + + extern s32 D_80184120; + extern int func_80134A74(int, s16, s16, int); + extern s16 * aD8017E914_80135004 __asm__("D_8017E914"); + extern s16 * aD8017E910_80135004 __asm__("D_8017E910"); + extern u8 D_8017E91C; + extern s16 *D_8017E918; + extern u16 D_80184130; + + register s16 *pb0 __asm__("$9"); /* aD8017E914_80135004 -> $t1 */ + register s16 *pac __asm__("$6"); /* aD8017E910_80135004 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_8017E91C -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = aD8017E914_80135004; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = aD8017E910_80135004; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_8017E91C); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_80184120; + __asm__ __volatile__("" ::: "memory"); + D_80184130 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_8017E918); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_80184130; + return 1; + } + { + register u16 *qb __asm__("$4"); /* aD8017E910_80135004 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* aD8017E914_80135004[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* aD8017E914_80135004 -> $a2 (reloaded) */ + qb = (u16 *)aD8017E910_80135004; + qa = (u16 *)aD8017E914_80135004; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_80184120)) + goto found; + return 0; + } +} + diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c b/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c index bcd0eddb4c..6a2354eff9 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_801380E0.c @@ -169,7 +169,7 @@ extern s32 D_80126F04[]; extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); @@ -631,7 +631,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -1659,7 +1658,23 @@ void func_8013C98C(void) { } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_801380E0", func_8013C9C4); +extern void func_80019064(void *a0); + +void func_8013C9C4(void * arg0) +{ + + extern M2C_UNK D_80062BC0; + extern s32 D_80184198; + extern s8 D_8018419C; + extern s8 D_8018419D; + D_80184198 = arg0; + D_8018419C = 0; + D_8018419D = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + void func_8013CA14(void) diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c index 53b3424d37..99da62b1c5 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8013F350.c @@ -115,7 +115,6 @@ extern s32 func_80128ED8(s32 param_1, s32 *param_2); extern void func_80128FAC(u16 *arg0); extern s16 D_8011DB2C; extern s16 D_8011DB30; -extern s32 D_80126AEC; extern u8 *func_8012913C(s32 a0); extern u8 * func_801290DC(s32 a0, u8 *a1); extern void func_8001D074(s32 a, s32 b); @@ -130,12 +129,9 @@ extern void func_8012927C(void); extern void func_8012931C(struct vec *a0); extern void func_80129350(s32 a0, s32 a1); extern void func_80129374(s32 a0, s32 a1); -extern s16 D_800B9AAC[]; extern s16 D_800B9AAE[]; extern s16 D_800B9AB0[]; -extern s16 D_800B9AB2[]; extern s16 D_800B9AB4[]; -extern s16 D_800B9AB6[]; extern s16 D_800B9AB8[]; extern s16 D_800B9ABA[]; extern void func_80129398(void); @@ -152,7 +148,6 @@ extern void GsSortBg(s32 *, void *, u16, s32 *); extern void GsSortFastBg(s32 *, void *, u16, s32 *); extern unsigned short D_800B99F0; extern struct BigCopy D_80126DB8; -extern u8 D_80126948[]; extern struct BigCopy D_80114EE8; extern s32 D_80126E60[]; extern s8 D_801150D6; @@ -166,12 +161,12 @@ extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); ( extern void GsSetRefView2L(void *); extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ extern s32 D_80126F04[]; -extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; -extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +/* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); extern void func_80129FF4(void); extern void func_8012A048(void *a0, s32 a1, u8 a2); @@ -212,7 +207,6 @@ extern s16 D_80127080; extern s16 D_801152C2; extern void func_8012A304(s32 a0, s32 a1); extern s32 func_80012F74(s32, s32, s32, s32); -extern s32 D_801151D4; extern void func_8012A418(void); extern Vec8 D_80114F24; extern void func_8012A464(void); @@ -249,9 +243,6 @@ extern void func_8012AD64(s32 *a0, s16 a1); extern void func_8012AD6C(void *a0); extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); -extern s32 *D_80126B78; -extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -318,7 +309,6 @@ extern s32 func_8012BF7C(s16 *a0); extern s16 D_80126CAC; extern short D_80126CAE; extern int func_8012BFA8(short *a0); -extern s32 D_801274D4; extern s32 D_801274E0; extern s32 func_8012C044(s32 a0); extern void func_8012C218(void *a0); @@ -631,7 +621,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -714,7 +703,6 @@ extern s32 *D_80126A30; extern void func_80139954(void); extern s32 D_80126A3C; extern s32 func_801399F0(s32 a0); -extern s32 D_80127520; extern void func_80139A34(s32 a0); extern s32 D_80127530[4]; extern void func_80139A44(s32 a0, u16 a1); @@ -818,8 +806,6 @@ extern void func_8013F244(void); extern void func_8013FAF8(s16 a0, s16 a1); extern void func_8013E958(void); extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; extern u16 D_8011511E; extern s32 D_80115130; extern s16 D_8011514C; @@ -882,7 +868,6 @@ extern void func_80141C0C(s32); // callers already cast (`((short (*)(void))func_8013F350)()`) -> def-side reconcile. extern u16 D_80115110; -extern u16 D_8011511A; extern u16 D_8011511C; extern u16 D_8011511E; extern u16 D_80115120; @@ -912,6 +897,10 @@ extern void func_801407F4(void); extern s32 func_801416D4(s16); /* macro-canonical redecl (§8e) */ s32 func_8013F350(void) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u16 D_8011511A; register u16 *pd __asm__("$5") = &D_8011511C; u16 *ps; u16 *pf; @@ -1151,7 +1140,136 @@ s32 func_8013F350(void) { return 0; } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_8013F350", func_8013FAF8); + + +// @class: regalloc-order +// @stuck: none — MATCH (312/312, relocation-masked) + + + + + + + + + + +extern void func_80140E6C(void); +extern void func_80140F00(void); +extern s32 *func_80140958(); +extern int func_80141100(int); +extern s16 func_8014168C(s16); +extern s32 func_8013FFD8(s16, s32, s32 *); +extern void func_80024054(void *a0, void *a1); +extern s32 *func_800D2650(s32 *, void *, s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern s32 func_800D27DC(s32, s32 *, void *, s32, s32); +extern s32 *func_800D29F8(s32, s32, void *, s32, s32); +extern int func_80137D08(int arg0, int arg1, short arg2); +extern s32 func_8013AB54(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_8013FAF8(s16 arg0, s16 arg1) { + + extern s32 D_801151D0; + extern u16 D_8011511A; + extern Hw4 D_8011516A[]; + extern u8 D_80078EC0; + extern Rec20 D_800AE7B8[]; + extern Blk60 D_8017ED80[]; + extern Blk20 D_8017F080[]; + extern Prim4 D_8017F180[]; + extern Prim4 D_8017F1F0[]; + extern Prim4 *D_8017F2E4[]; + extern s32 D_8017F304[]; + extern u8 D_8017F324; + extern s16 D_8017F6F8; + extern s16 D_8017F6FA; + u8 sp18[72]; + s32 sp60[2]; + s32 *ot; + s16 i; + s16 j; + s32 flag; + s32 addr; + Prim4 *p; + s32 r; + s32 t; + s16 *pp; + s32 flag2; + register s32 flag3 __asm__("$18"); + + func_80140E6C(); + func_80140F00(); + ot = func_80140958((s32 *)D_801151D0, arg0, arg1); + if (D_8011511A < 6) { + ot = (s32 *)func_80141100((int)ot); + } + for (i = arg0; i < arg1; i++) { + if (i == D_8011511A || i == 2 || i == 4) { + flag = 0; + } else { + flag = 0xFF; + } + p = &D_8017F180[i]; + if (i != 5) { + if (i == 2) { + addr = ((s32 *)&D_8017F324)[*(s16 *)&D_80115128]; + } else { + addr = D_8017F304[i]; + } + } else { + addr = func_8013FFD8(2, func_8014168C(2), sp60); + } + func_80024054(addr, sp18); + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, 1, + flag != 0 ? 0x585858 : 0x808080); + p = D_8017F2E4[i]; + j = 0; + if (p != 0) { + if (i == 2 && *(s16 *)&D_80115128 != 0) { + p = D_8017F1F0; + } + flag2 = flag; + for (;;) { + r = func_8013FFD8(i, j++, sp60); + if (r == 0) { + break; + } + if (r < 0) { + func_80024054(r, sp18); + t = 1; + if (i == 0 && (D_80078EC0 & 0x7F) == j) { + t = 0xB6; + } + if (flag2 != 0) { + sp60[0] += -0x282828; + } + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, t, sp60[0]); + } + p++; + } + } + func_8005A600((s32)ot, 0, 0, 0x15, 0); + flag3 = flag; + *ot = 0x2000000; + *ot = (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFFFFFF) | 0x2000000; + D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] = + (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFF000000) | ((u32)ot & 0xFFFFFF); + ot = func_800D29F8(flag3, + func_800D27DC(flag3 != 0, ot + 10, &D_8017ED80[i], 8, D_8011516A[i].x), + &D_8017F080[i], 2, D_8011516A[i].x); + } + pp = &D_8017F6F8; + if (*pp == 0xE) { + ot = func_80137D08(ot, &D_800AE7B8[*(u16 *)&D_800B9A02], 2); + } + if (*pp != 0 && D_8017F6FA != 0) { + ot = func_8013AB54(ot, D_800AE7B8[*(u16 *)&D_800B9A02].f4 + 2, (s32)(pp - 2), 0x8000); + } + D_801151D0 = (s32)ot; +} + extern u8 D_8017F434[]; @@ -4133,7 +4251,34 @@ final: } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_8013F350", func_80148E54); + +extern s32 ratan2(s32, s32); +/* derived from asm: lui/addu/lw %lo(D_8017FEF8) indexed by (u16>>12)*4, then jalr with no args; + * the result is sign-extended from 16 bits => the table's functions return s16. */ + +s32 func_80148E54(s32 arg0) { + + extern s32 D_801151D4; + extern s16 (*D_8017FEF8[])(); + register s32 tmp __asm__("$4") = (ratan2(*(s32 *)(D_801151D4 + 0x44) - *(s32 *)(D_801151D4 + 0x50), + *(s32 *)(D_801151D4 + 0x48) - *(s32 *)(D_801151D4 + 0x3C)) - 0x400) & 0xFFF; + s32 ang; + __asm__("" : "=r"(tmp) : "0"(tmp)); + ang = tmp; + + switch (*(u8 *)(arg0 + 0xA9)) { + case 0x41: + return D_8017FEF8[*(u16 *)(arg0 + 0xAA) >> 12](); + case 0x53: + case 0x73: + if ((*(u16 *)(arg0 + 0xAE) & 0xFF) == 0x80 && (*(u16 *)(arg0 + 0xAE) >> 8) == 0x80) { + return -1; + } + return (ang + ratan2((*(u16 *)(arg0 + 0xAE) & 0xFF) - 0x80, + 0x80 - (*(u16 *)(arg0 + 0xAE) >> 8))) & 0xFFF; + } +} + DEFINE_func_80148F60() /* dedup: shared engine-core @0x80148f60 (src/shared) */ diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c index eb2369650a..225a4dc2ec 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8015A3C8.c @@ -1082,7 +1082,6 @@ extern s32 func_80013294(void *a0, void *a1); extern int func_80144B14(int param_s0); extern void func_801458E0(void); extern s32 D_800AE6AC; -extern s32 D_800AE6B0; extern s16 D_800B9A0A; extern u8 D_80078E50; extern void func_800D185C(u8 *a0); @@ -1385,7 +1384,6 @@ extern u8 D_80078EBF; extern s32 func_80149744(struct S_80149744 *a0); extern void func_8015F7A0(); extern void func_80149788(void); -extern u8 D_80078E78[]; extern u8 D_80078EC1; extern s32 func_8014CB7C(void); extern s32 func_8014C088(s32 a0, s32 a1); @@ -2015,7 +2013,6 @@ extern void func_8015BDD0(s32 *a0); /* defined */ extern void func_801575E4(void *a0); /* defined */ extern void func_80157580(s32 arg0); extern u8 D_800D4F14[]; -extern s32 D_8011F730; extern void func_801576A8(void *arg0); extern s32 func_8015773C(u8 *a0); extern s32 func_8015771C(u8 *a0); @@ -2218,6 +2215,10 @@ extern void func_801483E8(unsigned char*); s32 func_8015A3C8(arg0) s32 arg0; { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_80078E78[]; extern void (*D_80180A1C[])(void *); @@ -2546,8 +2547,6 @@ extern s32 func_8014A69C(s32 *a0); extern void func_8014E6A0(void); extern void func_8015CF8C(s32 *a0); extern s32 func_801725A4(u8 *a0); -extern s16 D_801152A0; -extern u8 D_800D4BE0[]; extern s32 D_800D4E94; extern s32 D_800D4ED4; extern u8 D_800D4F8C[]; @@ -2557,6 +2556,14 @@ extern s32 D_800D4B48; s32 func_8015AE2C(arg0) s32 arg0; { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_800D4BE0[]; + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern s16 D_801152A0; s32 flag; s32 r; s32 lim; @@ -3196,7 +3203,6 @@ s32 func_8015C128(s32 param_1) { -extern void (*D_80180A1C[])(void *); extern u16 D_800B99DA; extern s32 func_80149FB0(s32 a0); @@ -3229,6 +3235,10 @@ extern void func_8015C0C4(s32 a0); extern void func_8015C6E0(s32*); void func_8015C32C(s32 arg0) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern void (*D_80180A1C[])(void *); s32 iVar2; u32 uVar4; s32 vin[4]; @@ -3921,7 +3931,104 @@ void func_8015D5E8(int param_1) } -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_8015A3C8", func_8015D738); + +extern int func_80148AFC(void*); +extern s32 func_80161B18(void *); +extern s32 func_80161B84(void *); +extern u16 func_80148800(s32*); +extern u8 func_8014BEF8(void); +extern s32 func_80165624(s32); +extern s32 func_801488A8(u8*); +extern void func_8014D738(void); +extern s32 func_80161208(); +extern void func_80154A74(s32, s32); +extern void func_8015DAC4(s32*); +extern void func_8015DE24(s32*); +extern void func_8015DA5C(s32); +extern void func_8015F948(s32*); +extern void func_800CAF14(void *); +extern void func_80154150(s32, s32); +extern void func_80146DB8(s32*, s32*); +extern void func_80147A84(s32); +extern void func_801473EC(s32*); +extern void func_80149374(s32, s32); +extern void func_80147078(s32*, s16); +extern void func_80159B70(void *); +extern void func_8015C714(void *); +extern void func_801483E8(unsigned char*); + + +void func_8015D738(void *arg0) { + + extern u8 D_80078E78[]; + extern u8 D_80180C60[]; + + extern u8 D_801809E0[]; + extern u8 D_801809F0[]; + u8 *p = D_80078E78; + s32 s1; + ((void (*)(void))func_80148AFC)(); + if (func_80161B18(arg0) != 0) return; + if (func_80161B84(arg0) != 0) return; + s1 = *(s32 *)((char *)arg0 + 0x178); + if (s1 != 0) { + if (*(u16 *)s1 == 0x360) goto block_808; + } + __asm__ __volatile__(""); + if (s1 != 0) { + if (*(u16 *)s1 != 0) goto block_7F4; + } + D_80180A1C[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; +block_7F4: + if (((s32 (*)(void *))func_80148800)(arg0) & 0x80) { + block_808: + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DAC4)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x10) && ((s32 (*)(void *))func_8014BEF8)(arg0) != 0) { + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DE24)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x20) && p[0x49] == 0xA) { + if (((s32 (*)(void *))func_80165624)(arg0) != 0) { + ((void (*)(void *))func_8015DA5C)(arg0); + ((void (*)(void *))func_8015F948)(arg0); + return; + } + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + func_800CAF14(arg0); + return; + } + if (((s32 (*)(void *))func_801488A8)(arg0) != 0 && *(u16 *)(*(s32 *)((char *)arg0 + 0x178)) != 0x82) { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1B); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_801809E0); + } else { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1A); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_801809F0); + } + ((void (*)(void *))func_80147A84)(arg0); + ((void (*)(void *))func_801473EC)(arg0); + s1 = *(s32 *)((char *)arg0 + 0x178); + *(s16 *)(s1 + 6) = (s16)((s8)D_80180C60[*(s32 *)((char *)arg0 + 0x234)] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xc)); + *(s16 *)(s1 + 0xa) = (s16)((s8)D_80180C60[*(s32 *)((char *)arg0 + 0x234) + 1] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xe)); + *(s16 *)(s1 + 0xe) = (s16)((s8)D_80180C60[*(s32 *)((char *)arg0 + 0x234) + 2] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0x10)); + ((void (*)(void *, void *))func_80149374)(arg0, (void *)(s1 + 4)); + *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12) = (*(u16 *)(*(s32 *)((char *)arg0 + 0x20) + 0x12) + 0x800) & 0xFFF; + if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { + D_80180A1C[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 9); + func_8015C714(arg0); + return; + } + if (func_80161208(arg0) != 0) return; + ((void (*)(void *))func_801483E8)(arg0); +} + DEFINE_func_8015DA5C() /* dedup: shared engine-core @0x8015da5c (src/shared) */ diff --git a/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c b/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c index e743c0b1d4..5d24099a6b 100644 --- a/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c +++ b/src/ov_MAIN_012/ov_MAIN_012_jr_8016AE5C.c @@ -270,7 +270,6 @@ extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); extern s32 *D_80126B78; extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -4622,7 +4621,15 @@ DEFINE_func_8016EFC8() /* dedup: shared engine-core @0x8016efc8 (src/shared) */ DEFINE_func_8016F094() /* dedup: shared engine-core @0x8016f094 (src/shared) */ -INCLUDE_ASM("asm/ov_MAIN_012/nonmatchings/ov_MAIN_012_jr_8016AE5C", func_8016F0AC); +extern void func_8016F0E4(void); +extern void func_80165770(void); +void func_8016F0AC(void) { + + extern u8 aD80126B58_8016F0AC __asm__("D_80126B58"); + ((void (*)(void *))func_8016F0E4)(&aD80126B58_8016F0AC); + ((void (*)(void *))func_80165770)(&aD80126B58_8016F0AC); +} + /* RECONCILE NOTE (uc3) — the body is byte-unchanged from uc2; only the declaration diff --git a/src/ov_SC02_037/ov_SC02_037.c b/src/ov_SC02_037/ov_SC02_037.c index 09bec87346..f9cfe3604e 100644 --- a/src/ov_SC02_037/ov_SC02_037.c +++ b/src/ov_SC02_037/ov_SC02_037.c @@ -423,7 +423,24 @@ s32 func_80128C98(s32 arg0) { } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_80128CFC); + + +extern CdFileLoc cdFileLocTable[]; +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 a4); + +s32 func_80128CFC(s32 arg0) { + + extern s16 D_80183ECC[]; + extern s32 aD801C7200_80128CFC __asm__("D_801C7200"); + s16 idx = D_80183ECC[arg0]; + + if (idx >= 0) { + func_8001ABBC(0, 0, (u8 *)&cdFileLocTable[idx], aD801C7200_80128CFC, 0); + } else { + return 1; + } +} + DEFINE_func_80128D60() /* dedup: shared engine-core @0x80128d60 (src/shared) */ @@ -2169,7 +2186,14 @@ DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130af0 (src/shared) */ DEFINE_func_80130C08() /* dedup: shared engine-core @0x80130c08 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_80130D0C); + + +void func_80130D0C(void *a0) { + + extern void (*D_80183F9C[])(void); + D_80183F9C[*(u8 *)((s32)a0 + 0xC1)](); +} + INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037", func_80130D48); diff --git a/src/ov_SC02_037/ov_SC02_037_jr_80131340.c b/src/ov_SC02_037/ov_SC02_037_jr_80131340.c index 5bf3da219a..0f0e1cc5eb 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_80131340.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_80131340.c @@ -2404,7 +2404,70 @@ block_14: DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134fb8 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_80131340", func_80135004); + typedef struct { s8 c[8]; } Blk8_80135004; + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype aD801841A0_80135004 + aD8018419C_80135004 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + + extern s32 D_801C8418; + extern int func_80134A74(int, s16, s16, int); + extern s16 * aD801841A0_80135004 __asm__("D_801841A0"); + extern s16 * aD8018419C_80135004 __asm__("D_8018419C"); + extern u8 D_801841A8; + extern s16 *D_801841A4; + extern u16 D_801C8428; + + register s16 *pb0 __asm__("$9"); /* aD801841A0_80135004 -> $t1 */ + register s16 *pac __asm__("$6"); /* aD8018419C_80135004 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_801841A8 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = aD801841A0_80135004; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = aD8018419C_80135004; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_801841A8); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_801C8418; + __asm__ __volatile__("" ::: "memory"); + D_801C8428 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_801841A4); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_801C8428; + return 1; + } + { + register u16 *qb __asm__("$4"); /* aD8018419C_80135004 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* aD801841A0_80135004[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* aD801841A0_80135004 -> $a2 (reloaded) */ + qb = (u16 *)aD8018419C_80135004; + qa = (u16 *)aD801841A0_80135004; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_801C8418)) + goto found; + return 0; + } +} + diff --git a/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c b/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c index 0f1368abd3..af18a59d64 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_801380E0.c @@ -168,7 +168,7 @@ extern s32 D_80126F04[]; extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); @@ -631,7 +631,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -1659,7 +1658,23 @@ void func_8013C98C(void) { } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_801380E0", func_8013C9C4); +extern void func_80019064(void *a0); + +void func_8013C9C4(void * arg0) +{ + + extern M2C_UNK D_80062BC0; + extern s32 D_801C8490; + extern s8 D_801C8494; + extern s8 D_801C8495; + D_801C8490 = arg0; + D_801C8494 = 0; + D_801C8495 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + void func_8013CA14(void) diff --git a/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c b/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c index 939ed52e1b..f512f78f35 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8013F350.c @@ -114,7 +114,6 @@ extern s32 func_80128ED8(s32 param_1, s32 *param_2); extern void func_80128FAC(u16 *arg0); extern s16 D_8011DB2C; extern s16 D_8011DB30; -extern s32 D_80126AEC; extern u8 *func_8012913C(s32 a0); extern u8 * func_801290DC(s32 a0, u8 *a1); extern void func_8001D074(s32 a, s32 b); @@ -129,12 +128,9 @@ extern void func_8012927C(void); extern void func_8012931C(struct vec *a0); extern void func_80129350(s32 a0, s32 a1); extern void func_80129374(s32 a0, s32 a1); -extern s16 D_800B9AAC[]; extern s16 D_800B9AAE[]; extern s16 D_800B9AB0[]; -extern s16 D_800B9AB2[]; extern s16 D_800B9AB4[]; -extern s16 D_800B9AB6[]; extern s16 D_800B9AB8[]; extern s16 D_800B9ABA[]; extern void func_80129398(void); @@ -151,7 +147,6 @@ extern void GsSortBg(s32 *, void *, u16, s32 *); extern void GsSortFastBg(s32 *, void *, u16, s32 *); extern unsigned short D_800B99F0; extern struct BigCopy D_80126DB8; -extern u8 D_80126948[]; extern struct BigCopy D_80114EE8; extern s32 D_80126E60[]; extern s8 D_801150D6; @@ -165,12 +160,12 @@ extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); ( extern void GsSetRefView2L(void *); extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ extern s32 D_80126F04[]; -extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; -extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +/* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); extern void func_80129FF4(void); extern void func_8012A048(void *a0, s32 a1, u8 a2); @@ -211,7 +206,6 @@ extern s16 D_80127080; extern s16 D_801152C2; extern void func_8012A304(s32 a0, s32 a1); extern s32 func_80012F74(s32, s32, s32, s32); -extern s32 D_801151D4; extern void func_8012A418(void); extern Vec8 D_80114F24; extern void func_8012A464(void); @@ -248,9 +242,6 @@ extern void func_8012AD64(s32 *a0, s16 a1); extern void func_8012AD6C(void *a0); extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); -extern s32 *D_80126B78; -extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -317,7 +308,6 @@ extern s32 func_8012BF7C(s16 *a0); extern s16 D_80126CAC; extern short D_80126CAE; extern int func_8012BFA8(short *a0); -extern s32 D_801274D4; extern s32 D_801274E0; extern s32 func_8012C044(s32 a0); extern void func_8012C218(void *a0); @@ -631,7 +621,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -714,7 +703,6 @@ extern s32 *D_80126A30; extern void func_80139954(void); extern s32 D_80126A3C; extern s32 func_801399F0(s32 a0); -extern s32 D_80127520; extern void func_80139A34(s32 a0); extern s32 D_80127530[4]; extern void func_80139A44(s32 a0, u16 a1); @@ -818,8 +806,6 @@ extern void func_8013F244(void); extern void func_8013FAF8(s16 a0, s16 a1); extern void func_8013E958(void); extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; extern u16 D_8011511E; extern s32 D_80115130; extern s16 D_8011514C; @@ -882,7 +868,6 @@ extern void func_80141C0C(s32); // callers already cast (`((short (*)(void))func_8013F350)()`) -> def-side reconcile. extern u16 D_80115110; -extern u16 D_8011511A; extern u16 D_8011511C; extern u16 D_8011511E; extern u16 D_80115120; @@ -912,6 +897,10 @@ extern void func_801407F4(void); extern s32 func_801416D4(s16); /* macro-canonical redecl (§8e) */ s32 func_8013F350(void) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u16 D_8011511A; register u16 *pd __asm__("$5") = &D_8011511C; u16 *ps; u16 *pf; @@ -1151,7 +1140,136 @@ s32 func_8013F350(void) { return 0; } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8013F350", func_8013FAF8); + + +// @class: regalloc-order +// @stuck: none — MATCH (312/312, relocation-masked) + + + + + + + + + + +extern void func_80140E6C(void); +extern void func_80140F00(void); +extern s32 *func_80140958(); +extern int func_80141100(int); +extern s16 func_8014168C(s16); +extern s32 func_8013FFD8(s16, s32, s32 *); +extern void func_80024054(void *a0, void *a1); +extern s32 *func_800D2650(s32 *, void *, s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern s32 func_800D27DC(s32, s32 *, void *, s32, s32); +extern s32 *func_800D29F8(s32, s32, void *, s32, s32); +extern int func_80137D08(int arg0, int arg1, short arg2); +extern s32 func_8013AB54(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_8013FAF8(s16 arg0, s16 arg1) { + + extern s32 D_801151D0; + extern u16 D_8011511A; + extern Hw4 D_8011516A[]; + extern u8 D_80078EC0; + extern Rec20 D_800AE7B8[]; + extern Blk60 D_8018460C[]; + extern Blk20 D_8018490C[]; + extern Prim4 D_80184A0C[]; + extern Prim4 D_80184A7C[]; + extern Prim4 *D_80184B70[]; + extern s32 D_80184B90[]; + extern u8 D_80184BB0; + extern s16 D_80184F84; + extern s16 D_80184F86; + u8 sp18[72]; + s32 sp60[2]; + s32 *ot; + s16 i; + s16 j; + s32 flag; + s32 addr; + Prim4 *p; + s32 r; + s32 t; + s16 *pp; + s32 flag2; + register s32 flag3 __asm__("$18"); + + func_80140E6C(); + func_80140F00(); + ot = func_80140958((s32 *)D_801151D0, arg0, arg1); + if (D_8011511A < 6) { + ot = (s32 *)func_80141100((int)ot); + } + for (i = arg0; i < arg1; i++) { + if (i == D_8011511A || i == 2 || i == 4) { + flag = 0; + } else { + flag = 0xFF; + } + p = &D_80184A0C[i]; + if (i != 5) { + if (i == 2) { + addr = ((s32 *)&D_80184BB0)[*(s16 *)&D_80115128]; + } else { + addr = D_80184B90[i]; + } + } else { + addr = func_8013FFD8(2, func_8014168C(2), sp60); + } + func_80024054(addr, sp18); + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, 1, + flag != 0 ? 0x585858 : 0x808080); + p = D_80184B70[i]; + j = 0; + if (p != 0) { + if (i == 2 && *(s16 *)&D_80115128 != 0) { + p = D_80184A7C; + } + flag2 = flag; + for (;;) { + r = func_8013FFD8(i, j++, sp60); + if (r == 0) { + break; + } + if (r < 0) { + func_80024054(r, sp18); + t = 1; + if (i == 0 && (D_80078EC0 & 0x7F) == j) { + t = 0xB6; + } + if (flag2 != 0) { + sp60[0] += -0x282828; + } + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, t, sp60[0]); + } + p++; + } + } + func_8005A600((s32)ot, 0, 0, 0x15, 0); + flag3 = flag; + *ot = 0x2000000; + *ot = (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFFFFFF) | 0x2000000; + D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] = + (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFF000000) | ((u32)ot & 0xFFFFFF); + ot = func_800D29F8(flag3, + func_800D27DC(flag3 != 0, ot + 10, &D_8018460C[i], 8, D_8011516A[i].x), + &D_8018490C[i], 2, D_8011516A[i].x); + } + pp = &D_80184F84; + if (*pp == 0xE) { + ot = func_80137D08(ot, &D_800AE7B8[*(u16 *)&D_800B9A02], 2); + } + if (*pp != 0 && D_80184F86 != 0) { + ot = func_8013AB54(ot, D_800AE7B8[*(u16 *)&D_800B9A02].f4 + 2, (s32)(pp - 2), 0x8000); + } + D_801151D0 = (s32)ot; +} + extern u8 D_80184CC0[]; @@ -4135,7 +4253,34 @@ final: } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8013F350", func_80148E54); + +extern s32 ratan2(s32, s32); +/* derived from asm: lui/addu/lw %lo(D_80185784) indexed by (u16>>12)*4, then jalr with no args; + * the result is sign-extended from 16 bits => the table's functions return s16. */ + +s32 func_80148E54(s32 arg0) { + + extern s32 D_801151D4; + extern s16 (*D_80185784[])(); + register s32 tmp __asm__("$4") = (ratan2(*(s32 *)(D_801151D4 + 0x44) - *(s32 *)(D_801151D4 + 0x50), + *(s32 *)(D_801151D4 + 0x48) - *(s32 *)(D_801151D4 + 0x3C)) - 0x400) & 0xFFF; + s32 ang; + __asm__("" : "=r"(tmp) : "0"(tmp)); + ang = tmp; + + switch (*(u8 *)(arg0 + 0xA9)) { + case 0x41: + return D_80185784[*(u16 *)(arg0 + 0xAA) >> 12](); + case 0x53: + case 0x73: + if ((*(u16 *)(arg0 + 0xAE) & 0xFF) == 0x80 && (*(u16 *)(arg0 + 0xAE) >> 8) == 0x80) { + return -1; + } + return (ang + ratan2((*(u16 *)(arg0 + 0xAE) & 0xFF) - 0x80, + 0x80 - (*(u16 *)(arg0 + 0xAE) >> 8))) & 0xFFF; + } +} + DEFINE_func_80148F60() /* dedup: shared engine-core @0x80148f60 (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 8b3b9b0caa..996c9bcbe1 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8015A3C8.c @@ -1099,7 +1099,6 @@ extern s32 func_80013294(void *a0, void *a1); extern int func_80144B14(int param_s0); extern void func_801458E0(void); extern s32 D_800AE6AC; -extern s32 D_800AE6B0; extern s16 D_800B9A0A; extern u8 D_80078E50; extern void func_800D185C(u8 *a0); @@ -1403,7 +1402,6 @@ extern u8 D_80078EBF; extern s32 func_80149744(struct S_80149744 *a0); extern void func_8015F7A0(); extern void func_80149788(void); -extern u8 D_80078E78[]; extern u8 D_80078EC1; extern s32 func_8014CB7C(void); extern s32 func_8014C088(s32 a0, s32 a1); @@ -2035,7 +2033,6 @@ extern void func_8015BDD0(s32 *a0); /* defined */ extern void func_801575E4(void *a0); /* defined */ extern void func_80157580(s32 arg0); extern u8 D_800D4F14[]; -extern s32 D_8011F730; extern void func_801576A8(void *arg0); extern s32 func_8015773C(u8 *a0); extern s32 func_8015771C(u8 *a0); @@ -2569,8 +2566,6 @@ extern s32 func_8014A69C(s32 *a0); extern void func_8014E6A0(void); extern void func_8015CF8C(s32 *a0); extern s32 func_801725A4(u8 *a0); -extern s16 D_801152A0; -extern u8 D_800D4BE0[]; extern s32 D_800D4E94; extern s32 D_800D4ED4; extern u8 D_800D4F8C[]; @@ -2580,6 +2575,14 @@ extern s32 D_800D4B48; s32 func_8015AE2C(arg0) s32 arg0; { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_800D4BE0[]; + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern s16 D_801152A0; s32 flag; s32 r; s32 lim; @@ -3217,7 +3220,6 @@ s32 func_8015C128(s32 param_1) { -extern void (*D_801862A8[])(void *); extern u16 D_800B99DA; extern s32 func_80149FB0(s32 a0); @@ -3250,6 +3252,10 @@ extern void func_8015C0C4(s32 a0); extern void func_8015C6E0(s32*); void func_8015C32C(s32 arg0) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern void (*D_801862A8[])(void *); s32 iVar2; u32 uVar4; s32 vin[4]; @@ -3942,7 +3948,104 @@ void func_8015D5E8(int param_1) } -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8015A3C8", func_8015D738); + +extern int func_80148AFC(void*); +extern s32 func_80161B18(void *); +extern s32 func_80161B84(void *); +extern u16 func_80148800(s32*); +extern u8 func_8014BEF8(void); +extern s32 func_80165624(s32); +extern s32 func_801488A8(u8*); +extern void func_8014D738(void); +extern s32 func_80161208(); +extern void func_80154A74(s32, s32); +extern void func_8015DAC4(s32*); +extern void func_8015DE24(s32*); +extern void func_8015DA5C(s32); +extern void func_8015F948(s32*); +extern void func_800CAF14(void *); +extern void func_80154150(s32, s32); +extern void func_80146DB8(s32*, s32*); +extern void func_80147A84(s32); +extern void func_801473EC(s32*); +extern void func_80149374(s32, s32); +extern void func_80147078(s32*, s16); +extern void func_80159B70(void *); +extern void func_8015C714(void *); +extern void func_801483E8(unsigned char*); + + +void func_8015D738(void *arg0) { + + extern u8 D_80078E78[]; + extern u8 D_801864EC[]; + + extern u8 D_8018626C[]; + extern u8 D_8018627C[]; + u8 *p = D_80078E78; + s32 s1; + ((void (*)(void))func_80148AFC)(); + if (func_80161B18(arg0) != 0) return; + if (func_80161B84(arg0) != 0) return; + s1 = *(s32 *)((char *)arg0 + 0x178); + if (s1 != 0) { + if (*(u16 *)s1 == 0x360) goto block_808; + } + __asm__ __volatile__(""); + if (s1 != 0) { + if (*(u16 *)s1 != 0) goto block_7F4; + } + D_801862A8[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; +block_7F4: + if (((s32 (*)(void *))func_80148800)(arg0) & 0x80) { + block_808: + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DAC4)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x10) && ((s32 (*)(void *))func_8014BEF8)(arg0) != 0) { + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DE24)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x20) && p[0x49] == 0xA) { + if (((s32 (*)(void *))func_80165624)(arg0) != 0) { + ((void (*)(void *))func_8015DA5C)(arg0); + ((void (*)(void *))func_8015F948)(arg0); + return; + } + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + func_800CAF14(arg0); + return; + } + if (((s32 (*)(void *))func_801488A8)(arg0) != 0 && *(u16 *)(*(s32 *)((char *)arg0 + 0x178)) != 0x82) { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1B); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_8018626C); + } else { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1A); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_8018627C); + } + ((void (*)(void *))func_80147A84)(arg0); + ((void (*)(void *))func_801473EC)(arg0); + s1 = *(s32 *)((char *)arg0 + 0x178); + *(s16 *)(s1 + 6) = (s16)((s8)D_801864EC[*(s32 *)((char *)arg0 + 0x234)] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xc)); + *(s16 *)(s1 + 0xa) = (s16)((s8)D_801864EC[*(s32 *)((char *)arg0 + 0x234) + 1] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xe)); + *(s16 *)(s1 + 0xe) = (s16)((s8)D_801864EC[*(s32 *)((char *)arg0 + 0x234) + 2] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0x10)); + ((void (*)(void *, void *))func_80149374)(arg0, (void *)(s1 + 4)); + *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12) = (*(u16 *)(*(s32 *)((char *)arg0 + 0x20) + 0x12) + 0x800) & 0xFFF; + if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { + D_801862A8[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 9); + func_8015C714(arg0); + return; + } + if (func_80161208(arg0) != 0) return; + ((void (*)(void *))func_801483E8)(arg0); +} + DEFINE_func_8015DA5C() /* dedup: shared engine-core @0x8015da5c (src/shared) */ 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 9cb0c5404b..68722e68c5 100644 --- a/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c +++ b/src/ov_SC02_037/ov_SC02_037_jr_8016AE5C.c @@ -283,7 +283,6 @@ extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); extern s32 *D_80126B78; extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -4715,7 +4714,15 @@ DEFINE_func_8016EFC8() /* dedup: shared engine-core @0x8016efc8 (src/shared) */ DEFINE_func_8016F094() /* dedup: shared engine-core @0x8016f094 (src/shared) */ -INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8016AE5C", func_8016F0AC); +extern void func_8016F0E4(void); +extern void func_80165770(void); +void func_8016F0AC(void) { + + extern u8 aD80126B58_8016F0AC __asm__("D_80126B58"); + ((void (*)(void *))func_8016F0E4)(&aD80126B58_8016F0AC); + ((void (*)(void *))func_80165770)(&aD80126B58_8016F0AC); +} + /* RECONCILE NOTE (uc3) — the body is byte-unchanged from uc2; only the declaration diff --git a/src/ov_SC03_107/ov_SC03_107.c b/src/ov_SC03_107/ov_SC03_107.c index acf2aa3f55..edfc148b23 100644 --- a/src/ov_SC03_107/ov_SC03_107.c +++ b/src/ov_SC03_107/ov_SC03_107.c @@ -2185,7 +2185,14 @@ DEFINE_func_80130AF0() /* dedup: shared engine-core @0x80130af0 (src/shared) */ DEFINE_func_80130C08() /* dedup: shared engine-core @0x80130c08 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107", func_80130D0C); + + +void func_80130D0C(void *a0) { + + extern void (*D_80182838[])(void); + D_80182838[*(u8 *)((s32)a0 + 0xC1)](); +} + INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107", func_80130D48); diff --git a/src/ov_SC03_107/ov_SC03_107_jr_80131340.c b/src/ov_SC03_107/ov_SC03_107_jr_80131340.c index a44ed2909c..83d8f15cdf 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_80131340.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_80131340.c @@ -2405,7 +2405,70 @@ block_14: DEFINE_func_80134FB8() /* dedup: shared engine-core @0x80134fb8 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_80131340", func_80135004); + typedef struct { s8 c[8]; } Blk8_80135004; + +// @class: plumbing +// @stuck: MATCH (89 ins). To BANK: retype aD80182A3C_80135004 + aD80182A38_80135004 (u8 -> s16*) in sibling func_80135168's externs (src/ov_SC01_077/ov_SC01_077_a.c ~L1879); they hold pointers double-referenced across a call, so only a 4-byte/pointer decl folds %lo (u8 &-cast CSE's the address into a saved reg). Retype is byte-NEUTRAL for the sibling (verified: identical objdump bytes u8 vs s16*). + + + + +s32 func_80135004(s32 arg0, s32 p1, s32 p2) +{ + + extern s32 D_8019A778; + extern int func_80134A74(int, s16, s16, int); + extern s16 * aD80182A3C_80135004 __asm__("D_80182A3C"); + extern s16 * aD80182A38_80135004 __asm__("D_80182A38"); + extern u8 D_80182A44; + extern s16 *D_80182A40; + extern u16 D_8019A788; + + register s16 *pb0 __asm__("$9"); /* aD80182A3C_80135004 -> $t1 */ + register s16 *pac __asm__("$6"); /* aD80182A38_80135004 -> $a2 */ + register s16 *pb8 __asm__("$8"); /* D_80182A44 -> $t0 */ + u16 *pb4; + u16 a, b; + int id; + int a1v, a2v, d94; + + pb0 = aD80182A3C_80135004; + __asm__ __volatile__("" : : "r"(pb0)); + + a = ((u16 *)p2)[0]; pac = aD80182A38_80135004; pb0[0] = a; b = ((u16 *)p1)[0]; pb8 = (*(s16 * *)&D_80182A44); pac[0] = b; pb8[0] = a - b; + a = ((u16 *)p2)[1]; pb0[1] = a; b = ((u16 *)p1)[1]; pac[1] = b; pb8[1] = a - b; + a = ((u16 *)p2)[2]; pb0[2] = a; b = ((u16 *)p1)[2]; pac[2] = b; pb8[2] = a - b; + + id = ((int)arg0) & 0xFFFF; + a1v = pac[0]; a2v = pac[2]; d94 = D_8019A778; + __asm__ __volatile__("" ::: "memory"); + D_8019A788 = 0; + + if (func_80134A74(id, a1v, a2v, d94)) { + found: + pb4 = (*(u16 * *)&D_80182A40); + ((u16 *)p2)[0] = pb4[0]; + ((u16 *)p2)[1] = pb4[1]; + ((u16 *)p2)[2] = pb4[2]; + ((u16 *)p2)[3] = D_8019A788; + return 1; + } + { + register u16 *qb __asm__("$4"); /* aD80182A38_80135004 -> $a0 (reloaded) */ + register int qa0 __asm__("$5"); /* aD80182A3C_80135004[0], kept in $a1 for the 2nd-call arg */ + register u16 *qa __asm__("$6"); /* aD80182A3C_80135004 -> $a2 (reloaded) */ + qb = (u16 *)aD80182A38_80135004; + qa = (u16 *)aD80182A3C_80135004; + qa0 = qa[0]; + if (((qb[0] & 0xFF80) == (qa0 & 0xFF80)) && + ((qb[2] & 0xFF80) == (qa[2] & 0xFF80))) + return 0; + if (func_80134A74(id, (s16)qa0, (s16)qa[2], D_8019A778)) + goto found; + return 0; + } +} + diff --git a/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c b/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c index 7409fbfb51..4cf3f0b02c 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_801380E0.c @@ -169,7 +169,7 @@ extern s32 D_80126F04[]; extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); @@ -632,7 +632,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -1660,7 +1659,23 @@ void func_8013C98C(void) { } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_801380E0", func_8013C9C4); +extern void func_80019064(void *a0); + +void func_8013C9C4(void * arg0) +{ + + extern M2C_UNK D_80062BC0; + extern s32 D_8019A7F0; + extern s8 D_8019A7F4; + extern s8 D_8019A7F5; + D_8019A7F0 = arg0; + D_8019A7F4 = 0; + D_8019A7F5 = 0; + if (func_80019198() == 0) { + func_80019064(&D_80062BC0); + } +} + void func_8013CA14(void) diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c b/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c index dca91c337a..8c0ec1fa22 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8013F350.c @@ -115,7 +115,6 @@ extern s32 func_80128ED8(s32 param_1, s32 *param_2); extern void func_80128FAC(u16 *arg0); extern s16 D_8011DB2C; extern s16 D_8011DB30; -extern s32 D_80126AEC; extern u8 *func_8012913C(s32 a0); extern u8 * func_801290DC(s32 a0, u8 *a1); extern void func_8001D074(s32 a, s32 b); @@ -130,12 +129,9 @@ extern void func_8012927C(void); extern void func_8012931C(struct vec *a0); extern void func_80129350(s32 a0, s32 a1); extern void func_80129374(s32 a0, s32 a1); -extern s16 D_800B9AAC[]; extern s16 D_800B9AAE[]; extern s16 D_800B9AB0[]; -extern s16 D_800B9AB2[]; extern s16 D_800B9AB4[]; -extern s16 D_800B9AB6[]; extern s16 D_800B9AB8[]; extern s16 D_800B9ABA[]; extern void func_80129398(void); @@ -152,7 +148,6 @@ extern void GsSortBg(s32 *, void *, u16, s32 *); extern void GsSortFastBg(s32 *, void *, u16, s32 *); extern unsigned short D_800B99F0; extern struct BigCopy D_80126DB8; -extern u8 D_80126948[]; extern struct BigCopy D_80114EE8; extern s32 D_80126E60[]; extern s8 D_801150D6; @@ -166,12 +161,12 @@ extern s32 func_80012F74(s32, s32, s32, s32); /* canonical s32 (engine_core); ( extern void GsSetRefView2L(void *); extern s8 D_801150D6; /* canonical (engine_core macro): s8 — access via *(u8*)& for lbu */ extern s32 D_80126F04[]; -extern u8 D_80126948[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_80126FA8[]; extern struct BigCopy D_80126DB8;/* canonical (engine_core macro): struct BigCopy — (s32*)& at use */ -extern u8 D_800AF630[]; /* canonical (sibling): u8[] — cast (s32*) at use */ +/* canonical (sibling): u8[] — cast (s32*) at use */ extern s32 D_800AE688[]; -extern s32 D_801151D4; /* canonical (10 siblings): scalar s32 — store (s32)ptr */ +/* canonical (10 siblings): scalar s32 — store (s32)ptr */ extern void func_8012A018(s32 a, s32 b); extern void func_80129FF4(void); extern void func_8012A048(void *a0, s32 a1, u8 a2); @@ -212,7 +207,6 @@ extern s16 D_80127080; extern s16 D_801152C2; extern void func_8012A304(s32 a0, s32 a1); extern s32 func_80012F74(s32, s32, s32, s32); -extern s32 D_801151D4; extern void func_8012A418(void); extern Vec8 D_80114F24; extern void func_8012A464(void); @@ -249,9 +243,6 @@ extern void func_8012AD64(s32 *a0, s16 a1); extern void func_8012AD6C(void *a0); extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); -extern s32 *D_80126B78; -extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -318,7 +309,6 @@ extern s32 func_8012BF7C(s16 *a0); extern s16 D_80126CAC; extern short D_80126CAE; extern int func_8012BFA8(short *a0); -extern s32 D_801274D4; extern s32 D_801274E0; extern s32 func_8012C044(s32 a0); extern void func_8012C218(void *a0); @@ -632,7 +622,6 @@ extern void ApplyMatrixSV(void *m, Svec_801372B0 *in, Svec_801372B0 *out); extern void aGsSortLine(Gline_801372B0 *p, void *ot, s32 z) __asm__("GsSortLine"); extern void aF80137030(s32 x, s32 y) __asm__("func_80137030"); extern void func_80137178(s32 x, s32 y); -extern u8 D_800AF630[]; extern u16 aD800B9A02 __asm__("D_800B9A02"); extern void func_801372B0(void); extern void func_80137614(s32 a0, s32 a1, s32 a2); @@ -715,7 +704,6 @@ extern s32 *D_80126A30; extern void func_80139954(void); extern s32 D_80126A3C; extern s32 func_801399F0(s32 a0); -extern s32 D_80127520; extern void func_80139A34(s32 a0); extern s32 D_80127530[4]; extern void func_80139A44(s32 a0, u16 a1); @@ -819,8 +807,6 @@ extern void func_8013F244(void); extern void func_8013FAF8(s16 a0, s16 a1); extern void func_8013E958(void); extern u8 D_801151C8[]; -extern s32 D_801151D0; -extern u16 D_8011511A; extern u16 D_8011511E; extern s32 D_80115130; extern s16 D_8011514C; @@ -883,7 +869,6 @@ extern void func_80141C0C(s32); // callers already cast (`((short (*)(void))func_8013F350)()`) -> def-side reconcile. extern u16 D_80115110; -extern u16 D_8011511A; extern u16 D_8011511C; extern u16 D_8011511E; extern u16 D_80115120; @@ -913,6 +898,10 @@ extern void func_801407F4(void); extern s32 func_801416D4(s16); /* macro-canonical redecl (§8e) */ s32 func_8013F350(void) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u16 D_8011511A; register u16 *pd __asm__("$5") = &D_8011511C; u16 *ps; u16 *pf; @@ -1152,7 +1141,136 @@ s32 func_8013F350(void) { return 0; } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_8013F350", func_8013FAF8); + + +// @class: regalloc-order +// @stuck: none — MATCH (312/312, relocation-masked) + + + + + + + + + + +extern void func_80140E6C(void); +extern void func_80140F00(void); +extern s32 *func_80140958(); +extern int func_80141100(int); +extern s16 func_8014168C(s16); +extern s32 func_8013FFD8(s16, s32, s32 *); +extern void func_80024054(void *a0, void *a1); +extern s32 *func_800D2650(s32 *, void *, s32, s32, s32, s32); +extern s32 func_8005A600(s32, s32, s32, s32, s32); +extern s32 func_800D27DC(s32, s32 *, void *, s32, s32); +extern s32 *func_800D29F8(s32, s32, void *, s32, s32); +extern int func_80137D08(int arg0, int arg1, short arg2); +extern s32 func_8013AB54(s32 a0, s32 a1, s32 a2, s32 a3); + + +void func_8013FAF8(s16 arg0, s16 arg1) { + + extern s32 D_801151D0; + extern u16 D_8011511A; + extern Hw4 D_8011516A[]; + extern u8 D_80078EC0; + extern Rec20 D_800AE7B8[]; + extern Blk60 D_80182EA8[]; + extern Blk20 D_801831A8[]; + extern Prim4 D_801832A8[]; + extern Prim4 D_80183318[]; + extern Prim4 *D_8018340C[]; + extern s32 D_8018342C[]; + extern u8 D_8018344C; + extern s16 D_80183820; + extern s16 D_80183822; + u8 sp18[72]; + s32 sp60[2]; + s32 *ot; + s16 i; + s16 j; + s32 flag; + s32 addr; + Prim4 *p; + s32 r; + s32 t; + s16 *pp; + s32 flag2; + register s32 flag3 __asm__("$18"); + + func_80140E6C(); + func_80140F00(); + ot = func_80140958((s32 *)D_801151D0, arg0, arg1); + if (D_8011511A < 6) { + ot = (s32 *)func_80141100((int)ot); + } + for (i = arg0; i < arg1; i++) { + if (i == D_8011511A || i == 2 || i == 4) { + flag = 0; + } else { + flag = 0xFF; + } + p = &D_801832A8[i]; + if (i != 5) { + if (i == 2) { + addr = ((s32 *)&D_8018344C)[*(s16 *)&D_80115128]; + } else { + addr = D_8018342C[i]; + } + } else { + addr = func_8013FFD8(2, func_8014168C(2), sp60); + } + func_80024054(addr, sp18); + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, 1, + flag != 0 ? 0x585858 : 0x808080); + p = D_8018340C[i]; + j = 0; + if (p != 0) { + if (i == 2 && *(s16 *)&D_80115128 != 0) { + p = D_80183318; + } + flag2 = flag; + for (;;) { + r = func_8013FFD8(i, j++, sp60); + if (r == 0) { + break; + } + if (r < 0) { + func_80024054(r, sp18); + t = 1; + if (i == 0 && (D_80078EC0 & 0x7F) == j) { + t = 0xB6; + } + if (flag2 != 0) { + sp60[0] += -0x282828; + } + ot = func_800D2650(ot, sp18, (s16)(p->f0 + (u16)D_8011516A[i].x), p->f2, t, sp60[0]); + } + p++; + } + } + func_8005A600((s32)ot, 0, 0, 0x15, 0); + flag3 = flag; + *ot = 0x2000000; + *ot = (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFFFFFF) | 0x2000000; + D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] = + (D_800AE7B8[*(u16 *)&D_800B9A02].f4[2] & 0xFF000000) | ((u32)ot & 0xFFFFFF); + ot = func_800D29F8(flag3, + func_800D27DC(flag3 != 0, ot + 10, &D_80182EA8[i], 8, D_8011516A[i].x), + &D_801831A8[i], 2, D_8011516A[i].x); + } + pp = &D_80183820; + if (*pp == 0xE) { + ot = func_80137D08(ot, &D_800AE7B8[*(u16 *)&D_800B9A02], 2); + } + if (*pp != 0 && D_80183822 != 0) { + ot = func_8013AB54(ot, D_800AE7B8[*(u16 *)&D_800B9A02].f4 + 2, (s32)(pp - 2), 0x8000); + } + D_801151D0 = (s32)ot; +} + extern u8 D_8018355C[]; @@ -4137,7 +4255,34 @@ final: } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_8013F350", func_80148E54); + +extern s32 ratan2(s32, s32); +/* derived from asm: lui/addu/lw %lo(D_80184020) indexed by (u16>>12)*4, then jalr with no args; + * the result is sign-extended from 16 bits => the table's functions return s16. */ + +s32 func_80148E54(s32 arg0) { + + extern s32 D_801151D4; + extern s16 (*D_80184020[])(); + register s32 tmp __asm__("$4") = (ratan2(*(s32 *)(D_801151D4 + 0x44) - *(s32 *)(D_801151D4 + 0x50), + *(s32 *)(D_801151D4 + 0x48) - *(s32 *)(D_801151D4 + 0x3C)) - 0x400) & 0xFFF; + s32 ang; + __asm__("" : "=r"(tmp) : "0"(tmp)); + ang = tmp; + + switch (*(u8 *)(arg0 + 0xA9)) { + case 0x41: + return D_80184020[*(u16 *)(arg0 + 0xAA) >> 12](); + case 0x53: + case 0x73: + if ((*(u16 *)(arg0 + 0xAE) & 0xFF) == 0x80 && (*(u16 *)(arg0 + 0xAE) >> 8) == 0x80) { + return -1; + } + return (ang + ratan2((*(u16 *)(arg0 + 0xAE) & 0xFF) - 0x80, + 0x80 - (*(u16 *)(arg0 + 0xAE) >> 8))) & 0xFFF; + } +} + DEFINE_func_80148F60() /* dedup: shared engine-core @0x80148f60 (src/shared) */ diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c b/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c index c4b32c246d..5c264eedd3 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8015A3C8.c @@ -1083,7 +1083,6 @@ extern s32 func_80013294(void *a0, void *a1); extern int func_80144B14(int param_s0); extern void func_801458E0(void); extern s32 D_800AE6AC; -extern s32 D_800AE6B0; extern s16 D_800B9A0A; extern u8 D_80078E50; extern void func_800D185C(u8 *a0); @@ -1389,7 +1388,6 @@ extern u8 D_80078EBF; extern s32 func_80149744(struct S_80149744 *a0); extern void func_8015F7A0(); extern void func_80149788(void); -extern u8 D_80078E78[]; extern u8 D_80078EC1; extern s32 func_8014CB7C(void); extern s32 func_8014C088(s32 a0, s32 a1); @@ -2019,7 +2017,6 @@ extern void func_8015BDD0(s32 *a0); /* defined */ extern void func_801575E4(void *a0); /* defined */ extern void func_80157580(s32 arg0); extern u8 D_800D4F14[]; -extern s32 D_8011F730; extern void func_801576A8(void *arg0); extern s32 func_8015773C(u8 *a0); extern s32 func_8015771C(u8 *a0); @@ -2222,6 +2219,10 @@ extern void func_801483E8(unsigned char*); s32 func_8015A3C8(arg0) s32 arg0; { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_80078E78[]; extern void (*D_80184B44[])(void *); @@ -2549,8 +2550,6 @@ extern s32 func_8014A69C(s32 *a0); extern void func_8014E6A0(void); extern void func_8015CF8C(s32 *a0); extern s32 func_801725A4(u8 *a0); -extern s16 D_801152A0; -extern u8 D_800D4BE0[]; extern s32 D_800D4E94; extern s32 D_800D4ED4; extern u8 D_800D4F8C[]; @@ -2560,6 +2559,14 @@ extern s32 D_800D4B48; s32 func_8015AE2C(arg0) s32 arg0; { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern u8 D_800D4BE0[]; + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern s16 D_801152A0; s32 flag; s32 r; s32 lim; @@ -3197,7 +3204,6 @@ s32 func_8015C128(s32 param_1) { -extern void (*D_80184B44[])(void *); extern u16 D_800B99DA; extern s32 func_80149FB0(s32 a0); @@ -3230,6 +3236,10 @@ extern void func_8015C0C4(s32 a0); extern void func_8015C6E0(s32*); void func_8015C32C(s32 arg0) { + /* [T51] scoped in from file scope: a file-scope decl of these symbols constrains every + LATER function in this TU, which blocks a byte-true decl of a different type. + Declaration-only move (cookbook §103); the whole-binary byte-gate is the arbiter. */ + extern void (*D_80184B44[])(void *); s32 iVar2; u32 uVar4; s32 vin[4]; @@ -3922,7 +3932,104 @@ void func_8015D5E8(int param_1) } -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_8015A3C8", func_8015D738); + +extern int func_80148AFC(void*); +extern s32 func_80161B18(void *); +extern s32 func_80161B84(void *); +extern u16 func_80148800(s32*); +extern u8 func_8014BEF8(void); +extern s32 func_80165624(s32); +extern s32 func_801488A8(u8*); +extern void func_8014D738(void); +extern s32 func_80161208(); +extern void func_80154A74(s32, s32); +extern void func_8015DAC4(s32*); +extern void func_8015DE24(s32*); +extern void func_8015DA5C(s32); +extern void func_8015F948(s32*); +extern void func_800CAF14(void *); +extern void func_80154150(s32, s32); +extern void func_80146DB8(s32*, s32*); +extern void func_80147A84(s32); +extern void func_801473EC(s32*); +extern void func_80149374(s32, s32); +extern void func_80147078(s32*, s16); +extern void func_80159B70(void *); +extern void func_8015C714(void *); +extern void func_801483E8(unsigned char*); + + +void func_8015D738(void *arg0) { + + extern u8 D_80078E78[]; + extern u8 D_80184D88[]; + + extern u8 D_80184B08[]; + extern u8 D_80184B18[]; + u8 *p = D_80078E78; + s32 s1; + ((void (*)(void))func_80148AFC)(); + if (func_80161B18(arg0) != 0) return; + if (func_80161B84(arg0) != 0) return; + s1 = *(s32 *)((char *)arg0 + 0x178); + if (s1 != 0) { + if (*(u16 *)s1 == 0x360) goto block_808; + } + __asm__ __volatile__(""); + if (s1 != 0) { + if (*(u16 *)s1 != 0) goto block_7F4; + } + D_80184B44[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; +block_7F4: + if (((s32 (*)(void *))func_80148800)(arg0) & 0x80) { + block_808: + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DAC4)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x10) && ((s32 (*)(void *))func_8014BEF8)(arg0) != 0) { + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DE24)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x20) && p[0x49] == 0xA) { + if (((s32 (*)(void *))func_80165624)(arg0) != 0) { + ((void (*)(void *))func_8015DA5C)(arg0); + ((void (*)(void *))func_8015F948)(arg0); + return; + } + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + func_800CAF14(arg0); + return; + } + if (((s32 (*)(void *))func_801488A8)(arg0) != 0 && *(u16 *)(*(s32 *)((char *)arg0 + 0x178)) != 0x82) { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1B); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80184B08); + } else { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1A); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80184B18); + } + ((void (*)(void *))func_80147A84)(arg0); + ((void (*)(void *))func_801473EC)(arg0); + s1 = *(s32 *)((char *)arg0 + 0x178); + *(s16 *)(s1 + 6) = (s16)((s8)D_80184D88[*(s32 *)((char *)arg0 + 0x234)] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xc)); + *(s16 *)(s1 + 0xa) = (s16)((s8)D_80184D88[*(s32 *)((char *)arg0 + 0x234) + 1] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xe)); + *(s16 *)(s1 + 0xe) = (s16)((s8)D_80184D88[*(s32 *)((char *)arg0 + 0x234) + 2] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0x10)); + ((void (*)(void *, void *))func_80149374)(arg0, (void *)(s1 + 4)); + *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12) = (*(u16 *)(*(s32 *)((char *)arg0 + 0x20) + 0x12) + 0x800) & 0xFFF; + if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { + D_80184B44[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 9); + func_8015C714(arg0); + return; + } + if (func_80161208(arg0) != 0) return; + ((void (*)(void *))func_801483E8)(arg0); +} + DEFINE_func_8015DA5C() /* dedup: shared engine-core @0x8015da5c (src/shared) */ diff --git a/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c b/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c index 56d74b7607..3ea228fd50 100644 --- a/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c +++ b/src/ov_SC03_107/ov_SC03_107_jr_8016AE5C.c @@ -270,7 +270,6 @@ extern void func_8012AD80(s32 a0); extern void func_8012ADE4(u8 *a0); extern s32 *D_80126B78; extern s32 *D_80126B90; -extern s32 D_80126B58; extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); extern s32 func_80013478(s32 a0, s32 a1); extern s32 func_8012AE00(s32 a0); @@ -4630,7 +4629,15 @@ DEFINE_func_8016EFC8() /* dedup: shared engine-core @0x8016efc8 (src/shared) */ DEFINE_func_8016F094() /* dedup: shared engine-core @0x8016f094 (src/shared) */ -INCLUDE_ASM("asm/ov_SC03_107/nonmatchings/ov_SC03_107_jr_8016AE5C", func_8016F0AC); +extern void func_8016F0E4(void); +extern void func_80165770(void); +void func_8016F0AC(void) { + + extern u8 aD80126B58_8016F0AC __asm__("D_80126B58"); + ((void (*)(void *))func_8016F0E4)(&aD80126B58_8016F0AC); + ((void (*)(void *))func_80165770)(&aD80126B58_8016F0AC); +} + /* RECONCILE NOTE (uc3) — the body is byte-unchanged from uc2; only the declaration diff --git a/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c b/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c index eeeb0cc944..79da6f8c7b 100644 --- a/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c +++ b/src/ov_SC06_020/ov_SC06_020_jr_80180B04.c @@ -3325,7 +3325,93 @@ void func_80181A94(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_020/nonmatchings/ov_SC06_020_jr_80180B04", func_80181AD0); + +/* + * func_80181AD0 — "spawn init" state handler. + * + * Sibling-search hit (cookbook §160g): func_8018523C + * (src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c) shares the exact opening + * idiom — func_8012C1B8() -> store result to a0+0x20 -> if zero, + * ((void (*)(s32))func_8012CAE4)(a0); return; else func_8001C214(v0, TABLE[idx]) — and the + * same shared-engine-core template also lives at + * src/shared/engine_core.h:10060 DEFINE_func_80144A98(). Both establish the + * house style used here: `extern void func_8012C1B8(void);` called through + * a `(s32 (*)(void))` cast (the canonical decl elsewhere is void-returning; + * §161c — cast at the call site rather than fighting it), and + * func_8012CAE4/func_8001C214 declared exactly as they already appear + * in this TU (grep hits at src/ov_SC06_018/ov_SC06_018_jr_80186270.c + * lines 2783/2790/2849/2895/2896). + * + * D_8119EC14 is stored by ADDRESS only (lui/addiu, no lw) — §160f array + * declaration to force the address-only store. + * + * The three `lhu ...,0x70($s1); andi ...,0xF` sequences are NOT cached in + * a local — the target re-loads/re-masks independently at the array index, + * the ==4 compare, and the ==5 compare (three separate `lhu+andi` pairs in + * the .s), so the raw expression is repeated at each site rather than + * hoisted into one named temp. + */ + +void func_80181AD0(void *a0) { + extern void func_8012C1B8(void); + extern void func_8012CAE4(void*); + extern void func_8001C214(s32 a0, s32 a1); + extern void func_80049CAC(s32 a0, s32 a1); + extern void func_800484EC(s32 a0, s32 a1, s32 a2); + extern s32 rand(void); + extern s32 D_8019EBFC[]; + extern u8 D_8119EC14[]; + + s16 buf[16]; /* sp+0x10 — output of func_80049CAC / input to func_800484EC */ + s16 rv[3]; /* sp+0x30 — random SVECTOR-ish {x,y,z} */ + s32 w[3]; /* sp+0x38 — {0, 0, 0xFFE80000} scratch handed to func_800484EC */ + s32 v0; + s32 m; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)a0 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(s32))func_8012CAE4)((s32)a0); + return; + } + + func_8001C214(v0, D_8019EBFC[*(u16 *)((s32)a0 + 0x70) & 0xF]); + + *(u16 *)((s32)a0 + 0x10A) = *(u16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36); + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 4) { + *(s32 *)(*(s32 *)((s32)a0 + 0x20) + 0x20) = (s32)D_8119EC14; + } + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 5) { + *(s16 *)((s32)a0 + 0x2) = 2; + return; + } + + w[1] = 0; + w[0] = 0; + w[2] = -0x180000; + m = rand() % 0x80; + if ((rand() & 1) == 0) { + rv[0] = m - 0x380; + } else { + rv[0] = -0x380 - m; + } + + rv[1] = *(u16 *)(*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0x20) + 0x12) + 0x800; + rv[2] = 0; + func_80049CAC((s32)rv, (s32)buf); + + func_800484EC((s32)buf, (s32)w, (s32)a0 + 0x10); + + *(s32 *)((s32)a0 + 0x48) = 0x18000; + *(u16 *)((s32)a0 + 0xFC) = rand() & 0xF0; + *(u16 *)((s32)a0 + 0xFE) = rand() & 0x7F; + *(u16 *)((s32)a0 + 0x100) = rand() & 0x30; + *(s32 *)((s32)a0 + 0x1C) = 0; + *(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1; +} + /* ov_SC06_018 :: func_80181C5C — actor state machine, jump-table switch on the diff --git a/src/ov_SC06_022/ov_SC06_022_jr_80184A28.c b/src/ov_SC06_022/ov_SC06_022_jr_80184A28.c index d6992c599f..b4acb9242a 100644 --- a/src/ov_SC06_022/ov_SC06_022_jr_80184A28.c +++ b/src/ov_SC06_022/ov_SC06_022_jr_80184A28.c @@ -3357,7 +3357,93 @@ void func_801859B8(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_80184A28", func_801859F4); + +/* + * func_801859F4 — "spawn init" state handler. + * + * Sibling-search hit (cookbook §160g): func_8018523C + * (src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c) shares the exact opening + * idiom — func_8012C1B8() -> store result to a0+0x20 -> if zero, + * ((void (*)(s32))func_8012CAE4)(a0); return; else func_8001C214(v0, TABLE[idx]) — and the + * same shared-engine-core template also lives at + * src/shared/engine_core.h:10060 DEFINE_func_80144A98(). Both establish the + * house style used here: `extern void func_8012C1B8(void);` called through + * a `(s32 (*)(void))` cast (the canonical decl elsewhere is void-returning; + * §161c — cast at the call site rather than fighting it), and + * func_8012CAE4/func_8001C214 declared exactly as they already appear + * in this TU (grep hits at src/ov_SC06_018/ov_SC06_018_jr_80186270.c + * lines 2783/2790/2849/2895/2896). + * + * D_811BD33C is stored by ADDRESS only (lui/addiu, no lw) — §160f array + * declaration to force the address-only store. + * + * The three `lhu ...,0x70($s1); andi ...,0xF` sequences are NOT cached in + * a local — the target re-loads/re-masks independently at the array index, + * the ==4 compare, and the ==5 compare (three separate `lhu+andi` pairs in + * the .s), so the raw expression is repeated at each site rather than + * hoisted into one named temp. + */ + +void func_801859F4(void *a0) { + extern void func_8012C1B8(void); + extern void func_8012CAE4(void*); + extern void func_8001C214(s32 a0, s32 a1); + extern void func_80049CAC(s32 a0, s32 a1); + extern void func_800484EC(s32 a0, s32 a1, s32 a2); + extern s32 rand(void); + extern s32 D_801BD324[]; + extern u8 D_811BD33C[]; + + s16 buf[16]; /* sp+0x10 — output of func_80049CAC / input to func_800484EC */ + s16 rv[3]; /* sp+0x30 — random SVECTOR-ish {x,y,z} */ + s32 w[3]; /* sp+0x38 — {0, 0, 0xFFE80000} scratch handed to func_800484EC */ + s32 v0; + s32 m; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)a0 + 0x20) = v0; + if (v0 == 0) { + ((void (*)(s32))func_8012CAE4)((s32)a0); + return; + } + + func_8001C214(v0, D_801BD324[*(u16 *)((s32)a0 + 0x70) & 0xF]); + + *(u16 *)((s32)a0 + 0x10A) = *(u16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36); + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 4) { + *(s32 *)(*(s32 *)((s32)a0 + 0x20) + 0x20) = (s32)D_811BD33C; + } + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 5) { + *(s16 *)((s32)a0 + 0x2) = 2; + return; + } + + w[1] = 0; + w[0] = 0; + w[2] = -0x180000; + m = rand() % 0x80; + if ((rand() & 1) == 0) { + rv[0] = m - 0x380; + } else { + rv[0] = -0x380 - m; + } + + rv[1] = *(u16 *)(*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0x20) + 0x12) + 0x800; + rv[2] = 0; + func_80049CAC((s32)rv, (s32)buf); + + func_800484EC((s32)buf, (s32)w, (s32)a0 + 0x10); + + *(s32 *)((s32)a0 + 0x48) = 0x18000; + *(u16 *)((s32)a0 + 0xFC) = rand() & 0xF0; + *(u16 *)((s32)a0 + 0xFE) = rand() & 0x7F; + *(u16 *)((s32)a0 + 0x100) = rand() & 0x30; + *(s32 *)((s32)a0 + 0x1C) = 0; + *(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1; +} + INCLUDE_ASM("asm/ov_SC06_022/nonmatchings/ov_SC06_022_jr_80184A28", func_80185B80); diff --git a/src/ov_SC06_024/ov_SC06_024_jr_80186F00.c b/src/ov_SC06_024/ov_SC06_024_jr_80186F00.c index 1ce7c6865b..4351b78d79 100644 --- a/src/ov_SC06_024/ov_SC06_024_jr_80186F00.c +++ b/src/ov_SC06_024/ov_SC06_024_jr_80186F00.c @@ -3391,7 +3391,93 @@ void func_80187E90(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_80186F00", func_80187ECC); + +/* + * func_80187ECC — "spawn init" state handler. + * + * Sibling-search hit (cookbook §160g): func_8018523C + * (src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c) shares the exact opening + * idiom — func_8012C1B8() -> store result to a0+0x20 -> if zero, + * func_8012CAE4(a0); return; else func_8001C214(v0, TABLE[idx]) — and the + * same shared-engine-core template also lives at + * src/shared/engine_core.h:10060 DEFINE_func_80144A98(). Both establish the + * house style used here: `extern void func_8012C1B8(void);` called through + * a `(s32 (*)(void))` cast (the canonical decl elsewhere is void-returning; + * §161c — cast at the call site rather than fighting it), and + * func_8012CAE4/func_8001C214 declared exactly as they already appear + * in this TU (grep hits at src/ov_SC06_018/ov_SC06_018_jr_80186270.c + * lines 2783/2790/2849/2895/2896). + * + * D_811BC480 is stored by ADDRESS only (lui/addiu, no lw) — §160f array + * declaration to force the address-only store. + * + * The three `lhu ...,0x70($s1); andi ...,0xF` sequences are NOT cached in + * a local — the target re-loads/re-masks independently at the array index, + * the ==4 compare, and the ==5 compare (three separate `lhu+andi` pairs in + * the .s), so the raw expression is repeated at each site rather than + * hoisted into one named temp. + */ + +void func_80187ECC(void *a0) { + extern void func_8012C1B8(void); + extern void func_8012CAE4(s32 a0); + extern void func_8001C214(s32 a0, s32 a1); + extern void func_80049CAC(s32 a0, s32 a1); + extern void func_800484EC(s32 a0, s32 a1, s32 a2); + extern s32 rand(void); + extern s32 D_801BC468[]; + extern u8 D_811BC480[]; + + s16 buf[16]; /* sp+0x10 — output of func_80049CAC / input to func_800484EC */ + s16 rv[3]; /* sp+0x30 — random SVECTOR-ish {x,y,z} */ + s32 w[3]; /* sp+0x38 — {0, 0, 0xFFE80000} scratch handed to func_800484EC */ + s32 v0; + s32 m; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)a0 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4((s32)a0); + return; + } + + func_8001C214(v0, D_801BC468[*(u16 *)((s32)a0 + 0x70) & 0xF]); + + *(u16 *)((s32)a0 + 0x10A) = *(u16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36); + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 4) { + *(s32 *)(*(s32 *)((s32)a0 + 0x20) + 0x20) = (s32)D_811BC480; + } + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 5) { + *(s16 *)((s32)a0 + 0x2) = 2; + return; + } + + w[1] = 0; + w[0] = 0; + w[2] = -0x180000; + m = rand() % 0x80; + if ((rand() & 1) == 0) { + rv[0] = m - 0x380; + } else { + rv[0] = -0x380 - m; + } + + rv[1] = *(u16 *)(*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0x20) + 0x12) + 0x800; + rv[2] = 0; + func_80049CAC((s32)rv, (s32)buf); + + func_800484EC((s32)buf, (s32)w, (s32)a0 + 0x10); + + *(s32 *)((s32)a0 + 0x48) = 0x18000; + *(u16 *)((s32)a0 + 0xFC) = rand() & 0xF0; + *(u16 *)((s32)a0 + 0xFE) = rand() & 0x7F; + *(u16 *)((s32)a0 + 0x100) = rand() & 0x30; + *(s32 *)((s32)a0 + 0x1C) = 0; + *(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1; +} + /* ov_SC06_018 :: func_80188058 — actor state machine, jump-table switch on the diff --git a/src/ov_SC06_033/ov_SC06_033_jr_80184CF8.c b/src/ov_SC06_033/ov_SC06_033_jr_80184CF8.c index 0e7e7178ff..d35e79af21 100644 --- a/src/ov_SC06_033/ov_SC06_033_jr_80184CF8.c +++ b/src/ov_SC06_033/ov_SC06_033_jr_80184CF8.c @@ -3478,4 +3478,90 @@ void func_801863AC(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_80184CF8", func_801863E8); + +/* + * func_801863E8 — "spawn init" state handler. + * + * Sibling-search hit (cookbook §160g): func_8018523C + * (src/ov_SC03_119/ov_SC03_119_jr_8017FB84.c) shares the exact opening + * idiom — func_8012C1B8() -> store result to a0+0x20 -> if zero, + * func_8012CAE4(a0); return; else func_8001C214(v0, TABLE[idx]) — and the + * same shared-engine-core template also lives at + * src/shared/engine_core.h:10060 DEFINE_func_80144A98(). Both establish the + * house style used here: `extern void func_8012C1B8(void);` called through + * a `(s32 (*)(void))` cast (the canonical decl elsewhere is void-returning; + * §161c — cast at the call site rather than fighting it), and + * func_8012CAE4/func_8001C214 declared exactly as they already appear + * in this TU (grep hits at src/ov_SC06_018/ov_SC06_018_jr_80186270.c + * lines 2783/2790/2849/2895/2896). + * + * D_811AFC08 is stored by ADDRESS only (lui/addiu, no lw) — §160f array + * declaration to force the address-only store. + * + * The three `lhu ...,0x70($s1); andi ...,0xF` sequences are NOT cached in + * a local — the target re-loads/re-masks independently at the array index, + * the ==4 compare, and the ==5 compare (three separate `lhu+andi` pairs in + * the .s), so the raw expression is repeated at each site rather than + * hoisted into one named temp. + */ + +void func_801863E8(void *a0) { + extern void func_8012C1B8(void); + extern void func_8012CAE4(s32 a0); + extern void func_8001C214(s32 a0, s32 a1); + extern void func_80049CAC(s32 a0, s32 a1); + extern void func_800484EC(s32 a0, s32 a1, s32 a2); + extern s32 rand(void); + extern s32 D_801AFBF0[]; + extern u8 D_811AFC08[]; + + s16 buf[16]; /* sp+0x10 — output of func_80049CAC / input to func_800484EC */ + s16 rv[3]; /* sp+0x30 — random SVECTOR-ish {x,y,z} */ + s32 w[3]; /* sp+0x38 — {0, 0, 0xFFE80000} scratch handed to func_800484EC */ + s32 v0; + s32 m; + + v0 = ((s32 (*)(void))func_8012C1B8)(); + *(s32 *)((s32)a0 + 0x20) = v0; + if (v0 == 0) { + func_8012CAE4((s32)a0); + return; + } + + func_8001C214(v0, D_801AFBF0[*(u16 *)((s32)a0 + 0x70) & 0xF]); + + *(u16 *)((s32)a0 + 0x10A) = *(u16 *)(*(s32 *)((s32)a0 + 0x64) + 0x36); + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 4) { + *(s32 *)(*(s32 *)((s32)a0 + 0x20) + 0x20) = (s32)D_811AFC08; + } + + if ((*(u16 *)((s32)a0 + 0x70) & 0xF) == 5) { + *(s16 *)((s32)a0 + 0x2) = 2; + return; + } + + w[1] = 0; + w[0] = 0; + w[2] = -0x180000; + m = rand() % 0x80; + if ((rand() & 1) == 0) { + rv[0] = m - 0x380; + } else { + rv[0] = -0x380 - m; + } + + rv[1] = *(u16 *)(*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0x20) + 0x12) + 0x800; + rv[2] = 0; + func_80049CAC((s32)rv, (s32)buf); + + func_800484EC((s32)buf, (s32)w, (s32)a0 + 0x10); + + *(s32 *)((s32)a0 + 0x48) = 0x18000; + *(u16 *)((s32)a0 + 0xFC) = rand() & 0xF0; + *(u16 *)((s32)a0 + 0xFE) = rand() & 0x7F; + *(u16 *)((s32)a0 + 0x100) = rand() & 0x30; + *(s32 *)((s32)a0 + 0x1C) = 0; + *(u16 *)((s32)a0 + 0x2) = *(u16 *)((s32)a0 + 0x2) + 1; +} +