feat(phase-26): h_seq family sweep — 26 member-matches banked via remap_hseq

This commit is contained in:
Drew T
2026-08-12 21:07:48 -06:00
parent 4cee2160fe
commit 9c2db69fc8
22 changed files with 1496 additions and 107 deletions
+8 -1
View File
@@ -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);
+64 -1
View File
@@ -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;
}
}
+18 -3
View File
@@ -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)
+165 -20
View File
@@ -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) */
+114 -7
View File
@@ -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) */
+9 -2
View File
@@ -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
+26 -2
View File
@@ -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);
+64 -1
View File
@@ -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;
}
}
+18 -3
View File
@@ -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)
+165 -20
View File
@@ -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) */
+110 -7
View File
@@ -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) */
+9 -2
View File
@@ -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
+8 -1
View File
@@ -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);
+64 -1
View File
@@ -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;
}
}
+18 -3
View File
@@ -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)
+165 -20
View File
@@ -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) */
+114 -7
View File
@@ -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) */
+9 -2
View File
@@ -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
+87 -1
View File
@@ -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
+87 -1
View File
@@ -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);
+87 -1
View File
@@ -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
+87 -1
View File
@@ -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;
}