feat(decomp): x1 wave gate — 21 binaries, clean-R22 verified 213/213

The x1 parallel_gate merged 23 files then ABORTED on 'check-all: 211 passed, 2 failed'
(ov_SC03_124, ov_SC03_001), correctly leaving the merge in the tree for inspection (R42).

That red was a STALE INCREMENTAL ARTIFACT, not a bad draft: after reverting the two named
binaries' files, a bare 'make check-all' still reported the same 211/213, but rebuilding
ov_SC03_124 from a cleaned build dir produced 0b3991853c39d8c3d8d12e145e3312dd333f2189 —
exactly config/check.ov_SC03_124.sha. The authoritative sweep (make clean && make extract-all
&& make check-all) then returned 213 passed, 0 failed of 213.

Lesson re-earned (R22's own rationale): a bare check-all is an incremental read and must never
be used to diagnose a red fleet — it nearly cost 21 byte-verified banks. The two reverted
drafts (func_8018009C, func_80182BB8) go back to the drafting queue.
This commit is contained in:
Drew T
2026-08-30 14:27:23 -06:00
parent ebde3e546d
commit d20007e049
21 changed files with 1095 additions and 31 deletions
+52 -1
View File
@@ -91,7 +91,58 @@ void func_800CAFE8(void *arg0) {
}
INCLUDE_ASM("asm/md_MAIN_033/nonmatchings/md_MAIN_033", func_800CB058);
void func_800CB058(s32 arg0)
{
extern u8 D_800CB8B0[];
extern s32 D_800CB984;
extern u8 D_800CB988[];
extern void func_80146578(void);
extern void func_800CB384(void);
extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3);
extern void func_80149374(s32 a0, s32 a1);
extern void func_80146DE8(s32 *a0, s32 a1, s32 a2, s32 a3);
extern void func_80146E90(s32 *a0, s32 a1);
extern void func_80146CA0(void *a0);
extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6);
extern void func_80147324(s32 a0);
register s32 s1a __asm__("$17");
register s32 s2a __asm__("$18");
register s32 s0a __asm__("$16");
register s32 maska __asm__("$6");
register s32 fptr __asm__("$6");
register s32 q __asm__("$5");
register s32 p __asm__("$4");
s32 v0w;
s32 cnt;
s1a = arg0;
s2a = *(s32 *)(s1a + 0x4C);
s0a = ((s32 (*)(void))func_80146578)();
*(s32 *)(s1a + 0x20) = s0a;
if (s0a == 0) goto fail;
func_8001CB6C((u8 *)s0a, (s32)D_800CB8B0, 0x1A0, 0x100);
maska = 0x50001000;
p = s2a;
q = (s32)(s1a + 4);
v0w = *(u32 *)(s0a + 4);
*(u8 *)(s0a + 0x27) = 0x19;
*(u32 *)(s0a + 4) = (v0w | maska) & ~0x40;
fptr = *(s32 *)(p + 0x20);
cnt = D_800CB984++;
*(s16 *)(s0a + 0x12) = *(s16 *)(fptr + 0x12);
*(s16 *)(s0a + 0x10) = 0x400;
*(s32 *)(s0a + 0x34) = (s32)D_800CB988 + ((cnt & 7) * 32);
func_80149374(p, q);
func_80146DE8(s1a, 0, 0, -0x100000);
func_80146E90(s1a, 0x3C);
func_80146CA0(s1a);
func_80146A6C(0x4A, s1a, *(s16 *)(s1a + 6), *(s16 *)(s1a + 0xA), *(s16 *)(s1a + 0xE), 0, 0);
func_80147324(0x8EF);
return;
fail:
((void (*)(s32))func_800CB384)(s1a);
}
void func_800CB190(void *arg0) {
extern void func_80147324(s32);
+43 -3
View File
@@ -181,7 +181,7 @@ void func_800CCFA8(s32 param_1)
extern void func_80146578(void);
extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3);
extern void func_80146CA0(void *a0);
extern void func_800CD204(void);
extern void func_800CD204();
extern void func_800CD1A8(void);
extern u8 D_800CD66C;
@@ -211,7 +211,7 @@ void func_800CD010(s32 param_1)
}
extern void func_800CD204(void);
extern void func_800CD204();
extern s32 func_80163408(s32 a0, s32 a1, s32 a2, s32 a3);
extern void func_80163328();
extern s32 func_801632F0();
@@ -258,7 +258,47 @@ void func_800CD1A8(void) {
}
INCLUDE_ASM("asm/md_MAIN_045/nonmatchings/md_MAIN_045", func_800CD204);
extern s16 func_8012A758(void);
extern s32 func_80013694(s16 a0, void *a1, void *a2);
extern void func_800139C8(s32 a0, void *a1, void *a2);
extern void func_80015954(void *a0, s32 a1);
extern s32 func_8004787C(s32 a0);
extern s32 func_80047948(s32 a0);
extern u8 D_800CD6BC[];
void func_800CD204(s32 arg0) {
u16 sp10[3];
s32 y;
s32 x;
s32 w;
s32 t;
s32 v1;
s16 ang;
y = *(s32 *)(arg0 + 0x4C);
x = *(s32 *)(arg0 + 0x20);
ang = func_8012A758();
func_80013694(*(s16 *)(x + 0x10), D_800CD6BC, sp10);
func_800139C8((s16)(ang + 0x400), sp10, sp10);
w = *(s32 *)(y + 0x20);
sp10[0] = sp10[0] + *(s32 *)(w + 0x48);
t = sp10[1] - 0x20;
sp10[1] = t + *(s32 *)(w + 0x4C);
sp10[2] = sp10[2] + *(s32 *)(w + 0x50);
v1 = func_80047948(*(s16 *)(arg0 + 0x60));
if (v1 < 0) {
v1 += 0x1FF;
}
sp10[0] = sp10[0] + (v1 >> 9);
v1 = func_8004787C(*(s16 *)(arg0 + 0x60));
if (v1 < 0) {
v1 += 0xFF;
}
sp10[1] = sp10[1] + (v1 >> 8);
*(u16 *)(arg0 + 0x60) = (*(u16 *)(arg0 + 0x60) + 0x38) & 0xFFF;
func_80015954(sp10, arg0 + 4);
}
extern s32 func_80161A00(s32 a0);
extern void (*D_800CD6C4[])(void);
+49 -1
View File
@@ -3442,7 +3442,55 @@ INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E1A
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E210);
INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E3A0);
void func_8017E3A0(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg4, s32 arg5)
{
extern u8 *D_800A5E60;
extern u8 D_800AF630[];
extern u8 D_800AA608[];
u8 *prim;
u8 *fl;
u32 *q;
u32 *addrw;
u32 v1;
u32 val;
u32 mlo, mhi;
volatile s32 pad;
prim = D_800A5E60;
fl = D_800AF630;
prim[3] = 4;
prim[7] = 0x50;
if (arg5 == 0) {
prim[0xC] = 0xFF;
prim[0xE] = 0;
prim[0xD] = 0;
prim[4] = arg4;
prim[6] = 0;
} else {
prim[0xE] = 0xFF;
prim[0xD] = 0;
prim[0xC] = 0;
prim[6] = arg4;
prim[4] = 0;
}
prim[5] = 0;
__asm__ __volatile__("");
mlo = 0xFFFFFF;
((u16 *)prim)[5] = a1;
mhi = 0xFF000000;
((u16 *)prim)[4] = a0;
((u16 *)prim)[8] = a2;
((u16 *)prim)[9] = a3;
*(u32 *)prim = (*(u32 *)prim & mhi) | (*(u32 *)&D_800AA608[*(u16 *)(fl + 0xA3D2) << 14] & mlo);
q = (u32 *)D_800AA608;
addrw = (u32 *)((s32)q + (*(u16 *)(fl + 0xA3D2) << 14));
v1 = (u32)prim & mlo;
val = *addrw;
D_800A5E60 = (prim += 20);
*addrw = (val & mhi) | v1;
}
void func_8017E4A0(void)
{
+40 -1
View File
@@ -4022,7 +4022,46 @@ void func_8017FE78(s32 a0)
void func_8017FED0(void) {
}
INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8017E590", func_8017FED8);
extern s16 D_801F32D8;
extern u8 D_801202A0[];
s32 func_8017FED8(s32 a0) {
s16 i;
u8 *e;
u8 *p;
s16 cur;
if (--*(s16 *)(a0 + 0x102) == -1) {
i = 0;
e = D_801202A0;
for (;;) {
p = e + 0x102;
__asm__ __volatile__("" :: "r"(p));
if (*(u16 *)(e + 0) != 0x1AB) goto next;
if (*(s16 *)(p - 0x92) != 0x2B) goto next;
cur = D_801F32D8;
if (*(s16 *)(p - 0x6) != cur - 1) goto next;
if (*(s32 *)(p - 0x36)) {
*(s16 *)(a0 + 0x102) = 0;
return 0;
}
D_801F32D8 = cur - 1;
*(s16 *)p = 1;
if (D_801F32D8 & 1) {
*(s16 *)(a0 + 0x102) = 9;
} else {
*(s16 *)(a0 + 0x102) = 4;
}
break;
next:
++i;
e += 0x10C;
if ((s16)i >= 0x60) break;
}
}
return D_801F32D8 < 2;
}
INCLUDE_ASM("asm/ov_SC01_009/nonmatchings/ov_SC01_009_jr_8017E590", func_8017FFD0);
+44 -1
View File
@@ -4221,7 +4221,50 @@ void func_8017D9C4(void *a0)
}
INCLUDE_ASM("asm/ov_SC02_004/nonmatchings/ov_SC02_004_jr_8017AE2C", func_8017DA30);
extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3);
extern void func_80128EA8();
extern s32 rand(void);
extern u8 D_800D387C[];
extern u8 D_800D3888[];
extern u8 D_801817A4[];
extern u8 D_801817B0[];
void func_8017DA30(s32 a0) {
register s32 ent __asm__("$16");
s32 sub;
s32 hw;
u32 r;
ent = a0;
sub = *(s32 *)((u8 *)ent + 0x20);
if (*(s16 *)((u8 *)ent + 0x2E) != 0) {
func_8001CC3C(sub, (s32)D_800D387C, 0, 0);
*(u8 *)((u8 *)sub + 0x27) = 0x9C;
*(u16 *)((u8 *)sub + 0x1A) = 0x4000;
*(u16 *)((u8 *)sub + 0x18) = 0x4000;
*(s32 *)((u8 *)sub + 4) |= 0x50000040;
func_80128EA8(sub, (s32)((u8 *)ent + 0x24), (s32)D_800D3888);
hw = 0x2C;
} else {
register s32 q __asm__("$4");
register s32 p __asm__("$5");
register s32 e __asm__("$6");
func_8001CC3C(sub, (s32)D_801817A4, 0, 0);
q = sub;
p = (s32)((u8 *)ent + 0x24);
e = (s32)D_801817B0;
__asm__ __volatile__("" : "=r"(q), "=r"(p), "=r"(e) : "0"(q), "1"(p), "2"(e));
*(u8 *)((u8 *)q + 0x27) = 0x33;
func_80128EA8(q, p, e);
hw = 0x1C;
}
*(u16 *)((u8 *)ent + 0x1A) = hw;
r = rand();
*(s16 *)((u8 *)ent + 0x12) = (r & 0x3F) - 0x20;
*(u16 *)((u8 *)ent + 0x16) = 0x20 - ((r >> 4) & 0x3F);
*(u16 *)((u8 *)ent + 2) += 1;
}
void func_8017DB2C(s32 a0) {
s32 ret;
+161 -5
View File
@@ -5793,7 +5793,48 @@ s16 param_3;
}
INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_80181D30", func_80186424);
extern u8 D_80126B5C;
extern s32 D_80126B60;
extern u16 D_80126B62;
extern s32 D_80126B64;
extern u16 D_80126B66;
extern s32 *D_80126B78;
extern void func_8012F0BC(s32 *a0, s32 *a1, s32 *a2);
extern void func_8012F1A4(s32 *a0, s32 a1, s32 *a2);
extern void func_80132784(s32 a0, s32 a1, u32 a2);
void func_80186424(s32 arg0)
{
if (*(u8 *)(arg0 + 0x74) != 0) {
extern s32 gVecX __asm__("D_80126B5C");
s32 in[4];
s32 out[4];
s32 tmp[4];
u16 h;
in[0] = gVecX;
in[1] = D_80126B60;
in[2] = D_80126B64;
func_8012F0BC((s32 *)(*(s32 *)(arg0 + 0x20) + 0x34), in, tmp);
func_80132784(arg0, *(s32 *)(arg0 + 0x64), *(u16 *)(arg0 + 0xFC));
func_8012F1A4((s32 *)(*(s32 *)(arg0 + 0x20) + 0x34), (s32)tmp, out);
gVecX = out[0];
D_80126B60 = out[1];
D_80126B64 = out[2];
h = *((u16 *)&gVecX + 1);
*(u16 *)((s32)D_80126B78 + 8) = h;
*(s32 *)((s32)D_80126B78 + 0x48) = (s32)(s16)h;
__asm__ __volatile__("" ::: "memory");
*(u16 *)((s32)D_80126B78 + 0xA) = D_80126B62;
*(s32 *)((s32)D_80126B78 + 0x4C) = (s32)(s16)D_80126B62;
__asm__ __volatile__("" ::: "memory");
*(u16 *)((s32)D_80126B78 + 0xC) = D_80126B66;
*(s32 *)((s32)D_80126B78 + 0x50) = (s32)(s16)D_80126B66;
} else {
func_80132784(arg0, *(s32 *)(arg0 + 0x64), *(u16 *)(arg0 + 0xFC));
}
}
#include "common.h"
@@ -5895,7 +5936,52 @@ void func_80186600(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_80181D30", func_8018675C);
extern u16 D_801E4BBC;
extern u16 D_801E43B4;
extern s32 D_801270C8;
extern u8 D_80195AC4[];
extern s16 D_80195ACE;
extern D_80195AF4_t D_80195AF4[];
s32 func_8018675C(void *a0)
{
s32 flags = *(s32 *)((u8 *)a0 + 0xE8);
if (flags & 0x800) {
s16 t = *(s16 *)((u8 *)a0 + 0xE0);
if (t >= 0) {
if (*(s16 *)((u8 *)a0 + 6) < *(s16 *)((u8 *)D_80195AF4 + t * 8)) {
u16 old = D_801E43B4;
s32 f6 = *(s16 *)((u8 *)D_80195AF4 + t * 8 + 6);
D_801E43B4 = old + 1;
D_801270C8 = f6;
*(s16 *)((u8 *)a0 + 0xE0) = -1;
}
}
if (*(s32 *)((u8 *)a0 + 0x10) >= 0) {
return 0;
}
if (*(s16 *)((u8 *)a0 + 6) < D_80195ACE) {
*(s16 *)((u8 *)a0 + 0xFE) = 0;
*(s32 *)((u8 *)a0 + 0xE8) |= 8;
return 1;
}
return 0;
} else {
if (*(s32 *)((u8 *)a0 + 0x18) > 0) {
s32 phase = D_801E4BBC;
if (*(s16 *)((u8 *)D_80195AC4 + phase * 4) < *(s16 *)((u8 *)a0 + 0xE)) {
*(s32 *)((u8 *)a0 + 0xE8) = flags | ((phase == 2) ? 0x400 : 8);
*(s16 *)((u8 *)a0 + 0xFE) = 0;
return 1;
}
}
}
return 0;
}
extern u16 D_801E4BBC;
extern s32 D_80195AD0[];
@@ -8267,7 +8353,7 @@ void func_8018A3B4(void *a0) {
* which is gcc's emit_block_move for align < 4. */
extern Blob8_8018A47C D_801E2F28;
extern void func_8018A6A0(s32 a0, Blob8_8018A47C *a1);
extern void func_8018A6A0();
void func_8018A47C(s32 a0) {
Blob8_8018A47C tmp;
@@ -8350,7 +8436,7 @@ void func_8018A4C4(s32 a0)
/* 8-byte, alignment-1 blob: the target copies it with lwl/lwr + swl/swr,
* which is gcc's emit_block_move for align < 4. */
extern void func_8018A6A0(s32 a0, Blob8_8018A47C *a1);
extern void func_8018A6A0();
void func_8018A658(s32 a0) {
@@ -8362,7 +8448,77 @@ void func_8018A658(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_80181D30", func_8018A6A0);
void func_8018A6A0(s32 a0, u16 *a1)
{
u8 *s0 = (u8 *)a0;
u16 *s1 = a1;
u16 vec0[4];
register u16 counter __asm__("$2");
s32 res[3];
s32 flags;
u8 *puVar;
func_8012B2CC(a0);
__asm__ __volatile__(
"lw $12, 0(%0)\n"
"lw $13, 4(%0)\n"
"ctc2 $12, $0\n"
"ctc2 $13, $1\n"
"lw $12, 8(%0)\n"
"lw $13, 12(%0)\n"
"lw $14, 16(%0)\n"
"ctc2 $12, $2\n"
"ctc2 $13, $3\n"
"ctc2 $14, $4\n"
"lw $12, 20(%0)\n"
"lw $13, 24(%0)\n"
"ctc2 $12, $5\n"
"lw $14, 28(%0)\n"
"ctc2 $13, $6\n"
"ctc2 $14, $7\n"
: : "r"((u8 *)*(s32 *)(s0 + 0x20) + 0x34) : "$12", "$13", "$14");
vec0[2] = 0;
vec0[0] = 0;
vec0[1] = counter = *s1;
goto test;
body:
puVar = func_8012913C(0xC);
if (puVar != 0) {
__asm__ __volatile__(
"lwc2 $0, 0(%0)\n"
"lwc2 $1, 4(%0)\n"
"nop\n"
"nop\n"
"mvmva 1, 0, 0, 0, 0\n"
: : "r"(vec0) : "memory");
__asm__ __volatile__(
"swc2 $25, 0(%0)\n"
"swc2 $26, 4(%0)\n"
"swc2 $27, 8(%0)\n"
: : "r"(res) : "memory");
__asm__ __volatile__(
"cfc2 $12, $31\n"
"nop\n"
"sw $12, 0(%0)\n"
: : "r"(&flags) : "$12", "memory");
*(u16 *)(puVar + 6) = (u16)res[0];
*(u16 *)(puVar + 0xA) = (u16)res[1];
*(u16 *)(puVar + 0xE) = (u16)(res[2] - 8);
}
{
register u16 tmp __asm__("$3");
counter = vec0[1];
tmp = *(u16 *)(s1 + 2);
counter += tmp;
vec0[1] = counter;
}
test:
if ((s16)counter < *(s16 *)(s1 + 1)) goto body;
}
void func_8018A7D0(void) {
}
+49 -2
View File
@@ -3335,7 +3335,7 @@ extern Blk16_8018A1D8 D_801E2F18;
extern u8 *func_8018A30C(s32 a0, s32 a1);
extern u8 * func_8018A30C(s32 a0, s32 a1);
extern Blob8_8018A47C D_801E2F28;
extern void func_8018A6A0(s32 a0, Blob8_8018A47C *a1);
extern void func_8018A6A0();
extern Blob8_8018A4C4 D_801E2F30;
extern Blk16_8018A4C4 D_801E2F38;
extern void func_8018A4C4(s32 a0);
@@ -3912,7 +3912,54 @@ void func_8018F230(void *param_1)
}
INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_8018EA04", func_8018F2C4);
extern s32 D_801270CC;
extern s32 D_801270C8;
extern u8 D_80196C34[];
extern void func_8012C218(void *a0);
extern s32 func_80185D6C();
void func_8018F2C4(s32 a0)
{
s32 var_s1;
s32 *p8;
var_s1 = 0;
if (*(u16 *)(*(s32 *)&D_801270CC) != 0x3D) {
func_8012C218((void *)a0);
return;
}
if ((*(u8 *)(*(s32 *)&D_801270CC + 0xC1) - 3U) < 2) {
*(u16 *)(a0 + 0x5C) = 0;
return;
}
p8 = &D_801270C8;
if (*p8 == 0x1B) {
*(s32 *)(a0 + 0x58) = (s32)D_80196C34;
*(u16 *)(a0 + 0x5C) = 0;
return;
}
if (func_80185D6C() != 0) {
var_s1 = 0x80;
}
*(u16 *)(a0 + 0x5C) = 0x800;
if (*p8 < 0x1B) {
if (*(s16 *)(a0 + 0xE) < *(s16 *)(*(s32 *)&D_801270CC + 0xE)) {
*(u16 *)(a0 + 0xDC) = *(s16 *)(*(s32 *)&D_801270CC + 0xE);
}
*(u16 *)(a0 + 6) = *(u16 *)(a0 + 0xDE);
*(u16 *)(a0 + 0xE) = *(u16 *)(a0 + 0xDC) + var_s1;
} else {
if (*(s16 *)(*(s32 *)&D_801270CC + 6) < *(s16 *)(a0 + 6)) {
*(u16 *)(a0 + 0xDE) = *(s16 *)(*(s32 *)&D_801270CC + 6);
}
*(u16 *)(a0 + 6) = *(u16 *)(a0 + 0xDE) - var_s1;
*(u16 *)(a0 + 0xE) = *(u16 *)(a0 + 0xDC);
}
}
extern void func_8013C414(void *a0, void *a1);
extern s32 D_8019AA5C;
+33 -1
View File
@@ -6176,7 +6176,39 @@ void func_8017F05C(void) {
}
INCLUDE_ASM("asm/ov_SC02_037/nonmatchings/ov_SC02_037_jr_8017AE2C", func_8017F07C);
void func_8017F07C(void) {
extern s32 D_801C9A5C;
extern s32 D_801C9968;
extern s32 D_801C996C;
extern s32 D_801C9970;
extern s32 D_801C9974;
extern u8 D_801A041C[];
extern s32 D_80187858[];
extern void func_8017F1B8(void *a0, s32 a1);
switch (D_801C9A5C) {
case 0:
D_801C9968 = 1;
D_801C996C = 0;
D_801C9970 = 1;
D_801C9974 = 1;
D_801C9A5C = 1;
break;
case 1:
if (--D_801C9968 == 0) {
D_801C9968 = 2;
func_8017F1B8(D_801A041C, D_801C996C * 6);
D_801C996C = (D_801C996C + 1) & 7;
}
if (--D_801C9970 == 0) {
D_801C9970 = 8;
func_800183E0(D_80187858[D_801C9974]);
D_801C9974 = (D_801C9974 + 1) & 0xF;
}
break;
}
}
void func_8017F1B8(void *a0, s32 a1)
+44 -1
View File
@@ -3813,7 +3813,50 @@ s32 func_8017DBD0(u32 a0v)
}
INCLUDE_ASM("asm/ov_SC02_039/nonmatchings/ov_SC02_039_jr_8017BEBC", func_8017DC7C);
#include "common.h"
extern u16 D_80126CAC;
extern u16 D_8019B568[];
extern void func_8002D59C(s32 a0, u16 a1, s32 a2);
void func_8017DC7C(s32 a0)
{
s16 t;
s16 temp;
s16 vol;
t = *(u16 *)(a0 + 6) - D_80126CAC;
if (t < 0) {
t = -t;
}
if (t >= 0x801) {
*(s32 *)(*(s32 *)(a0 + 0x20) + 4) |= 0x80000000;
} else {
*(s32 *)(*(s32 *)(a0 + 0x20) + 4) &= 0x7FFFFFFF;
*(u16 *)(*(s32 *)(a0 + 0x20) + 0x14) += D_8019B568[*(s16 *)(a0 + 0x70)];
}
temp = t - 0x140;
if (temp < 0) {
vol = 0x7F;
} else if (temp >= 0x200) {
vol = 0;
} else {
vol = 0x7F - (temp >> 2);
}
if (vol == 0) {
if (*(s16 *)(a0 + 0x84) != 0) {
func_8002D59C(4, 0x6DD, *(u16 *)(a0 + 0x70));
*(s16 *)(a0 + 0x84) = 0;
}
} else {
func_8002D59C(0x6DD, (vol | 0x1000) & 0xFFFF, *(u16 *)(a0 + 0x70));
*(s16 *)(a0 + 0x84) = 1;
}
}
// @class: struct
+65 -1
View File
@@ -7831,7 +7831,71 @@ void func_80182F10(void *a0) {
}
INCLUDE_ASM("asm/ov_SC03_006/nonmatchings/ov_SC03_006_jr_8017AE2C", func_80182F4C);
extern u8 D_801AD31C[];
s32 func_80182F4C(s32 a0, s16 a1)
{
register u8 *base __asm__("$8");
s16 val;
register u16 c0 __asm__("$11");
register u16 c1 __asm__("$7");
u16 outerIdx;
u16 innerIdx;
u16 diff;
s32 prod;
u16 temp2;
u16 idx2;
u16 *tbl;
register s32 p1 __asm__("$4");
s32 p2;
s32 p3;
u16 dx;
u16 n;
u16 sample;
s32 addr;
s16 cur;
u16 v;
base = D_801AD31C;
c0 = 0xF800;
val = (s16)a0;
do {
c1 = 0xFA00;
outerIdx = (c0 + 0x8000) >> 7 & 0x1FF;
do {
innerIdx = (c1 + 0x8000) >> 7 & 0x1FF;
diff = innerIdx - *(u16 *)(base + 2);
prod = diff * *(u16 *)(base + 4);
p1 = *(s32 *)(base + 0x14);
p2 = *(s32 *)(base + 0x18);
p3 = *(s32 *)(base + 0x1C);
temp2 = outerIdx - *(u16 *)(base + 0);
tbl = *(u16 **)(base + 0x8);
idx2 = (prod + temp2) * 2;
dx = tbl[idx2];
n = tbl[idx2 + 1];
p1 += dx;
while (n--) {
sample = *(u16 *)p1;
if (!(sample & 0x8000)) {
addr = p2 + sample * 18;
} else {
v = sample & 0x7FFF;
addr = p3 + v * 22;
}
cur = *(s16 *)addr;
if (cur == val) {
*(s16 *)addr = a1;
}
p1 += 2;
}
c1 += 0x80;
} while (c1 <= 0xFDFF);
c0 += 0x80;
} while (c0 <= 0xFBFF);
}
#include "common.h"
+57 -1
View File
@@ -5038,7 +5038,63 @@ void func_8018162C(void *a0) {
}
INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8017DF84", func_80181668);
extern s32 D_8018B0BC;
extern u8 D_800D387C[];
extern u8 D_800D3888[];
void func_80181668(s32 param_1)
{
s32 p;
register s32 r1 __asm__("$16");
register s32 r2 __asm__("$17");
s32 r3;
s32 r4;
s16 v;
s32 buf[3];
s32 *pAddr;
p = *(s32 *)(param_1 + 0x20);
*(u8 **)(p + 0x20) = D_800D387C;
*(u8 *)(p + 0x27) = 0x9c;
*(u16 *)(p + 0x1a) = 0x4000;
*(u16 *)(p + 0x18) = 0x4000;
*(u8 *)(p + 0x24) = 0x40;
*(u8 *)(p + 0x25) = 0x30;
*(u8 *)(p + 0x26) = 0x30;
*(u32 *)(p + 4) = *(u32 *)(p + 4) | 0x50000000;
func_80128EA8(*(s32 *)(param_1 + 0x20), param_1 + 0x24, (s32)D_800D3888);
r1 = rand();
r2 = rand();
r3 = rand();
v = (r1 & 3) * 1024;
v += (r2 & 3) * 250;
v += (r3 & 3) * 68;
r4 = rand();
pAddr = &D_8018B0BC;
*pAddr = 0xFFFC0000 - ((r4 & 0xF) << 14);
func_8001382C(v, (void *)((s32)pAddr - 8), buf);
{
s32 b0, b1, b2;
s32 cnt;
b0 = buf[0];
cnt = *(u16 *)(param_1 + 2);
*(s32 *)(param_1 + 0x10) = b0;
b1 = buf[1];
cnt = cnt + 1;
*(s32 *)(param_1 + 0x14) = b1;
b2 = buf[2];
*(s32 *)(param_1 + 0x1c) = 0x1e;
*(u16 *)(param_1 + 2) = cnt;
*(s32 *)(param_1 + 0x18) = b2;
}
}
extern void func_8012931C(struct vec *a0);
extern s32 func_80128ED8(s32 param_1, s32 *param_2);
+27 -1
View File
@@ -4712,7 +4712,33 @@ void func_80182CA4(s32 param_1) {
}
INCLUDE_ASM("asm/ov_SC03_029/nonmatchings/ov_SC03_029_jr_8017FF7C", func_80182D70);
#include "common.h"
typedef struct { s32 w[8]; } Blk20_80182D70;
extern s32 func_8004787C(s32 a0);
extern s32 func_80047948(s32 a0);
extern void RotMatrixY(s32 a0, void *a1);
extern void func_800484EC(s32 a0, s32 a1, s32 a2);
void func_80182D70(s32 arg) {
register void *s1 __asm__("$17") = (void *)arg;
extern Blk20_80182D70 aD800AE620_80182D70 __asm__("D_800AE620");
Blk20_80182D70 m;
s32 vec[3];
s32 out[3];
vec[0] = *(s16 *)(s1 + 0xE0) * func_80047948(*(s32 *)(s1 + 0x1C) << 7);
vec[1] = *(s16 *)(s1 + 0xE0) * func_8004787C(*(s32 *)(s1 + 0x1C) << 7);
vec[2] = 0;
m = aD800AE620_80182D70;
RotMatrixY(*(s16 *)(s1 + 0xFC), &m);
func_800484EC((s32)&m, (s32)vec, (s32)out);
*(s16 *)(s1 + 0x6) = *(u16 *)(s1 + 0x88) + (out[0] >> 12);
*(s16 *)(s1 + 0xA) = *(u16 *)(s1 + 0x8A) + (out[1] >> 12);
*(s16 *)(s1 + 0xE) = *(u16 *)(s1 + 0x8C) + (out[2] >> 12);
}
extern s32 D_801C48F0[];
extern s32 func_8012C044(s32 a0);
+63 -1
View File
@@ -4558,7 +4558,69 @@ void func_80181AA0(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_090/nonmatchings/ov_SC03_090_jr_8017CA80", func_80181B50);
#include "common.h"
extern u16 func_80148800(s32 *a0);
extern void func_80181D30(s32 param_1, s16 *param_2);
extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3);
void func_80181B50(s32 a0) {
extern s32 D_80126B58;
extern s16 D_8018F780[];
extern Blk8_80126940_8017D6D0_80181C80 D_80126940;
Blk8_80126940_8017D6D0_80181C80 sp10;
u8 t;
s16 v1;
register s16 c __asm__("$4"); /* clamp store value — target stores every bound from $a0 */
if (func_80148800(&D_80126B58) & 3) {
t = (*(u8 *)(a0 + 5) + 1) & 1;
*(u8 *)(a0 + 5) = t;
*(s32 *)(a0 + 0x14) = D_8018F780[t];
}
sp10 = D_80126940;
v1 = sp10.v[0];
if (v1 < -0x43F) {
if (v1 < -0x4FF) {
*(s16 *)(a0 + 0x2E) = 0;
} else {
*(s16 *)(a0 + 0x2E) = -0x500 - v1;
}
} else {
*(s16 *)(a0 + 0x2E) = 0;
}
*(s16 *)(a0 + 0x28) = (s16)func_80012F74(*(s16 *)(a0 + 0x28), *(s16 *)(a0 + 0x2E), 4, 1);
{
s16 lo = -0x580;
if (sp10.v[0] < lo) {
c = -0x580;
sp10.v[0] = c;
}
}
{
s16 lim = -0x380;
if (lim < sp10.v[0]) {
c = -0x380;
sp10.v[0] = c;
}
}
{
s16 lo2 = 0xC0;
if (sp10.v[2] < lo2) {
c = 0xC0;
sp10.v[2] = c;
}
}
func_80181D30(a0, sp10.v);
}
/* 8 bytes, align 2 -> lwl/lwr/swl/swr copy (cookbook §48-C2) */
+61 -1
View File
@@ -2923,7 +2923,67 @@ void func_801826C8(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_80182268", func_80182788);
#include "/home/musashi/bfm-decomp/src/shared/engine_core.h"
extern u16 func_80148800(s32 *a0);
extern void func_80182B48(s32 param_1, s16 *param_2);
extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3);
void func_80182788(s32 a0) {
extern s32 D_80126B58;
extern s16 D_80190714[];
extern Blk8_80126940_8017D6D0_80182A98 D_80126940;
Blk8_80126940_8017D6D0_80182A98 sp10;
u8 t;
s16 v1;
register s16 c __asm__("$4");
if (func_80148800(&D_80126B58) & 3) {
t = (*(u8 *)(a0 + 5) + 1) & 1;
*(u8 *)(a0 + 5) = t;
*(s32 *)(a0 + 0x14) = D_80190714[t];
}
sp10 = D_80126940;
v1 = sp10.v[0];
if (v1 >= 0x700) {
if (v1 < 0x7C0) {
*(s16 *)(a0 + 0x2E) = 0x7C0 - v1;
} else {
*(s16 *)(a0 + 0x2E) = 0;
}
} else {
*(s16 *)(a0 + 0x2E) = 0;
}
*(s16 *)(a0 + 0x28) = (s16)func_80012F74(*(s16 *)(a0 + 0x28), *(s16 *)(a0 + 0x2E), 4, 1);
{
s16 lo = 0x540;
if (sp10.v[0] < lo) {
c = lo;
sp10.v[0] = c;
}
}
{
s16 lim = 0x800;
if (lim < sp10.v[0]) {
c = lim;
sp10.v[0] = c;
}
}
{
s16 lo2 = -0x3C0;
if (sp10.v[2] < lo2) {
c = lo2;
sp10.v[2] = c;
}
}
func_80182B48(a0, sp10.v);
}
/* 8 bytes, align 2 -> lwl/lwr/swl/swr copy (cookbook §48-C2) */
+87 -2
View File
@@ -3850,7 +3850,48 @@ void func_8017DD44(s32 a0)
}
INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8017BEBC", func_8017DDDC);
extern s32 func_8012DEB8(s32 a0, s32 a1, s32 a2);
s32 func_8017DDDC(s32 a0, s32 a1) {
V4_8017FAC0_8017D708 p2;
V4_8017FAC0_8017D708 p1;
register s32 rp1 __asm__("$17");
s32 mid;
rp1 = (s32)&p1;
p2.x = p1.x = *(u16 *)(a1 + 4);
p2.y = p1.y = *(u16 *)(a1 + 8) - 0x10;
p2.z = *(u16 *)(a1 + 0xC);
p1.z = *(u16 *)(a1 + 0xE);
if (func_8012DEB8(a0, (s32)&p2, rp1) != 0) {
return 1;
}
p2.x = p1.x = mid = (*(s16 *)(a1 + 4) + *(s16 *)(a1 + 6)) >> 1;
if (func_8012DEB8(a0, (s32)&p2, rp1) != 0) {
return 1;
}
p2.x = p1.x = (u32)(*(s16 *)(a1 + 4) + mid) >> 1;
if (func_8012DEB8(a0, (s32)&p2, rp1) != 0) {
return 1;
}
p2.x = p1.x = (u32)(*(s16 *)(a1 + 6) + mid) >> 1;
if (func_8012DEB8(a0, (s32)&p2, rp1) != 0) {
return 1;
}
p2.x = p1.x = *(u16 *)(a1 + 6);
if (func_8012DEB8(a0, (s32)&p2, rp1) != 0) {
return 1;
}
return 0;
}
extern void func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
@@ -4052,7 +4093,51 @@ void func_8017E27C(void *a0)
}
INCLUDE_ASM("asm/ov_SC03_108/nonmatchings/ov_SC03_108_jr_8017BEBC", func_8017E3F8);
typedef struct { s32 w[8]; } Blk20_8017E3F8;
void func_8017E3F8(void *a0)
{
extern Blk20_8017E3F8 D_800AE620;
extern s32 D_801847E0;
extern void RotMatrixY(s32 a0, void *a1);
extern void func_8004914C(void *a0);
extern void func_800491AC(void *a0);
extern void RotTransSV(void *a0, void *a1, void *a2);
extern void func_8012E32C(void);
extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3);
s32 s0 = (s32)a0;
s16 v[4];
Blk20_8017E3F8 mtx = D_800AE620;
s32 flag;
s32 sxy;
s32 z;
s32 ent;
u16 t;
s32 f;
mtx.w[5] = *(s16 *)(s0 + 0x6);
mtx.w[6] = *(s16 *)(s0 + 0xA);
mtx.w[7] = *(s16 *)(s0 + 0xE);
ent = *(s32 *)(s0 + 0x20);
RotMatrixY(*(s16 *)(ent + 0x12), &mtx);
func_8004914C(&mtx);
func_800491AC(&mtx);
RotTransSV(&D_801847E0, v, &flag);
func_8012E32C();
*(s32 *)(s0 + 0xE0) = RotTransPers((s32)v, (s32)&sxy, &z, &flag);
t = *(u16 *)&sxy;
f = flag;
*(s16 *)(s0 + 0x100) = t;
if (f < 0) {
*(s16 *)(s0 + 0x100) = -0x3E7;
}
}
typedef struct { s32 flag; u16 xy[2]; s32 sp1c; } Out_8017E910_8017E508;
typedef struct { s16 a, b, c, d; } SV4_8017E910_8017E508;
+33 -3
View File
@@ -7453,7 +7453,37 @@ s32 a2;
}
INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8017AE2C", func_80181EE8);
typedef struct { s32 w[8]; } Blk20_80181EE8;
typedef struct { s16 vx, vy, vz, pad; } Svec_80181EE8;
extern Blk20_80181EE8 D_800AE620;
extern s32 func_8012B8A4(s16 *a0);
extern void RotMatrixY(s32 a0, void *a1);
extern void ApplyMatrixSV(void *a0, void *a1, void *a2);
extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5);
extern u8 D_801152A8[];
void func_80181EE8(s32 param_1)
{
Svec_80181EE8 out;
Svec_80181EE8 sv;
Blk20_80181EE8 m;
s16 r;
s32 t;
m = D_800AE620;
t = (*(s16 *)(*(u32 *)(param_1 + 0x20) + 0x18) * 9) >> 9;
sv.vx = sv.vy = 0;
sv.vz = -t;
r = func_8012B8A4((s16 *)param_1);
RotMatrixY(r, &m);
ApplyMatrixSV(&m, &sv, &out);
out.vx += *(u16 *)(param_1 + 6);
out.vy += *(u16 *)(param_1 + 0xA) - t;
out.vz += *(u16 *)(param_1 + 0xE);
func_8012F568(1, 0x4002, 0, 0x14, (s32)&out, (s32)D_801152A8);
}
INCLUDE_ASM("asm/ov_SC04_004/nonmatchings/ov_SC04_004_jr_8017AE2C", func_80182014);
@@ -7566,7 +7596,7 @@ extern void func_8012C218(void *a0);
extern void func_801439C0(void*);
extern void func_801821E0();
extern s32 func_80181D1C(s32 a0);
extern void func_80181EE8(void*);
extern void func_80181EE8();
void func_801823F4(s32 param_1) {
s32 flag;
@@ -7606,7 +7636,7 @@ void func_801824A8(void) {
extern void func_8012CBF4(s32);
extern s32 func_80181D1C(s32);
extern s32 func_80181DAC(s32);
extern void func_80181EE8(void *);
extern void func_80181EE8();
extern void func_80182170(s32, s32);
extern void func_801439C0(void *);
extern void func_8012C218(void *);
+37 -1
View File
@@ -4755,7 +4755,43 @@ void func_8017E394(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC04_008/nonmatchings/ov_SC04_008_jr_8017AE2C", func_8017E628);
extern void (*D_8018EE98[])(void);
extern void func_8012C218(void *a0);
extern s32 func_80143C74(s32 a0, s32 a1);
extern s32 rand(void);
void func_8017E628(s32 a0)
{
s32 s0;
s32 v0;
s32 v1;
s0 = a0;
D_8018EE98[*(u16 *)(s0 + 0x2)]();
if (*(s16 *)(s0 + 0x102) != 0) {
v0 = *(s32 *)(s0 + 0x20);
*(u16 *)(v0 + 0x18) -= 0x80;
v1 = *(s32 *)(s0 + 0x20);
if (*(s16 *)(v1 + 0x18) < 0x100) {
func_8012C218((void *)s0);
} else {
*(u16 *)(v1 + 0x1A) -= 0x80;
v1 = *(s32 *)(s0 + 0x20);
*(u16 *)(v1 + 0x1C) -= 0x80;
if (--*(s16 *)(s0 + 0x102) == 0) {
*(s16 *)(s0 + 0x102) = 3;
s0 = func_80143C74(s0, 0);
if (s0 != 0) {
*(s16 *)(s0 + 0x16) = -8;
*(u16 *)(s0 + 0xA) -= 0x20;
*(s16 *)(s0 + 0x12) = (rand() & 7) - 4;
*(s16 *)(s0 + 0x1A) = (rand() & 7) - 4;
}
}
}
}
}
void func_8017E754(s32 arg0) {
+43 -1
View File
@@ -3456,7 +3456,49 @@ void func_8017D6D8(s32 a0) {
}
INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8017BEBC", func_8017D924);
extern void func_800D20C0();
extern unsigned char D_801A6B00;
extern unsigned char D_801A6B01;
extern unsigned char D_801A6B02;
void func_8017D924(s32 arg0) {
short sp10[3];
short sp18[3];
s32 temp;
register s32 color __asm__("$2");
u16 cnt;
sp10[0] = -0x100;
sp10[1] = -0x252;
sp10[2] = 0x60;
func_800D20C0(sp10, sp18, 5);
*(u16 *)(arg0 + 6) = sp10[0];
*(u16 *)(arg0 + 0xA) = sp10[1];
*(u16 *)(arg0 + 0xE) = sp10[2];
temp = *(s32 *)(arg0 + 0x1C);
if (temp < 0x20) {
color = temp * 2 - 0x80;
} else {
color = (0x20 - temp) * 2 - 0x40;
}
D_801A6B01 = color;
D_801A6B00 = D_801A6B02 = (u8)color >> 2;
*(s32 *)(arg0 + 0x1C) += 1;
if (*(s32 *)(arg0 + 0x1C) >= 0x40) {
*(s32 *)(arg0 + 0x1C) = 0;
}
if (*(s16 *)(arg0 + 0xFC) != 0) {
D_801A6B02 = 0xE0;
D_801A6B00 = 0xE0;
D_801A6B01 = 0xFF;
*(u16 *)(*(s32 *)(arg0 + 0x20) + 0x18) = 0x1800;
*(u16 *)(*(s32 *)(arg0 + 0x20) + 0x1A) = 0x2000;
cnt = *(u16 *)(arg0 + 2);
*(s32 *)(arg0 + 0x1C) = 0x20;
*(u16 *)(arg0 + 2) = cnt + 1;
}
}
INCLUDE_ASM("asm/ov_SC04_016/nonmatchings/ov_SC04_016_jr_8017BEBC", func_8017DA50);
+40 -1
View File
@@ -3981,7 +3981,46 @@ void func_80182CE0(void *a0) {
}
INCLUDE_ASM("asm/ov_SC06_016/nonmatchings/ov_SC06_016_jr_801816DC", func_80182D1C);
void func_80182D1C(void *a0)
{
extern u32 D_8019FF00;
void *s3 = a0;
void *s2;
u32 p;
u32 q;
s32 y;
s32 r1;
u16 h;
s2 = *(void **)((s32)s3 + 0x20);
func_80182F44(s3);
p = D_8019FF00;
if (p != 0) {
h = *(u16 *)((s32)s2 + 0x12) + 0x800;
q = *(u32 *)((s32)p + 0x20);
y = h & 0xFFF;
if (*(u16 *)((s32)q + 0x12) & 0x400) {
r1 = func_80012A60(y, 0x400);
__asm__ __volatile__("" ::: "memory");
__asm__ __volatile__("" ::: "memory");
if (!((s16)r1 > (s16)func_80012A60(y, 0xC00))) {
*(s16 *)((s32)s2 + 0x12) = 0x400;
} else {
*(s16 *)((s32)s2 + 0x12) = 0xC00;
}
} else {
r1 = func_80012A60(y, 0);
if (!((s16)r1 > (s16)func_80012A60(y, 0x800))) {
*(s16 *)((s32)s2 + 0x12) = 0;
goto done;
}
*(s16 *)((s32)s2 + 0x12) = 0x800;
}
}
done:
func_80171990((u8 *)s3);
}
extern s32 func_80183020();
+40 -1
View File
@@ -4921,7 +4921,46 @@ void func_8017FE9C(void *a0) {
}
INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8017BEBC", func_8017FEEC);
extern s32 func_8012C1B8(void);
extern void func_8012CAE4(void *a0);
extern void func_8001C2C4(s32 a0);
extern u16 D_801865D8;
extern u16 D_801865DA;
extern u16 D_801865DC;
extern u16 D_801865DE;
extern void D_801866C8;
extern s16 D_80186728;
extern s32 func_8012AD50(void *a0);
void func_8017FEEC(void *a0)
{
s32 ret;
s32 t;
ret = func_8012C1B8();
*(s32 *)((u8 *)a0 + 0x20) = ret;
if (ret == 0) {
func_8012CAE4(a0);
return;
}
func_8001C2C4(ret);
*(s16 *)((u8 *)a0 + 0xFE) = *(u16 *)((u8 *)&D_801865D8 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) & 0xFF00;
t = *(u16 *)((u8 *)&D_801865D8 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) & 0x7;
*(u16 *)((u8 *)a0 + 0x5C) = 0x8C00;
*(s16 *)((u8 *)a0 + 0x6) = 0;
*(s16 *)((u8 *)a0 + 0x102) = t;
*(s32 *)((u8 *)a0 + 0x58) = ((s32)((u8 *)&D_801866C8 + (t << 4))) | 0x40000000;
*(s16 *)((u8 *)a0 + 0xA) = *(u16 *)((u8 *)&D_801865DA + (*(s16 *)((u8 *)a0 + 0x70) << 3));
*(s16 *)((u8 *)a0 + 0xE) = *(u16 *)((u8 *)&D_801865DC + (*(s16 *)((u8 *)a0 + 0x70) << 3));
*(s16 *)(*(s32 *)((u8 *)a0 + 0x20) + 0x10) = *(u16 *)((u8 *)&D_801865DE + (*(s16 *)((u8 *)a0 + 0x70) << 3)) & 0xFF0;
*(s16 *)((u8 *)a0 + 0x104) = 0;
*(s32 *)((u8 *)a0 + 0x1C) = *(s16 *)((u8 *)&D_80186728 + (*(s16 *)((u8 *)a0 + 0x70) << 1));
func_8012AD50(a0);
}
INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8017BEBC", func_8018000C);
+27 -1
View File
@@ -4311,7 +4311,33 @@ void func_8017DAE8(void *a0, void *a1)
}
INCLUDE_ASM("asm/ov_SC07_007/nonmatchings/ov_SC07_007_jr_8017BEBC", func_8017DC20);
extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2);
extern s32 func_80012ABC(s32 a0, s32 a1, s32 a2);
void func_8017DC20(void *param_1, void *param_2, void *param_3) {
s32 pad[12];
s32 p1 = (s32)param_1;
s32 p2 = (s32)param_2;
s32 p3 = (s32)param_3;
*(s32 *)(p1 + 0x8) = (s16)func_80012C6C((s32)*(s16 *)(p1 + 0x8), (s32)*(s16 *)(p1 + 0xC), 4);
*(s32 *)(p1 + 0x10) = (s16)func_80012C6C((s32)*(s16 *)(p1 + 0x10), (s32)*(s16 *)(p1 + 0x14), 4);
*(s16 *)(p1 + 0x18) = func_80012ABC((s32)*(s16 *)(p1 + 0x18), (s32)*(s16 *)(p1 + 0x20), 4);
*(s16 *)(p1 + 0x1A) = func_80012ABC((s32)*(s16 *)(p1 + 0x1A), (s32)*(s16 *)(p1 + 0x22), 4);
*(s16 *)(p1 + 0x1C) = func_80012ABC((s32)*(s16 *)(p1 + 0x1C), (s32)*(s16 *)(p1 + 0x24), 4);
*(s16 *)(p1 + 0x28) = func_80012C6C((s32)*(s16 *)(p1 + 0x28), (s32)*(s16 *)(p1 + 0x2E), 0x10);
*(s16 *)(p1 + 0x2A) = func_80012C6C((s32)*(s16 *)(p1 + 0x2A), (s32)*(s16 *)(p1 + 0x30), 0x10);
*(s16 *)(p1 + 0x2C) = func_80012C6C((s32)*(s16 *)(p1 + 0x2C), (s32)*(s16 *)(p1 + 0x32), 0x10);
*(s32 *)(p1 + 0x48) = (s32)*(s16 *)(p1 + 0x28) + (s32)*(s16 *)(p3 + 0);
*(s32 *)(p1 + 0x4C) = (s32)*(s16 *)(p1 + 0x2A) + (s32)*(s16 *)(p3 + 2);
*(s32 *)(p1 + 0x50) = (s32)*(s16 *)(p1 + 0x2C) + (s32)*(s16 *)(p3 + 4);
*(s32 *)(p1 + 0x3C) = (s32)*(s16 *)(p2 + 0);
*(s32 *)(p1 + 0x40) = (s32)*(s16 *)(p2 + 2);
*(s32 *)(p1 + 0x44) = (s32)*(s16 *)(p2 + 4);
}