feat(decomp): ox wave cv overlays — 9 banked

Committed before the main batch: gate_main reverts on failure and would take these with it.
This commit is contained in:
Drew T
2026-08-25 08:21:29 -06:00
parent 352d0b6c31
commit b5dc678a09
8 changed files with 329 additions and 10 deletions
+126 -2
View File
@@ -94,7 +94,7 @@ extern s32 D_800EC6A4;
extern s32 D_800EC690;
extern u8 D_800DA48C[];
extern void func_800CF3E8(void);
extern s32 func_800CFC1C(u8 *arg0);
extern s32 func_800CFC1C();
extern void func_800118AC(void);
void func_800CF078(void) {
@@ -230,7 +230,131 @@ void func_800CFB3C(u16 *arg0)
}
INCLUDE_ASM("asm/md_MAIN_003/nonmatchings/md_MAIN_003", func_800CFC1C);
extern void func_800599B8();
s32 func_800CFC1C(u16 *param_1)
{
extern s32 D_800EC69C;
u8 buf[0x10];
register u16 *cursor __asm__("$18");
register s32 uVar13 __asm__("$16");
register u16 *psVar14 __asm__("$17");
register s32 uVar16 __asm__("$19");
register u32 mask __asm__("$20");
register u16 *puVar9 __asm__("$11");
register u16 *puVar10 __asm__("$12");
register s32 iVar11 __asm__("$13");
u16 tag;
u32 result;
u16 stored;
s32 gate;
register u32 acc __asm__("$2");
register u32 uVar5 __asm__("$7");
register u32 uVar7 __asm__("$6");
register u32 uVar1 __asm__("$4");
register u32 uVar6 __asm__("$3");
register u32 uVar8 __asm__("$8");
register u32 uVar3 __asm__("$10");
cursor = param_1;
uVar16 = 0;
D_800EC69C = D_800EC69C + 1;
gate = D_800EC69C < 2;
if (gate) {
return (u16 *)gate;
}
__asm__ __volatile__("" : "=r"(cursor) : "0"(cursor));
tag = *(u16 *)cursor;
D_800EC69C = 0;
if (tag != 0xff) {
mask = -0x8000;
psVar14 = param_1 + 5;
do {
iVar11 = 0;
if (tag == 9) {
uVar13 = 0;
puVar10 = *(u16 **)(psVar14 + 1);
{
register s32 boff __asm__("$2") = (s32)((s16 *)psVar14)[-1] * 2;
register u16 *pi __asm__("$5");
pi = (u16 *)((s32)puVar10 + boff);
__asm__ __volatile__("" : "=r"(pi) : "0"(pi));
puVar9 = pi;
}
if (0 < (s32)((s16 *)psVar14)[-1]) {
do {
register u32 pix __asm__("$2");
register u32 out __asm__("$9");
pix = (u32)*puVar9;
out = (u32)*puVar10;
uVar5 = pix & 0x1f;
uVar7 = pix & 0x3e0;
uVar1 = pix & 0x7c00;
uVar6 = out & 0x1f;
uVar8 = out & 0x3e0;
uVar3 = out & 0x7c00;
if (uVar5 != uVar6) {
register s32 c __asm__("$2");
uVar13 = 1;
if ((s32)uVar5 < (s32)uVar6) uVar5 = uVar5 + 1;
c = (s32)uVar6 < (s32)uVar5;
if (c) uVar5 = uVar5 - 1;
}
if (uVar7 != uVar8) {
register s32 c __asm__("$2");
uVar13 = 1;
if ((s32)uVar7 < (s32)uVar8) uVar7 = uVar7 + 0x20;
c = (s32)uVar8 < (s32)uVar7;
if (c) uVar7 = uVar7 - 0x20;
}
if (uVar1 != uVar3) {
register s32 c __asm__("$2");
uVar13 = 1;
if ((s32)uVar1 < (s32)uVar3) uVar1 = uVar1 + 0x400;
c = (s32)uVar3 < (s32)uVar1;
if (c) uVar1 = uVar1 - 0x400;
}
acc = uVar5 | uVar7;
result = acc | uVar1 | (out & mask);
stored = result;
if ((stored & 0xFFFF) == 0 && out != 0) {
stored = result | 0x8000;
}
*puVar9 = stored;
puVar9 = puVar9 + 1;
iVar11 = iVar11 + 1;
puVar10 = puVar10 + 1;
} while (iVar11 < (s32)((s16 *)psVar14)[-1]);
}
if (uVar13 != 0) {
register u8 *argp __asm__("$4");
argp = buf;
*(u16 *)(buf + 0) = psVar14[-3];
__asm__ __volatile__("" ::: "memory");
*(u16 *)(buf + 2) = psVar14[-2];
__asm__ __volatile__("" ::: "memory");
*(u16 *)(buf + 4) = psVar14[-1];
__asm__ __volatile__("" ::: "memory");
*(u16 *)(buf + 6) = psVar14[0];
func_800599B8(argp);
}
uVar16 = uVar16 | uVar13;
}
cursor = cursor + 8;
psVar14 = psVar14 + 8;
tag = *(u16 *)cursor;
} while (tag != 0xff);
}
return (u16 *)uVar16;
}
extern s16 D_800EC678;
extern void func_800599B8(u16 *, u16 *);
+35 -1
View File
@@ -143,7 +143,41 @@ void func_800CB190(void *arg0) {
}
INCLUDE_ASM("asm/md_MAIN_033/nonmatchings/md_MAIN_033", func_800CB2C8);
void func_800CB2C8(void *arg0) {
extern void func_80146CA0(s32 *);
extern s32 func_80012ABC(s32, s32, s32);
extern void func_8001382C(s32, void *, void *);
extern void func_80162FC0(s32 *);
void *s1;
register void *p __asm__("$4");
register s32 raw __asm__("$3");
register s32 t __asm__("$2");
s32 r;
s32 buf[3];
s1 = *(void **)((u8 *)arg0 + 0x20);
p = *(void **)((u8 *)arg0 + 0x4C);
raw = *(u8 *)((u8 *)s1 + 0x24);
t = raw - 0x10;
if (t < 0) {
func_80146CA0((s32 *)arg0);
return;
}
raw = t;
__asm__("" : "=r"(raw) : "0"(raw));
t = raw;
*(u8 *)((u8 *)s1 + 0x24) = *(u8 *)((u8 *)s1 + 0x25) = *(u8 *)((u8 *)s1 + 0x26) = t;
r = func_80012ABC(*(s16 *)((u8 *)s1 + 0x12),
*(s16 *)(*(void **)((u8 *)p + 0x20) + 0x12), 0x10);
*(s16 *)((u8 *)s1 + 0x12) = r;
func_8001382C((s16)r, (u8 *)arg0 + 0x24, buf);
*(s32 *)((u8 *)arg0 + 0x10) = buf[0];
*(s32 *)((u8 *)arg0 + 0x14) = buf[1];
*(s32 *)((u8 *)arg0 + 0x18) = buf[2];
func_80162FC0((s32 *)arg0);
}
extern void func_80162CCC(void);
void func_800CB384(void) {
+15 -1
View File
@@ -581,7 +581,21 @@ void func_801E3424(s32 param_1) {
INCLUDE_ASM("asm/md_SC03_134/nonmatchings/md_SC03_134", func_801E3448);
INCLUDE_ASM("asm/md_SC03_134/nonmatchings/md_SC03_134", func_801E346C);
void func_801E346C(s32 a0_) {
extern s32 D_801E9E38;
extern s32 D_801E9E3C;
register s32 c __asm__("$3") = 2;
register s32 a0 __asm__("$4") = a0_;
s32 p1 = D_801E9E38;
*(s16 *)((s32)a0 + 0xFC) = 0;
a0 = D_801E9E3C;
*(s16 *)(p1 + 0xFC) = c;
*(s16 *)((s32)a0 + 0xFC) = 0;
}
void func_801E3490(s32 arg0) {
extern s32 D_801E9E38;
+26 -1
View File
@@ -5287,7 +5287,32 @@ void func_8017FC04(s32 arg0) {
INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8017AE2C", func_8017FCC0);
INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8017AE2C", func_8017FCFC);
extern u16 D_801C7600[];
void func_8017FCFC(u16 *a0) {
register u16 *p __asm__("$5");
register s32 i __asm__("$6");
register s32 c __asm__("$7");
register u16 *q __asm__("$3");
p = D_801C7600;
i = 0;
c = 0x20;
q = p + 2;
do {
if (*(s16 *)(q + 1) == 0) {
*(s16 *)(q + 1) = c;
p[0] = a0[0];
q[-1] = a0[1];
q[0] = a0[2];
return;
}
i++;
q += 4;
p += 4;
} while (i < 0x100);
}
INCLUDE_ASM("asm/ov_SC01_080/nonmatchings/ov_SC01_080_jr_8017AE2C", func_8017FD64);
+8 -1
View File
@@ -8153,7 +8153,14 @@ void func_80184590(s32 param_1) {
}
INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_801845C0);
void func_801845C0(s32 param_1) {
extern u8 D_80126B5C;
extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2);
*(s32 *)&D_80126B5C = *(s32 *)(param_1 + 4);
func_8012C658(0xBA, 1, param_1);
}
s32 func_801845F4(s32 param_1) {
extern s32 func_80172670(s32 *a0);
+37 -1
View File
@@ -7705,7 +7705,43 @@ void func_80188950(s32 arg0) {
}
INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_8017DF98", func_80188A0C);
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
extern void func_8001CA1C(s32 a0, s32 a1);
extern void func_8012A828(s32 a0, void *a1);
extern void func_8012B23C(s32 a0);
extern s32 rand(void);
extern u8 D_801904A8;
extern u8 D_801904B4;
void func_80188A0C(s32 param_1)
{
s32 v0;
s32 s0;
v0 = ((s32 (*)(void))func_8012C1B8)();
s0 = param_1;
*(s32 *)(s0 + 0x20) = v0;
if (v0 == 0) {
func_8012CAE4((void *)s0);
} else {
func_8001CA1C(v0, (s32)&D_801904A8);
func_8012A828((s32)s0, &D_801904B4);
*(s16 *)(s0 + 2) = 1;
func_8012B23C((s32)s0);
*(s32 *)(s0 + 0x10) = ((rand() & 0xFF) - 0x80) << 12;
*(s32 *)(s0 + 0x18) = ((rand() & 0xFF) - 0x80) << 12;
*(s16 *)(*(s32 *)(s0 + 0x20) + 0x18) = 0x2000;
*(s16 *)(*(s32 *)(s0 + 0x20) + 0x1A) = 0x2000;
*(s16 *)(*(s32 *)(s0 + 0x20) + 0x1C) = 0x2000;
*(u16 *)(*(s32 *)(s0 + 0x20) + 0x2C) |= 0x10;
}
}
#include "common.h"
+46 -2
View File
@@ -3403,7 +3403,28 @@ int func_8017D584(int param_1)
}
INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8017BEBC", func_8017D5B4);
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
extern void func_8001C2C4(s32 a0);
extern u8 D_801836F8;
void func_8017D5B4(void *param_1) {
s32 ret;
if (*(u16 *)((s32)param_1 + 2) == 0) {
ret = ((s32 (*)(void))func_8012C1B8)();
*(s32 *)((s32)param_1 + 0x20) = ret;
if (ret == 0) {
func_8012CAE4(param_1);
} else {
func_8001C2C4(ret);
*(u16 *)((s32)param_1 + 0x5C) = 0x40;
*(s32 *)((s32)param_1 + 0x58) = (u32)&D_801836F8;
*(u8 *)((s32)param_1 + 0x75) = 2;
(*(u16 *)((s32)param_1 + 2))++;
}
}
}
extern s32 func_8017D638(void);
@@ -4403,7 +4424,30 @@ void func_8017E948(void *a0) {
}
INCLUDE_ASM("asm/ov_SC04_006/nonmatchings/ov_SC04_006_jr_8017BEBC", func_8017E9EC);
extern u16 D_8019572A;
void func_8017E9EC(s32 s0) {
s32 v0;
s32 v1;
if (func_8012BEE8(s0) != 0) {
v1 = *(s32 *)(s0 + 0x20);
v0 = *(u16 *)(v1 + 0x2C);
v0 &= 0xFFEF;
*(s16 *)(v1 + 0x2C) = v0;
*(s16 *)(s0 + 0x2) = 3;
*(u16 *)(s0 + 0x5C) = D_8019572A;
} else {
s32 a0 = *(s32 *)(s0 + 0x1C);
a0 = (a0 << 10) >> 4;
v0 = func_80047948(a0);
v1 = *(s32 *)(s0 + 0x20);
*(s16 *)(v1 + 0x1C) = v0;
*(s16 *)(v1 + 0x1A) = v0;
*(s16 *)(v1 + 0x18) = v0;
}
}
extern void func_8012A828(s32 a0, s32 a1);
+36 -1
View File
@@ -3937,7 +3937,42 @@ void func_8017D248(s32 param_1, s16 *param_2) {
}
INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8017AE2C", func_8017D3E0);
extern u16 D_80126B66;
extern int func_80178970(void);
extern void func_80178D18(void);
extern s32 func_80178B18(s32 param_1, s32 param_2);
extern void func_8012C218(void *a0);
extern void (*D_80182154[])(s32);
extern void (*D_801821A4[])(void);
void func_8017D3E0(s32 a0) {
switch (*(u16 *)(a0 + 2)) {
case 0:
*(s32 *)(a0 + 0x1C) = 0x14;
*(u16 *)(a0 + 2) = *(u16 *)(a0 + 2) + 1;
break;
case 1:
if (--*(s32 *)(a0 + 0x1C) == 0) {
if ((s16)D_80126B66 < 0x400) {
func_80178B18(a0, (s32)&D_80182154);
} else {
func_80178B18(a0, (s32)&D_801821A4);
}
*(u16 *)(a0 + 2) = *(u16 *)(a0 + 2) + 1;
}
break;
case 2:
if (((s32 (*)(s32))func_80178970)(a0) == 0) {
return;
}
((void (*)(s32))func_80178D18)(a0);
func_8012C218((void *)a0);
return;
default:
return;
}
}
INCLUDE_ASM("asm/ov_SC04_012/nonmatchings/ov_SC04_012_jr_8017AE2C", func_8017D4CC);