feat(decomp): O1 wave gate — 16 fns, clean-R22 verified 213/213

parallel_gate merged 17 drafts across 16 binaries then aborted on "check-all: 212 passed, 1 failed".
The red was REAL: ov_SC06_022 still failed from a fully clean rebuild. Reverted that one file
(func_80181664, back to the drafting queue); the remaining 16 verify green with
make clean && make extract-all && make check-all.

CORRECTION to what I claimed while diagnosing the earlier x1 abort: parallel_gate's R22 IS a proper
clean rebuild — it calls sh(["make","clean"]) at tools/parallel_gate.py:257 before extract-all and
check-all. I had grepped for the string "make clean", which cannot match the arg-list form, and
wrongly concluded the tool was reading incrementally. The x1 red was real too; my revert of its two
bad drafts is what made the fleet green. The genuinely stale read was MY OWN bare `make check-all`
run after that revert, which still reported the old 211/213 from leftover objects and nearly led me
to discard 21 good banks. R40 (exonerate the instrument) applies to the instrument's SOURCE, not
just its output: read the code before blaming it.
This commit is contained in:
Drew T
2026-08-30 14:48:21 -06:00
parent a1024ab76d
commit 8fcd05965e
15 changed files with 459 additions and 18 deletions
+35 -1
View File
@@ -107,7 +107,41 @@ void func_800CB158(s32 arg0) {
}
INCLUDE_ASM("asm/md_MAIN_016/nonmatchings/md_MAIN_016", func_800CB228);
typedef struct {
s32 a, b, c, d;
} Blk16;
void func_800CB228(s32 arg0) {
register s32 ent __asm__("$7");
register s32 oth __asm__("$5");
s32 cnt;
s32 p;
u16 t0;
u16 t1;
ent = arg0;
cnt = *(s32 *)(ent + 0x1C);
oth = *(s32 *)(ent + 0x34);
*(s32 *)(ent + 0x1C) = cnt + 1;
if (cnt < 10) {
*(u16 *)(ent + 0x28) = *(u16 *)(ent + 0x28) + 0x120;
} else {
t0 = *(u16 *)(ent + 2);
*(s16 *)(ent + 0x12) = (*(u16 *)(oth + 0x12) << 16) >> 17;
t1 = *(u16 *)(oth + 0x1A);
t0 += 1;
*(s32 *)(ent + 0x30) = 0x20;
*(s32 *)(ent + 0x1C) = -0xC0;
*(u16 *)(ent + 0x2A) = 0x500;
*(u16 *)(ent + 2) = t0;
*(s16 *)(ent + 0x1A) = (t1 << 16) >> 17;
}
p = *(s32 *)(oth + 0x20);
*(Blk16 *)(ent + 0x38) = *(Blk16 *)(p + 0x34);
*(Blk16 *)(ent + 0x48) = *(Blk16 *)(p + 0x44);
func_800CAF84(ent);
}
void func_800CB304(s32 arg0) {
extern void func_800CAF84();
+12 -1
View File
@@ -29,7 +29,18 @@ void func_800CAE88(void *a0) {
}
INCLUDE_ASM("asm/md_MAIN_026/nonmatchings/md_MAIN_026", func_800CAEC0);
void func_800CAEC0(void *arg0) {
extern s32 func_80165910(void);
extern void func_801655E4(s32 arg0);
extern void func_80147324(s32 arg0);
if (func_80165910() == 0) {
func_801655E4((s32)arg0);
func_80147324(0x7B8);
}
*(u8 *)((s32)arg0 + 0x197) += 1;
}
extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32);
+12 -1
View File
@@ -1,6 +1,17 @@
#include "common.h"
INCLUDE_ASM("asm/md_MAIN_040/nonmatchings/md_MAIN_040", func_800CAE0C);
#include "common.h"
extern void func_800183E0(s32 a0);
void func_800CAE0C(void) {
extern s32 D_800CB9F4;
extern s32 D_800CB9B4;
func_800183E0((s32)&D_800CB9F4);
func_800183E0((s32)&D_800CB9B4);
}
+73 -2
View File
@@ -2478,7 +2478,49 @@ s32 func_801A419C(s32 arg0) {
INCLUDE_ASM("asm/md_SC07_003/nonmatchings/md_SC07_003", func_801A4268);
INCLUDE_ASM("asm/md_SC07_003/nonmatchings/md_SC07_003", func_801A43E8);
extern void func_8002D4C8(s32 a0, s32 a1);
void func_801A43E8(void *a0) {
switch (*(u16 *)((s32)a0 + 0x5E)) {
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 35:
func_8002D4C8(0xC33, 0);
*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) += 0x2000;
break;
case 11:
case 12:
case 18:
case 19:
case 20:
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
func_8002D4C8(0xC33, 0);
*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) += 0x4000;
break;
case 36:
func_8002D4C8(0xC33, 0);
*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) += 0x4000;
break;
default:
*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) += 0x2000;
break;
}
if (*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) > 0x10000) {
*(s32 *)(*(s32 *)((s32)a0 + 0x64) + 0xE8) = 0x10000;
}
}
@@ -3504,7 +3546,36 @@ void func_801A5A9C(s32 a0) {
}
INCLUDE_ASM("asm/md_SC07_003/nonmatchings/md_SC07_003", func_801A5AE0);
extern void func_8001CD50(s32 a0, s32 a1);
extern void func_800233CC(void *a0, u16 a1);
extern u8 D_801F4444[];
extern u8 D_801F4448[];
typedef struct { u8 d[4]; } Blk4;
const Blk4 D_801A01CC = {{0x00, 0x00, 0x00, 0x00}};
const Blk4 D_801A01D0 = {{0xFF, 0x80, 0x00, 0x00}};
void func_801A5AE0(void *a0) {
void *s1 = D_801F4444;
func_8001CD50(*(s32 *)((s32)a0 + 0x20), (s32)s1);
*(u16 *)((s32)a0 + 0xA) -= 0x100;
*(s32 *)(*(s32 *)((s32)a0 + 0x20) + 0x4) |= 0x50000000;
*(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x10) = 0x400;
*(u16 *)((s32)a0 + 0x2C) = 0x10;
func_800233CC(s1, 0x10);
*(Blk4 *)s1 = D_801A01CC;
*(Blk4 *)D_801F4448 = D_801A01D0;
*(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x1E) = 0xC00;
*(u16 *)((s32)a0 + 0x2) += 1;
}
#include "common.h"
+27 -1
View File
@@ -5385,7 +5385,33 @@ void func_801847F8(void *a0) {
}
INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8017F690", func_80184834);
void func_80184834(s32 param_1) {
extern s32 func_80014C54(s32, s32, s32);
extern void func_8012A828(s32 a0, void *a1);
extern s32 D_8018A978[];
s16 v;
u16 t;
s32 iVar3;
s32 base;
v = func_80014C54(1, 0, 0x40);
if (v != 0) {
*(s16 *)(*(s32 *)(param_1 + 0x20) + 0x12) += 0x200;
}
v = func_80014C54(1, 0, 0x20);
if (v != 0) {
t = *(u16 *)(param_1 + 0xFC) + 1;
*(u16 *)(param_1 + 0xFC) = t;
base = D_8018A978[*(s16 *)(param_1 + 0x70)];
iVar3 = *(s32 *)(((t << 16) >> 14) + base);
if (iVar3 == 0) {
*(u16 *)(param_1 + 0xFC) = 0;
iVar3 = *(s32 *)D_8018A978[*(s16 *)(param_1 + 0x70)];
}
func_8012A828(param_1, (void *)iVar3);
}
}
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
+33 -2
View File
@@ -9951,7 +9951,7 @@ extern void func_8013CABC(void);
extern void func_80186728(void *a0);
extern s32 func_8012BEE8(s32 a0);
extern void func_80186070(s32 a0);
extern s32 func_80185FA0(s32 a0);
extern s32 func_80185FA0();
extern int func_80178970(void);
extern s32 func_80188114(void);
extern s32 D_801EB520;
@@ -10001,7 +10001,38 @@ void func_80185E20(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_80185FA0);
extern u16 D_800B99D8;
extern s32 func_80132EF4(s32 a0, s32 a1);
s32 func_80185FA0(s32 param_1)
{
s32 q;
s32 iVar5;
s32 iVar4;
s16 sVar1;
iVar5 = 0;
do {
q = func_80132EF4(param_1, 0x22);
if (q != 0) {
iVar4 = iVar5 + (D_800B99D8 & 4) * 3 - 0x2A;
*(s16 *)(q + 6) = *(u16 *)(q + 6) + iVar4;
*(s16 *)(q + 0xA) = *(u16 *)(q + 0xA) - 0x20;
*(s16 *)(q + 0xE) = *(u16 *)(q + 0xE) - 0x28;
iVar4 = iVar4 << 16;
if ((iVar4 >> 16) >= 0) {
sVar1 = (s16)((iVar4 >> 16) << 7);
} else {
sVar1 = (s16)(-((iVar4 >> 16) << 7));
}
*(s16 *)(q + 0x34) = sVar1 + 0x1000;
*(s32 *)(q + 0x14) = 0xFFFE0000;
*(s32 *)(q + 0x18) = 0xFFFD0000;
}
iVar5 += 0x18;
} while (iVar5 < 0x49);
}
extern void func_8001CA1C(s32 a0, s32 a1);
+31 -1
View File
@@ -5605,7 +5605,37 @@ s32 func_801809E4(s32 a0, s32 a1, s32 a2) {
}
INCLUDE_ASM("asm/ov_SC02_035/nonmatchings/ov_SC02_035_jr_8017BEBC", func_80180B38);
typedef struct { s32 w[8]; } Blk20_80180B38;
extern s32 func_8012B6D4(s16 *a0, s16 *a1);
extern void RotMatrixY(s32 a0, void *a1);
extern void func_800484EC(s32 a0, s32 a1, s32 a2);
extern Blk20_80180B38 D_800AE620;
s32 func_80180B38(s32 a0, s32 a1)
{
s32 partner;
s32 pad[4];
Blk20_80180B38 mat;
s32 ang;
s32 trailing[4];
partner = *(s32 *)(a0 + 0x2C);
if (*(u16 *)partner == 0) {
return 0;
}
mat = D_800AE620;
ang = func_8012B6D4((s16 *)(a0 + 4), (s16 *)(partner + 4));
RotMatrixY(ang, &mat);
trailing[1] = 0;
trailing[0] = 0;
trailing[2] = a1;
func_800484EC((s32) &mat, (s32) trailing, a0 + 0x10);
return 1;
}
void func_80180C10(s32 param)
{
+37 -1
View File
@@ -4329,7 +4329,43 @@ void func_8018046C(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8017DF84", func_80180580);
extern void func_80183094(void);
extern void func_8014706C(void *arg0);
extern void func_80154274(s32 *a0, s32 a1);
extern void func_80154A74(s32 a0, s32 a1);
extern void func_8013C9C4(void *a0);
extern void func_80015978(s32 a0, s32 *a1);
extern u8 *func_801290DC(s32 arg0, u8 *arg1);
extern void func_80147324(s32 arg0);
extern s32 func_80171990(u8 *a0);
extern s32 D_800D5904;
extern u8 D_8018B030[];
void func_80180580(s32 *a0)
{
s16 buf[4];
s32 i;
if (*(s16 *)((s32)a0 + 0xA) > -0x83) {
i = 0;
func_80183094();
*(s16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12) = 0;
*(s16 *)(*(s32 *)((s32)a0 + 0x20) + 0x10) = 0xC00;
func_8014706C(a0);
func_80154274(a0, (s32)&D_800D5904);
func_80154A74((s32)a0, 0x20);
func_8013C9C4(D_8018B030);
*(s32 *)((s32)a0 + 0x200) = 0x10;
func_80015978((s32)a0 + 4, (s32 *)buf);
buf[1] -= 0x20;
for (i = 0; i < 0x14; i++) {
func_801290DC(0x64, (u8 *)buf);
}
func_80147324(0x949);
func_80171990((u8 *)a0);
}
}
+32 -1
View File
@@ -3741,7 +3741,38 @@ void func_801816C8(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8017FF7C", func_80181708);
void func_80181708(void *a0) {
extern s32 *D_80126B78;
extern s32 *D_8018B9A4[];
extern u8 func_8014BF6C(void);
extern void func_8012F214(s32 a0, s32 a1, s32 a2);
extern void func_8012B260(u8 *a0);
typedef struct { s32 w[8]; } Blk32_80181708;
Blk32_80181708 *dst;
Blk32_80181708 *src;
u8 result;
s16 field70;
u16 sp10[3];
dst = (Blk32_80181708 *)((u8 *)*(s32 **)((u8 *)a0 + 0x20) + 0x34);
src = (Blk32_80181708 *)((u8 *)D_80126B78 + 0x34);
*dst = *src;
result = func_8014BF6C();
field70 = *(s16 *)((u8 *)a0 + 0x70);
func_8012F214((s32)a0,
(s32)D_8018B9A4[result & 0xFF] + (field70 << 3),
(s32)sp10);
*(s16 *)((u8 *)a0 + 0x6) = sp10[0];
*(s16 *)((u8 *)a0 + 0xA) = sp10[1];
*(s16 *)((u8 *)a0 + 0xE) = sp10[2];
func_8012B260((u8 *)a0);
}
void func_801817D8(u8 *a0, u8 *a1) {
u16 sp0[3];
+25 -1
View File
@@ -4998,7 +4998,31 @@ void func_8017EFD8(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_030/nonmatchings/ov_SC03_030_jr_8017AE2C", func_8017F018);
extern s32 *D_80126B78;
extern u8 func_8014BF6C(void);
extern void func_8012F214(s32 a0, s32 a1, s32 a2);
extern void func_8012B260(u8 *a0);
extern void *D_801859E8[];
void func_8017F018(s32 a0) {
s32 p;
u8 idx;
u16 out[4];
p = *(s32 *)(a0 + 0x20);
*(Blk32 *)(p + 0x34) = *(Blk32 *)((s32)D_80126B78 + 0x34);
idx = func_8014BF6C();
func_8012F214(a0, (s32)D_801859E8[idx] + (*(s16 *)(a0 + 0x70) << 3), (s32)out);
*(s16 *)(a0 + 0x6) = out[0];
*(s16 *)(a0 + 0xA) = out[1];
*(s16 *)(a0 + 0xE) = out[2];
func_8012B260((u8 *)a0);
}
extern u8 *func_801290DC(s32 a0, u8 *a1);
+27 -1
View File
@@ -5742,7 +5742,33 @@ s32 func_80182574(s32 a0, s32 a1, s32 a2) {
}
INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8017D898", func_801826C8);
extern s32 func_8012B6D4(s16 *a0, s16 *a1);
extern void func_800484EC(s32 a0, s32 a1, s32 a2);
extern void RotMatrixY(s32 a0, void *a1);
extern Blk20 D_800AE620;
s32 func_801826C8(s32 arg0, s32 arg1)
{
s32 pad[4];
Blk20 mat;
s32 vec[4];
s16 *ptr;
ptr = *(s16 **)(arg0 + 0x2C);
if (*(u16 *)ptr == 0) {
return 0;
}
mat = D_800AE620;
RotMatrixY(func_8012B6D4((s16 *)(arg0 + 4), ptr + 2), &mat);
vec[1] = 0;
vec[0] = 0;
vec[2] = arg1;
func_800484EC((s32)&mat, (s32)vec, arg0 + 0x10);
return 1;
}
extern s32 func_8004787C(s32 a0);
+17 -1
View File
@@ -4600,7 +4600,23 @@ void func_8017D9C8(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_119/nonmatchings/ov_SC03_119_jr_8017AE2C", func_8017DA98);
extern s16 D_80126B30;
extern s16 D_80126B3A;
extern s32 D_8012750C;
extern s16 D_8011F9C8;
extern void func_80174684(void *);
extern void func_8017DB00(void *);
struct S8_8017DA98 { s16 m[4]; };
void func_8017DA98(s16 a0, void *a1, s32 a2) {
*(struct S8_8017DA98 *)&D_80126B30 = *(struct S8_8017DA98 *)a1;
D_80126B3A = a0;
D_8012750C = a2;
func_80174684((void *)func_8017DB00);
(*(s32 *)&D_8011F9C8) = 0;
}
extern void (*D_8018D620[])(void);
+43 -1
View File
@@ -9007,7 +9007,49 @@ void func_80184AA8(void *a0) {
}
INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_80184B30);
#include "common.h"
extern void func_8012C1B8(void);
extern void func_8001C214(s32 a0, s32 a1);
extern void func_8012C194(void);
extern void func_8012CAE4(void *a0);
extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3);
extern void func_80143994(s32 a0, s32 a1);
extern u8 D_801A960C[];
void func_80184B30(s32 param_1) {
s32 v0;
s32 s0;
u16 tmp;
v0 = ((s32 (*)(void))func_8012C1B8)();
*(s32 *)(param_1 + 0x20) = v0;
if (v0 == 0) {
func_8012CAE4((void *)param_1);
return;
}
func_8001C214(v0, 0);
v0 = *(s32 *)(param_1 + 0x20);
*(s16 *)(v0 + 0x1A) = 0x1800;
*(s16 *)(v0 + 0x18) = 0x1800;
s0 = ((s32 (*)(void))func_8012C194)();
if (s0 == 0) {
func_8012CAE4((void *)param_1);
return;
}
*(s32 *)(param_1 + 0xCC) = s0;
func_8001CB6C((u8 *)s0, D_801A960C, 0x2E0, 0x100);
*(u8 *)(s0 + 0x27) = 0x37;
*(u16 *)(s0 + 0x10) = 0x400;
*(s32 *)(s0 + 0x4) |= 0x50000000;
tmp = *(u16 *)(param_1 + 0xFC);
*(s16 *)(s0 + 0x1A) = 0x1800;
*(s16 *)(s0 + 0x18) = 0x1800;
*(u16 *)(s0 + 0x14) = tmp;
*(s16 *)(param_1 + 2) = 1;
func_80143994(param_1, 0x1000);
}
extern void func_8012B2CC(s32 a0);
+31 -1
View File
@@ -2899,7 +2899,37 @@ extern void func_8012AD44(s32 *a0, s16 a1);
}
INCLUDE_ASM("asm/ov_SC06_024/nonmatchings/ov_SC06_024_jr_80181D34", func_80181EF4);
extern void func_801825A4(s32 a0);
extern void func_8002D4C8(s32 a0, s32 a1);
extern void func_8012AD44(s32 *a0, s16 a1);
extern s16 D_801AC426[];
extern u8 D_801AC45C[];
void func_80181EF4(s32 param_1) {
*(u16 *)(param_1 + 0xFE) = 0;
*(s32 *)(param_1 + 0x1C) = D_801AC426[*(s16 *)(param_1 + 0x70) * 4];
if (*(s16 *)(param_1 + 0x70) == 0) {
if (*(s32 *)(param_1 + 0xCC) != 0) {
func_801825A4(*(s32 *)(param_1 + 0xCC));
}
if (*(s32 *)(param_1 + 0xD0) != 0) {
func_801825A4(*(s32 *)(param_1 + 0xD0));
}
if (*(s32 *)(param_1 + 0xD4) != 0) {
func_801825A4(*(s32 *)(param_1 + 0xD4));
}
if (*(s32 *)(param_1 + 0xD8) != 0) {
func_801825A4(*(s32 *)(param_1 + 0xD8));
}
*(s32 *)(param_1 + 0x58) = (s32)D_801AC45C;
*(u16 *)(param_1 + 0x5C) = 0x800;
*(u8 *)(param_1 + 0x75) = 8;
*(u16 *)(param_1 + 0x106) = 0;
func_8002D4C8(0x94F, 0);
}
((void (*)(s32, s32))func_8012AD44)(param_1, 2);
}
void func_80181FD4(void *a0) {
extern u8 D_8018FF4C;
+24 -2
View File
@@ -5911,7 +5911,29 @@ void func_8018247C(void)
}
INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8017C8D0", func_80182538);
extern s32 func_80132EF4(s32 a0, s32 a1);
extern s32 rand(void);
void func_80182538(s32 param_1)
{
s32 p;
s32 r;
s32 t;
s32 f;
p = func_80132EF4(param_1, 0x72);
if (p != 0) {
r = 0x30;
t = *(u16 *)(p + 6) - r + rand() % 96;
f = *(u16 *)(p + 0xA);
*(u16 *)(p + 6) = t;
*(u16 *)(p + 0xA) = *(u16 *)(param_1 + 0x52) + (f + 0x80);
r = 0x30;
t = *(u16 *)(p + 0xE) - r + rand() % 96;
*(u16 *)(p + 0xE) = t;
}
}
extern void func_8012AD44(s32 *a0, s16 a1);
extern u16 D_8018A464[];
@@ -6262,7 +6284,7 @@ void func_80182C68(s32 a0)
extern void func_8018247C(void);
extern void func_80182270(void *a0);
extern void func_8018241C(void *a0);
extern void func_80182538(void *a0);
extern void func_80182538();
extern void func_80181FE8(void *a0);
extern u16 D_800B99DA;
extern u16 D_8019FF8A;