From 93bfa45561dcb06e833b3980a842086390db5975 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 2 Sep 2026 01:24:53 -0600 Subject: [PATCH] =?UTF-8?q?feat(carve):=20=C2=A7323=20blocker=202=20cleare?= =?UTF-8?q?d=20=E2=80=94=20jr-isolate=20ov=5FSC07=5F000=20for=20func=5F801?= =?UTF-8?q?7F8B8,=20byte-identical?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The type-name scan matched `}\s*(\w+)\s*;`, which reads `__attribute__` as the name and fails on the following `((` — so a packed file-local typedef never entered the carried set, every decl naming it read as an unknown type, and the isolate refused the whole overlay. Stripping attributes before the scan is the entire fix. --- config/splat.ov_SC07_000.yaml | 1 + src/ov_SC07_000/ov_SC07_000_jr_8017BEBC.c | 2051 --------- src/ov_SC07_000/ov_SC07_000_jr_8017F8B8.c | 4866 +++++++++++++++++++++ tools/jr_isolate_all.py | 16 + 4 files changed, 4883 insertions(+), 2051 deletions(-) create mode 100644 src/ov_SC07_000/ov_SC07_000_jr_8017F8B8.c diff --git a/config/splat.ov_SC07_000.yaml b/config/splat.ov_SC07_000.yaml index bec7adfdb..1de5d17b1 100644 --- a/config/splat.ov_SC07_000.yaml +++ b/config/splat.ov_SC07_000.yaml @@ -121,6 +121,7 @@ segments: - [0x52354, c, ov_SC07_000_jr_8017A4AC] - [0x52cd4, c, ov_SC07_000_jr_8017AE2C] - [0x53d64, c, ov_SC07_000_jr_8017BEBC] + - [0x57760, c, ov_SC07_000_jr_8017F8B8] - [0x5a4d8, data, tail] - [0xa5418, .rodata, ov_SC07_000] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xa54f4, .rodata, ov_SC07_000_jr_8012ACE0] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/src/ov_SC07_000/ov_SC07_000_jr_8017BEBC.c b/src/ov_SC07_000/ov_SC07_000_jr_8017BEBC.c index ac8443051..c76ac6838 100644 --- a/src/ov_SC07_000/ov_SC07_000_jr_8017BEBC.c +++ b/src/ov_SC07_000/ov_SC07_000_jr_8017BEBC.c @@ -4790,2054 +4790,3 @@ void func_8017F888(s32 *a0, s32 *a1) { *(u16 *)((s32)a0 + 0xE) = *(u16 *)((s32)a1 + 0x4); *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12) = *(u16 *)((s32)a1 + 0x6); } - - -INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8017BEBC", func_8017F8B8); - -void func_8017F958(s32 a0) -{ - extern u16 D_8018659C[]; - extern u16 D_8018659E[]; - extern void MoveImage(void *a0, s32 a1, s32 a2); - s16 sp[4]; - - sp[0] = *(u16 *)((u8 *)D_8018659C + a0 * 4); - sp[1] = *(u16 *)((u8 *)D_8018659E + a0 * 4); - sp[2] = 0xC; - sp[3] = 0x28; - MoveImage(&sp[0], 0x2C0, 0x100); -} - - -typedef struct { u8 b[4]; } __attribute__((packed, aligned(1))) Blk4_9B4; - -extern void func_8001CD9C(s32, void *); -extern void func_800233CC(void *, u16); - -extern u16 aD_801D0630[] __asm__("D_801D0630"); -extern u16 D_801D0632[]; -extern u16 aD_801D0660[] __asm__("D_801D0660"); -extern u16 aD_801D0662[] __asm__("D_801D0662"); - -extern u8 D_801D0620[]; -extern u8 D_801865A8[]; -extern Blk4_9B4 aD_801CE7A4[] __asm__("D_801CE7A4"); -extern Blk4_9B4 D_801D0624[]; - -void func_8017F9B4(void *arg0) { - register void *s1 __asm__("$17") = arg0; - void *s0 = D_801D0620; - register s32 off1 __asm__("$3"); - register s32 off2 __asm__("$4"); - - func_8001CD9C(*(s32 *)((u8 *)s1 + 0x20), s0); - func_800233CC(s0, 0x40); - - for (off1 = 0, off2 = 0; off1 < 0x30; off1 += 8, off2 += 4) { - *(s16 *)((u8 *)aD_801D0660 + off2) = (s16)(*(u16 *)((u8 *)aD_801D0630 + off1)) >> 3; - __asm__ __volatile__("" ::: "memory"); - *(s16 *)((u8 *)aD_801D0662 + off2) = (s16)(*(u16 *)((u8 *)D_801D0632 + off1)) >> 3; - } - - *(Blk4_9B4 *)D_801D0620 = *(Blk4_9B4 *)D_801865A8; - D_801D0624[0] = aD_801CE7A4[0]; - - *(u32 *)(*(s32 *)((u8 *)s1 + 0x20) + 4) |= 0x50000000; - *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x18) = 0x800; - *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x1A) = 0x800; - *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x2C) = 0xC040; - - *(s32 *)((u8 *)s1 + 0x1C) = 4; - *(u16 *)((u8 *)s1 + 0x2C) = 0; - *(u16 *)((u8 *)s1 + 0x2E) = 0; - *(u16 *)((u8 *)s1 + 0x2) += 1; -} - - - -extern void (*D_801865AC[])(void); - -void func_8017FAFC(void *a0) { - D_801865AC[*(u16 *)((s32)a0 + 0x2)](); -} - - -extern void func_80016450(s32 a0, s32 a1); - -void func_8017FB38(s32 param_1) -{ - s16 t; - - if (*(s16 *)(param_1 + 0x2E) == 0) { - t = *(s16 *)(param_1 + 0x2C); - if (t < 0x60) { - t = t + 0x20; - *(s16 *)(param_1 + 0x2C) = t; - if (t >= 0x60) { - *(u16 *)(param_1 + 0x2E) = *(u16 *)(param_1 + 0x2E) + 1; - } - } - } else { - t = *(s16 *)(param_1 + 0x2C); - if (t == 0) { - return; - } - t = t - 0x10; - *(s16 *)(param_1 + 0x2C) = t; - if (t < 0) { - *(s16 *)(param_1 + 0x2C) = 0; - } - } - - if (*(s16 *)(param_1 + 0x2C) != 0) { - func_80016450(*(s16 *)(param_1 + 0x2C) & 0xFF, 1); - } -} - - -extern void func_8001CD9C(s32, void *); -extern void func_800233CC(void *, u16); -typedef struct { u8 b[4]; } __attribute__((packed, aligned(1))) Blk4; -extern Blk4 D_801CE7A4[]; -extern u8 D_801865C0; -extern u8 D_801D0678[]; - -void func_8017FBE8(void *arg0) { - s32 mode = *(s16 *)((u8 *)arg0 + 0x2C); - u8 *s0 = (u8 *)D_801D0678 + (mode << 6); - switch (mode) { - case 0: - func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); - func_800233CC(s0, 0x80); - *(Blk4 *)s0 = D_801CE7A4[0]; - *(Blk4 *)(s0 + 4) = D_801CE7A4[0]; - *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x60000000; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; - *(u16 *)((u8 *)arg0 + 0x2E) = 1; - *(s32 *)((u8 *)arg0 + 0x1C) = 2; - *(u16 *)((u8 *)arg0 + 2) = 1; - break; - case 1: - func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); - func_800233CC(s0, 0x40); - *(Blk4 *)s0 = D_801CE7A4[0]; - *(Blk4 *)(s0 + 4) = D_801CE7A4[0]; - *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x50000000; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; - *(u16 *)((u8 *)arg0 + 2) = 3; - break; - case 2: - func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); - func_800233CC(s0, 0x80); - *(Blk4 *)s0 = D_801CE7A4[0]; - *(Blk4 *)(s0 + 4) = ((Blk4 *)&D_801865C0)[0]; - *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x50000000; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; - *(u16 *)((u8 *)arg0 + 2) = 4; - break; - } -} - - - -extern void (*D_801865C4[])(void); - -void func_8017FE20(void *a0) { - D_801865C4[*(u16 *)((s32)a0 + 0x2)](); -} - - -extern s32 func_80132EF4(); - -void func_8017FE5C(void *a0) { - register s32 s0 __asm__("$16") = (s32)a0; - s32 obj; - - obj = func_80132EF4((void *)s0, 0x77); - if (obj != 0) { - *(u16 *)(obj + 0x2C) = 1; - *(s32 *)(obj + 0x34) = s0; - } -} - - -extern u8 *func_801290DC(); - -void func_8017FE9C(void *a0) { - struct { s16 x; s16 y; s16 z; } sp; - u8 *rec; - - sp.x = *(u16 *)((u8 *)a0 + 0x6); - sp.y = *(u16 *)((u8 *)a0 + 0xA); - sp.z = *(u16 *)((u8 *)a0 + 0xE); - rec = func_801290DC(0x77, &sp); - if (rec != NULL) { - *(s16 *)(rec + 0x2C) = 2; - } -} - - -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); -} - - - -extern void func_8012AD44(); -extern void func_8013C9C4(void *a0); -extern void func_8002D4C8(s32 a0, s32 a1); -extern u8 D_801867A0[]; -extern u8 D_80182DD8[]; - -void func_8018000C(s32 arg0) { - func_8012AD44((s32 *)arg0, 2); - func_8013C9C4(D_80182DD8); - *(s16 *)((s32)arg0 + 0x106) = *(u16 *)(D_801867A0 + *(s16 *)((s32)arg0 + 0x70) * 2); - func_8002D4C8(0xB75, 0); -} - - -#include "common.h" - -extern void func_8017DF94(s32 arg0, s16 *arg1, s32 arg2); -extern void func_801805C0(); -extern void func_8012C218(void *arg0); -extern s32 func_8004787C(s32 a0); -extern void func_80180200(void *a0); -extern void func_801802E4(void *a0); -extern void func_8012E014(s32 a0); -extern u16 D_801865DA; - -void func_8018006C(void *a0) { - struct { s16 x; s16 y; s16 z; } sp; - s32 idx; - u16 y; - - if (*(s16 *)((u8 *)a0 + 0xE) - 0x80 < *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xE)) { - func_8017DF94(*(s16 *)((u8 *)a0 + 0x70), (s16 *)&sp, 0); - func_801805C0(a0, *(s16 *)((u8 *)a0 + 0x102)); - func_8012C218(a0); - return; - } - idx = *(s16 *)((u8 *)a0 + 0x70); - y = *(u16 *)((u8 *)a0 + 0xA); - if (*(s16 *)((u8 *)a0 + 0x100) >= 0x400) { - if ((s16)y < -0x1FF) { - *(s16 *)((u8 *)a0 + 0xA) = y + 8; - } else { - func_8017DF94(idx, (s16 *)&sp, 0); - func_8012C218(a0); - return; - } - } else { - *(s16 *)((u8 *)a0 + 0x100) = *(s16 *)((u8 *)a0 + 0x100) + 0x10; - *(s16 *)((u8 *)a0 + 0xA) = *(u16 *)((u8 *)a0 + 0xA) + (func_8004787C(*(s16 *)((u8 *)a0 + 0x100)) >> 9); - } - if (*(s16 *)((u8 *)a0 + 0x106) != 0) { - *(s16 *)((u8 *)a0 + 0x106) = *(s16 *)((u8 *)a0 + 0x106) - 1; - if ((*(s16 *)((u8 *)a0 + 0x106) & 3) == 0) { - func_80180200(a0); - } - } - func_801802E4(a0); - sp.z = 0; - sp.x = 0; - sp.y = *(u16 *)((u8 *)a0 + 0xA) - *(u16 *)((u8 *)&D_801865DA + (*(s16 *)((u8 *)a0 + 0x70) << 3)); - func_8017DF94(*(s16 *)((u8 *)a0 + 0x70), (s16 *)&sp, 1); - if (*(u8 *)((u8 *)a0 + 0x74) != 0) { - func_8012E014((s32)a0); - } -} - - - -extern void (*D_801867DC[])(void); - -void func_801801C4(void *a0) { - D_801867DC[*(u16 *)((s32)a0 + 0x2)](); -} - - -extern u16 D_80186764[]; -extern void func_801803F0(); - -void func_80180200(void *a0) { - struct { s16 x; s16 y; s16 z; } sp; - s32 var_s1; - s32 i; - s32 ret; - - var_s1 = *(u16 *)((u8 *)a0 + 0xA) + D_80186764[*(s16 *)((u8 *)a0 + 0x70)]; - i = 0; - while (i < 3) { - ret = rand(); - sp.x = (*(u16 *)((u8 *)a0 + 6) - 0x80) - (ret & 0x1F); - sp.y = var_s1; - if (*(s16 *)((u8 *)a0 + 0x102) == 1) { - sp.z = *(u16 *)((u8 *)a0 + 0xE) + 0x80; - } else { - sp.z = *(u16 *)((u8 *)a0 + 0xE) + 0xC0; - } - func_801803F0(a0, &sp); - ret = rand(); - i++; - sp.x = (*(u16 *)((u8 *)a0 + 6) + 0x80) + (ret & 0x1F); - func_801803F0(a0, &sp); - var_s1 += 0x20; - } -} - - -extern u16 D_80126B62; -void func_801802E4(void *a0) { - struct { s16 x; s16 y; s16 z; } sp; - - sp.x = (*(u16 *)((u8 *)a0 + 6) - 0x100) - (rand() & 0x1F); - sp.y = D_80126B62 + 0xB0; - if ((s16)(D_80126B62 + 0xB0) < *(s16 *)((u8 *)a0 + 0xA)) { - sp.y = *(s16 *)((u8 *)a0 + 0xA); - } - if (*(s16 *)((u8 *)a0 + 0x102) == 1) { - sp.z = *(u16 *)((u8 *)a0 + 0xE) + (rand() % 0xC0) - 0x60; - } else { - sp.z = *(u16 *)((u8 *)a0 + 0xE) + (rand() % 0x140) - 0xA0; - } - func_801803F0(a0, &sp); -} - - -extern u8 *func_801290DC(); - -void func_801803F0() { - u8 *rec; - s32 r; - - rec = func_801290DC(0x22); - if (rec != NULL) { - *(s32 *)(rec + 0x34) = 0x4000; - r = rand(); - *(s32 *)(rec + 0x14) = -((r & 0x3FF0 | 0x8000) << 4); - } -} - - - -extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); - -void func_80180440(s32 arg0) { - s32 i; - - for (i = 0; i < 30; i++) { - func_8012C658(0x3a5, i, arg0); - } -} - - -extern s32 *D_80186800[]; -extern s32 *D_80186810[]; - -void func_80180490(void *a0) { - s32 ret; - s16 idx; - s32 *p0, *p1; - - ret = func_8012C1B8(); - *(s32 *)((u8 *)a0 + 0x20) = ret; - if (ret == 0) { - func_8012CAE4(a0); - return; - } - - *(u16 *)((u8 *)a0 + 0xFE) = (*(u16 *)((u8 *)a0 + 0x70) >> 8) & 7; - *(u16 *)((u8 *)a0 + 0x70) = *(u16 *)((u8 *)a0 + 0x70) & 0xF; - idx = *(s16 *)((u8 *)a0 + 0xFE); - p0 = D_80186800[idx]; - p1 = D_80186810[idx]; - p1[*(s16 *)((u8 *)a0 + 0x70) * 2] = p0[*(s16 *)((u8 *)a0 + 0x70)]; - p1[*(s16 *)((u8 *)a0 + 0x70) * 2 + 1] = 0; - func_8001C214(*(s32 *)((u8 *)a0 + 0x20), &p1[*(s16 *)((u8 *)a0 + 0x70) * 2]); - - *(u16 *)((u8 *)a0 + 0x106) = rand() & 0xF0; - *(u16 *)((u8 *)a0 + 0x108) = rand() & 0xF0; - func_8012B23C(a0); - *(s32 *)((u8 *)a0 + 0x1C) = 0x20; - func_8012AD50(a0); -} - - - -extern void (*D_80186840[])(void); - -void func_80180584(void *a0) { - D_80186840[*(u16 *)((s32)a0 + 0x2)](); -} - - -#include "common.h" - -extern s32 D_801867E8[]; -extern s32 D_80186820[]; -extern void *D_80186830[]; -extern u16 D_80186848[]; -extern u16 D_80186850[]; -extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); -extern void func_8018091C(void *a0, void *a1); -extern void func_80180704(void *a0); -extern void func_80180790(s32 self); -extern void func_8002D4C8(s32 a0, s32 a1); - -void func_801805C0(s32 arg0, s32 arg1) { - s32 idx; - s32 i; - s32 rec; - char *base; - - idx = D_801867E8[arg1]; - base = (char *)D_80186830[idx]; - for (i = 0; i < D_80186820[idx]; i++) { - rec = func_8012C658(0x3C4, (idx << 8) + i, arg0); - if (rec != 0) { - func_8018091C((void *)rec, base + i * 0xC); - *(u16 *)(rec + 0xA) += *(u16 *)(arg0 + 0xA) - D_80186848[idx]; - *(u16 *)(rec + 0xE) += *(u16 *)(arg0 + 0xE) - D_80186850[idx]; - func_80180704((void *)rec); - func_80180790(rec); - } - } - func_8002D4C8(0xC02, 0); -} - - -extern s32 rand(void); - -void func_80180704(void *a0) { - s32 v0; - - *(s32 *)((u8 *)a0 + 0x10) = (*(s16 *)((u8 *)a0 + 6) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 6)) << 11; - *(s32 *)((u8 *)a0 + 0x14) = ((*(s16 *)((u8 *)a0 + 0xA) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xA)) << 10) - 0x200000; - v0 = rand() & 0xFF; - *(s32 *)((u8 *)a0 + 0x18) = ((*(s16 *)((u8 *)a0 + 0xE) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xE)) + v0 - 0x80) << 12; -} - - -extern s32 func_80132EF4(s32 a0, s32 a1); - -void func_80180790(s32 self) { - s32 obj; - char *prim; - - obj = func_80132EF4(self, 0x22); - if (obj != 0) { - prim = *(char **)(obj + 0x20); - *(s32 *)(obj + 0x34) = 0x7002; - *(u16 *)(prim + 0x2C) = 0xC020; - *(s32 *)(obj + 0x10) = (*(s32 *)(self + 0x10) >> 2) * 3; - *(s32 *)(obj + 0x14) = *(s32 *)(self + 0x14) >> 2; - *(s32 *)(obj + 0x18) = (*(s32 *)(self + 0x18) >> 2) * 3; - } -} - - - -extern void (*D_80186858[])(void); - -void func_80180818(void *a0) { - D_80186858[*(u16 *)((s32)a0 + 0x2)](); -} - - -extern u8 D_801ADEA0[]; -extern void func_8018091C(); -extern void func_8018096C(void *a0); -extern s32 func_80132EF4(s32 a0, s32 a1); -extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); - -void func_80180854(void) -{ - register s32 s0 __asm__("$16"); - register s32 s1 __asm__("$17"); - register s32 s2 __asm__("$18"); - s32 v1; - - s1 = 0; - s2 = 0; - do { - s0 = func_8012C658(0x3A3, s1, 0); - if (s0 != 0) { - func_8018091C(s0, D_801ADEA0 + s2); - func_8018096C(s0); - v1 = func_80132EF4(s0, 0x22); - if (v1 != 0) { - *(s32 *)(v1 + 0x34) = 0x7002; - *(s32 *)(v1 + 0x10) = *(s32 *)(s0 + 0x10) >> 2; - *(s32 *)(v1 + 0x14) = *(s32 *)(s0 + 0x14) >> 2; - *(s32 *)(v1 + 0x18) = *(s32 *)(s0 + 0x18) >> 2; - } - } - s1++; - s2 += 0xC; - } while (s1 < 0xE); -} - - - - -void func_8018091C(void *a0, void *a1) { - *(u16 *)((s32)a0 + 0x6) = *(u16 *)((s32)a1 + 0x0); - *(u16 *)((s32)a0 + 0xA) = *(u16 *)((s32)a1 + 0x2); - *(u16 *)((s32)a0 + 0xE) = *(u16 *)((s32)a1 + 0x4); - *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x10) = *(u16 *)((s32)a1 + 0x6); - *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12) = *(u16 *)((s32)a1 + 0x8); - *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x14) = *(u16 *)((s32)a1 + 0xA); -} - - -void func_8018096C(void *a0) { - *(s32 *)((s32)a0 + 0x10) = *(s16 *)((s32)a0 + 0x06) << 13; - *(s32 *)((s32)a0 + 0x14) = (*(s16 *)((s32)a0 + 0x0A) + 0x400) << 13; - *(s32 *)((s32)a0 + 0x18) = (*(s16 *)((s32)a0 + 0x0E) - 0x180) * 3 << 13; -} - - -#include "common.h" - -extern s32 func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(s32 a0, s32 a1); -extern void D_801B9C88; -extern void D_80186550; -extern void func_8017F888(s32 *a0, s32 *a1); -extern s32 func_80143970(s32 a0); -extern void D_801BCCAC; -extern void func_8012A828(); -extern void func_8017F4F8(s32 a0); -extern void func_8017EE40(s32 a0); - -void func_801809A4(void *a0) { - s32 ret; - s32 p; - - ret = func_8012C1B8(); - *(s32 *)((u8 *)a0 + 0x20) = ret; - if (ret == 0) { - func_8012CAE4(a0); - return; - } - - func_8001C214(ret, (s32)&D_801B9C88); - - p = *(s32 *)((u8 *)a0 + 0x20); - *(u16 *)((u8 *)p + 0x2C) |= 0x10; - func_8017F888((s32 *)a0, (s32 *)&D_80186550); - - func_80143970((s32)a0); - - func_8012A828(a0, &D_801BCCAC); - - func_8017F4F8(0); - - func_8017EE40((s32)a0); -} - - -void func_80180A3C(s32 a0) { - func_8012AD80(a0); - - *(u32 *)(a0 + 0x1C) = *(u32 *)(a0 + 0x1C) + 1; - if ((*(u32 *)(a0 + 0x1C) & 7) == 0) { - func_8017F3FC(a0); - } - - if (*(s16 *)(a0 + 0xE) >= 0x361) { - func_8017EE8C(a0); - } -} - - -extern s16 D_801D0B7C; -extern void func_8017EEC0(void); -void func_80180AA4(void *a0) { - s32 a1; - s32 v1; - short v; - a1 = *(s32 *)(a0 + 0x20); - v = *(s16 *)(a1 + 0x12); - if (v != 0) { - *(s16 *)(a1 + 0x12) = v - 0x100; - v1 = *(s32 *)(a0 + 0x20); - if (*(s16 *)(v1 + 0x12) < 0) { - *(s16 *)(v1 + 0x12) = 0; - } - if (*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) == 0) { - D_801D0B7C = 1; - } - } else { - if (*(u16 *)&D_801D0B7C == 2) { - func_8017EEC0(); - } - } -} - - -void func_80180B3C(s32 a0) -{ - extern s16 D_801D0B7C; - extern void func_8017F098(); - extern s32 func_8012B8A4(s16 *a0); - extern void func_8017F464(); - - if ((*(u16 *)&D_801D0B7C) == 4) { - ((void (*)())func_8017F098)(); - } - *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = func_8012B8A4((s16 *)a0); - func_8017F464(a0); -} - - -extern void func_80142414(s32 a0, s16 a1); -extern void func_8017F0D0(s32 a0); -extern s16 D_801D0B7C; - -void func_80180B90(s32 ent) { - s16 t; - - switch (*(u16 *)(ent + 0x34)) { - case 0: - t = *(s16 *)(*(s32 *)(ent + 0x20) + 0x12); - if (t != 0) { - *(s16 *)(*(s32 *)(ent + 0x20) + 0x12) = t - 0x100; - if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) < 0) { - *(u16 *)(*(s32 *)(ent + 0x20) + 0x12) = 0; - } - if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) != 0) { - break; - } - } - *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; - break; - case 1: - func_80142414(ent, -0xA0); - *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; - break; - case 2: - break; - } - if (*(u16 *)&D_801D0B7C == 6) { - func_8017F0D0(ent); - } -} - - -#include "common.h" - -extern s32 func_8012C1B8(void); -extern void func_8012CAE4(void *a0); -extern void func_8001C214(s32 a0, s32 a1); -extern void func_8012A828(); -extern void func_8017F888(s32 *a0, s32 *a1); -extern void func_80029124(s32, s32); -extern s16 D_801CC230; -extern u8 D_801C0DEC; -extern void D_80186584; - -void func_80180C68(void *a0) { - s32 ret; - extern s32 func_8012AD50(void *a0); - - ret = func_8012C1B8(); - *(s32 *)((u8 *)a0 + 0x20) = ret; - if (ret == 0) { - func_8012CAE4(a0); - return; - } - - func_8001C214(ret, (s32)&D_801C0DEC); - func_8012A828(a0, &D_801CC230); - func_8017F888((s32 *)a0, (s32 *)&D_80186584); - func_80029124(0x135, 0); - func_8012AD50(a0); -} - - -extern s16 D_801D0B7C; -extern u8 D_801CC8D8[]; - -void func_80180CEC(s32 a0) { - s32 s0 = a0; - s32 v1, v0; - - *(s16 *)(*(s32 *)(s0 + 0x20) + 0x12) = func_8012B8A4((s16 *)s0); - - v1 = *(u16 *)(s0 + 0x34); - if (v1 != 1) { - if (v1 < 2) { - if (v1 == 0) { - if ((func_80029178(0x135) & 0xFF) != 0) { - func_8012A828(s0, D_801CC8D8); - v0 = *(u16 *)(s0 + 0x34) + 1; - *(u16 *)(s0 + 0x34) = v0; - } - } - } - } else { - if (*(s32 *)(s0 + 0x94) == 0) { - *(s16 *)(s0 + 0x98) = 0; - v0 = *(u16 *)(s0 + 0x34) + 1; - *(u16 *)(s0 + 0x34) = v0; - } - } - - if (*(u16 *)&D_801D0B7C == 4) { - func_8017F554(s0); - } - func_8017F8B8(s0); -} - - -extern s16 D_801D0B7C; - -void func_80180DB4(s32 ent) { - s16 t; - - switch (*(u16 *)(ent + 0x34)) { - case 0: - t = *(s16 *)(*(s32 *)(ent + 0x20) + 0x12); - if (t != 0) { - *(s16 *)(*(s32 *)(ent + 0x20) + 0x12) = t - 0x100; - if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) < 0) { - *(u16 *)(*(s32 *)(ent + 0x20) + 0x12) = 0; - } - if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) != 0) { - break; - } - } - *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; - break; - case 1: - func_80142414(ent, -0x80); - *(s32 *)(ent + 0x1C) = 0x10; - *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; - break; - case 2: - if (func_8012BEE8(ent) == 0) { - break; - } - func_8017FE5C(ent); - *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; - break; - } - if (*(u16 *)&D_801D0B7C == 5) { - func_8017F59C(ent); - } -} - - -extern void func_8017FB38(); -struct D_801D0630_s { u16 f0; u16 f2; u16 pad[2]; }; -extern struct D_801D0630_s D_801D0630[]; -struct D_801D0660_s { u16 f0; u16 f2; }; -extern struct D_801D0660_s D_801D0660[]; -extern struct D_801D0660_s D_801D0662[]; - -void func_80180ED0(s32 arg0) { - register s32 a3 __asm__("$7") = arg0; - register s32 i __asm__("$6"); - register s32 a1 __asm__("$5"); - - if (*(s32 *)(a3 + 0x1C) != 0) { - (*(s32 *)(a3 + 0x1C))--; - for (i = 0, a1 = (s32)D_801D0630; i < 12; i += 2) { - *(u16 *)(a1 + 0) += D_801D0660[i >> 1].f0; - *(u16 *)(a1 + 2) += D_801D0662[i >> 1].f0; - a1 += 8; - } - *(u16 *)(*(s32 *)(a3 + 0x20) + 0x18) += 0x200; - *(u16 *)(*(s32 *)(a3 + 0x20) + 0x1A) += 0x200; - } else { - *(s32 *)(a3 + 0x1C) = 4; - *(u16 *)(a3 + 0x2) += 1; - } - func_8017FB38(a3); -} - - -#include "common.h" - -extern u8 D_801D0620[]; -extern u8 D_801865A8[]; -extern u8 D_801865A9; -extern u8 D_801865AA; -extern void func_801292C8(u8 *a0); -extern void func_8017FB38(); - -void func_80180FA8(void *a0) { - register s32 s0 __asm__("$16") = (s32)a0; - void *ptr; - s32 v0; - - v0 = *(s32 *)(s0 + 0x1C); - v0 = v0 - 1; - *(s32 *)(s0 + 0x1C) = v0; - if (v0 == 0) { - func_801292C8((u8 *)s0); - } - - D_801D0620[0] -= D_801865A8[0] >> 2; - D_801D0620[1] -= D_801865A9 >> 2; - D_801D0620[2] -= D_801865AA >> 2; - - ptr = *(void **)(s0 + 0x20); - *(u16 *)((s32)ptr + 0x18) += 0x200; - - ptr = *(void **)(s0 + 0x20); - *(u16 *)((s32)ptr + 0x1A) += 0x200; - - func_8017FB38(s0); -} - - -void func_8018107C(s32 arg0) -{ - extern u8 D_801D0678[]; - extern u8 D_801865B8; - extern u8 D_801865B9; - extern u8 D_801865BA; - extern void func_8017FE9C(void *); - - u8 *dst; - s16 t18; - s16 t2e; - s32 cnt; - - dst = &D_801D0678[*(s16 *)(arg0 + 0x2C) << 6]; - t18 = *(s16 *)(*(s32 *)(arg0 + 0x20) + 0x18); - if (t18 < 0xC00) { - *(s16 *)(*(s32 *)(arg0 + 0x20) + 0x18) = t18 + 0x180; - *(u16 *)(*(s32 *)(arg0 + 0x20) + 0x1A) += 0x200; - dst[0] += D_801865B8 >> 3; - dst[1] += D_801865B9 >> 3; - dst[2] += D_801865BA >> 3; - } else { - *(u16 *)(arg0 + 2) += 1; - } - t2e = *(s16 *)(arg0 + 0x2E); - if (t2e != 0) { - cnt = *(s32 *)(arg0 + 0x1C); - if (cnt != 0) { - *(s32 *)(arg0 + 0x1C) = cnt - 1; - } else { - *(s16 *)(arg0 + 0x2E) = t2e - 1; - func_8017FE9C((void *)arg0); - } - } -} - - -extern u8 D_801D0678[]; -extern u8 D_801865B8; -extern u8 D_801865B9; -extern u8 D_801865BA; -extern void func_801292C8(u8 *a0); - -void func_80181174(u8 *a1) { - u8 *a0; - u8 *a2; - u8 *a3; - a0 = (u8*)D_801D0678 + (*(s16*)(a1 + 0x2C) << 6); - a3 = *(u8 **)(a1 + 0x20); - if (*(s16*)(a3 + 0x18) != 0) { - *(s16*)(a3 + 0x18) = *(s16*)(a3 + 0x18) - 0x180; - *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) - 0x200; - *(u8*)(a0 + 0) = *(u8*)(a0 + 0) - (D_801865B8 >> 3); - *(u8*)(a0 + 1) = *(u8*)(a0 + 1) - (D_801865B9 >> 3); - *(u8*)(a0 + 2) = *(u8*)(a0 + 2) - (D_801865BA >> 3); - } else { - func_801292C8(a1); - } -} - - -extern u8 D_801D0678[]; -extern u8 D_801865BC; -extern u8 D_801865BD; -extern u8 D_801865BE; -extern void func_80129350(s32 a0, s32 a1); - -void func_80181228(void *a0) { - u8 *p; - s32 a1; - s32 v1; - s16 v; - - p = &D_801D0678[*(s16 *)((s32)a0 + 0x2C) * 0x40]; - a1 = *(s32 *)((s32)a0 + 0x20); - v = *(s16 *)(a1 + 0x18); - if (v < 0x1000) { - *(s16 *)(a1 + 0x18) = v + 0x200; - v1 = *(s32 *)((s32)a0 + 0x20); - *(u16 *)(v1 + 0x1A) += 0x300; - p[0] += D_801865BC >> 3; - p[1] += D_801865BD >> 3; - p[2] += D_801865BE >> 3; - } - if (*(s32 *)((s32)a0 + 0x34) != 0) { - func_80129350((s32)a0, *(s32 *)((s32)a0 + 0x34)); - *(u16 *)((s32)a0 + 0xA) -= 0x20; - } -} - - -extern u8 D_801D0678[]; -extern u8 D_801865C0; -extern u8 D_801865C1; -extern u8 D_801865C2; -extern void func_801292C8(u8 *a0); - -void func_80181304(u8 *a1) { - u8 *a0; - u8 *a2; - a0 = (u8*)D_801D0678 + (*(s16*)(a1 + 0x2C) << 6); - a2 = *(u8 **)(a1 + 0x20); - if (*(s16*)(a2 + 0x18) < 0x1400) { - *(s16*)(a2 + 0x18) = *(s16*)(a2 + 0x18) + 0x280; - *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) + 0x3C0; - *(u16*)(*(u8 **)(a1 + 0x20) + 0x1E) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1E) + 0x100; - *(u8*)(a0 + 4) = *(u8*)(a0 + 4) - (D_801865C0 >> 3); - *(u8*)(a0 + 5) = *(u8*)(a0 + 5) - (D_801865C1 >> 3); - *(u8*)(a0 + 6) = *(u8*)(a0 + 6) - (D_801865C2 >> 3); - } else { - func_801292C8(a1); - } -} - - -extern u16 D_80126B66; -extern u16 D_801D0BB8; -extern s32 func_8012BEE8(s32 a0); -extern void func_8012E014(s32 a0); -extern void func_8018000C(s32 arg0); - -void func_801813D4(s32 a0) -{ - s32 s0 = a0; - - switch (*(s16 *)((s32)s0 + 0xFE)) { - case 0: - if (*(s16 *)((s32)s0 + 0x104) == 0) { - if ((*(u8 *)((s32)s0 + 0x74) != 0) || - ((s16)(D_80126B66 - *(u16 *)((s32)s0 + 0xE)) >= 0xC1)) { - *(s16 *)((s32)s0 + 0x104) = 1; - } - } else if (func_8012BEE8(s0) != 0) { - ((void (*)())func_8018000C)(s0); - } - break; - case 0x100: - if ((D_801D0BB8 & 2) != 0) { - if (func_8012BEE8(s0) != 0) { - ((void (*)())func_8018000C)(s0); - } - } - break; - } - if (*(u8 *)((s32)s0 + 0x74) != 0) { - func_8012E014(s0); - } -} - - -void func_801814B0(s32 param) -{ - extern s32 func_8012BEE8(s32 arg0); - extern void func_8012C218(void *arg0); - extern void func_8012AD80(s32 arg0); - - if (func_8012BEE8(param) != 0) { - func_8012C218((void *)param); - } else { - func_8012AD80(param); - *(u16 *)(*(s32 *)(param + 0x20) + 0x10) += *(u16 *)(param + 0x106); - *(u16 *)(*(s32 *)(param + 0x20) + 0x14) += *(u16 *)(param + 0x108); - } -} - - -extern s32 D_801ADE64[]; -extern s32 D_801D0900[]; -extern s32 D_801D0904[]; - -void func_80181528(void *a0) { - *(s32 *)((u8 *)a0 + 0x20) = func_8012C1B8(); - if (*(s32 *)((u8 *)a0 + 0x20) == 0) { - func_8012CAE4(a0); - return; - } - - *(s32 *)((s8 *)D_801D0900 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) = - D_801ADE64[*(s16 *)((u8 *)a0 + 0x70)]; - *(s32 *)((s8 *)D_801D0904 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) = 0; - func_8001C214(*(s32 *)((u8 *)a0 + 0x20), - (s32)((s8 *)D_801D0900 + (*(s16 *)((u8 *)a0 + 0x70) << 3))); - - *(u16 *)((u8 *)a0 + 0x106) = rand() & 0xF0; - *(u16 *)((u8 *)a0 + 0x108) = rand() & 0xF0; - func_8012B23C(a0); - *(s32 *)((u8 *)a0 + 0x1C) = 0x20; - func_8012AD50(a0); -} - - -extern s32 func_8012BEE8(s32 arg0); -extern void func_8012C218(void *arg0); -extern void func_8012AD80(s32 arg0); - -void func_801815F8(s32 param) { - if (func_8012BEE8(param) != 0) { - func_8012C218((void *)param); - } else { - func_8012AD80(param); - *(u16 *)(*(s32 *)(param + 0x20) + 0x10) += *(u16 *)(param + 0x106); - *(u16 *)(*(s32 *)(param + 0x20) + 0x14) += *(u16 *)(param + 0x108); - } -} - - - -extern void (*D_80186860[])(void); - -void func_80181670(void *a0) { - D_80186860[*(u16 *)((s32)a0 + 0x2)](); -} - - -extern s32 func_8012AD50(void *a0); - void func_801816AC(u8 *param_1) { - *(short *)(param_1 + 0xfc) = 0; - *(unsigned short *)(param_1 + 0x72) |= 0x1000; - ((void (*)(void))func_8012AD50)(); - } - - -void func_801816D8(void) -{ - extern s32 D_801151D4; - extern s16 func_8012A758(void); - extern s16 D_800B9AB8[]; - extern s16 D_800B9ABA[]; - s32 *base; - u16 arr[2]; - s32 t1; - - base = (s32 *)D_801151D4; - - t1 = (*(base + 0x13) + 0x800) * 120 / 1024; - arr[1] = t1; - if ((s16)t1 < 0) { - arr[1] = 0; - } - - arr[0] = (s16)((s32 (*)(void))func_8012A758)() * 320 / 4096; - arr[0] -= *(base + 0x14) >> 4; - D_800B9AB8[0] = arr[0]; - D_800B9ABA[0] = arr[1]; -} - - -void func_80181790(void) { - - extern s16 D_801D0A84; - s16 *p = &D_801D0A84; - s32 i = 0xF; - do { - *p = 0; - p = (s16 *)((s32)p + 0xe); - i--; - } while (i >= 0); -} - - - -/* func_801817B4 — cookbook §71 (sibling-first). - * func_80181854 is ALREADY MATCHED in the same TU - * (src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c L4221) as a 3-arg - * `void func_80181854(s32, s32, s32)`, so the untouched $a3 at the first - * jal is just the incoming arg3 living on, not a 4th argument. - * func_80181970 (asm, same TU) reads its 2nd arg as lhu+0 / lhu+2 / lh+4 / - * lh+6 => the sp+0x10 local is a 4 x s16 record. - * - * Two levers took it 32 -> 2 -> 0 (match_one MATCH, rtu_match MATCH): - * 1. LENGTH-DRIFT (-2, cookbook §78): writing `sp10.unk2 = i * 0x100` - * leaves gcc-2.7.2 recomputing `sll v0,s1,8` instead of building the - * strength-reduced giv, so only s0..s3 get saved and the frame is two - * instructions short. An EXPLICIT accumulator (`ang += 0x100`) forces - * the second callee-saved register ($s2) and restores sw/lw $s4. - * 2. REGALLOC-PERM $s1>$s2 (cookbook §3-T2, source order drives emission): - * `ang = 0;` on its own line before the loop emits the $s2 zero-init - * FIRST. Folding it into the for-init (`for (i = 0, ang = 0; ...)`) - * puts $s1's zero-init first, which is the target order. - */ - - -extern void func_80181854(s32 arg0, s32 arg1, s32 arg2); -extern void func_80181970(s32 arg0, Rec_8018A6A4_801817B4 *arg1, s32 arg2, s32 arg3); - -void func_801817B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - Rec_8018A6A4_801817B4 sp10; - s32 i; - s32 ang; - - func_80181854(arg0, 0x1000, 0); - sp10.unk0 = *(u16 *)(arg3 + 0x0); - sp10.unk4 = *(u16 *)(arg3 + 0x2); - sp10.unk6 = 1; - for (i = 0, ang = 0; i < 16; i++) { - sp10.unk2 = ang; - func_80181970(i, &sp10, arg1, arg2); - ang += 0x100; - } -} - - - - extern s16 D_801D0A7E; - extern s16 D_801D0A80; - extern s16 D_801D0A82; - void func_80181854(s32 arg0, s32 arg1, s32 arg2) { - /* [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_801D0A7C; - D_801D0A7C = *(u16 *)((s32)arg0 + 0x0); - D_801D0A7E = *(u16 *)((s32)arg0 + 0x2); - D_801D0A80 = arg1; - D_801D0A82 = arg2; - } - - - - -extern void func_80015978(s32 a0, s32 *a1); -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); - -void func_80181884(s32 a0) { - - extern s16 D_801D0A7C; - extern s16 D_801D0A7E; - /* [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_800AF648; - u16 sxy[2]; - s32 pv[4]; - - func_80015978(a0, pv); - func_8004914C(&D_800AF648); - func_800491AC(&D_800AF648); - RotTransPers((s32)pv, (s32)sxy, &pv[2], &pv[3]); - - D_801D0A7C = sxy[0]; - D_801D0A7E = sxy[1]; -} - - -extern s16 D_801D0A82; - void func_801818FC(s32 arg0) { - *(s16 *)((s32)&D_801D0A82 + 0x0) += arg0; - } - - -void func_80181918(s32 arg0, s32 arg1, s32 arg2) { - extern s32 func_80181A44(void); - s32 idx; - - idx = func_80181A44(); - if (idx >= 0) { - func_80181970(idx, arg0, arg1, arg2); - } -} - - - -/* func_80181970 — SPLICE RECONCILE (bytes unchanged from the s6h draft). - * - * THREE in-TU collisions, all fixed without touching an emitted instruction - * (src/ov_SC03_014/ov_SC03_014_jr_801848E4.c): - * - * (1) memcpy — cookbook §2959 / the sibling note at TU L3742. The TU declares - * memcpy THREE times: L81 + L1518 with the builtin-compatible signature - * (void*, const void*, unsigned) and then L1524 as - * `extern void *memcpy(void *dst, void *src, s32 n);`. L1524 disagrees with - * gcc's built-in, so duplicate_decls "throws away the built-in" (warning only, - * because the old decl was still DECL_BUILT_IN) and installs a PLAIN function - * decl. Two consequences at the splice point (L3635): - * a. my own builtin-shaped redeclaration now conflicts with a plain decl — - * hard error ("conflicting types for `memcpy'", :3637 vs :1524); - * b. even if it compiled, the identifier `memcpy` is no longer a builtin - * here, so both copies would lower to `jal memcpy` — but the TARGET - * bytes are the INLINE block move (lwl 3 / lwr 0 / swl / swr, no jal). - * Fix = do not name memcpy at all: a 4-byte STRUCT ASSIGN through an - * ALIGN-1 struct (u8 x4). That is exactly the sibling func_8018ADA8 lever - * in this same TU (TU L3736-3744, cookbook §48-C2): align 1 routes - * mips.c expand_block_move, which copy_addr_to_reg's the source into one - * held register -> the identical lwl/lwr + swl/swr pair, zero memcpy ref. - * The typedef is BLOCK-scoped so it cannot collide with the TU's own - * block-scoped `V4` at L3758. - * - * (2) func_80181970 itself — the TU prototypes it at L3570 as - * `extern void func_80181970(s32, Rec_8018A6A4 *, s32, s32);` (used by the - * matched caller func_8018A6A4 at L3583). Rec_8018A6A4 is a TU-local - * typedef I cannot restate (C89 forbids the redefinition), and the last two - * args are really pointers, so defining the name directly is "conflicting - * types". Fix = §37/§124 ASM-LABEL ALIAS: define aF8018A860 with an - * __asm__("func_80181970") label. Emits the identical symbol, leaves the - * TU's declaration untouched, zero blast radius, zero byte change. - * - * (3) D_801D0A84 / rand — declared VERBATIM as the TU already has them - * (D_801D0A84: TU L3637 + L3671; rand: TU L951), so both are exact - * re-declarations and merge silently. - */ -extern s32 rand(void); /* TU L951, verbatim */ - -void aF8018A860(s32 a0, s16 *a1, u8 *a2, u8 *a3) __asm__("func_80181970"); - -void aF8018A860(s32 a0, s16 *a1, u8 *a2, u8 *a3) -{ - - extern s16 D_801D0A84; /* TU L3637 / L3671, verbatim */ - /* align 1 — §48-C2 */ - s16 *s1; - u16 temp_u16; - s16 temp_s16; - s32 temp_s32, v0; - - s1 = (s16 *)((a0 * 14) + (s32)&D_801D0A84); - - *(u16 *)s1 = *(u16 *)a1; - - *(B4_80181970 *)((u8 *)s1 + 6) = *(B4_80181970 *)a2; - *(u8 *)((u8 *)s1 + 9) = 0; - - *(B4_80181970 *)((u8 *)s1 + 10) = *(B4_80181970 *)a3; - *(u8 *)((u8 *)s1 + 13) = 0; - - v0 = rand() & 0x3f; - temp_u16 = *(u16 *)((u8 *)a1 + 2); - *(u16 *)((u8 *)s1 + 2) = temp_u16 + v0 - 0x20; - - v0 = rand() & 0x7f0; - temp_s16 = *(s16 *)((u8 *)a1 + 4); - temp_s32 = temp_s16 * (v0 + 0xc00); - v0 = (s32)(temp_s32 >> 12); - *(s16 *)((u8 *)s1 + 4) = (s16)v0; - - v0 = *(s16 *)((u8 *)a1 + 6); - if (v0 != 0) { - u16 v1 = *(u16 *)((u8 *)s1 + 4); - *(u8 *)((u8 *)s1 + 9) = 1; - *(u16 *)((u8 *)s1 + 4) = 0; - *(u8 *)((u8 *)s1 + 13) = (u8)v1; - } -} - - - - -s32 func_80181A44(void) { - - extern s16 D_801D0A84; - s32 i = 0; - s32 offset = 0; - - while (i < 0x10) { - u16 val = *(u16*)((u8*)&D_801D0A84 + offset); - if (val == 0) { - return i; - } - i++; - offset += 0xE; - } - return -1; -} - - - - - -void func_80181A80(s32 a0, s32 a1) { - - extern s16 D_801D0A84; - s16 *s1; - u16 val; - - if (a0 >= 0x10) return; - - s1 = (s16 *)((a0 * 14) + (s32)&D_801D0A84); - val = *(u16 *)s1; - - if (val == 0) return; - - if (a1 == 0) { - *(u16 *)s1 = 0; - } else { - *(u8 *)((u8 *)s1 + 9) = 2; - } -} - - - -/* func_80181ACC — 16-entry table walk, stride 0xE, over D_801D0A84. - * §71 sibling: func_8018A680 (same TU, L4199) already matched the - * `extern s16 D_801D0A84; s16 *p = &D_801D0A84; p = (s16*)((s32)p+0xe)` - * shape over the very same array — copy that walker verbatim. - * - * Two induction registers in the target ($s1 = base+0, $s0 = base+4) are NOT - * two source pointers: $s1 is the user pointer (the biv, used for the +0 - * accesses) and $s0 is loop.c's single COMBINED address giv for the - * {+4, +9, +13} group (offsets 0/5/9 off $s0). Declaring a second pointer - * splits that group and costs a third register (iter 1: 53 mismatches). - */ - -extern void func_80181BA8(s32 arg0); - -void func_80181ACC(void) { - - extern s16 D_801D0A84; - s16 *p = &D_801D0A84; - s32 i = 0; - s16 t; - - do { - if (*(u16 *)p != 0) { - func_80181BA8(i); - switch (*(u8 *)((s32)p + 9)) { - case 1: - if (*(s16 *)((s32)p + 4) < *(u8 *)((s32)p + 13)) { - *(s16 *)((s32)p + 4) = *(s16 *)((s32)p + 4) + 8; - } else { - *(u8 *)((s32)p + 9) = 0; - } - break; - case 2: - t = *(s16 *)((s32)p + 4); - if (t != 0) { - t -= 0x10; - *(s16 *)((s32)p + 4) = t; - if (t > 0) { - break; - } - } - *p = 0; - break; - } - } - i++; - p = (s16 *)((s32)p + 0xe); - } while (i < 0x10); -} - - - -/* func_80181BA8 — draws one entry of the 16-slot D_801D0A84 particle table: - * bump-allocates a 0x1C-byte GPU packet out of D_800A5E60, fills it from the - * table entry, runs two RotMatrixZ/ApplyMatrixSV passes to place the two - * endpoints, then link-ins the packet into the current double-buffer's OT - * (the PSY-Q `addPrim` macro pair) and calls func_80016638. - * - * STATUS: byte-MATCH, 177/177 instructions (match_one standalone AND spliced - * into the real TU — the in-TU compile adds ZERO new cc1 diagnostics over the - * unmodified TU baseline). - * - * --------------------------------------------------------------------------- - * LEVERS (each byte-checked against asm/.../func_80181BA8.s) - * - * §48 STRUCT ASSIGN, not a hand-rolled temp copy. `m = D_800AE620;` on a - * 32-byte aggregate routes expr.c move_by_pieces, which emits the exact - * lw/lw/lw + sw/sw/sw (x2) + lw/lw + sw/sw grouping AND picks the - * target's registers ($a2 = source address, $v0/$v1/$a1 = carriers), and - * keeps the arg0*14 allocator chain OUT of the copy. The manual - * three-temp form (DEFINE_func_8012B4B8, engine_core.h L29487) emits the - * same instruction MIX but a different allocation (+60 mismatches). - * - * §21/T6 The double-buffer index D_800B9A02 is read at ALL THREE use sites - * (three `lhu`s off ONE materialised `la`). A PLAIN read is CSEd down to - * two AND keeps -G0 symbol addressing (lui+lhu per read, +1 insn); a - * POINTER local gives the `la` but lets cse fold the third read. The - * `volatile u16 *` pointer local reproduces BOTH properties and leaves - * the TU's own `extern s16 D_800B9A02;` untouched. - * - * T6 The OT base is bound to an s32 local (`ot`) so the tag read/write keep - * the `0x40($v1)` displacement form instead of folding into the pointer. - * - * L4 `mp`, a pointer local bound to &m, is what puts the matrix address in a - * callee-saved register ($s2) and turns each argument setup into a move; - * passing the array directly re-materialises `addiu $aN,$sp,0x10` at - * every call site and drops $s6 from the frame entirely. - * - * S1 `t = *(u16 *)ent;` is hoisted ABOVE the two `sh $zero` stores — the - * sp-relative stores are not disambiguated from the $s0-based load, so - * only SOURCE ORDER moves it (4 mismatches). - * - * T-form `u16 bx/by` (not s32) is what makes `addu $v0,$s3,$v0` come out with - * the accumulator first; through s32 locals combine canonicalises the - * zero_extend into operand 0 and both adds emit reversed. - * - * §83c-inverse FRAME: 0x70 = 16 args + 56 declared vars + 32 saved regs + an - * 8-byte COMPILER TEMP that gcc allocates for the two `symbol+register` - * memory references (both D_800A651C). So the DECLARED locals must total - * 56, not 60: m(32)@0x10, sv(8)@0x30, out(8)@0x38, v(8)@0x40 — the third - * word of the vector handed to func_8004901C (sp+0x48) lands INSIDE that - * compiler temp. `s32 v[3]` gives a 0x78 frame and 19 extra mismatches. - * Do NOT invent a dead local to reach the frame size. - * - * --------------------------------------------------------------------------- - * THE TWO RESIDUAL CLUSTERS AND WHAT ACTUALLY CLOSED THEM - * (both are gcc-2.7.2-map/sched.md §1 rule 7 "BIRTHING BOOST" + rule 5(b) - * "potential hazard"; diagnosed from the cc1 `-dS` ready-list trace, which - * names the decision verbatim: `;; insn 245 has a greater potential hazard`.) - * - * (a) The three symbol loads before the first RotMatrixZ came out E4,EA,E6 - * instead of EA,E4,E6. `lh $a0,D_801D0A82` is a single-set SET(REG,…) — - * the sched1 birthing boost sinks it to just before its consumer (the - * jal), i.e. one slot too late. Statement order CANNOT fix this: written - * as a plain local the load is combined into the call's arg setup, so its - * LUID is the call's either way (verified: two source orders, identical - * bytes). `register s32 ang __asm__("$4")` keeps the load a separate insn - * AT its source position — zero extra instructions, +0 bytes. - * - * (b) The tail's `lw $v1,0($s1)` (`*(u32 *)p`) belongs in the load-delay slot - * of `lhu $a0,0($a2)`; ours landed 7 insns later with `lui $a0,0xff00` - * taking the slot. sched1 trace: at T-27 the ready list is - * `247 (7f000001) 245 (7f000001)` — BOTH boosted — and the tie goes to the - * LOAD via `potential_hazard` (memory-unit users beat ALU insns), so the - * load is picked first = placed LAST. TWO edits are needed and neither - * works alone: - * 1. KILL the boost on the load's destination — `pv` gets a second SET - * from a zero-byte dead `__asm__ __volatile__("" : "=r"(pv));` at the - * end of the function (sched.md S2: a plain C reassignment does not - * work, cse/flow removes it; reusing one local across BOTH addPrim - * halves does kill the boost but makes `pv` a 2-death GLOBAL allocno - * that loses $v1, §136). With the boost dead, sched1 emits the - * target order exactly (proved with -fno-schedule-insns2). - * 2. PIN `pv` to $v1 (`register u32 pv __asm__("$3")`). Without it, - * local-alloc gives $v1 to the shorter, denser index quantity and - * `pv` lands in $a1/$t0; sched2 then re-applies rule 5(b) and undoes - * sched1's order. With `pv` in $v1 the index is pushed to $a0, the - * 0xFF000000 constant reuses $a0, and its output-dependence on the - * index's `sll/addu` FREEZES it after them — which is precisely the - * target's shape, and what makes sched2 leave sched1's order alone. - * - * Pin-trim log (all re-scored): dropping the $a2 `bidx` pin — MATCH; - * dropping the $a3 0xFFFFFF pin — MATCH; dropping `ang` — 4 mismatches - * (a dead-volatile boost-kill on `ang` does NOT substitute); dropping - * `pv` — 11; dropping the dead `pv` asm — 11. Two pins are the minimum - * found. - * - * --------------------------------------------------------------------------- - * DECLARATIONS: ApplyMatrixSV, D_800B9A02 and D_801D0A7C/E6/EA/EC are declared - * VERBATIM as the TU already has them at file scope (L163, L2460/2462, - * L3689/3705/3706, L3726, L3879), so they merge silently. D_800AE620, - * D_800A5E60, D_800A651C, D_800A6518, D_801D0A80, RotMatrixZ, func_8004901C and - * func_80016638 have NO file-scope declaration anywhere in the TU and none in - * include/ (checked in one pass, D2), so each is block-scoped here to keep the - * blast radius on the rest of the TU at zero (§103/T51). Verified by splicing - * this body over the INCLUDE_ASM at TU L3917 and compiling the whole TU: same - * 7 stderr lines as the untouched TU, and func_80181BA8 is byte-identical. - */ - -void func_80181BA8(s32 arg0) -{ - /* 32 bytes, align 4 */ - - extern Blk32_8018AA98_80181BA8 D_800AE620; - extern s32 D_800A5E60; - extern s32 D_800A651C; - extern u8 D_800A6518[]; - extern s16 D_801D0A7C; - extern s16 D_801D0A7E; - extern s16 D_801D0A80; - extern s16 D_801D0A84; - extern void RotMatrixZ(s32 a0, void *a1); - extern void ApplyMatrixSV(void *a0, void *a1, void *a2); - extern void func_8004901C(void *a0, void *a1); - extern void func_80016638(void *a0, s32 a1, s32 a2); - - Blk32_8018AA98_80181BA8 m; /* sp+0x10 */ - s16 sv[4]; /* sp+0x30 */ - s16 out[4]; /* sp+0x38 */ - s32 v[2]; /* sp+0x40 — 3rd word lives in the temp area */ - void *mp; - u8 *p; - u8 *ent; - s32 ot; - u16 bx; - u16 by; - register s32 ang __asm__("$4"); /* §17 pin — see residual (a) */ - volatile u16 *bidx; - s32 t; - register u32 pv __asm__("$3"); /* §17 pin — see residual (b) */ - - m = D_800AE620; - mp = &m; - - ent = (u8 *)((arg0 * 14) + (s32)&D_801D0A84); - p = (u8 *)D_800A5E60; - D_800A5E60 = (s32)p + 0x1C; - - p[3] = 6; - p[7] = 0x32; - p[4] = ent[6]; - p[5] = ent[7]; - p[6] = ent[8]; - p[0xC] = ent[0xA]; - p[0xD] = ent[0xB]; - p[0xE] = ent[0xC]; - p[0x14] = ent[0xA]; - p[0x15] = ent[0xB]; - p[0x16] = ent[0xC]; - - ang = D_801D0A82; - bx = (u16)D_801D0A7C; - by = (u16)D_801D0A7E; - RotMatrixZ(ang, mp); - - *(s32 *)((u8 *)v + 8) = D_801D0A80; - v[1] = *(s32 *)((u8 *)v + 8); - v[0] = v[1]; - func_8004901C(mp, v); - - t = *(u16 *)ent; - sv[2] = 0; - sv[1] = 0; - sv[0] = t; - *(s16 *)(p + 8) = bx; - *(s16 *)(p + 0xA) = by; - - RotMatrixZ(*(s16 *)(ent + 2) - (((s32)*(u16 *)(ent + 4) << 16) >> 17), mp); - ApplyMatrixSV(mp, sv, out); - *(s16 *)(p + 0x10) = bx + (u16)out[0]; - *(s16 *)(p + 0x12) = by + (u16)out[1]; - - RotMatrixZ(*(s16 *)(ent + 4), mp); - ApplyMatrixSV(mp, sv, out); - bx += (u16)out[0]; - *(s16 *)(p + 0x18) = bx; - by += (u16)out[1]; - *(s16 *)(p + 0x1A) = by; - - /* addPrim(otp, p) == setaddr(p, getaddr(otp)), setaddr(otp, p) */ - bidx = (volatile u16 *)&D_800B9A02; - pv = *(u32 *)p; - *(u32 *)p = (pv & 0xFF000000) | - (*(u32 *)(*(s32 *)((u8 *)&D_800A651C + - (*bidx * 20)) + 0x40) & 0xFFFFFF); - ot = *(s32 *)((u8 *)&D_800A651C + (*bidx * 20)); - *(u32 *)(ot + 0x40) = (*(u32 *)(ot + 0x40) & 0xFF000000) | ((u32)p & 0xFFFFFF); - func_80016638(&D_800A6518[*bidx * 20], 0x10, 1); - __asm__ __volatile__("" : "=r"(pv)); /* zero-byte 2nd SET: kills the sched1 birthing boost */ -} - - -void func_80181E6C(void) { - - extern s16 D_801D097C; - s16 *p = &D_801D097C; - s32 i = 0xF; - do { - *p = 0; - p = (s16 *)((s32)p + 0x10); - i--; - } while (i >= 0); -} - - - - -extern void func_80015978(s32 a0, s32 *a1); -extern void func_80181EB8(s32 a0); - -void func_80181E90(s32 a0) { - s32 pv[2]; - func_80015978(a0, pv); - func_80181EB8((s32)pv); -} - - - -/* func_80181EB8 — §71 sibling of func_8018A774 / func_8018AF0C (same TU): the - * RotTransPers wrapper family. Here the SVECTOR comes in as the parameter - * instead of being produced by func_80015978, so pv[0..1] is free and carries - * the 4-byte word copied out of D_801CE7A8 instead. - * - * Frame proof (0x38 = 0x10 outgoing + 0x18 var + 0x10 saved s0/s1/ra): - * sp+0x10 u16 sxy[4] (8 bytes) -> RotTransPers a1, func_80181F40 arg0 - * sp+0x18 s32 pv[4] (16 bytes) -> pv[0] = copy dest, &pv[2]/&pv[3] = 0x20/0x24 - * - * The lwl 0x3 / lwr 0x0 / swl 0x1B / swr 0x18 block move: a 4-byte struct assign - * whose type has ALIGNMENT 1 (cookbook §48-C2). Align 1 (not 2) is load-bearing — - * it is what pushes the copy off the move_by_pieces path (which keeps the SYMBOL - * in the address and emits a fresh `lui $at,%hi` per reference) onto mips.c - * expand_block_move, which copy_addr_to_reg's the source address into ONE held - * register first -> `lui $a1,%hi; addiu $a1,$a1,%lo; lwl 3($a1); lwr 0($a1)`. - * A {u16,u16} (align 2) struct compiles to the same opcode sequence but with the - * folded-symbol addressing: 4 mismatches. Struct assign, NOT memcpy (memcpy - * byte-matches in isolation but lowers to `jal memcpy` in any TU that declares - * it — §2959). - * - * All four callee prototypes are copied VERBATIM from this TU (func_8004914C / - * func_800491AC / RotTransPers at file scope L3484-3486; func_80181F40 from its - * own definition at L3612). D_800AF648 is block-scoped `extern u8` exactly as - * the two matched siblings do it. D_801CE7A8 appears nowhere else in the TU. - */ - -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); -extern void func_80181F40(void *arg0, void *arg1, s32 arg2, s32 arg3); - -void func_80181EB8(s32 a0) { - extern u8 D_800AF648; - extern V4_80181EB8 D_801CE7A8; - u16 sxy[4]; - s32 pv[4]; - - *(V4_80181EB8 *)pv = D_801CE7A8; - func_8004914C(&D_800AF648); - func_800491AC(&D_800AF648); - RotTransPers(a0, (s32)sxy, &pv[2], &pv[3]); - func_80181F40(sxy, pv, 0x10, 0x18); -} - - - -extern void func_80181FAC(void *a0, void *a1, s16 a2); -extern void func_801820E0(s32 a0, s16 a1, u16 a2); - -void func_80181F40(void *arg0, void *arg1, s32 arg2, s32 arg3) { - /* The target frame is 0x30: 0x10 outgoing-arg area + 0x10 var_size + - * 0x10 saved regs (s0/s1/s2/ra at 0x20..0x2C). gcc-2.7.2 allocates a - * declared aggregate even when it is never referenced, so this 16-byte - * local reproduces the original's var_size exactly. */ - s32 unused[4]; - s32 i; - s32 j; - - func_80181FAC(arg0, arg1, arg2); - for (i = 0, j = 0; i < 0x10; i++, j += 0x100) { - func_801820E0(i, j, arg3); - } -} - - - - - -void func_80181FAC(void *a0, void *a1, s16 a2) { - - extern s16 D_801D0970; - extern s16 D_801D0972; - extern u8 D_801D0978; - extern u8 D_801D0979; - extern u8 D_801D097A; - extern u32 D_801D0974; - if (a0 != NULL) { - D_801D0970 = *(u16 *)a0; - D_801D0972 = *(u16 *)((s32)a0 + 2); - } else { - D_801D0970 = 0; - D_801D0972 = 0; - } - - D_801D0978 = *(u8 *)a1; - D_801D0979 = *(u8 *)((s32)a1 + 1); - D_801D097A = *(u8 *)((s32)a1 + 2); - D_801D0974 = (u32)a2 << 16; -} - - - - -extern void func_80015978(s32 a0, s32 *a1); -extern void func_8004914C(void *a0); -extern void func_800491AC(void *a0); -extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); - -void func_8018201C(s32 a0) { - - extern s16 D_801D0970; - extern s16 D_801D0972; - /* [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_800AF648; - u16 sxy[2]; - s32 pv[4]; - - func_80015978(a0, pv); - func_8004914C(&D_800AF648); - func_800491AC(&D_800AF648); - RotTransPers((s32)pv, (s32)sxy, &pv[2], &pv[3]); - - D_801D0970 = sxy[0]; - D_801D0972 = sxy[1]; -} - - - - -extern s32 func_801821FC(void); -extern void func_801820E0(s32 a0, s16 a1, u16 a2); - -void func_80182094(s32 a0, s32 a1) { - s32 result = func_801821FC(); - if (result >= 0) { - s16 ext_a0 = (s16)a0; - func_801820E0(result, ext_a0, (u16)a1); - } -} - - - -/* func_801820E0 — particle/ripple spawner for slot `a0` of the 16-entry, - * 0x10-byte-stride table at D_801D097C. - * - * Declaration notes (the TU already carries all of these — nothing is invented): - * - rand / func_80047948 / func_8004787C : verbatim re-declarations of the - * TU's own file-scope prototypes (L951, L2197, L2198) -> merge silently. - * - D_801D097C : block-scope `extern s16` exactly as func_8018AD5C (L3869) - * and func_8018B0EC (L3982) declare it. - * - D_801D0976 : its own dlabel in asm/ov_SC03_014/data/tail19.data.s:5868; - * undeclared anywhere in the TU, so a block-scope extern is conflict-free. - * It is declared as an ARRAY on purpose: the ARRAY_REF sets MEM_IN_STRUCT_P, - * which restores the true_dependence() edge against the in-struct `p->f2` - * store and stops sched2 from hoisting the load above it (cookbook §135/2). - * - The TU's own prototype for this function is - * extern void func_801820E0(s32 a0, s16 a1, u16 a2); (L3929) - * but the body byte-proves the params are plain s32 (no `sll/sra` on $a1 and - * a single `andi` at the use, not the promoted-var `move`+`andi` pair). So the - * definition uses the §37/§124 ASM-LABEL ALIAS — exactly what this same TU - * already does for `aF8018A860` — leaving the TU's declaration untouched. - */ - -extern s32 rand(void); -extern s32 func_80047948(s32 a0); -extern s32 func_8004787C(s32 a0); - -void aF8018AFD0(s32 a0, s32 a1, s32 a2) __asm__("func_801820E0"); - -void aF8018AFD0(s32 a0, s32 a1, s32 a2) -{ - - extern s16 D_801D097C; - extern s16 D_801D0976[]; - - s32 unused[4]; /* dead locals — reproduces var_size 0x10 (frame 0x38) */ - P_801820E0 *p; - u16 rad; - s32 m; - s32 ang; - s32 t8; - s16 tC; - - p = (P_801820E0 *)((s32)&D_801D097C + (a0 << 4)); - - rad = a2; - rad = a2 + (rand() % (rad >> 2) - (rad >> 3)); - - ang = a1 + (rand() & 0x3f) - 0x20; - p->f6 = ang; - - m = rad; - t8 = (func_80047948(p->f6) * m) >> 12; - tC = (func_8004787C(p->f6) * m) >> 12; - p->f8 = t8 << 16; - p->fC = tC << 16; - - p->f0 = (rand() & 0xf) + 0x10; - p->f2 = m << 6; - p->f4 = (s32)D_801D0976[0] * 64; -} - - - - -s32 func_801821FC(void) { - - extern s16 D_801D097C; - s32 i = 0; - s32 offset = 0; - - while (i < 0x10) { - u16 val = *(u16*)((u8*)&D_801D097C + offset); - if (val == 0) { - return i; - } - i++; - offset += 0x10; - } - return -1; -} - - - - -/* func_80182238 — the 16-slot particle/effect stepper over D_801D097C[16] - * (0x10-byte records; slot 0 = the `active` u16 that func_8018AD5C clears and - * func_8018B0EC scans). Layout used here, all as byte-offsets off ONE walked - * base pointer: - * +0x0 u16 active +0x2 s16 angle +0x4 u16 dangle - * +0x6 s16 dir +0x8 s32 x +0xC s32 z - * - * IV shape (cookbook §3-Giv / gcc-map L1): the target has ONE biv (the walked - * base, kept alive by the bare +0x0 accesses, which find_mem_givs excludes from - * giv formation) plus ONE combined DEST_ADDR giv anchored at base+2 - * (`addiu $s1, $s2, 0x2`). combine_givs takes g1 from the list HEAD and - * record_giv PREPENDS, so *the last-emitted offset reference anchors*: the - * `+= dangle` statement (which ends on a +0x2 store) must therefore come LAST - * in the body. Written before the two s32 updates it anchors at base+0xC - * instead -> 14 mismatched immediates. - * - * Both rsin/rcos products are computed BEFORE any store because gcc-2.7.2's - * sched.c makes every mem ref depend on last_function_call — a store emitted - * between the two `jal`s could not have floated below the second one. - * - * `i++` precedes the pointer bump in the for-increment: that emission order is - * what puts `addiu $s4,$s4,1` ahead of the giv's `addiu $s1,$s1,0x10` (the - * biv's own bump then fills the branch delay slot). - * - * func_80047948 / func_8004787C keep this TU's file-scope prototypes verbatim - * (L2197-2198, `s32` param) — the s16 field is sign-extended at the call site - * by the `lh`, so the narrower m2c-style `s16` prototype is not needed (§17a-1). - * D_801D097C uses the TU's existing block-scope `extern s16` spelling - * (func_8018AD5C L3869, func_8018B0EC L3982). - */ - -extern s32 func_80047948(s32 a0); -extern s32 func_8004787C(s32 a0); - -void func_80182238(void) { - - extern s16 D_801D0976; - extern s16 D_801D097C; - extern void func_8018234C(s32); - - s16 *p; - s32 i; - s16 ang; - s32 vx; - s32 vz; - - ang = D_801D0976; - p = &D_801D097C; - - for (i = 0; i < 0x10; i++, p = (s16 *)((s32)p + 0x10)) { - if (*(u16 *)p != 0) { - if ((ang > 0 && *(s16 *)((s32)p + 2) > 0x4000) || - (ang < 0 && *(s16 *)((s32)p + 2) <= 0)) { - *p = 0; - } else { - func_8018234C(i); - vx = func_80047948(*(s16 *)((s32)p + 6)) * ang * 0x10; - vz = func_8004787C(*(s16 *)((s32)p + 6)) * ang * 0x10; - *(s32 *)((s32)p + 8) += vx; - *(s32 *)((s32)p + 12) += vz; - *(u16 *)((s32)p + 2) += *(u16 *)((s32)p + 4); - } - } - } -} - - - -/* func_8018234C — spawns one 0x14-byte GPU packet from D_800A5E60, rotates / - * scales a matrix copy of D_800AE620 by the D_801D097C[a0] record, projects the - * four corner offsets into the packet, then links the packet into the OT. - * - * Byte-verified levers (all three were needed; each is worth 8-31 insns): - * - * A. THE OT LINK IS THE libgpu P_TAG BITFIELD, NOT HAND-MASKING. Writing - * `*(u32*)q = (*(u32*)q & 0xFF000000) | (ot & 0xFFFFFF)` is byte-correct - * arithmetic but gives the WRONG register assignment (16 mismatches: the - * 0xFFFFFF / 0xFF000000 / &D_800B9A02 pseudos land in a0/a2/a3 permuted, - * and the `lw $v1,0($s3)` gets serialised behind the index load). The - * `unsigned addr:24; unsigned len:8` bitfield insert reproduces both the - * allocation and the schedule exactly. This is just `addPrim(ot, q)`. - * - * B. THE OT TABLE MUST BE AN ARRAY_REF (`D_800A651C[i].a`), NOT - * `*(s32*)((u8*)&D_800A651C + i*20)`. With the pointer-arith spelling gcc - * allocates a phantom 8-byte stack temp that is never referenced, pushing - * the frame from 0x68 to 0x70 (cookbook D6 in reverse: the frame is too - * BIG). The temp only appears when the SAME lookup expression occurs in - * two statements; the ARRAY_REF form (engine_core.h `OtBlk`) kills it. - * - * C. THE LAST ApplyMatrixSV RECOMPUTES THE MATRIX ADDRESS. The first four - * matrix arguments come out of $s4 (`addu $aX,$s4,$zero`), but the fifth is - * `addiu $a0,$sp,0x10`. cse.c cannot be talked out of folding a fifth - * `&m` into the existing pseudo: the conditional above it is a - * "branch around a block", so cse_end_of_basic_block EXTENDS the basic - * block through the join label (status AROUND) and the equivalence class - * for (plus fp 16) is still live. Every source-level attempt to break it - * (pointer local, `mp = m` in the skipped arm, a §21 zero-byte re-tie, - * do{}while(0) loop notes) either changed nothing or cost 3 insns by - * turning the pointer into a two-def global allocno. Pinning a reader to - * $sp makes the expression `(plus (reg 29) 16)` — a different rtx from - * `(plus (reg fp) 16)`, so cse never looks it up, and the single-use pseudo - * is folded by combine into the one `addiu` the target has. - * - * The svp/outp block around the FIRST ApplyMatrixSV is load-bearing too: - * removing it costs 6 insns and two extra callee-saved registers. - */ - -extern void ApplyMatrixSV(void *a0, void *a1, void *a2); -extern void RotMatrixZ(s32 a0, void *a1); -extern void func_8004901C(void *a0, void *a1); -extern void func_80016638(void *a0, s32 a1, s32 a2); - - -/* 0x10-byte-stride record table at D_801D097C (same table as func_8018AD5C) */ - - /* the 0x20-byte matrix */ - /* == engine_types.h OtBlk */ - /* the D_800B9A02 buffer index */ - /* libgpu P_TAG */ - -void func_8018234C(s32 a0) { - - extern s16 D_801D0970; - extern s16 D_801D0972; - extern u8 D_801D0978; - extern u8 D_801D0979; - extern u8 D_801D097A; - - extern s16 D_801D097C; - extern u8 *D_800A5E60; - extern s32 D_800AE620; - extern u8 D_800A6518[]; - extern Ot_8018B23C_8018234C D_800A651C[]; - - s32 m[8]; /* sp+0x10 */ - u8 sv[8]; /* sp+0x30 */ - u16 out[4]; /* sp+0x38 */ - s32 scale[4]; /* sp+0x40 */ - - u8 *q; - Rec_8018B23C_8018234C *p; - s32 x; - s32 y; - s32 ang; - - q = D_800A5E60; - - *(Mat32_8018B23C_8018234C *)m = *(Mat32_8018B23C_8018234C *)&D_800AE620; - - D_800A5E60 = q + 0x14; - *(u8 *)(q + 3) = 4; - *(u8 *)(q + 7) = 0x22; - *(u8 *)(q + 4) = D_801D0978; - *(u8 *)(q + 5) = D_801D0979; - *(u8 *)(q + 6) = D_801D097A; - - p = (Rec_8018B23C_8018234C *)((s32)&D_801D097C + (a0 << 4)); - x = p->fA + (u16)D_801D0970; - y = p->fE + (u16)D_801D0972; - RotMatrixZ(p->f6, m); - - scale[0] = *(s16 *)((s32)p + 2); - scale[1] = *(s16 *)((s32)p + 2); - scale[2] = *(s16 *)((s32)p + 2); - func_8004901C(m, scale); - - *(s16 *)(sv + 4) = 0; - *(s16 *)(sv + 2) = 0; - *(s16 *)(sv + 0) = p->f0; - { - void *svp = sv; - void *outp = out; - ApplyMatrixSV(m, svp, outp); - __asm__ __volatile__("" : "=r"(svp)); - __asm__ __volatile__("" : "=r"(outp)); - } - - *(s16 *)(q + 0x8) = x + ((s16)out[0] >> 1) * 3; - *(s16 *)(q + 0xA) = y + ((s16)out[1] >> 1) * 3; - *(s16 *)(q + 0xC) = x - ((s16)out[0] >> 1); - *(s16 *)(q + 0xE) = y - ((s16)out[1] >> 1); - x = x + out[0]; - *(s16 *)(q + 0x10) = x; - y = y + out[1]; - *(s16 *)(q + 0x12) = y; - - ang = -0x400; - if (p->f0 & 1) { - ang = 0x400; - } - RotMatrixZ(ang, m); - - *(s16 *)(sv + 0) = 2; - { - /* lever C: sp+0x10 IS &m, but spelled so cse cannot fold it to $s4 */ - register u8 *spr __asm__("$29"); - ApplyMatrixSV(spr + 0x10, sv, out); - } - - *(s16 *)(q + 0x10) = *(u16 *)(q + 0x10) + out[0]; - *(s16 *)(q + 0x12) = *(u16 *)(q + 0x12) + out[1]; - - { - Bidx_8018B23C_8018234C *bp = (Bidx_8018B23C_8018234C *)&D_800B9A02; - - /* addPrim(&D_800A651C[bp->f].a[0x10], q) */ - ((PTag_8018B23C_8018234C *)q)->addr = - ((PTag_8018B23C_8018234C *)(D_800A651C[bp->f].a + 0x40))->addr; - ((PTag_8018B23C_8018234C *)(D_800A651C[bp->f].a + 0x40))->addr = (u32)q; - func_80016638(&D_800A6518[bp->f * 20], 0x10, 1); - } -} - - - - - diff --git a/src/ov_SC07_000/ov_SC07_000_jr_8017F8B8.c b/src/ov_SC07_000/ov_SC07_000_jr_8017F8B8.c new file mode 100644 index 000000000..68e980456 --- /dev/null +++ b/src/ov_SC07_000/ov_SC07_000_jr_8017F8B8.c @@ -0,0 +1,4866 @@ +#include "common.h" +#include "../shared/engine_core.h" + + +/* ==== Phase-26 §8b carried decl layer (jr_isolate_all.py) =================== + * The file-scope decl environment from earlier code regions of this object — + * file-local types, col-0 decls, DEFINE_func macro externs, and each earlier + * definition's implied prototype (types first, then decls in original order). + * Decls emit no code => byte-neutral. See cookbook §8c. */ +typedef struct { + SVECTOR_8016E7C8 v[4]; /* 0x00 */ + s32 f0, f1, f2, f3, f4, f5; /* 0x20..0x37 */ + u8 f6; /* 0x38 */ + u8 pad[7]; /* -> 0x40 */ +} Prim_8016E7C8; +typedef void (*Handler)(struct Entry_8016E95C *); +typedef struct { s16 vx, vy, vz, pad; } SV3_8017E830; +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); +extern void func_801458E8(void); +extern s32 func_80029504(void); +extern void func_80145B24(void); +extern u8 D_80184BB4; +extern u8 D_80184B24; +extern u8 D_80184B00; +extern u8 D_80184ADC; +extern u8 D_80184B90; +extern u8 D_80184B6C; +extern u8 D_80184B48; +extern u8 D_80184AB8; +extern void func_80145934(void); +extern u8 D_80184C44; +extern u8 D_80184C20; +extern u8 D_80184BFC; +extern u8 D_80184BD8; +extern void func_80145A2C(void); +extern s32 func_800291DC(s32); +extern void func_800291C8(s32, s32); +extern void func_80162120(void); +extern void func_80029124(s32, s32); +extern s32 func_80165A50(s32); +extern void func_80029514(s32); +extern u8 D_800AF630[]; +extern u8 D_80078EC0; +extern s32 D_80126B58; +extern s32 func_80028FBC(void); +extern s32 func_80029000(void); +extern s32 func_80028D9C(void); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_80145BF8(void); +extern s32 func_800291B4(s32 arg); +extern void func_800291A0(s32, s32); +extern void func_80145C54(void); +extern s32 func_80145CEC(); +extern s32 func_80029178(s32 arg); +extern void func_80146014(s32 a0); +extern unsigned char D_8018403C[]; +extern unsigned char D_8018406C[]; +extern unsigned char D_801840BC[]; +extern unsigned char D_801840EC[]; +extern unsigned char D_8018411C[]; +extern void func_80145EE8(s32 param_1); +extern void MoveImage(void *a0, s32 a1, s32 a2); +extern void func_80146074(void); +extern s32 func_80146128(void); +extern void func_80146360(void); +extern void func_801463A0(); +extern void func_8014607C(void); +extern s32 *D_80126B78; +extern u8 D_80078EC1; +extern s32 D_80078EC8; +extern s32 D_80126B9C; +extern s32 D_8011F730; +extern u16 D_801152B8; +extern u16 D_8012693A; +extern u8 D_80126BE0[]; +extern u8 D_801150F0[]; +extern void *memcpy(void *dst, const void *src, u32 n); +extern void func_80146FC4(s32 a0); +extern void func_80150A70(s32 a0); +extern void func_80147098(s32 *a0); +extern void func_8014A638(s32 arg0); +extern s32 func_80155458(s32 a0); +extern s32 func_80029104(void); +extern void func_80029344(void); +extern void func_8014ADE0(s32 a0); +extern void func_8014B350(s32 a0); +extern void func_8014B7A4(s16 *param_1); +extern s32 func_80161D58(s32 a0); +extern void func_80161A90(s32 a0); +extern void func_8014B504(u16 *a0); +extern void func_80149BEC(s32 a0); +extern void func_8014B5D0(s32 *a0); +extern void func_8014C99C(u8 *a0); +extern void func_8014B190(s32 s0); +extern void func_80148648(s32 a0, s32 a1); +extern s32 func_80149228(s32 a0); +extern void func_8014A59C(s32 a0); +extern void func_8016F14C(void *a0); +extern void func_80154418(void *a0); +extern void func_80154BE4(s32 a0); +extern void func_80165694(s32 arg0); +extern void func_801654A8(s32 a0); +extern void func_8014A680(s32 a0); +extern void func_8014A6A8(s32 a0); +extern void func_8014A71C(s32 a0); +extern void func_80172588(s32 *a0); +extern void func_801473DC(s32 *a0); +extern void func_80015978(s32 a0, s32 *a1); +extern void (*D_8018416C[])(void *); +extern u8 D_80126BA4; +extern s32 D_80127098; +extern s32 D_80127094; +extern s32 D_80127090; +extern void func_80146534(void); +extern void func_8001D074(s32 a0, s32 a1); +extern void func_80146554(void); +extern void func_80146578(void); +extern void func_8001CFDC(s32, s32); +extern void func_8014659C(void); +extern void func_8001D074(s32, s32); +extern void func_801465C0(void); +extern void func_801465E4(void); +extern void func_801466F0(s32 a0, s32 a1, s32 a2, s32 a3, s32 sp5, s32 sp6, s32 sp7, s32 sp8); +extern s32 D_8011F9D0; +extern s32 func_80146608(s32 a0, s32 a1, s32 a2, s32 a3, s16 arg9, s32 arg10, s32 arg11, s32 arg12, s32 arg13); +extern void func_801466B4(u16 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 D_8011F750; +extern s32 D_8011F754; +extern u8 * func_801468C8(s32 arg0, u8 arg1); +extern s32 D_8011D030; +extern s32 func_80146994(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80146924(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg5); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern s32 func_80146994(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_801469C8(int a0, void *a1, int a2, int a3, u16 arg5, int arg6, int arg7, int arg8); +extern s32 func_80146B9C(void *a0); +extern void func_80146AB4(s16 a0, s32 a1, s16 a2, s16 a3, u16 a4, s32 a5, s32 a6); +extern u16 D_8011DA28; +extern s32 func_80146B9C(void * arg0); +extern void func_80146C98(s32 *a0, s16 a1); +extern void func_80146CA0(void *a0); +extern void func_80146CB4(void *a0); +extern void func_80146CC8(s32 a0); +extern void func_80146D30(s32 a0); +extern void func_80146D80(s32 *a0); +extern void func_80146DE8(s32 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80146D90(s32 a0); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80146DF8(s32 *a0, s32 a1, s32 a2, s32 a3, s32 t0); +extern void func_80146E90(s32 *a0, s32 a1); +extern s32 func_80146E98(s32 a0); +extern void func_80015954(s32 a0, s32 a1); +extern void func_80149374(s32 a0, s32 a1); +extern void func_80146F58(s32 a0, s32 a1); +extern void func_80146EC0(s32 a0, s32 a1, s32 a2, s32 a3); +extern s16 func_8012A68C(void); +extern s16 func_8012A758(void); +extern void func_8004978C(s16 *a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern u8 D_80126DB0[]; +extern u16 D_80126DB6; +extern void func_8014704C(s32 *a0); +extern s32 func_80147054(void *a0); +extern void func_80147060(u8 * a0); +extern void func_8014706C(void *arg0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80147084(s32 *a0); +extern void func_8014708C(void *arg0); +extern s32 func_801470A0(void *a0); +extern void func_801470AC(s32 *a0); +extern void func_801470B4(s32 arg0); +extern void func_801470C0(s32 a0); +extern void func_80147118(s32 a0); +extern s16 D_80126BB8; +extern s16 D_80126BBA; +extern s16 D_80126BBC; +extern void func_80147264(s32 a0); +extern void func_80147290(void); +extern void func_801472B4(void *a0); +extern s32 func_801472C8(struct S *a0); +extern void *D_8012707C; +extern void func_801472DC(void); +extern void func_801472F0(void *a0); +extern void func_80147364(u16, s32); +extern void func_80147300(u16 arg0); +extern void func_80147324(s32 arg0); +extern void func_801473EC(s32 *a0); +extern void func_80147460(s32 a0); +extern void func_80147514(); +extern void func_80147628(s32 a0); +extern void func_80147478(s32 a0); +extern void func_801474D8(s32 *a0); +extern void func_801474EC(s32 *a0); +extern s32 func_80012C6C(s32 a0, s32 a1, s32 a2); +extern s32 func_800129CC(s32 a0, s32 a1); +extern void func_80147514(s32 arg0); +extern void func_80013F3C(s32 a0); +extern void func_80012558(s32 a0, s32 a1); +extern void func_800126C4(s32 a0, s32 a1); +extern void func_800123F0(s32 a0, s32 a1); +extern void func_80147718(s32 a0); +extern void func_80147788(void *a0, s32 a1); +extern void func_801477A8(void *a0, s32 a1); +extern void func_801477C8(void *a0, s32 a1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80147814(s32 a0, s32 a1); +extern void func_80147928(int a0, int a1); +extern void func_8014799C(int a0, int a1); +extern void func_80147A10(int a0, int a1); +extern void func_80147860(int a0, int a1, int a2, int a3); +extern void func_80147948(s32 a0, s32 a1, s32 a2); +extern void func_801479BC(s32 a0, s32 a1, s32 a2); +extern void func_80147A30(s32 a0, s32 a1, s32 a2); +extern void func_801478B8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147948(int a0, int a1, int a2); +extern void func_801479BC(int a0, int a1, int a2); +extern void func_80147A30(int a0, int a1, int a2); +extern void func_80147AD4(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147A84(s32 arg0); +extern void func_80147C30(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147AAC(s32 arg0); +extern void func_80147CC8(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80147B5C(s32 a0, void *a1); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern void func_80147B18(s32 a0); +extern void func_80147B5C(s32 arg0, void *arg1); +extern void func_80147C30(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147DC0(s32 a0, s32 a1); +extern void func_80147D38(s32 a0, s32 a1, s32 a2, s32 a3, void * a4); +extern void func_800484EC(s32 a0, s32 a1, s32 a2); +extern void func_80147E44(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80147F78(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern void func_80147F50(s32 arg0); +extern void func_80148038(s32 a0, s32 a1); +extern s32 ratan2(s32 a0, s32 a1); +extern s32 csqrt(s32 a0); +extern s32 func_80012A60(s32 a0, s32 a1); +extern void func_80148094(int param_1, short *param_2, int *param_3); +extern void func_801485B8(s32 a0, s32 a1, s32 a2); +extern void func_801484B0(s32 a0, s32 a1); +extern s32 func_80154358(void *a0); +extern void func_801484E8(s32 a0, s32 a1); +extern void func_80148534(s32 a0, s32 a1); +extern void func_8014856C(s32 a0, s32 a1); +extern void func_801485B8(s32 arg0, s32 arg1, s32 arg2); +extern void func_80148634(void *a0); +extern u8 D_800B9A64; +extern s32 func_80014DC0(); +extern s32 func_80014D68(); +extern s32 func_80014D94(); +extern s32 func_80014CF8(); +extern void func_800120DC(); +extern s32 func_800CF8B4(); +extern u16 func_801487F4(s32 *a0); +extern u16 func_80148800(s32 *a0); +extern u8 func_8014880C(s32 *a0); +extern u16 func_80148818(s32 *a0); +extern s32 func_80047D3C(s32 a0); +extern s32 func_80148824(void *arg0); +extern s32 func_801488A8(u8 *a0); +extern s32 func_8014891C(s32 a0); +extern s32 func_80148980(u8 *a0); +extern s32 func_801489E8(s32 a0); +extern s32 func_80148A48(s32 a0); +extern int func_80148AFC(void *a0); +extern void func_80148AAC(u8 *a0); +extern s32 func_80148C18(void); +extern s32 func_80148C20(s32 a0, s16 a1); +extern s32 func_80148C34(s32 a0, s32 a1); +extern s32 func_80148C4C(s32 a0, s32 a1); +extern s32 func_80148C64(s32 a0, s32 a1); +extern s32 func_80148C7C(void); +extern s32 func_80148C84(s32 a0, s32 a1); +extern s32 func_80148C9C(s32 a0, s32 a1); +extern s32 func_80148CB4(s32 a0, s32 a1); +extern s32 func_80148CCC(s32 a0, s32 a1); +extern s32 func_80148CE4(void); +extern s32 func_80148CEC(void); +extern s32 func_80148CF4(s32 a0, s32 a1); +extern s32 func_80148D0C(s32 a0, s32 a1); +extern s32 func_80148D24(void *a0, int a1); +extern s32 func_80148D3C(void); +extern s32 func_80148F60(void); +extern s32 func_80148F68(s32 a0); +extern s32 func_80148F74(s32 a0); +extern s32 func_80148F80(s32 a0); +extern s32 func_80148F8C(s32 a0); +extern s32 func_80148F98(void); +extern s32 func_80148FA0(s32 a0); +extern s32 func_80148FAC(s32 a0); +extern s32 func_80148FB8(s32 a0); +extern s32 func_80148FC4(s32 a0); +extern s32 func_80148FD0(void); +extern s32 func_80148FD8(void); +extern s32 func_80148FE0(s32 a0); +extern s32 func_80148FEC(s32 a0); +extern s32 func_80148FF8(s32 a0); +extern s32 func_80149004(void); +extern void func_8014900C(s32 *a0); +extern void func_80149020(s32 *a0); +extern void func_80149034(s32 *a0); +extern void func_80149048(s32 *a0); +extern void func_8014905C(u8 *a0); +extern void func_801490E0(s32 *a0, s16 a1); +extern void func_801490E8(s32 *a0, s16 a1); +extern void func_801490F0(s32 *a0, s16 a1); +extern void func_80149078(s32 *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_80012B04(s32 a0, s32 a1, s32 a2); +extern void func_801490F8(s32 a0, s32 a1); +extern s32 func_801491C4(s32 a0); +extern s32 func_80149184(s32 a0); +extern s32 D_801151D4; +extern void func_80149204(s32 *a0); +extern void func_80149210(s32 a0, s32 a1); +extern s32 func_80149284(s32 *a0, s32 a1); +extern void func_80149350(s32 arg0); +extern void func_80149290(s32 a0); +extern void func_8012F14C(s32 a0, s32 a1, s32 a2); +extern void func_80149374(s32 arg0, s32 arg1); +extern void func_801493D0(s32 param_1, s32 param_2, s32 param_3); +extern void func_8012F038(int param_1, short *param_2, short *param_3); +extern void func_8014942C(s32 arg0); +extern void func_8012EF70(s32 a0, s32 a1); +extern void func_80149544(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012EFB8(s32 a0); +extern void func_80149584(s32 arg0, s32 arg1, s32 arg2); +extern void func_8014964C(s32 param_1, s32 param_2); +extern s32 func_801496D4(void *a0); +extern void func_8015AD08(); +extern void func_80149704(void); +extern void func_8015ACC4(); +extern void func_80149724(void); +extern u8 D_80078EBF; +extern s32 func_80149744(struct S_80149744 *a0); +extern void func_8015F7A0(); +extern void func_80149788(void); +extern void func_801653B8(); +extern void func_80149864(void); +extern s16 currentLocationId; +extern s32 func_8016F1AC(void); +extern s32 func_80149884(void); +extern void func_80160B00(); +extern void func_801498C0(void); +extern s32 func_80149AA8(s32 *a0); +extern s32 func_80149B54(s32 *a0); +extern void func_80146750(void *a0); +extern s32 func_801498E0(s32 *a0); +extern void func_8012E5CC(s32 param_1, u16 param_2, u16 param_3); +extern void func_80147364(u16 a0, s32 a1); +extern s32 func_800CCF28(s32 a0); +extern u8 D_80126B5C; +extern s32 func_80149954(s32 s0); +extern s32 func_80149A64(s32 *a0); +extern void func_8015DAC4(s32 *a0); +extern void func_8015554C(s32 *a0); +extern void func_80149AD4(s32 *a0); +extern void func_80149B14(s32 *a0); +extern u8 func_8014BEF8(void); +extern s32 func_80149B54(s32 * arg0); +extern void func_8015DE24(s32 *a0); +extern void func_80157510(s32 *a0); +extern void func_80149BAC(s32 *a0); +extern s32 func_80029178(s32 a0); +extern s32 func_80149C08(s32 arg0); +extern void func_801577C8(); +extern void func_80149C94(void); +extern void func_80157D20(void); +extern void func_80149CB4(void); +extern s32 func_80149CD4(s32 a0); +extern u8 func_8014B5B8(s32 *a0); +extern s32 func_80149D10(s32 a0); +extern s32 func_80149E94(s32 a0); +extern s32 func_80149DD8(s32 a0); +extern s32 func_80149D9C(s32 a0); +extern u8 D_801202A0[]; +extern s32 func_80149F2C(s32 a0, s32 a1); +extern s32 func_80149E94(s32 arg0); +extern void func_80149FA8(void); +extern s32 D_80184234[]; +extern u8 D_80078E78[]; +extern s32 func_80149FB0(s32 a0); +extern s32 func_80135260(s32 arg0, s32 arg1, s16 *arg2, s16 *arg3); +extern void func_8014A1B0(s32 a0, s32 a1); +extern s32 func_8014A048(s32 param_1); +extern u16 func_80156370(u16 a0); +extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4); +extern void func_8015D4B4(); +extern void func_8014A218(void); +extern s32 func_8014C278(s32 a0, s32 a1, s32 a2); +extern s32 func_8014C2B0(void *a0, void *a1, s32 a2); +extern s32 func_8014A238(s32 arg0); +extern s32 func_8014A2E4(s32 a0); +extern void func_8014A380(s32 a0, s32 a1); +extern s16 D_801152B0; +extern s16 D_801152B4; +extern s32 func_8014A3E0(struct S_8014A3E0 *a0); +extern s32 func_8014A454(s32 a0); +extern s32 func_8014A4B4(void *a0); +extern void func_8015EDD4(); +extern void func_8014A4FC(void); +extern s32 func_8014A674(s32 *a0); +extern s32 func_8014A69C(s32 *a0); +extern s32 func_8014A6C4(s32 a0); +extern void func_8015E184(); +extern void func_8014A830(void); +extern s32 func_80029AF4(void); +extern s32 func_8014A850(s32 param_1); +extern void func_8014AA04(s32 a0); +extern void func_801599A4(void *a0); +extern void func_80159B3C(void *a0); +extern s32 func_80165A20(s32 a0); +extern void func_8014AB7C(); +extern void func_8014AC10(); +extern void func_8014AA28(void); +extern void func_8014AB5C(void); +extern void func_80162CCC(void); +extern void func_8014AB7C(s32 arg0); +extern void func_8014ABF0(void); +extern void func_80016714(void *a0, s32 a1); +extern void func_8014AC10(s32 arg0); +extern void func_8014ACC0(s32 a0, s32 a1); +extern void func_8014AD30(s32 a0, u16 *a1, s32 a2, s32 a3); +extern void func_8014ACE8(void *a0, s32 a1, s32 a2); +extern void func_80146AFC(void *a0); +extern void func_8014ADA8(s32 a0, s32 a1); +extern void func_8014AD7C(s32 a0); +extern s32 D_80078E8C; +extern void func_8014B034(s32 arg0); +extern void func_8014B00C(s32 arg0); +extern void func_8014B084(void); +extern s16 D_80078E90; +extern void func_8014B034(s32 a0); +extern u16 D_80078EAC; +extern u8 D_80078EBA; +extern void func_800D10EC(void); +extern void func_8002AC98(void); +extern s32 func_8014B154(s32 *a0); +extern void func_8014B12C(void); +extern void func_8014B2F8(void); +extern void func_8014B4C4(void); +extern void func_8014B160(s32 a0); +extern s32 func_8016F1C4(void); +extern s16 D_80078E96; +extern s16 D_80078EB8; +extern u16 D_80078EA6; +extern void func_8014B2A8(void); +extern void func_8014B310(void); +extern void func_8014B2D0(void); +extern s32 D_80078E94; +extern s32 D_80078ECC; +extern void func_8014B33C(void); +extern u8 D_80062BF4[]; +extern void func_8014BC80(s32 a0, s32 a1); +extern void func_80019064(void *a0); +extern s32 D_80078E98; +extern void func_80166244(); +extern void func_8014B4D4(void *a0); +extern s16 D_80078E9A; +extern u8 D_80126D1C; +extern s32 D_80126D74; +extern void func_8014B598(s32 a0, s32 a1); +extern void func_8014B5B0(s32 *a0); +extern void func_8014B5C4(s32 *a0, s32 a1, s32 a2); +extern void func_8014B5D8(s32 s1); +extern s32 D_80078E9C; +extern s32 D_80078ED0; +extern void func_8014B6F0(s32 a0, s32 a1); +extern void func_8014B768(s32 a0, s32 a1); +extern void func_8014B944(s32 a0, s32 a1, s32 a2); +extern s32 D_80078EA4; +extern u16 D_80078EB2; +extern s16 D_80078EB4; +extern void func_8014BB0C(void); +extern void func_8014BB24(s32 a0, s32 a1, s32 a2); +extern void func_8014BC0C(s32 a0, s32 a1); +extern void func_8014BC44(s32 a0, s32 a1); +extern u8 D_800B9A17; +extern void func_8014BCC0(s32 a0, s32 a1); +extern u16 D_80078EB6; +extern s32 func_8014BCEC(s32 a0, s32 a1); +extern void func_8014BD24(s32 a0, s32 a1); +extern void func_8014BD60(s32 param_1, s32 param_2); +extern void func_8014BD98(s32 a0, u16 a1); +extern void func_8014BDC8(void); +extern void func_8014BDE0(void); +extern s32 func_8017267C(s32 *a0); +extern s32 func_80013294(void *a0, void *a1); +extern void func_80029ED4(s32 a0); +extern void func_8014BDE8(s32 a0); +extern void func_8014BE78(void); +extern void func_8014BE9C(void); +extern void func_80029124(s32 a0, s32 a1); +extern void func_8014BEC0(void); +extern void func_8014BF18(s32 a0); +extern void func_8014BF48(void); +extern u8 func_8014BF6C(void); +extern void func_8014BF8C(u8 arg0); +extern void func_8014BFB0(void); +extern u8 func_8014BFD4(void); +extern void func_8014BFF4(s32 a0, s32 a1); +extern void func_8014C010(s32 a0, s32 a1); +extern s32 func_8014C050(s32 a0, s32 a1); +extern s32 func_8014C088(s32 a0, s32 a1); +extern s32 func_8014C0C8(s32 a0_unused, s32 a1, s32 a2); +extern s32 func_8014C118(void * a0, s32 a1, s32 a2); +extern s32 func_8014C168(s32 * param_1, s32 param_2); +extern void func_8014C1C8(s32 arg0, s32 arg1, void *arg2); +extern u8 D_801842BC[]; +extern void func_8014C1A0(s32 arg0, s32 arg1); +extern s32 func_80013328(s32 a0, s32 a1); +extern s32 func_8014C59C(void *a0, void *a1); +extern s32 func_8014C308(s32 arg0, s32 arg1, s32 arg2, s32 arg3); +extern s32 func_8014C43C(void *a0, s32 a1, s32 a2, s32 a3, s16 a5); +extern s32 func_8014C3A4(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C3D0(void *a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014C43C(void * a0, s32 a1, s32 a2, s32 a3, s16 a4); +extern s32 ratan2(s32 dx, s32 dy); +extern u8 D_801842C4; +extern s32 func_8014C5FC(s32 a0, s32 a1, void *a2); +extern s16 func_8014C5D0(s32 a0, s32 a1); +extern s32 func_8014C5FC(s32 a0, s32 a1, void * a2); +extern u8 D_80126D17; +extern void func_8014C6AC(void); +extern void func_8014C6C0(void); +extern u8 D_80126D1E; +extern void func_8014C6D0(void); +extern void func_8014C6E0(void); +extern s32 func_8014C860(s32 a0, s32 a1); +extern void func_8014C8C8(s32 a0, s32 *a1); +extern void func_8014C88C(s32 a0); +extern void func_8014C8C8(s32 dst, s32 * src); +extern void func_8014C8F0(s32 arg0); +extern u8 D_801151F0[]; +extern s32 func_8014C918(s32 a0, s32 a1); +extern s32 D_80126B50; +extern void func_8014C968(void); +extern void func_8014C978(void); +extern s32 func_8014C98C(void); +extern void func_80139914(s32 a0); +extern s32 func_8014CA00(s32 a0); +extern u16 func_8014CA70(s32 a0, s32 a1); +extern s32 func_8014CA14(s32 a0, s32 a1); +extern u16 func_8014CAE4(s32 *a0, s32 a1); +extern s32 func_8014CA88(s32 *a0, s32 a1); +extern s32 func_8014CAFC(void); +extern s32 func_8014CB0C(void); +extern s32 func_8014CB1C(void); +extern u8 D_80126D1F; +extern s32 func_8014CB2C(void); +extern s32 func_8014CB58(void); +extern u8 D_80126D1D; +extern void func_8014CB68(void); +extern s32 func_8014CB7C(void); +extern s32 func_8014CB8C(void); +extern short D_80126C9E; +extern void func_8014CB9C(struct Packed8 *a0); +extern s32 D_80126CDC; +extern void func_8014CBD8(void); +extern s16 D_80126CC4; +extern void func_8014CBE8(void); +extern void func_8014CBF8(void *a0); +extern void func_8014D3E0(s32 a0); +extern void func_8014D04C(void); +extern void func_8014CCB4(void); +extern void func_8014CC28(s32 a0); +extern void func_8014CD0C(u8 *a0); +extern s32 func_8014CF04(s32 a0, s32 a1, void *a2); +extern void func_8014CD80(s32 a0, void *a1, void *a2); +extern void func_8014D0A4(s32 a0); +extern s32 func_8014D2A0(s32 a0, void *a1, void *a2); +extern s32 func_8014D12C(s32 a0, void *a1, void *a2); +extern void func_8014D438(s32 a0); +extern void func_8014D3E0(s32 _arg0); +extern void func_8014D610(s32 a0, void *a1, void *a2); +extern s32 func_8014D4C0(s32 a0, void *a1, void *a2); +extern void func_8014D790(s32 a0); +extern void func_8014D738(void); +extern s32 func_8014DD8C(s32 a0, void *a1, void *a2); +extern s32 func_8014D820(s32 a0, u16 *a1, u16 *a2); +extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); +extern s32 func_8014DCE0(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_8014DD8C(s32 arg0, void *arg1, void *arg2); +extern void func_8014DF94(s32 arg0); +extern void func_8014DF3C(void); +extern s32 func_8014E284(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E048(s32 a0, u16 *a1, u16 *a2); /* u16*: def lhu semantics (T5b reconcile; ptr param type codegen-neutral for the caller) */ +extern s32 func_80135A4C(s32 a0, s32 a1, s32 *a2, s32 a3); +extern s32 func_80133784(s32 a0, void *a1, s32 a2); +extern u8 D_801152A8[]; /* canonical TU type (engine_core) — read via *(u16*) cast */ +extern s16 D_801152AC; +extern s32 func_8014E048(s32 param_1, u16 * param_2, u16 * param_3); +extern void func_8014E48C(s32 a0); +extern void func_8014E434(void); +extern void func_8014E5B4(s32 a0, void *a1, void *a2); +extern s32 func_8014E514(u8 *a0, s32 a1, s32 a2); +extern void func_8014E6F8(struct SubE6F8 *a0); +extern void func_8014E6A0(void); +extern s32 func_8014E83C(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014E790(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014E83C(s32 arg0, s16 * arg1, s16 * arg2); +extern void func_8014E934(s32 _arg0); +extern s32 func_8014EA4C(void *a0, void *a1, void *a2, s32 a3); +extern s32 func_8014E98C(void *a0); +extern u16 D_800B99DA; +extern s32 D_801150D8; +extern s16 D_801152AA; +extern u8 D_80126720[]; +extern s16 D_80126724; +extern s32 func_8014EA4C(void * a0, void * a1, void * a2, s32 _arg3); +extern s32 func_8014ED80(struct SubED80 *a0); +extern int D_801CE948; +extern void func_8014ED28(s32 _arg0); +extern s32 func_8014EE14(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014EE14(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F24C(struct SubF24C *a0); +extern void func_8014F1F4(void); +extern s32 func_8014F2E0(s32 a0, s16 *a1, s16 *a2); +extern s32 func_8014F2E0(s32 arg0, s16 * arg1, s16 * arg2); +extern s32 func_8014F4C0(); +extern s32 func_8014F468(void); +extern int func_8014F74C(); +extern int func_8014F6F4(void); +extern u8 D_800D3918[]; +extern u8 D_801152A8[]; +extern s32 D_801152BC; +extern int func_8014F74C(s32 arg0); +extern s32 func_8014FA70(s32 a0); +extern s32 D_801CE94C; +extern void func_8014FA04(s32 a0); +extern s32 func_8014FBC0(); +extern s32 func_8014FC18(u8 *self); +extern int func_8014FD54(int param_1); +extern void func_8014FCFC(void); +extern void func_80150170(void *a0); +extern s32 func_8014FE60(void *a0); +extern void func_8014FDF4(struct S8014FDF4 *a0); +extern s32 func_8014FE60(void *e); +extern s32 func_80134510(s32 arg); +extern s32 func_80150150(s32 a, s32 b); +extern s32 func_80150460(s32 a, s32 b); +extern void func_801504D8(u16 *a0); +extern s32 func_80150480(s32 _arg0); +extern s32 func_80150528(void *a0, void *a1, void *a2); +extern s32 func_80150528(void *arg0, void *arg1, void *arg2); +extern s32 func_801506A4(s32 a0, s32 a1); +extern s32 func_801505FC(s32 a0); +extern s32 func_801506A4(s32 arg0, s32 arg1); +extern void func_80150820(s32 a0, s32 a1); +extern void func_8015086C(int param_1); +extern s32 func_801508B4(s32 a0); +extern s32 func_8015094C(s32 a0); +extern short func_801508F8(s32 a0); +extern s32 D_801842F4; +extern s32 D_80126990; +extern s32 D_80126994; +extern u8 D_80126948[]; +extern s32 func_80021174(s32 a0, s32 a1); +extern s32 func_8015094C(s32 param_1); +extern void func_80150B9C(void); +extern s32 func_80151184(s32 a0, s32 a1, s32 a2); +extern s32 func_80150BA4(s32 a0); +extern s32 func_801619D0(void *a0); +extern void func_80150BC8(s32 *a0); +extern s32 func_80150480(s32 a0); +extern u16 D_800AE6DC; +extern void func_80150C48(s32 a0); +extern int func_80151184(int arg, int a1, int a2); +extern int func_80150CA0(int arg); +extern void func_80150EC4(s32 a, s32 b); +extern void func_80150CC4(s32 a); +extern void func_80150CE4(s32 a); +extern void func_80150D04(s32 a); +extern void func_80150D24(s32 a); +extern void func_80150D44(s32 a); +extern void func_80150D64(s32 a); +extern void func_80150D84(s32 a); +extern void func_80150DA4(s32 a); +extern void func_80150DC4(s32 a); +extern void func_80150DE4(s32 a); +extern void func_80150E04(s32 a); +extern void func_80150E24(s32 a); +extern void func_80150E44(s32 a); +extern void func_80150EC4(s32 a0, s32 a1); +extern void func_80150E64(s32 a0); +extern void func_80150E84(s32 a0); +extern void func_80150EA4(s32 a0); +extern u8 D_800AE6C0; +extern s16 D_800AE6C8; +extern s16 D_800AE6CA; +extern s16 D_800AE6CC; +extern s32 D_800AE6C4; +extern s16 D_800AE6CE; +extern u8 D_800AE6BE; +extern u8 D_801201F8[]; +extern void func_80150F78(void); +extern void func_80150F80(s32 a0); +extern int func_80150FB4(int arg); +extern void func_80150FD8(s32 a0); +extern int func_80151014(int arg); +extern void func_80151038(s32 a0); +extern int func_80151070(int arg); +extern int func_80151094(int arg); +extern void func_801510B8(void); +extern void func_801510C0(void); +extern int func_801510C8(int arg); +extern int func_801510EC(int arg); +extern s32 func_8012DB84(void); +extern s32 func_80151110(void); +extern void func_80151130(void); +extern int func_80151138(int arg); +extern void func_8015115C(s32 *a0, s16 a1); +extern s32 func_80151164(s32 a0, s32 a1); +extern s32 func_80151184(s32 arg0, s32 arg1, s32 arg2); +extern void func_801511A8(u8 *a0); +extern void func_801511C4(u8 *a0); +extern int func_80151204(int arg, int a1); +extern int func_801511E0(int arg); +extern int func_80151204(int a0, int a1); +extern void func_80151238(void *a0); +extern void func_8015126C(u16 *p); +extern void func_80151780(s32 a0); +extern void func_801516F0(s32 *a0); +extern void func_8015173C(s32 *a0); +extern s16 D_8011DB1A; +extern s32 D_80127518; +extern s32 D_801151FC; +extern s32 func_801725CC(u8 *a0); +extern s32 func_80029D3C(void); +extern void func_80151878(void); +extern void func_80153B58(s32 *a0); +extern s32 func_80151880(s32 a0); +extern s32 func_801518D8(s32 a0); +extern s32 func_80151944(void); +extern s32 func_80151924(void); +extern void func_8014E934(s32 a0); +extern s32 func_8014F3E8(s32 a0); +extern void func_801519C8(s32 a0); +extern void func_80151980(s32 a0); +extern M2C_UNK D_800D5880; +extern s32 D_800D58AC; +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_801519C8(s32 arg0); +extern void func_80151C54(s32 a0); +extern void func_801542DC(s32 *a0, s32 a1); +extern void func_8015BDD0(s32 *a0); +extern void func_80165718(s32 a0); +extern u8 D_800D46E4[]; +extern void func_80151AE4(s32 arg0); +extern void (*D_8018439C[])(void); +extern void func_80151D24(void *a0); +extern void func_80151DB0(s32 a0); +extern void func_80151D60(void *a0); +extern s32 func_80172630(u8 *a0); +extern s32 D_80062C14; +extern void func_80151DB0(s32 param_1); +extern void func_80151E78(s32 *a0); +extern void func_80151ECC(struct S80151ECC *a0); +extern void func_80151FB4(s32 a0); +extern void func_80151F38(s32 *a0); +extern void func_801553C0(s32 a0); +extern void func_80153C18(); +extern void (*D_801843C0[])(void); +extern void func_80152058(void *a0); +extern void func_801520DC(s32 a0); +extern void func_80152094(s32 a0); +extern void func_80147324(s32 a0); +extern u8 D_80062C04[]; +extern M2C_UNK D_801843B0; +extern void func_801520DC(s32 arg0); +extern void func_801470B4(s32 a0); +extern void func_8015369C(s32 a0); +extern void func_80152194(s32 *a0); +extern s32 func_801536DC(s32 a0); +extern void func_8015220C(s32 a0); +extern s32 func_80153800(s32 a0); +extern void func_801522CC(s32 a0); +extern void func_80152254(s32 *a0); +extern void (*D_801843D4[])(void); +extern void func_80152370(void *a0); +extern void func_801523F4(s32 a0); +extern void func_801523AC(s32 a0); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern u8 D_801843E0[]; +extern void func_801523F4(s32 arg0); +extern void func_801525F4(int); +extern s32 func_801535F4(void *arg0); +extern void func_8015BF48(s32 *a0); +extern void func_80152500(int param_1); +extern void func_801525F4(s32 a0); +extern void (*D_801843F0[])(void); +extern void func_80152698(void *a0); +extern void func_80152714(s32 a0); +extern void func_801526D4(s32 a0); +extern void func_80152790(s32 a0); +extern void (*D_80184408[])(void); +extern void func_8015282C(void *a0); +extern void func_801528B0(s32 a0); +extern void func_80152868(s32 a0); +extern M2C_UNK D_801843F8; +extern void func_801528B0(s32 arg0); +extern void func_8015294C(s32 a0); +extern void func_80152A08(s32 a0); +extern void func_80152AC8(s32 a0); +extern void func_80152A50(s32 *a0); +extern void (*D_8018441C[])(void); +extern void func_80152B6C(void *a0); +extern void func_80152BF0(s32 a0); +extern void func_80152BA8(s32 a0); +extern void func_80152C80(s32 *a0); +extern void func_80152C40(s32 *a0); +extern void (*D_80184438[])(void); +extern void func_80152D24(void *a0); +extern void func_80152DA8(s32 a0); +extern void func_80152D60(s32 a0); +extern M2C_UNK D_80184428; +extern void func_80152DA8(s32 arg0); +extern void func_80152E4C(s32 a0); +extern void func_80152EFC(s32 a0); +extern void func_80152FBC(s32 a0); +extern void func_80152F44(s32 *a0); +extern void (*D_8018444C[])(void); +extern void func_80153060(void *a0); +extern void func_801530E4(s32 a0); +extern void func_8015309C(s32 a0); +extern void func_80155440(s32 *a0); +extern void func_801530E4(s32 arg0); +extern void func_80153150(struct S80153150 *a0); +extern void func_801531BC(s32 a0); +extern void func_8015327C(s32 a0); +extern void func_80153204(s32 *a0); +extern void (*D_80184460[])(void); +extern void func_80153320(void *a0); +extern void func_801533A4(s32 a0); +extern void func_8015335C(s32 a0); +extern void func_80153410(s32 *a0); +extern void func_80153490(s32 a0); +extern void func_80153550(s32 a0); +extern void func_801534D8(s32 *a0); +extern void (*D_8011DB28)(s32 a0); +extern s32 func_801536DC(s32 param_1); +extern void func_800139C8(s32 a0, void *a1, void *a2); +extern s32 func_80153978(s32 a0, u16 *src); +extern s32 func_80133784(s32 a0, void *src, s32 dst); +extern s32 func_801539F8(s32 a0, void *a1); +extern s32 func_801539F8(s32 a0, void * a1); +extern s32 func_8016DA04(s32 a0); +extern s32 func_80153BD8(s32 a0); +extern s32 func_80153BF0(s32 a0); +extern void func_80153C18(void); +extern u16 D_8011F748; +extern void func_80153C30(void); +extern void func_80153C74(s16 a0, s16 a1); +extern s16 D_8011DB18; +extern void func_80153C44(int a0, int a1, s16 a2); +extern s16 D_8011DB0C; +extern s32 D_80115210; +extern void func_80153C8C(void); +extern void func_80153C9C(void); +extern s32 func_80153CBC(void); +extern s32 D_80184474; +extern void (*D_8018449C[])(void *a0); +extern void func_80153CCC(S80153CCC *a0); +extern void func_80153D7C(s32 a0); +extern void func_80153D34(s32 a0); +extern u8 D_8018447C; +extern void func_80153D7C(s32 param_1); +extern void func_8015410C(void); +extern void func_80153E00(s32 param_1); +extern void func_80151664(void); +extern void func_80154134(u8 *a0); +extern void func_80154190(u8 *a0, s32 a1); +extern void func_80154150(s32 a0, s32 a1); +extern void func_80154218(u8 *a0, s32 a1, s32 a2); +extern void func_801541D8(u8 *a0, s32 a1, s32 a2); +extern s32 func_801549F8(s32 a0, s32 a1, s32 a2); +extern void func_801542A4(); +extern void func_801542A4(s32 *a0, s32 a1); +extern void func_8015430C(); +extern void func_8015430C(u8 *arg0, s32 arg1, s32 arg2); +extern void func_8015444C(void *a0, s32 *a1, s32 *a2, s32 *a3); +extern s32 func_80154358(void * arg0); +extern void func_80154AB4(s32 a0, s32 a1); +extern void func_80154B20(s32 a0, s32 a1, s32 a2); +extern void func_80154AE0(s32 a0, s32 a1, s32 a2); +extern void func_80154B7C(u8 *a0, s32 a1); +extern void func_80154B4C(u8 *a0, s32 a1); +extern void func_80154BC8(void *a0, s32 a1, s32 a2); +extern void func_80154B98(void *a0, s32 a1, s32 a2); +extern u8 D_800D8D10[]; +extern s16 D_80078E9E; +extern void func_801550FC(s32 a0); +extern void func_80154ED8(s32 a0, s32 a1); +extern void func_80154F9C(s32 a0); +extern void func_800183E0(s32 a0); +extern void func_801550FC(s32 arg0); +extern void func_8001D150(s32, s32); +extern void func_8001D130(int, int); +extern void func_80155150(int param_1); +extern s32 D_800DE2A4[]; +extern void func_801552F4(s32 a0); +extern void func_80155344(s32 a0); +extern s32 func_80155394(s32 *a0); +extern void func_801553A8(s32 *a0); +extern s32 func_80029178(s32); +extern int (*D_801844E8[])(void); +extern s32 func_80155458(s32 param_1); +extern s32 func_801659DC(u8 *a0); +extern s32 func_801554B8(void *arg0); +extern void func_801555F4(void *a0); +extern void func_80155518(s32 *a0); +extern void func_80155580(void *a0); +extern void (*D_801844EC[])(void); +extern s32 func_80161104(void); +extern void func_801555F4(void *); +extern void func_801555BC(void *a0); +extern int func_80155A44(int param_1); +extern int func_80161208(); +extern u8 D_800D4DA8[]; +extern void func_80155B20(s32 *a0); +extern s32 D_800D4DB4; +extern void func_80155B9C(s32 a0); +extern u8 D_800D4DD4[]; +extern void func_80155C0C(s32 *a0); +extern void func_8014ED28(s32 a0); +extern int func_80155FF8(int arg, int a1); +extern s32 D_800D4DF4; +extern void func_80155C64(s32 a0); +extern void func_8015E880(s32 *a0); +extern void func_80155D70(s32 param_1); +extern void func_80155E30(void *a0); +extern s32 func_80161208(); +extern void func_80155EA4(void *arg0); +extern void func_80155F58(void); +extern s32 func_80155F80(); +extern s32 func_80155F60(void); +extern s32 func_80155F80(s32 a0); +extern int func_80155FB0(int arg, int a1); +extern int func_80155FD4(int arg, int a1); +extern int func_80156044(int arg, int a1); +extern s32 func_80029B4C(s32 a0, s32 a1); +extern s32 func_80029BC8(s32 a0, s32 a1); +extern s32 func_80029C44(s32 a0, s32 a1); +extern s32 func_8015640C(s32 a0, s32 a1); +extern s32 rand(void); +extern u32 func_8015616C(s32 param_1, u16 param_2); +extern u16 func_80156370(u16 param_1); +extern s32 func_801564B0(s32 a0); +extern s32 func_8002A1B4(void); +extern s32 func_8002A400(void); +extern s32 func_8002A670(void); +extern s32 func_8002A8E0(void); +extern s32 D_801151E0[]; +extern s32 func_801565C0(void); +extern void func_80156A14(s32 *a0); +extern void func_80156648(s32 *a0); +extern u8 D_8011DAD8[]; +extern s32 func_8014C568(s16 *a0, s16 *a1); +extern void func_801567BC(s32 a0); +extern u8 D_80126730[]; +extern void func_80156848(s32 param_1, s32 param_2); +extern unsigned char D_8011520C[]; +extern unsigned short D_80184950[]; +extern void func_80156A1C(s32 param_1, s32 param_2); +extern s32 D_801150E0[]; +extern void func_80156A88(s32 a0, s32 a1); +extern void func_80156B74(s32 param_1, u32 param_2, u8 *param_3); +extern void func_80156ECC(int param_1, int param_2, int param_3, int param_4, int param_5); +extern void func_80156FA8(s16 *param_1, s16 *param_2, s16 *param_3); +extern void func_80157158(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern s32 func_80135004(s32 a0, void *a1, s32 a2); +extern u32 func_801571C4(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801575E4(void *a0); +extern void func_801574DC(s32 *a0); +extern void func_80157544(void *a0); +extern void (*D_80184960[])(void); +extern void func_8014CC28(s32 a0); /* defined */ +extern s32 func_8014F3E8(s32 a0); /* declared */ +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 void func_801576A8(void *arg0); +extern s32 func_8015773C(u8 *a0); +extern s32 func_8015771C(u8 *a0); +extern s32 func_8015773C(u8 * arg0); +extern int D_801CE980; +extern void func_801578C0(s32 a0); +extern void func_80157788(int param_1); +extern void func_801577C8(s32 arg0); +extern void (*D_80184988[])(void); +extern void func_80157808(void *param_1); +extern void func_80157880(s32 a0); +extern s32 func_801725A4(u8 *a0); +extern u8 D_800D5128; +extern u8 D_80184968; +extern void func_801578C0(s32 param_1); +extern void func_80147A84(int); +extern void func_80148038(int, int); +extern void func_80147460(int); +extern void func_80146D90(int); +extern void func_80161450(void *a0); +extern void func_80157A8C(int); +extern void func_80154A74(int, int); +extern unsigned char D_800D5178; +extern unsigned char D_80184978; +extern void func_8015795C(int param_1); +extern void func_80161D20(s32 a0, s32 a1); +extern void func_80157A8C(s32 a0); +extern void func_8016706C(s32 a0); +extern u8 D_800D51AC[]; +extern void func_80157AC8(s32 param_1); +extern void func_80157B74(int param_1); +extern void func_8016158C(void *a0); +extern void func_8015BE04(s32 *a0); +extern void func_80157BC8(s32 a0); +extern void func_80157CCC(s32 a0); +extern void func_80157DC4(void *a0); +extern void func_80157FC4(void *a0); +extern void func_80157D74(u16 *a0); +extern void (*D_801849C8[])(void); +extern void func_80157E38(void *); +extern void func_80157E00(void *a0); +extern void func_80157E38(void * a0); +extern s32 func_80157F64(s32 *a0); +extern s32 func_80156600(void *a0); +extern void func_80157EA4(void *a0); +extern void (*D_801849D0[])(void); +extern void func_80158038(void *); +extern void func_80158000(void *a0); +extern s32 D_800D51E0; +extern s32 D_8018499C; +extern void func_80158038(void * param); +extern u8 D_800D524C[]; +extern void func_80161418(void *a0); +extern void func_801580B4(s32 a0); +extern void func_801581AC(s32 a0); +extern void (*D_801849DC[])(void); +extern void func_8015824C(void *a0); +extern void func_801582C0(void *); +extern void func_80158288(void *a0); +extern u8 D_800D52A8[]; +extern void func_801585A4(s32 *a0); +extern void func_801582C0(void *a0); +extern s32 func_801585AC(s32 *a0); +extern u8 D_800D52E8[]; +extern void func_80158344(s32 *a0); +extern s32 func_801615C4(void *a0, s32 a1); +extern u8 D_801849AC; +extern u8 D_800D533C; +extern void func_80158434(s32 param_1); +extern void func_80158548(s32 param_1); +extern void func_801585EC(u8 *a0); +extern void func_80158794(void); +extern s32 D_801CE988; +extern s32 D_801CE994; +extern s32 D_801CE998; +extern void func_80158880(s32 *param); +extern void func_8015879C(s32 param_1); +extern void func_80158814(void *arg0); +extern void (*D_80184A18[])(s32 *); +extern void func_80158AE4(void *a0); +extern void func_80158AB4(void *a0); +extern void func_8016F264(void); +extern void func_80165840(void); +extern void func_801658DC(void); +extern void func_80165A78(s32); +extern void func_80158AE4(void * a0); +extern M2C_UNK D_800D58D8; +extern void func_80158BB0(void *arg0); +extern s32 func_80159404(s32 a0, s32 a1); +extern void func_80158C40(s32 *a0); +extern void func_80158CD8(s32 *a0); +extern s32 func_80159434(s32 a0, s32 a1); +extern void func_80158D60(s32 a0); +extern M2C_UNK D_800D5904; +extern void func_80158E24(s32 *a0); +extern s32 D_801849EC[]; +extern int rand(void); +extern s32 func_8013767C(s32 a0); +extern void func_80158F00(int param_1); +extern u8 D_80110C3C[]; +extern s32 func_801399F0(s32); +extern void func_80139914(s32); +extern s32 func_80159464(void); +extern void func_801594E8(s32, s32); +extern void func_80158FA4(s32 param_1); +extern s32 func_801399F0(s32 a0); +extern u8 D_80110C94[]; +extern u8 D_80110CD4[]; +extern void func_80159070(void *a0); +extern s32 func_80029A94(s32); +extern void func_80175454(void); +extern void func_800298BC(void *); +extern void func_8002992C(s32); +extern void func_800CF804(void); +extern void func_800CF818(void); +extern u8 D_80110D0C[]; +extern void func_80159120(s32 a0); +extern void func_801592CC(s32 *a0); +extern u8 D_800AE6BD; +extern s32 D_801CE990; +extern void func_8015934C(void *arg0); +extern void func_801593E4(A801593E4 *a0); +extern void (*D_80184C68[])(void); +extern void func_80159698(void *a0); +extern s32 func_801596D4(void *a0); +extern void func_80174B6C(void); +extern void func_80129248(s16 a0); +extern void func_8013C938(void); +extern void func_8013CB20(void); +extern void func_8013C98C(void); +extern void func_8002850C(s32, s32, s32); +extern void func_80028620(s32, void *); +extern s16 D_800B9AAC[]; +extern s16 D_800B9B00; +extern u16 D_801270C0; +extern u32 D_800AFAE8[]; +extern char D_80184A88[]; +extern s32 func_801596F0(s32 param_1); +extern s32 func_80159874(void); +extern void func_800167B8(s32 a0); +extern s32 func_8015987C(s32 a0); +extern int func_800167F0(int arg); +extern int func_801598BC(void); +extern void func_80159968(void *a0); +extern void func_801598E0(u8 *a0); +extern void (*D_80184D0C[])(void); +extern void func_80159A20(void *a0); +extern void func_801599E0(void *a0); +extern void func_80159A18(void); +extern void func_80159BE4(s32); +extern void func_80159B08(s32 *a0); +extern void func_80159B70(void *a0); +extern void func_80159B3C(void * a0); +extern void (*D_80184E60[])(void); +extern void func_80159BAC(s32 a0); +extern s32 func_80172590(u8 *a0); +extern unsigned char D_80184C7C; +extern void func_80159BE4(s32 arg0); +extern void func_8015A1C8(s32 a0); +extern void func_8015A2D8(s32); +extern void func_8015A1FC(s32 *a0); +extern void func_8015A264(void *a0); +extern void func_8015A230(s32 *a0); +extern void (*D_80184E68[])(void); +extern void func_8015A2A0(s32 a0); +extern int D_80184C8C; +extern s32 func_80172608(u8 *a0); +extern void func_8015A2D8(s32 param_1); +extern u8 D_800D48DC; +extern s32 func_8015AB7C(s32 a0); +extern s32 D_8011F9C4; +extern s32 func_8015ABD4(s32 a0, s32 a1, s32 a2); +extern s32 func_80161CD0(s32 a0, s32 a1); +extern M2C_UNK D_80184CAC; +extern void func_8015AC48(s32 arg0); +extern void func_8015AC90(s32 a0); +extern void func_8015ADB0(s32 a0); +extern void func_8015ACC4(s32 *arg0); +extern void func_8015AD3C(void *a0); +extern void func_8015AD08(void *arg0); +extern void (*D_80184E70[])(void); +extern void func_8015ADB0(s32); +extern void func_8015AD78(s32 a0); +extern void func_8015ADB0(s32 arg0); +extern s32 D_800D4A9C; +extern int func_8015B6F4(int param_1); +extern u8 D_800D4F8C[]; +extern s32 func_8015B7B4(s32 a0); +extern u8 D_800D4BE0[]; +extern s32 func_8014A51C(void); +extern s32 func_8015B858(u8 *a0); +extern s32 D_800D4B48; +extern void func_8015B8F8(s32 *a0); +extern void func_8015BD8C(s32 *a0); +extern s32 func_8015BE94(); +extern void func_8015BE38(struct Obj *a0); +extern s32 func_8015BE74(void); +extern void func_80161124(void *a0); +extern s32 func_8015BE94(s32 *a0); +extern s32 func_8015AE2C(); +extern s32 func_8015BEC4(void); +extern s32 func_8015B950(s32 arg0); +extern s32 func_8015BEE4(void); +extern void func_8015BF04(s32 *a0); +extern void func_8015C0C4(s32 a0); +extern void func_8015BFF4(void *a0); +extern void func_8015BF7C(s32 *a0); +extern void func_8015C030(s32 *a0, s32 a1); +extern void func_8015BFB0(s32 *a0, s32 a1); +extern void (*D_80184E98[])(void); +extern void func_8015C0C4(s32); +extern void func_8015C08C(s32 a0); +extern s32 func_8015C128(s32 param_1); +extern void func_8015C6A4(void); +extern void func_8015C788(s32 a0); +extern void func_8015C6AC(s32 *a0); +extern void func_8015C714(void *a0); +extern void func_8015C6E0(s32 *a0); +extern void (*D_80184EA4[])(void); +extern void func_8015C788(s32); +extern void func_8015C750(s32 a0); +extern void func_8015CB94(s32 a0); +extern void func_8015CBCC(void); +extern void func_8015CBD4(void); +extern void func_8015CBDC(void); +extern void func_8015CBE4(void); +extern void func_8015CBEC(void); +extern void func_8015CBF4(void); +extern void func_8015CBFC(void); +extern void func_8015CC04(void); +extern void func_8015CC0C(s32 *param_1); +extern void func_8015CC74(s32 *a0); +extern void func_8015CC40(s32 *a0); +extern s32 func_8015CCD0(); +extern s32 func_8015CCB0(void); +extern s32 func_801725E0(u8 *a0); +extern s32 func_8015CCD0(s32 param_1); +extern s32 func_8015CD20(s32 arg0); +extern void func_8015CF24(s32 a0); +extern void func_8015D01C(); +extern void func_8015CF58(s32 *param_1); +extern void func_8015CFC0(s32 *a0); +extern void func_8015CF8C(s32 *a0); +extern void func_8015CFFC(void); +extern void func_8015D01C(int param_1); +extern void (*D_80184D18[])(void *); +extern s32 func_801725F4(u8 *a0); +extern void func_8015D104(void *arg0); +extern s32 D_80184F48; +extern void func_8015D380(s32 a0); +extern unsigned char D_8018402C[]; +extern void func_8015D414(int param_1); +extern void func_8015D57C(s32); +extern void func_8015D480(s32 *a0); +extern s32 func_8015D4E8(s16 *a0); +extern void func_8015D4B4(s16 *a0); +extern void func_8015D524(s32 arg0); +extern void func_8015D544(s32 a0); +extern void func_801746DC(void); +extern void func_8015D57C(s32 arg0); +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern void func_80154150(int, int); +extern void func_80149374(int, int); +extern unsigned char D_80184F5C[]; +extern void func_8015D5E8(int param_1); +extern int func_8015E0D4(int); +extern void func_8015DA5C(s32 a0); +extern void func_8015DB6C(s32 a0); +extern void func_8015DA90(s32 *a0); +extern void func_8015DAF8(s32 *a0); +extern void func_8015DB6C(s32); +extern void func_8015DB34(s32 a0); +extern void func_8015DCB8(s32 a0); +extern void func_8014BD60(s32 a0, s32 a1); +extern int func_8015DD74(int); +extern void func_8015DBD4(void *arg0); +extern int func_8015DC84(int a0); +extern s8 D_80184F98[]; +extern void func_8015DCB8(s32 param_1); +extern int func_8015DD74(int arg0); +extern void func_8015DECC(s32 a0); +extern void func_8015DDF0(s32 *a0); +extern void func_8015DE58(s32 *a0); +extern void func_8015DECC(s32); +extern void func_8015DE94(s32 a0); +extern void func_8015E018(s32 a0); +extern void func_8015DF34(void *arg0); +extern int func_8015DFE4(int a0); +extern void func_8015E018(s32 param_1); +extern int func_8015E0D4(int a0); +extern void func_8015E22C(s32 a0); +extern void func_8015E150(s32 *a0); +extern s32 func_8015E1B8(s32 a0); +extern void func_8015E184(s32 *arg0); +extern void func_8015E22C(s32); +extern void func_8015E1F4(s32 a0); +extern u8 D_800D4FF4[]; +extern u8 D_800D5098[]; +extern u8 D_800D5060[]; +extern s32 func_8014A850(s32 a0); +extern void func_8015E40C(s32 a0); +extern void func_8015E588(void); +extern void func_8015E4B0(s32 a0); +extern void func_8015E288(s32 a0); +extern u16 D_80184FE0; +extern u16 D_80184FE2; +extern u16 D_80184FE4; +extern s32 D_80184FE8; +extern void func_80013E94(void *a0, void *a1); +extern void func_8015E4B0(s32 param_1); +extern void func_8013C9C4(void *a0); +extern s32 D_80184FF0; +extern void func_8015E5B0(u8 *self); +extern void func_8015E714(s32 *a0); +extern void func_8015E95C(s32); +extern void func_8015E84C(s32 *a0); +extern void func_8015E8E8(s32 *a0); +extern void func_8015E9B8(s32 *a0); +extern void func_8015E8B4(s32 *a0); +extern void func_8015E924(s32 a0); +extern void func_8015E95C(s32 a0); +extern s16 D_801152A0; +extern void func_80160818(s32 *a0); +extern void func_8015ED6C(s32 *a0); +extern void func_8015EE7C(s32); +extern void func_8015EDA0(s32 *a0); +extern s32 func_8015EE08(s32 a0); +extern void func_8015EDD4(s32 *arg0); +extern void func_8015EE44(s32 a0); +extern int D_800D4C48; +extern int D_80184CFC; +extern void func_8015EE7C(s32 param_1); +extern void func_8015EEE0(void *arg0); +extern void func_8015EF9C(void); +extern void func_8015F080(s32); +extern void func_8015EFA4(s32 *a0); +extern void func_8015F00C(s32 *a0); +extern void func_8015EFD8(s32 *a0); +extern void func_8015F048(s32 a0); +extern void func_8015F080(s32 a0); +extern s32 D_80062BE8; +extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); +extern s32 func_80161208(void); +extern void func_8015F118(void *a0); +extern void func_8015F260(s32 *a0); +extern void func_8015F380(); +extern void func_8015F2BC(s32 *a0); +extern void func_8015F324(s32 *a0); +extern void func_8015F2F0(s32 *a0); +extern void func_8015F360(void); +extern s32 func_801725B8(u8 *a0); +extern void func_8015F380(void* arg0); +extern void func_8015F738(s32 *a0); +extern void func_8015F848(s32 *a0); +extern void func_8015F76C(s32 *a0); +extern s32 func_8015F7D4(s32 a0); +extern void func_8015F7A0(s32 *arg0); +extern void func_8015F810(s32 *a0); +extern void func_80147078(s32 *, s16); +extern void func_80159B70(void *); +extern void func_8015F89C(void *arg0); +extern void func_8015F948(s32 *param_1); +extern void func_8015F9A4(void *arg0); +extern void func_8015FA24(s32 arg0); +extern void func_8015FBE0(s32 *a0); +extern void func_8015FA44(s32 *a0); +extern void func_8015FAAC(s32 *a0); +extern void func_8015FA78(s32 *a0); +extern s32 func_801612B8(void *a0, s32 a1); +extern void func_8016007C(s32 a0); +extern void func_8015FAE8(void *arg0); +extern void func_8015FCC8(void *param_1); +extern unsigned int D_80185074[]; +extern void func_8015FD74(int param_1); +extern s32 func_80028DE0(void); +extern u8 func_80165700(s32 a0, s32 a1); +extern void func_8015FDCC(s32 a0); +extern u8 D_80078EC2; +extern u8 func_801656E8(s32 a0, s32 a1); +extern void func_80165670(s32 a0, s32 a1); +extern void func_8016004C(s32 a0); +extern void func_8015FF20(void *param_1); +extern void func_801601AC(s32 *a0); +extern void func_801600D0(s32 *a0); +extern void func_80160138(s32 *a0); +extern void func_80160104(s32 *a0); +extern void func_80160174(s32 *a0); +extern void func_801601E4(s32 *a0); +extern void func_80160244(s32 *a0); +extern void func_8016032C(void); +extern void func_80160410(s32 *a0); +extern void func_80160334(s32 *a0); +extern void func_8016039C(s32 *a0); +extern void func_80160368(s32 *a0); +extern void func_801603D8(s32 *a0); +extern u8 D_80062BD0; +extern void func_80160410(s32 * a0); +extern void func_801607B8(s32 *a0); +extern void func_801608C0(s32 *a0); +extern void func_801607E4(s32 *a0); +extern void func_8016084C(s32 *a0); +extern void func_80160888(s32 *a0); +extern void func_80160A28(s32 a0); +extern void func_80160A74(s32 *a0); +extern void func_80160BB4(s32 *a0); +extern void func_80160ACC(s32 *a0); +extern s32 func_80160B34(s32 a0); +extern void func_80160B00(s32 *arg0); +extern void func_80160B70(s32 a0); +extern void func_80160C28(void *arg0); +extern void func_80160CB4(s32 *a0); +extern void func_80160D10(void *arg0); +extern void func_80160DEC(u8 *a0); +extern void func_80160F00(); +extern void func_80160E3C(s32 *a0); +extern void func_80160EA4(); +extern void func_80160E70(s32 *a0); +extern void (*D_80185124[])(void); +extern void func_80160EA4(void *a0); +extern void func_80160EE0(void); +extern void func_80160F00(void* arg0); +extern void func_800D0F4C(s32 a0); +extern u8 D_80110EC0; +extern void func_80160F70(s32 a0); +extern void func_80160FE0(s32 *a0); +extern void func_80161034(void *a0); +extern void func_80161094(s32 a0); +extern void func_801610FC(void); +extern void func_801483E8(void); +extern s32 func_80161A60(s32 a0); +extern void func_8016130C(void *a0, s32 a1); +extern void func_80161240(void *a0); +extern void func_80161374(void *a0, s32 a1); +extern void func_80161278(void *a0); +extern s32 func_801612B8(void * a0, s32 a1); +extern void func_8016163C(void *a0, s32 a1); +extern void func_80161774(void *a0, s32 a1); +extern s32 func_8016197C(s32 a0, s32 a1); +extern s32 func_80161488(void *a0); +extern void func_80161888(void *a0, s32 a1); +extern void func_801614E4(void *a0); +extern void func_8016191C(void *a0, s32 a1); +extern void func_8016151C(void *a0); +extern void func_80161554(void *a0); +extern s32 func_801615C4(void * arg0, s32 arg1); +extern s32 func_801619A4(s32 *a0); +extern s32 func_80161A00(s32 a0); +extern s32 func_80161A30(s32 a0); +extern int func_801497A8(void); +extern int func_80161BE0(void *param_1); +extern u16 D_80185154[]; +extern void func_80161C98(int param_1, u32 param_2); +extern void func_80161E08(s32); +extern s32 func_80162438(s32); +extern s32 D_800AE6A8; +extern void func_800D1734(void *); +extern s32 D_801851B8; +extern void func_80161D88(void); +extern void func_80161E08(s32 param_1); +extern int func_800291DC(int); +extern int func_800D0E30(void *a0); +extern int func_801620C4(void); +extern s32 func_800D0D7C(s32, s32); +extern int D_801CE9A0[]; +extern void func_8016216C(void); +extern u8 D_80078EB0; +extern u8 D_80078EB1; +extern s32 func_801621CC(s32 arg0); +extern void func_801622C4(void); +extern void (*D_801851DC[])(void); +extern void func_80162330(void *a0); +extern void func_8014706C(void *a0); +extern s32 func_8016236C(u8 *a0); +extern void func_800D0C48(s32 a0); +extern s32 func_801623B8(s32 *a0); +extern s32 func_800167F0(s32 a0); +extern s32 func_80162414(void); +extern s32 func_80162438(s32 _unused0); +extern int func_801626B8(void); +extern void func_80162714(void); +extern int D_801CE9F8[]; +extern void func_80162760(void); +extern void func_801627C0(void); +extern void (*D_80185224[])(void); +extern void func_80162834(void *a0); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80162968(s32 a0); +extern s32 func_80162ACC(u8 *a0); +extern u8 D_800B5CB8; +extern s32 D_80185214; +extern s32 D_800B5CBC; +extern u8 D_800B5CDF; +extern s32 D_800B5CEC; +extern void func_80162870(s32 param_1); +extern void func_801628F4(s32 *a0); +extern void func_80162968(s32 param_1); +extern void func_80162AC0(s32 *a0, s8 a1); +extern s32 func_80162AE0(u8 *a0); +extern void func_80162AF4(void); +extern void func_80162CC4(void); +extern s32 D_80126D40; +extern void func_80162B1C(void); +extern void func_80162D28(s32 *a0); +extern void func_80162D88(s32 *a0); +extern void func_80162DE8(s32 *a0); +extern void func_80162E48(s32 *a0); +extern void func_80162EA8(s32 *a0); +extern void func_80162F60(s32 arg0, s32 arg1); +extern void func_80162F80(s32 arg0, s32 arg1); +extern void func_80162FA0(s32 arg0, s32 arg1); +extern void func_80162F08(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80162FC0(s32 *a0); +extern void func_80162FF4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801630C4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163194(s32 a0, s32 a1, s32 a2, s32 a3, s32 arg4); +extern void func_8016325C(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163234(s32 a0); +extern s32 D_80115100; +extern s32 func_801632E0(void); +extern s32 D_80115200; +extern s32 func_801632F0(void); +extern u16 D_80126B18[]; +extern void func_80163328(void); +extern s32 func_801633A8(void); +extern s32 func_80163408(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void func_80163534(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, u16 * a5); +extern void func_8016345C(s32 a0, u16 a1, s32 a2, u16 a3, s32 a4); +extern char D_801CE184[8]; +extern void *memcpy(void *dst, const void *src, unsigned int n); +extern void func_801634D8(s32 param_1, u16 param_2, u16 param_3, s32 param_4, u16 param_5); +extern void func_80157158(); +extern void func_80163664(s32 a0, u16 a1, u16 a2, s32 a3, s32 a4, s32 a5, s32 a6, s32 a7, s32 a8, s32 a9, u16 a10, s32 a11, s32 a12); +extern void func_801636D0(s32 a0, s32 a1); +extern s32 func_8016380C(struct S8016380C *a0, s32 a1); +extern void *memcpy(void *dst, void *src, s32 n); +extern s32 func_801638A0(u8 *a0, s32 a1); +extern s32 func_80163950(s32 a0); +extern void (*D_8018522C[])(void); +extern void func_80163A58(void *a0); +extern void func_80163A94(s32 param_1); +extern void func_80163C2C(s32 param_1); +extern void func_80163EC8(s32 param_1); +extern void func_80164270(s32 *a0); +extern void func_80164418(void); +extern void func_80163764(s32 a0); +extern void func_801642AC(s32 a0); +extern void func_8016432C(s32 a0); +extern void func_80164410(void); +extern s32 func_80012DBC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164530(s32 arg0); +extern void (*D_80185280[])(void); +extern void func_80164744(s32 param_1); +extern void func_8001C810(s32 a0, s32 a1); +extern void func_80164A74(s32 *a0); +extern void func_80164930(s32 a); +extern u16 D_800DF2E0; +extern s32 D_80185248; +extern s16 D_8018527C; +extern s16 D_8018527A; +extern s16 D_80185278; +extern void func_801647A4(int param_1); +extern void func_80164ACC(); +extern void func_80164864(void *a0); +extern void func_80164930(s32 param_1); +extern s32 func_8014C308(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80164ACC(s32 a0); +extern void (*D_8018528C[])(void); +extern void func_80164BA0(void *a0); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80164DD0(s32 a0); +extern void func_80164DB0(void); +extern u8 D_801CEA58; +extern u8 D_801CEA59; +extern u8 D_801CEA5A; +extern u8 D_801CEA5B; +extern u8 D_801CEA5C; +extern u8 D_801CEA5D; +extern u8 D_801CEA5E; +extern u8 D_801CEA5F; +extern void func_80164BDC(s32 param_1); +extern void func_80164E40(void); +extern void func_80164CD4(u8 *a0); +extern void func_80164D4C(void *arg0); +extern void (*D_8018529C[])(void); +extern void func_80164EA4(void *a0); +extern void func_80165124(void *a0); +extern void func_80164EE0(int param_1); +extern s32 func_80165140(s32 a0); +extern void func_801651B8(void *a0); +extern void func_80164F44(void *arg0); +extern void func_80165024(void *a0); +extern void func_80165064(s32 *a0); +extern void func_801650C4(s32 *a0); +extern s32 func_80165140(s32 param_1); +extern s32 func_80165240(s32 a0, s32 a1, s32 a2); +extern s32 D_801CEA98; +extern void func_801651B8(void * param_1); +extern u8 D_80126CF8; +extern void func_8016533C(void); +extern void func_801653F4(s32 a0); +extern void func_80165580(s32 a0); +extern void func_80165374(s32 a0); +extern void func_80165580(s32 _arg0); +extern void func_801653B8(s32 *a0); +extern s32 func_80165624(s32 a0); +extern u8 D_80078EC5; +extern void (*D_801852E0[])(void); +extern u8 func_80165658(s32 a0, s32 a1); +extern void func_800CAE0C(s32 a0); +extern void func_801654A8(s32 arg0); +extern void func_80165B28(void *a0); +extern void func_801655E4(s32 a0); +extern u8 D_8018535C[]; +extern s32 D_8018537C[]; +extern u8 D_801853F8[]; +extern u8 func_801656D0(s32 a0, s32 a1); +extern u8 D_80185418[]; +extern u8 D_80185438[]; +extern void func_800CAF6C(void); +extern void func_80165770(void); +extern void func_801657D8(void); +extern u8 D_80078EC3; +extern void func_801657A0(void); +extern s32 D_80078EA0; +extern s32 D_80078EA8; +extern u8 D_80078EBB; +extern s32 D_80078ED4; +extern s32 D_80078ED8; +extern s32 D_80078EDC; +extern u8 D_80078EE0; +extern void func_80165874(void); +extern s8 D_80078EC4; +extern void func_801658EC(void); +extern s32 func_80165900(void); +extern s32 func_80165910(void); +extern s32 D_8012672C; +extern s32 D_8012811C; +extern s32 D_80126B08; +extern void func_80165938(void); +extern void func_80165958(void); +extern s32 func_80165978(void); +extern void func_80165988(void); +extern s32 func_801659A8(void); +extern void func_801659B8(void); +extern s32 func_801659CC(void); +extern void func_80165A18(void); +extern s32 func_80165A50(s32 _arg0); +extern void func_80165AC8(void); +extern void func_80165A78(s32 arg0); +extern void (*D_801854D4[])(void); +extern void func_80165B08(void); +extern void func_80165B10(void); +extern void func_80165B18(void); +extern void func_80165B20(void); +extern void (*D_80185550[])(void); +extern void func_80165BB4(u8 *a0); +extern void func_80165B6C(u8 *a0); +extern void func_80165C58(s32 arg0); +extern void func_80165BFC(void *a0); +extern void func_80165C78(void); +extern M2C_UNK D_801CE194; +extern void func_80165E2C(u16 *arg0); +extern s32 func_80165FA4(s32 a0, s32 a1, s32 a2); +extern s32 func_80167DBC(s32 a0, s32 a1, s32 a2); +extern s32 func_80167AE0(s32 a0, s32 a1, s32 a2); +extern void func_80165E90(void); +extern void func_80020F34(s32 a0, s32 a1); +extern s32 func_80165FA4(s32 arg0, s32 arg1, s32 arg2); +extern void (*D_8018555C[])(void); +extern void func_80166018(void *a0); +extern void func_80166054(s32 arg0); +extern void func_801661CC(s32 param_1); +extern void func_80166244(void* arg0); +extern void func_8016629C(void *a0); +extern void func_801662F4(void *a0); +extern void func_8016634C(void *a0); +extern void func_801663A4(void *a0); +extern void (*D_80185564[])(void); +extern void func_801663FC(void *a0); +extern u8 D_800D387C[]; +extern u8 D_800D3888[]; +extern s32 func_800D21C4(s32 a0, void *a1, s32 a2); +extern void func_800D1FC8(s32 a0, s32 a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_801665B4(); +extern void func_80146C3C(); +extern void func_80166438(u8 *a0); +extern s32 func_80128ED8(s32 param_1, s32 *param_2); +extern void func_800D22E4(s32 a0); +extern void func_801665B4(s32 *a0); +extern void (*D_8018562C[])(void); +extern void func_80166618(void *a0); +extern void (*D_8018563C[])(void); +extern void func_80166654(void *a0); +extern s32 func_80166690(s32 param_1, s32 param_2); +extern s32 func_80166994(); +extern s32 func_80166F58(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern s32 func_80167540(s32 arg0); +extern void (*D_8018564C[])(void); +extern void func_801678B4(void *a0); +extern void RotMatrixYXZ(void *a0, void *a1); +extern void func_80048EAC(void *a0, void *a1); +extern s32 func_801670E4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80146C3C(void); +extern void func_801678F0(s32 a0); +extern void (*D_80185658[])(void); +extern void func_80167A9C(void *a0); +extern void func_80167AD8(void); +extern s32 func_80167AE0(s32 param_1, s32 param_2, s32 param_3); +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u8 D_801855B8[]; +extern u8 D_801855CC[]; +extern s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2); +extern void func_800D20C0(void *a0, void *a1, s32 a2); +extern void func_80017E68(void *a0, void *a1); +extern void func_800D23D0(void *a0); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern s32 D_801269A4; +extern s32 D_801269A8; +extern s32 D_801269AC; +extern void func_80168070(s32 param_1, s16 *param_2, s16 *param_3, void *param_4); +extern s32 func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_8016829C(s32 a0); +extern s32 func_80166690(s32 a0, s32 a1); +extern void func_80168328(s32 arg0); +extern void func_801683D8(s32 a0); +extern void func_801684B4(s32 a0); +extern void func_80168540(s32 a0); +extern void func_801685EC(s32 a0); +extern void func_80168640(s32 a0); +extern s32 RotMatrixX(s32 a0, void *a1); +extern void func_80168664(void *arg0); +extern void (*D_80185670[])(void); +extern void func_80168744(void *a0); +extern void func_80168BDC(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801687CC(s32 a0); +extern void func_80168780(s32 a0); +extern void func_80168828(void); +extern void func_801687CC(s32 param_1); +extern void func_80168828(); +extern void (*D_80185678[])(void); +extern void func_801689D8(void *a0); +extern void func_80168A14(s32 *a0); +extern void func_80168A88(void); +extern void (*D_80185680[])(void); +extern void func_80168AA8(void *a0); +extern void func_80168AE4(s32 a0); +extern void func_800D2318(void); +extern void func_80168BDC(s32 param_1, s32 param_2, s32 param_3, s32 param_4); +extern void (*D_80185688[])(void); +extern void func_80168D58(void *a0); +extern void func_80168D94(int a0); +extern void func_80168F40(); +extern void func_80168EC4(s32 a0); +extern void func_80168F40(void *arg0); +extern void (*D_80185690[])(void); +extern void func_8016901C(void *a0); +extern void func_80169058(s32 a0); +extern s32 func_80169228(void); +extern void func_801691B8(void *a0); +extern void (*D_80185698[])(void); +extern void func_801693CC(void *a0); +extern void func_80169584(s32 param_1); +extern void func_80169408(s32 a0); +extern void func_8016951C(int param_1); +extern s32 func_80017758(void *a0, void *a1); +extern s32 func_80017DC4(void *a0, void *a1); +extern void func_801696D8(s32 a0, s32 a1); +extern void (*D_801856A0[])(void); +extern void func_80169830(void *a0); +extern void func_8016986C(s32 a0); +extern s32 func_80169A4C(s32 a0, s32 a1); +extern void func_801699D0(void *arg0); +extern void (*D_80185754[])(void); +extern void func_80169B80(void *a0); +extern void func_80169E44(s32 a0); +extern void (*D_8018575C[])(void); +extern void func_80169F00(void *a0); +extern char D_8018570C[]; +extern char D_801856CC[]; +extern void func_80169F3C(int param_1); +extern void func_80169FE0(s32 a0); +extern void (*D_80185794[])(void); +extern void func_8016A020(void *a0); +extern void func_8016A05C(void *a0); +extern void func_8016A290(s32 a, void *b, void *c); +extern void func_8016A08C(s32 param_1); +extern void func_8016A1CC(int param_1); +extern void func_8016A290(s32 param_1, void *param_2, void *param_3); +extern void (*D_801857A0[])(void); +extern void func_8016A700(void *a0); +extern s32 func_8016A73C(s32 arg0); +extern s32 func_8016A8FC(s32 a0); +extern void func_8016A890(s32 arg0); +extern u16 D_80126B5E; +extern u16 D_80126B62; +extern u16 D_80126B66; +extern void func_8016AA50(s32 param_1, s32 param_2); +extern void (*D_801857E8[])(void); +extern void func_8016AB30(void *a0); +extern void func_8016B234(void); +extern void func_8016AFB0(s32 a0); +extern void func_8016B114(void *arg0); +extern s32 func_8016B448(s32, s32); +extern s32 func_8016BA48(s32 a0); +extern void func_8016B3F4(s32 a0); +extern s32 func_8016B428(s32 a0); +extern void func_8016B984(void *a0); +extern s32 func_8016B448(s32 arg0, s32 arg1); +extern void (*D_80185864[])(void); +extern void func_8016B4BC(void *a0); +extern int func_8016B9F8(int); +extern int func_8016B834(int, int); +extern void func_8016B91C(int); +extern int D_801CEDB8; +extern void func_8016B4F8(int param_1); +extern s32 func_8016B9F8(s32 param_1); +extern void func_8016B6BC(s32, s32, s32, s32); +extern void func_8016B91C(s32); +extern s16 D_80185858[]; +extern void func_8016B5C0(s32 param_1); +extern void func_8001CD9C(int, void *); +extern int *D_8018589C[]; +extern unsigned short D_801858A4[]; +extern unsigned short D_801858AC[]; +extern unsigned char D_801CEDC0[]; +extern int func_8016B834(int param_1, int param_2); +extern void func_8016B964(SrcB964 *a0, DstB964 *a1); +extern void func_8016B91C(s32 arg0); +extern s32 D_801CEDB8; +extern s32 func_8016BA68(s32, s32); +extern void func_8016BADC(void *a0, s32 a1, s32 a2); +extern void (*D_801858B4[])(void); +extern void func_8016BBA4(void *a0); +extern s32 func_8016BBE0(s32 param_1); +extern void func_8016BFA8(s32 a0, s32 a1, s32 a2, s32 a3); +extern M2C_UNK D_801CEEF4; +extern M2C_UNK D_801CEEF8; +extern void func_8016BCC0(void *arg0); +extern s32 func_8016BD78(s32 param_1); +extern s32 func_8016BEA0(s32 param_1); +extern void func_8016BF34(void *a0); +extern void func_8016BFD0(s32 a0, s32 a1, s32 a2, s32 a3, void *a4); +extern s32 D_801CEE80; +extern void (*D_801858E4[])(void); +extern void func_8016C14C(void *a0); +extern s32 func_8016C374(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_801CEEFC[]; +extern u8 D_801CEF04[]; +extern u8 D_801CEEB4[]; +extern void func_8016C2C4(s32 param); +extern s32 func_8016C49C(s32 param_1_arg); +extern s32 VectorNormalSS(void *a0, void *a1); +extern void func_8016C74C(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern short func_8016CF04(s32 a0, s32 a1); +extern void func_8016C83C(s32 a0); +extern void (*D_801858EC[])(void); +extern void func_8016CB84(void *a0); +extern short func_8016CF04(s32 param_1, s32 param_2); +extern void (*D_80185908[])(void); +extern void func_8016D19C(void *a0); +extern void (*D_80185910[])(void); +extern void func_8016D428(void *a0); +extern void func_8016D464(u8 *a0); +extern void func_8016D4DC(s32 a0); +extern void func_8016D5EC(s32 *a0); +extern short func_8016CBC0(void); +extern void func_8016D64C(int param_1); +extern void func_8016D778(s32 a0); +extern void func_800D20C0(); +extern void func_8016D848(s32 *a0); +extern void func_8016D984(s32 *a0); +extern void func_8016DBD8(u8 *a0); +extern void (*D_80185978[])(int); +extern void func_8016DA30(int param_1); +extern s32 func_8001CC3C(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_8018591C; +extern u8 D_80185928; +extern void func_8016DA7C(s32 param_1); +extern void func_8016DB34(s32 param_1); +extern void (*D_801859AC[])(void); +extern void func_8016DEA4(void *a0); +extern void func_8016DEE0(s32 a0); +extern void (*D_801859B4[])(void); +extern void func_8016DF20(void *a0); +extern void func_8016E3CC(s32 a0); +extern void func_8016E1CC(s32 a0); +extern void func_8016E26C(s32 *a0); +extern void func_8016E2E8(void *a0); +extern void func_8016E460(void *a0, void *a1); +extern void func_8016E358(void *a0); +extern void func_8016E460(void *arg0, void *arg1); +extern void (*D_80185A08[])(void); +extern void func_8016E5B8(void *a0); +extern void func_8016E5F4(s32 arg0); +extern void func_8016E778(); +extern void func_8016E688(void *a0); +extern void func_8016E6E4(s32 a0); +extern void func_8016E728(u8 *a0); +extern void func_8016E7C8(int param_1, short *p1, unsigned int *p2); +extern void func_8016E778(int param_1); +extern void func_8016E7C8(int param_1, short *param_2, unsigned int *param_3); +extern s32 D_80115218; +extern void func_8016E8F0(void); +extern void func_8016E918(short param_1, short param_2); +extern s32 func_8016E95C(); +extern u16 D_80185A3C[]; +extern s32 func_8016EC0C(s32 a0, s32 a1); +extern void func_8016EAC0(Wave *param_1); +extern u8 D_80185A2C[]; +extern void func_8016EB3C(s32 p); +extern void func_8016EBA8(u8 *param_1); +extern void func_8016ED6C(void); +extern s32 D_80126D70; +extern void func_8016EDEC(s32 a0, s32 a1, s32 a2); +extern void func_8016ED8C(s32 a0, s32 a1, s32 a2); +extern void func_8016EE40(s32 a0, s32 a1, s32 a2); +extern void func_8016EDBC(s32 a0, s32 a1, s32 a2); +extern void func_8016EE94(); +extern void func_8016EDEC(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_8016EF78(s32 a0); +extern void func_8016EE40(s32 _arg0, s32 _arg1, s32 _arg2); +extern void func_801726D0(void *a0); +extern s32 D_80126D50; +extern s32 D_80126D54; +extern u8 D_80126D6C; +extern u8 D_80126D6D; +extern u8 D_80126D6E; +extern s32 D_80126D5C; +extern s32 D_80126D60; +extern s16 D_80126D64; +extern s16 D_80126D66; +extern s16 D_80126D68; +extern s16 D_80126D6A; +extern u8 D_80126D1A; +extern s32 D_80127058; +extern s32 D_8012705C; +extern s32 D_80127060; +extern s32 D_80127064; +extern s32 D_80127068; +extern s32 D_8012706C; +extern s32 D_80127070; +extern s32 D_80127074; +extern s16 D_80126D20; +extern void func_8016EE94(s32 a0, s32 a1); +extern s32 func_8016EFC8(s32); +extern s32 func_8016EFA8(s32 a0); +extern void func_8016F094(s32 *a0); +extern s32 func_8016F0AC(); +extern s32 D_80185A58; +extern void func_8016F250(void); +extern void func_8016F288(void); +extern void func_8016F2A8(void); +extern void func_8016F2C8(void); +extern void func_8016F2EC(void); +extern void func_8016F30C(void); +extern void func_8016F330(void); +extern void func_8016F350(void); +extern void func_8016F374(void); +extern void func_8016F388(void); +extern void func_8016F398(void); +extern s32 func_8016F44C(s32 a0); +extern void func_8016F470(s32 a0); +extern s32 func_8016F410(s32 a0); +extern void func_80175414(s32 _arg0); +extern s32 func_8016F4C4(s32); +extern s32 func_8016F494(s32 a0); +extern void func_8016F0E4(void); +extern s32 func_8016F4C4(s32 param_1); +extern void func_8016F4F4(void); +extern void func_801719A4(int a0, int a1); +extern void func_800D1724(s32 a0); +extern void func_80171928(void *a0); +extern void *D_8011F738; +extern void func_8016F4FC(void *a0); +extern void func_8014708C(void *a0); +extern void func_8016F540(void *a0); +extern void func_8016F578(s32 *a0); +extern void func_8016F5B0(void *a0); +extern void func_80147060(u8 *a0); +extern void func_8016F5E0(u8 *a0); +extern void func_8016F610(void *a0); +extern void func_8016F648(void *a0); +extern void func_8016F680(void *a0); +extern void func_8016F6B0(void *a0); +extern void (*D_80185AD0[])(void); +extern void func_8016F6E0(void *a0); +extern s32 func_80171990(u8 *a0); +extern void func_8016F764(void *a0); +extern void func_8016F71C(u8 *a0); +extern void (*D_80185AD8[])(void); +extern void func_8016F798(void *a0); +extern void func_8016F804(void *a0); +extern void func_8016F7D4(u8 *a0); +extern void func_80171928(void *); +extern void (*D_80185AE0[])(void); +extern void func_8016F834(void *a0); +extern void func_8016F8AC(u8 *a0); +extern void func_8016F870(u8 *a0); +extern void func_80172358(u8 *a0, u8 *a1); +extern void (*D_80185AE8[])(void); +extern void func_8016F8E4(void *a0); +extern void func_8016F95C(void *a0); +extern void func_8016F920(u8 *a0); +extern s32 func_80171CC4(void *a0, void *a1); +extern s32 func_80171D1C(void *a0, void *a1, s32 a2); +extern u16 D_8011F73E; +extern void (*D_80185AF0[])(void); +extern void func_8016F9C4(void *a0); +extern void func_80171B44(s32 *a0); +extern void func_8016FA44(s32 a0); +extern void func_8016FA00(s32 a0); +extern s32 func_80171C64(s32 a0, s32 a1); +extern void (*D_80185AF8[])(void); +extern void func_8016FA84(void *a0); +extern void func_8016FB10(void *a0); +extern void func_8016FAC0(u8 *a0); +extern void func_8016FB50(void *a0); +extern void (*D_80185B04[])(void); +extern void func_8016FB7C(void *a0); +extern void func_8016FC24(); +extern void func_8016FBB8(s32 a0); +extern s32 func_80171B4C(s32 a0, s32 a1); +extern void func_8016FC24(s32 a0); +extern void func_8016FC64(void *a0); +extern void (*D_80185B10[])(void); +extern void func_8016FC90(void *a0); +extern void func_8016FD08(u8 *a0); +extern void func_8016FCCC(u8 *a0); +extern s32 func_80172658(s32 *a0); +extern void func_8016FD08(u8 *s0); +extern void func_8016FD7C(s32 *a0); +extern void (*D_80185B1C[])(void); +extern void func_8016FDB4(void *a0); +extern void func_8016FE2C(u8 *a0); +extern void func_8016FDF0(u8 *a0); +extern void func_8016FE2C(u8 * a0); +extern s32 func_8016FE78(s32 *a0); +extern s32 func_80172664(s32 *a0); +extern void func_8016FED0(s32 *a0); +extern void (*D_80185B2C[])(void); +extern void func_8016FF30(void *a0); +extern void func_8016FFA8(u8 *a0); +extern void func_8016FF6C(u8 *a0); +extern void (*D_80185B3C[])(void); +extern void func_8016FFDC(void *a0); +extern void func_80170068(u8 *a0); +extern void func_80170018(u8 *a0); +extern void func_801700B8(u8 *a0); +extern void func_80170100(u8 *a0); +extern void (*D_80185B44[])(void); +extern void func_80170150(void *a0); +extern void func_801701C8(u8 *a0); +extern void func_8017018C(u8 *a0); +extern void func_801701C8(u8 * a0); +extern void (*D_80185B4C[])(void); +extern void func_80170240(void *a0); +extern void func_801702B8(s32 a0); +extern void func_8017027C(u8 *a0); +extern s16 func_80171AB0(s32 a0, void *a1); +extern void (*D_80185B54[])(void); +extern void func_801702FC(void *a0); +extern void func_80170374(u8 *a0); +extern void func_80170338(u8 *a0); +extern s32 func_8014C168(s32 *a0, s32 a1); +extern void func_80170374(u8 * a0); +extern void (*D_80185B5C[])(void); +extern void func_801703E0(void *a0); +extern void func_8017044C(u8 *a0); +extern void func_8017041C(u8 *a0); +extern void func_8017044C(u8 * a0); +extern void (*D_80185B64[])(void); +extern void func_801704B0(void *a0); +extern void func_8017051C(void *a0); +extern void func_801704EC(u8 *a0); +extern void (*D_80185B6C[])(void); +extern void func_80170548(void *a0); +extern void func_801705C0(u8 *a0); +extern void func_80170584(u8 *a0); +extern void func_801705C0(u8 * a0); +extern void (*D_80185B74[])(void); +extern void func_801705F8(void *a0); +extern void func_80170670(void *a0); +extern void func_80170634(u8 *a0); +extern void func_8012A568(void (*a0)(void)); +extern void (*D_80185B7C[])(void); +extern void func_801706AC(void *a0); +extern void func_80170718(void *a0); +extern void func_801706E8(u8 *a0); +extern void func_80129FF4(void); +extern void (*D_80185B84[])(void); +extern void func_80170748(void *a0); +extern void func_801707D4(void *a0); +extern void func_80170784(u8 *a0); +extern s32 func_80174ED4(void); +extern void (*D_80185B8C[])(void); +extern void func_80170810(void *a0); +extern void func_801708B0(void *a0); +extern u8 D_800D5DA8; +extern void func_8017084C(s32 a0); +extern u8 D_800D5A34[]; +extern void func_80170AD8(void *a0); +extern void func_80171904(s32 a0); +extern void func_80170B48(int a0); +extern void func_80170928(void); +extern u8 D_800D59EC[]; +extern void func_80170970(void); +extern u8 D_800D599C[]; +extern void func_801709B8(void); +extern u8 D_800D5934[]; +extern void func_80170A00(void); +extern void func_80170A48(void); +extern u8 D_800D5DC0[]; +extern void func_80170A90(void); +extern void (*D_80185B94[])(void); +extern void func_80170B14(int a0); +extern void func_80170B90(u8 *a0); +extern void (*D_80185B9C[])(void); +extern void func_80170BD8(void *a0); +extern void func_80170C44(u8 *a0); +extern void func_80170C14(u8 *a0); +extern void (*D_80185BA4[])(void); +extern void func_80170C74(void *a0); +extern s32 func_8017197C(u8 *a0); +extern void func_80170CF0(void *a0); +extern void func_80170CB0(u8 *a0); +extern void (*D_80185BAC[])(void); +extern void func_80170D68(void *a0); +extern void func_80170DE0(u8 *a0); +extern void func_80170DA4(u8 *a0); +extern s32 D_8011F73C; +extern s32 D_8011F740; +extern void func_801718AC(void *a0); +extern void func_80170DE0(u8 * _arg0); +extern void (*D_80185BB4[])(void); +extern void func_80170E34(void *a0); +extern void func_80170EAC(u8 *a0); +extern void func_80170E70(u8 *a0); +extern int func_800D0F8C(int a0); +extern void func_80170EAC(u8 * _arg0); +extern void (*D_80185BBC[])(void); +extern void func_80170EFC(void *a0); +extern void func_80170F74(void *a0); +extern void func_80170F38(u8 *a0); +extern void (*D_80185BC4[])(void); +extern void func_80170FB0(void *a0); +extern void func_80171028(void *a0); +extern void func_80170FEC(u8 *a0); +extern void (*D_80185BCC[])(void); +extern void func_80171064(void *a0); +extern void func_801710DC(u8 *a0); +extern void func_801710A0(u8 *a0); +extern u16 D_8011F73A; +extern void func_801710DC(u8 * arg0); +extern void (*D_80185BD4[])(void); +extern void func_80171120(void *a0); +extern void func_8017118C(u8 *a0); +extern void func_8017115C(u8 *a0); +extern void func_80142454(s32 a0); +extern void func_8017118C(u8 * a0); +extern void (*D_80185BDC[])(void); +extern void func_801711C0(void *a0); +extern void func_80171238(void); +extern void func_801711FC(u8 *param_1); +extern void (*D_80185BE4[])(void); +extern void func_80171260(void *a0); +extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80171384(void *a0); +extern void (*D_80185BEC[])(void); +extern void func_801714E4(void *a0); +extern void func_8017162C(void *a0); +extern void func_80171520(s32 a0); +extern s32 func_801716AC(s32 a0, void *a1, s32 *a2); +extern s32 func_80012FC8(s32 a0, s32 a1, s32 a2, s32 a3); +extern u8 D_800A5E94; +extern u8 D_800A5E95; +extern u8 D_800A5E96; +extern s32 func_801716AC(s32 a0, void * a1, s32 * a2); +extern int func_800D0FE0(int a0); +extern void func_801717A0(void *a0); +extern void func_8013E588(void *a0); +extern void func_801717F4(void *a0); +extern void func_80171824(void *a0); +extern void func_80171854(void *a0); +extern void func_80171884(void); +extern void func_80171A1C(u8 *a0); +extern void func_80171928(void * a0); +extern void func_8017196C(s32 *a0, s8 a1); +extern void func_80171A04(s32 *a0); +extern void func_80171A10(s32 *a0); +extern void func_80171A34(s32 *a0, s8 a1); +extern s32 func_80171A44(u8 *a0); +extern s32 func_80171A58(u8 *a0); +extern s32 func_80171A6C(u8 *a0); +extern void func_80171A80(s32 *a0, s32 a1); +extern s32 func_80171A88(s32 a0); +extern s16 func_80171AB0(s32 param_1, void * _arg1); +extern void func_80171B10(void *a0); +extern void func_80171EC8(s32 a0); +extern s32 func_80171C64(s32 param_1, s32 param_2); +extern s32 func_80171D78(s32 a0, s32 a1); +extern int func_8017250C(short *a0, short *a1); +extern s32 func_80171CC4(void * a0, void * a1); +extern s32 func_80171FFC(short *a0, short *a1, s32 a2); +extern s32 func_80171D1C(void * a0, void * a1, s32 a2); +extern s32 func_8017248C(s32 a0, s32 a1); +extern s32 func_80171E08(s32 arg0, s32 arg1, s32 arg2); +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); +extern void func_80172170(s32 a0, s32 a1); +extern s32 func_8017209C(void *arg0, void *arg1, s32 arg2, s32 arg3); +extern void func_801722CC(s32 *a0); +extern void func_80172304(s32 *a0); +extern void func_80172310(u8 *a0); +extern void func_801723C4(s32 param_1, s32 param_2); +extern void func_80161C24(s32, s32); +extern void func_80172414(s32 a0); +extern s32 func_801724EC(s32 a0); +extern s32 func_8017248C(s32 arg0, s32 arg1); +extern s32 func_80013450(s32); +extern s32 func_80172560(u8 *a0, u8 *a1); +extern s32 func_8017261C(u8 *a0); +extern s32 func_80172644(u8 *a0); +extern s32 func_80172670(s32 *a0); +extern s32 func_80172688(s32 *a0); +extern s32 func_80172694(s32 *a0); +extern s32 func_801726A0(s32 *a0); +extern s32 func_801726AC(s32 *a0); +extern s32 func_801726B8(s32 *a0); +extern s32 func_801726C4(s32 *a0); +extern s32 func_80172760(s32 a0); +extern s32 func_80174650(s32); +extern void (*D_80127088)(void); +extern s32 D_801270BC; +extern s16 D_80126B0C; +extern void func_801726D0(void * _arg0); +extern void func_80172710(void); +extern void func_80174684(void *); +extern void func_80172738(void); +extern s16 D_80126B30; +extern s32 func_801727D0(void *a0); +extern void func_80172780(void *a0); +extern void func_80172844(u8 *a0); +extern void func_8017280C(u8 *a0); +extern void func_8017288C(void); +extern s32 func_801728E4(void *a0); +extern void func_80172894(void *a0); +extern void func_80172958(u8 *a0); +extern void func_80172920(u8 *a0); +extern s16 D_80126B36; +extern void func_80172958(u8 * a0); +extern void func_801729A8(void); +extern s32 func_801729F0(void *a0); +extern s16 D_80126B34; +extern s16 D_80126B32; +extern void func_801729B0(s32 a0); +extern void func_80172A8C(void *a0); +extern void func_80172A2C(int param_1); +extern void func_80172ACC(u8 *a0); +extern void func_80172B0C(void); +extern s32 func_80172B44(void *a0); +extern void func_80172B14(s16 a0); +extern s32 D_801150F8; +extern void func_80172BC8(void *a0); +extern void func_80172B80(u8 *a0); +extern void func_80172C48(void); +extern void (*D_80185C30[])(void); +extern void func_80172CA0(void *a0); +extern void func_80172D14(u8 *a0); +extern void func_80172CDC(u8 *a0); +extern void func_80172D14(u8 * a0); +extern void func_80172D60(void); +extern s32 D_80127508; +extern s32 func_80172DAC(void *a0); +extern void func_80172D68(s32 a0); +extern void func_80172E20(u8 *a0); +extern void func_80172DE8(u8 *a0); +extern void func_80172E20(u8 * a0); +extern void func_80172E8C(void); +extern void func_8017303C(void *); +extern void func_80172E94(void); +extern void func_80172ED4(void); +extern void func_80172EFC(void); +extern void func_80172F24(void); +extern u8 D_800D47F4[]; +extern void func_80172F4C(void); +extern void func_80172F9C(void); +extern u8 D_800D5C6C[]; +extern void func_80172FEC(void); +extern s32 func_80173078(void *a0); +extern void func_8017303C(void * a0); +extern void func_801730FC(struct S801730FC *a0); +extern void func_801730B4(s32 a0); +extern void func_8017316C(void); +extern s32 func_8017319C(void *a0); +extern void func_80173174(void); +extern u8 D_800D5AA0[]; +extern void func_80173220(void *a0); +extern void func_801731D8(s32 *a0); +extern M2C_UNK D_80185BF4; +extern void func_80173220(void * arg0); +extern void func_80173294(void); +extern void func_801732C4(); +extern void func_8017329C(void); +extern void func_801732C4(s32 *a0); +extern void func_8017331C(); +extern void func_801732F4(void); +extern void func_8017331C(s32 *a0); +extern void func_80173374(); +extern void func_8017334C(void); +extern void func_80173374(s32 *a0); +extern void func_801733A4(void); +extern void func_801733CC(s32 a0); +extern void func_801734BC(s32 a0, s32 a1); +extern s16 D_80126B3E; +extern void func_80173460(s32 a0, s32 a1); +extern void func_801734BC(s32 arg0, s32 _unused1); +extern void (*D_80185C60[])(void); +extern void func_80173544(void *a0); +extern void func_801735B8(u8 *a0); +extern void func_80173580(u8 *a0); +extern s16 D_80126B40; +extern void func_801735EC(void *a0); +extern void func_80173648(u8 *a0); +extern void func_801736A8(void); +extern s32 func_8014C118(void *a0, s32 a1, s32 a2); +extern s32 func_801736FC(void *a0); +extern void func_801736B0(s32 a0, s32 a1); +extern void func_80173770(u8 *a0); +extern void func_80173738(u8 *a0); +extern void func_801723C4(s32 a0, s32 a1); +extern void func_801737B0(void); +extern s32 func_801737E8(void *a0); +extern void func_801737B8(s16 a0); +extern void func_8017385C(u8 *a0); +extern void func_80173824(u8 *a0); +extern void func_801738D4(void); +extern s32 func_8017390C(void *a0); +extern void func_801738DC(s16 a0); +extern void func_80173980(u8 *a0); +extern void func_80173948(u8 *a0); +extern void func_801739D8(u8 *a0); +extern void func_80173A20(void); +extern s32 D_8012750C; +extern void func_80173A60(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4); +extern void func_80173A28(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void (*D_80185C9C[])(void); +extern void func_80173B4C(void *a0); +extern void func_80173BC0(u8 *a0); +extern void func_80173B88(u8 *a0); +extern void func_80173C64(u8 *a0); +extern void func_80173E1C(s32 a0); +extern s16 D_80126938; +extern s16 D_80126B3A; +extern void func_800D128C(s32, s32); +extern void func_80174158(s32 a0); +extern void func_8002A088(s32); +extern void func_8002A2D4(s32); +extern void func_8002A544(s32); +extern void func_8002A7B4(s32); +extern s32 func_80174188(s32 a0); +extern void func_801741A8(s32 a0); +extern s32 func_800D0EC4(void); +extern void func_800D0F0C(s32, s32); +extern void func_80145EE8(s32); +extern void func_80173EF8(void *param_1); +extern s32 func_8014BCEC(s32, s32); +extern void func_801741A8(s32 _arg0); +extern s16 D_80126B3C; +extern s16 D_8011F9C8; +extern void func_801741EC(u8 *a0); +extern void func_80174274(void); +extern s32 func_801742A4(void *a0); +extern void func_8017427C(void); +extern void func_80174318(u8 *a0); +extern void func_801742E0(u8 *a0); +extern void func_80174354(void); +extern s32 func_80174384(void *a0); +extern void func_8017435C(void); +extern void func_801743F0(u8 *a0); +extern void func_801743C0(u8 *a0); +extern void func_801743F0(u8 * a0); +extern void func_80174430(void); +extern s32 func_80174474(void *a0); +extern void func_80174438(s32 a0); +extern void func_801744E0(u8 *a0); +extern void func_801744B0(u8 *a0); +extern void func_80174524(void); +extern void func_80174554(); +extern void func_8017452C(void); +extern void func_80174554(s32 arg0); +extern void func_801745AC(); +extern void func_80174584(void); +extern void func_801745AC(s32 *a0); +extern void func_80174604(void); +extern void func_801745DC(void); +extern void func_80174630(void); +extern s32 func_80174650(s32 _arg0); +extern void func_80174674(void); +extern void func_801746A4(void); +extern s32 func_800CF8CC(void); +extern void func_80174714(void); +extern s32 func_80174754(void); +extern s16 func_80174764(void); +extern s16 func_80174774(void); +extern s32 func_801747CC(void *a0); +extern void func_80174784(void); +extern s32 func_801747AC(s32 a0); +extern s32 func_80174808(u8 *a0); +extern void func_8017481C(void); +extern s32 func_80174888(void *a0); +extern void func_80174824(void); +extern void func_8017484C(s32 a0); +extern void func_801748C4(s32 a0); +extern void func_801748E4(void); +extern void func_8012A018(s32 a, s32 b); +extern s32 func_8017496C(void *a0); +extern s32 D_80126954; +extern s32 D_80126950; +extern s32 D_8012695C; +extern s16 D_80126968; +extern s16 D_8012696A; +extern s16 D_8012696C; +extern s16 D_80126976; +extern s16 D_80126978; +extern s16 D_8012697A; +extern void func_801748EC(void); +extern s32 func_801749C8(); +extern s32 func_801749A8(s32 a0); +extern void func_80174BBC(void *a0); +extern void func_8012A0E0(void); +extern void func_80174BF4(void *a0); +extern void (*D_80185CF4[])(); +extern void func_80174BF4(void * arg0); +extern s32 func_80174CB0(s32, s32); +extern s32 func_80174C60(s32 a0); +extern void func_80174C80(s32 a0); +extern s32 D_8012697C; +extern u16 D_80126980; +extern s32 func_80174F28(void *a0); +extern void func_80174E9C(s32 a0); +extern void func_80174EF0(s32 a0, s16 a1); +extern s32 func_80175014(u8 *a0, u8 *a1, s32 a2); +extern void func_80174F64(u8 *a0); +extern void func_80174FBC(u8 *a0); +extern s32 func_8017509C(u8 *a0, s32 a1, u8 *a2, u8 *a3); +extern void func_80175184(s32 *a0); +extern void func_80175114(s32 *a0); +extern void func_80175184(); +extern void func_80175150(s32 *a0); +extern void (*D_80185D04[])(void*); +extern s32 func_80175268(s32); +extern void func_80175184(s32* arg0); +extern s32 func_80175218(void *a0); +extern void func_801751D8(void *a0); +extern void (*D_80185D0C[])(s32); +extern s32 func_80175218(void * param_1); +extern void func_801752BC(s32 *a0); +extern u8 D_8011F7A8; +extern u8 D_8011F7A9; +extern u8 D_8011F7AD; +extern u8 D_8011F7AE; +extern void func_80175494(void); +extern void (*D_80185E74[])(); +extern s32 func_801758FC(void); +extern s32 func_80175820(void); +extern s32 func_801759D8(void); +extern void func_8017553C(s32 *param); +extern void func_801757A0(s32 a0); +extern short D_800B9A02; +extern void func_80175590(void *arg0); +extern s16 D_800B9A02; +extern void func_801757A0(s32); +extern void func_80175624(void *a0); +extern void func_801757E0(int); +extern void func_80175668(void); +extern void (*D_80185E80[])(); +extern void func_80175690(s32 *param); +extern void func_80175DA8(s32 a0); +extern void func_80175AB8(s32 a0); +extern void func_80176144(s32 a0); +extern void func_801756E4(s32 arg0); +extern void func_80175798(void); +extern void func_80176734(s32 a0); +extern void func_80176218(s32 a0); +extern void func_80176D00(s32 a0); +extern void func_801757E0(s32 a0); +extern s32 func_80178004(s32 a0, s32 a1, s32 a2); +extern u8 D_8011F7B1; +extern u16 D_8011F7B4; +extern u16 D_8011F7B6; +extern s16 D_8011F81E; +extern void *func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern u32 func_801783D0(s32 a0, s32 a1); +extern void *func_801777BC(void *a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern u16 D_8011F82C; +extern u16 D_8011F82A; +extern u32 * func_80176D94(void *param_1, u32 param_2, s16 param_3_); +extern void func_801778A8(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80176FF4(s32 a0); +extern u16 D_8011F830; +extern u16 D_8011F82E; +extern u32 * func_801770E0(void *param_1, u32 param_2, s16 param_3_); +extern void func_80177340(s32 a0); +extern u8 D_8011F837; +extern u8 D_8011F7F0; +extern u8 D_8011F7AB; +extern u32 * func_8017742C(u32 *param_1, s32 param_2, s32 param_3); +extern void func_801776EC(u8 *a0); +extern void * func_80177784(void *a0, s32 a1, s32 a2, s32 a3); +extern uint * func_80177EA4(uint *param_1, int param_2, uint param_3, int param_4); +extern void func_80177F84(s32 param_1, s32 param_2); +extern u32 * func_80178298(u32 *param_1, u8 *param_2, short param_3, short param_4); +extern M2C_UNK D_801CE3DC; +extern void func_80178438(u16 *arg0); +extern void func_801787D4(void); +extern void func_8012A908(void); +extern void func_8017869C(s32 a0); +extern void func_80130D0C(s32 a0); +extern void func_8013E370(void); +extern s32 D_8011DB08; +extern void func_8017849C(void); +extern void func_8013E4B4(void); +extern s16 D_801270C4; +extern s32 D_801274D8; +extern s16 D_801270C2; +extern u8 D_801270C6; +extern u8 D_801270C7; +extern s32 D_801274DC; +extern s32 D_801274E0; +extern void func_80178608(void); +extern void func_80178744(s32 a0, s32 a1); +extern void func_80178840(); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8012B2CC(s32 a0); +extern s32 func_801788B8(s32 arg0, s32 arg1); +extern s32 func_801789AC(s32 arg0); +extern s16 D_801D0C70; +extern int func_80178970(void); +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern s32 func_80178B70(s32 param_1, s32 param_2); +extern void func_80178BB8(s32 a0, s32 a1); +extern s32 func_80178BF8(); +extern s32 D_801CF638; +extern short D_801D0CE4; +extern void func_80178CBC(s32 arg0, s32 arg1); +extern void func_80178D18(void); +extern s32 func_80178D40(s32 arg0, s32 arg1); +extern void func_80179B28(s32 a0); +extern void func_80179B74(u16 *p); +extern void func_80179D30(u16 *a0); +extern void func_80179D78(u16 *a0); +extern void func_80179DCC(short a0); +extern void func_80179DF8(void); +extern void func_80179E1C(short a0); +extern void func_80179E48(s16 a0); +extern void func_80179E74(s16 a0); +extern void func_80179EA0(u16 *a0); +extern void func_80179EE8(short a0); +extern void func_80179F14(s16 a0, s16 a1); +extern void func_80179F44(void); +extern void func_80179F6C(short a0); +extern void func_80179F98(u16 *a0); +extern void func_80179FEC(u16 *a0); +extern void func_8017A040(u16 *a0); +extern s32 D_801CFA64; +extern void func_8017A094(s32 arg0); +extern void func_8017A0C4(s32 arg0); +extern void func_8017A0F4(void); +extern void func_8017A11C(void); +extern s32 D_801CFA8C; +extern void func_8017A144(s32 a0); +extern void func_8017A180(void); +extern void func_8017A1A8(void); +extern void func_8017A1D0(void); +extern void func_8017A1F8(void); +extern void func_8017A220(void); +extern void func_8017A248(void); +extern void func_8017A270(void); +extern void func_8017A298(void); +extern void func_8017A2C0(void); +extern void func_8017A2E8(void); +extern void func_8017A310(void); +extern void func_8017A338(void); +extern void func_8017A360(void); +extern void func_8017A388(void); +extern s16 D_801CFA48; +extern s32 func_8017A3B0(void); +extern short D_801CFA84; +extern short D_801CFA80; +extern int func_800D0CA0(int); +extern int func_8001AAA0(void); +extern int func_800D0CE0(void); +extern int func_8017A3D8(void); +extern void func_80172310(u8*); +extern void func_80172780(void*); +extern void func_80172894(void*); +extern void func_801729B0(s32); +extern void func_80172B14(s16); +extern void func_80172C50(u16 *); +extern void func_80172D68(s32); +extern void func_801733FC(s16, u16 *); +extern void func_80173460(s32, s32); +extern void func_801734BC(s32, s32); +extern void func_801736B0(s32, s32); +extern void func_801737B8(s16); +extern void func_801738DC(s16); +extern void func_80173A28(s32, s32, s32, s32, s32, s32); +extern void func_80174438(s32); +extern void func_8017A4AC(void); +extern s32 func_8017AD0C(s32 arg0); +extern s32 func_8017AD0C(s32); +extern s32 func_8017ADE8(s32 a0); +extern s32 func_8017AE08(void); +extern void func_8017B0E4(int param_1, int param_2); +extern s16 D_801CFA4C; +extern u16 D_801CFACC; +extern u16 D_801CFACE; +extern u16 D_801CFAD0; +extern void func_8017B1D8(void); +extern s32 func_8017B238(s32 param_1, s32 param_2); +extern s32 func_8017B368(s32 param); +extern s32 func_8017B614(s32 param_1, s32 param_2); +extern s32 D_80114F30; +extern s32 D_80114F34; +extern s32 D_80114F38; +extern s32 D_80114F24; +extern s32 D_80114F28; +extern s32 D_80114F2C; +extern u8 D_8012694C; +extern s16 D_801CFAC4; +extern s16 D_801CFAC6; +extern s16 D_801CFAC8; +extern s16 D_801CFABC; +extern s16 D_801CFABE; +extern s16 D_801CFAC0; +extern void func_8017B7A8(void); +extern s16 D_801CFADC; +extern s16 D_801CFADE; +extern s16 D_801CFAE0; +extern s16 D_801CFAE4; +extern s16 D_801CFAE6; +extern s16 D_801CFAE8; +extern void func_8017B824(void); +extern void func_8017B880(void); +extern s32 func_8017B8E8(s32 src); +extern short D_801CFAD4; +extern short D_801CFAD6; +extern short D_801CFAD8; +extern void func_8017B940(void); +extern void func_8012F214(s32 a0, s32 a1, s32 a2); +extern void func_80049CAC(s32 a0, s32 a1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern void RotTransSV(void *a0, void *a1, void *a2); +extern SV4 D_801CFA6C; +extern SV4 D_801CFA74; +extern void func_8017BA3C(s32 param_1, s32 param_2); +extern s32 func_8017BB34(s32 param_1, s32 param_2); +extern void (*D_801CFA94[10])(int); +extern void func_8017BC38(int param_1); +extern void func_8017B0E4(int, int); +extern void func_8017BCA0(int param_1); +extern void func_8012A4BC(void); +extern void func_8017BCF4(int param_1); +extern void (*D_801CFA90)(void); +extern void func_8017BD50(int param_1); +extern void (*D_8018605C[])(void); +extern void func_8017BE60(void *a0); +extern void func_8017BE9C(void); +extern void func_8017BEA4(void); +extern void func_8017BEAC(void); +extern void func_8017BEB4(void); +extern void func_8017BEBC(s32 arg0); +extern void func_80052D90(s32 a0, void *a1); +extern void func_80054514(s32 a0, s32 a1); +extern void func_8017CD9C(s32 a0); +extern void func_8017CDF0(s32 a0, s32 a1, s32 a2); +extern void func_8002931C(); +extern void func_8017D8C4(void); +extern void (*D_801860B8[])(void); +extern void func_8017D8E4(void *a0); +extern void func_8017DA78(void); +extern s32 func_8017D920(s32 a0); +extern s32 func_8017D964(void); +extern void (*D_801860C0[])(void); +extern void func_8017D988(void *a0); +extern s32 func_8017D9C4(void *a0); +extern s32 func_8017D9E0(void *a0); +extern int func_8017DA54(void); +extern void func_8017DAA0(void); +extern void func_8012A018(s32 a0, s32 a1); +extern void func_8012A094(s32 a0); +extern void func_8017DB64(void *a0); +extern void func_8017DAC8(void); +extern void (*D_801860D4[])(void); +extern void func_8017DC68(s32 param_1, s16 *param_2); +extern void func_8017DBA0(s32 param_1); +extern s32 func_80012ABC(s32 a0, s32 a1, s32 a2); +extern s32 D_801D0C5C; +extern s32 D_801D0C78[]; +extern s32 D_801D0540; +extern s32 D_801D0598; +extern s32 D_801860D8[]; +extern s32 *D_80186150[]; +extern s32 D_801861C8[]; +extern s32 D_801A3560; +extern void func_8017DE00(void); +extern void func_8017DF84(s32 arg0); +extern void func_8017DF94(s32 arg0, s16 *arg1, s32 arg2); +extern s32 func_8017DFF4(void); +extern void func_8012AD44(s32 *a0, s16 a1); +extern void func_8017DFFC(void); +extern s32 func_8012C588(s32 a0, s32 a1); +extern s32 func_8017E01C(s32 arg0); +extern s32 func_8017E040(void); +extern s16 D_801D0B7C; +extern void func_8017E058(void); +extern s32 func_8017E06C(void); +extern void func_8002D4C8(s32 arg0, s32 arg1); +extern void func_8017E084(void *arg0); +extern s32 func_8012BEE8(s32 a0); +extern u8 D_801862AC[]; +extern s32 func_8017E0B0(s32 arg0); +extern void func_80180854(void); +extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); +extern u16 D_801D0BB8; +extern void func_8017E118(s32 arg0); +extern s32 func_8017E1A8(s32 arg0); +extern void func_8017E1BC(s32 a0); +extern u16 D_801863A0[]; +extern void func_8017E7E8(void *a0); +extern void func_8017E20C(void *a0); +extern s32 func_8012BEE8(s32 arg0); +extern void func_8012AD80(s32 arg0); +extern void func_8017E3A4(void *a0); +extern void func_8017E268(s32 a0); +extern s32 func_8017E3F0(s32 arg0); +extern s32 func_8017E404(void); +extern void func_8017E41C(void *a0); +extern s32 func_8017E448(s32 arg0); +extern void func_8017E4B0(s32 a0); +extern void func_8017E524(s32 a0); +extern s32 func_8017E554(void); +extern void func_8017E56C(void); +extern void func_800D1724(s32); +extern void func_8017E58C(void); +extern s32 func_8017E5B4(void); +extern s32 func_80014C54(s32 arg0, s32 arg1, s32 arg2); +extern s16 func_8017E5BC(void); +extern void func_8017E5E8(void); +extern void (*D_80186528[])(void); +extern void func_8017E5FC(void *a0); +extern void func_8012B200(u8 *a0); +extern void func_8017E638(s32 *a0); +extern u16 D_801865DA; +extern u16 D_801865DC; +extern void func_8017E804(s32 *a0, s32 a1, s32 a2); +extern void func_8017E7A0(s32 arg0); +extern void func_8017E658(void *a0); +extern s16 D_80186248; +extern s16 D_8018624A; +extern s16 D_8018624C; +extern s16 D_8018624E; +extern s32 *D_80126B90; +extern s32 func_8012B8A4(s16 *a0); +extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); +extern void func_8017E830(void *arg0); +extern s16 D_801D05A0[]; +extern Blk4_E960 D_80186540[]; +extern Blk4_E960 D_801CE6E0; +extern void func_8017E960(void *a0); +extern void func_800234E4(void *a0, s32 a1, s32 a2); +extern void func_8017EAD8(s32 arg0); +extern void (*D_80186548[])(void); +extern void func_8017EBC4(void *a0); +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_8001D0E8(s32 a0, s32 a1, s32 a2); +extern u32 D_80186250[]; +extern s32 D_801B0A20; +extern void func_80180440(s32 arg0); +extern void func_8017EC00(s32 a0); +extern void func_8017ECAC(void); +extern void func_8017ED8C(s32 arg0); +extern void func_8017EE38(void); +extern u8 D_801BD0D4[]; +extern void func_8017EE40(s32 a0); +extern void func_8017EE8C(s32 param_1); +extern void func_8017EEC0(void); +extern void func_8012A828(s32, void*); +extern void func_8012AD80(s32 a0); +extern void func_8017F044(s32 a0); +extern void func_8017F3FC(s32 a0); +extern void func_8017EEE0(s32 a0); +extern void func_8017F888(s32 *a0, s32 *a1); +extern void D_801BCCAC; +extern void D_80186558; +extern void func_8017F4F8(s32 a0); +extern void func_8017F098(s32 a0); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern void D_801BCE04; +extern void func_8017F0D0(s32 s0); +extern void func_8012AD80(); +extern void func_8012A828(); +extern void func_8017F15C(s32 s0); +extern void (*D_80186560[])(void); +extern void func_8017F3C0(void *a0); +extern void func_8017F3FC(s32 arg0); +extern void func_8017F464(s32 a0); +extern u16 D_8018657C[]; +extern u16 D_8018657E[]; +extern void func_8017F4F8(); +extern void func_8017F958(s32 a0); +extern s16 D_801CC230; +extern void func_8017F554(s32 a0); +extern s32 func_80132EF4(); +extern void func_8012AD44(); +extern void func_8017F59C(void *a0); +extern void (*D_8018658C[])(void); +extern void func_8017F84C(void *a0); +/* ==== end §8b carried decl layer ==== */ + + +INCLUDE_ASM("asm/ov_SC07_000/nonmatchings/ov_SC07_000_jr_8017F8B8", func_8017F8B8); + +void func_8017F958(s32 a0) +{ + extern u16 D_8018659C[]; + extern u16 D_8018659E[]; + extern void MoveImage(void *a0, s32 a1, s32 a2); + s16 sp[4]; + + sp[0] = *(u16 *)((u8 *)D_8018659C + a0 * 4); + sp[1] = *(u16 *)((u8 *)D_8018659E + a0 * 4); + sp[2] = 0xC; + sp[3] = 0x28; + MoveImage(&sp[0], 0x2C0, 0x100); +} + + +typedef struct { u8 b[4]; } __attribute__((packed, aligned(1))) Blk4_9B4; + +extern void func_8001CD9C(s32, void *); +extern void func_800233CC(void *, u16); + +extern u16 aD_801D0630[] __asm__("D_801D0630"); +extern u16 D_801D0632[]; +extern u16 aD_801D0660[] __asm__("D_801D0660"); +extern u16 aD_801D0662[] __asm__("D_801D0662"); + +extern u8 D_801D0620[]; +extern u8 D_801865A8[]; +extern Blk4_9B4 aD_801CE7A4[] __asm__("D_801CE7A4"); +extern Blk4_9B4 D_801D0624[]; + +void func_8017F9B4(void *arg0) { + register void *s1 __asm__("$17") = arg0; + void *s0 = D_801D0620; + register s32 off1 __asm__("$3"); + register s32 off2 __asm__("$4"); + + func_8001CD9C(*(s32 *)((u8 *)s1 + 0x20), s0); + func_800233CC(s0, 0x40); + + for (off1 = 0, off2 = 0; off1 < 0x30; off1 += 8, off2 += 4) { + *(s16 *)((u8 *)aD_801D0660 + off2) = (s16)(*(u16 *)((u8 *)aD_801D0630 + off1)) >> 3; + __asm__ __volatile__("" ::: "memory"); + *(s16 *)((u8 *)aD_801D0662 + off2) = (s16)(*(u16 *)((u8 *)D_801D0632 + off1)) >> 3; + } + + *(Blk4_9B4 *)D_801D0620 = *(Blk4_9B4 *)D_801865A8; + D_801D0624[0] = aD_801CE7A4[0]; + + *(u32 *)(*(s32 *)((u8 *)s1 + 0x20) + 4) |= 0x50000000; + *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x18) = 0x800; + *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x1A) = 0x800; + *(u16 *)(*(s32 *)((u8 *)s1 + 0x20) + 0x2C) = 0xC040; + + *(s32 *)((u8 *)s1 + 0x1C) = 4; + *(u16 *)((u8 *)s1 + 0x2C) = 0; + *(u16 *)((u8 *)s1 + 0x2E) = 0; + *(u16 *)((u8 *)s1 + 0x2) += 1; +} + + + +extern void (*D_801865AC[])(void); + +void func_8017FAFC(void *a0) { + D_801865AC[*(u16 *)((s32)a0 + 0x2)](); +} + + +extern void func_80016450(s32 a0, s32 a1); + +void func_8017FB38(s32 param_1) +{ + s16 t; + + if (*(s16 *)(param_1 + 0x2E) == 0) { + t = *(s16 *)(param_1 + 0x2C); + if (t < 0x60) { + t = t + 0x20; + *(s16 *)(param_1 + 0x2C) = t; + if (t >= 0x60) { + *(u16 *)(param_1 + 0x2E) = *(u16 *)(param_1 + 0x2E) + 1; + } + } + } else { + t = *(s16 *)(param_1 + 0x2C); + if (t == 0) { + return; + } + t = t - 0x10; + *(s16 *)(param_1 + 0x2C) = t; + if (t < 0) { + *(s16 *)(param_1 + 0x2C) = 0; + } + } + + if (*(s16 *)(param_1 + 0x2C) != 0) { + func_80016450(*(s16 *)(param_1 + 0x2C) & 0xFF, 1); + } +} + + +extern void func_8001CD9C(s32, void *); +extern void func_800233CC(void *, u16); +typedef struct { u8 b[4]; } __attribute__((packed, aligned(1))) Blk4; +extern Blk4 D_801CE7A4[]; +extern u8 D_801865C0; +extern u8 D_801D0678[]; + +void func_8017FBE8(void *arg0) { + s32 mode = *(s16 *)((u8 *)arg0 + 0x2C); + u8 *s0 = (u8 *)D_801D0678 + (mode << 6); + switch (mode) { + case 0: + func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); + func_800233CC(s0, 0x80); + *(Blk4 *)s0 = D_801CE7A4[0]; + *(Blk4 *)(s0 + 4) = D_801CE7A4[0]; + *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x60000000; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; + *(u16 *)((u8 *)arg0 + 0x2E) = 1; + *(s32 *)((u8 *)arg0 + 0x1C) = 2; + *(u16 *)((u8 *)arg0 + 2) = 1; + break; + case 1: + func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); + func_800233CC(s0, 0x40); + *(Blk4 *)s0 = D_801CE7A4[0]; + *(Blk4 *)(s0 + 4) = D_801CE7A4[0]; + *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x50000000; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; + *(u16 *)((u8 *)arg0 + 2) = 3; + break; + case 2: + func_8001CD9C(*(s32 *)((u8 *)arg0 + 0x20), s0); + func_800233CC(s0, 0x80); + *(Blk4 *)s0 = D_801CE7A4[0]; + *(Blk4 *)(s0 + 4) = ((Blk4 *)&D_801865C0)[0]; + *(u32 *)(*(s32 *)((u8 *)arg0 + 0x20) + 4) |= 0x50000000; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x18) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x1A) = 0; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x2C) = 0xC040; + *(u16 *)((u8 *)arg0 + 2) = 4; + break; + } +} + + + +extern void (*D_801865C4[])(void); + +void func_8017FE20(void *a0) { + D_801865C4[*(u16 *)((s32)a0 + 0x2)](); +} + + +extern s32 func_80132EF4(); + +void func_8017FE5C(void *a0) { + register s32 s0 __asm__("$16") = (s32)a0; + s32 obj; + + obj = func_80132EF4((void *)s0, 0x77); + if (obj != 0) { + *(u16 *)(obj + 0x2C) = 1; + *(s32 *)(obj + 0x34) = s0; + } +} + + +extern u8 *func_801290DC(); + +void func_8017FE9C(void *a0) { + struct { s16 x; s16 y; s16 z; } sp; + u8 *rec; + + sp.x = *(u16 *)((u8 *)a0 + 0x6); + sp.y = *(u16 *)((u8 *)a0 + 0xA); + sp.z = *(u16 *)((u8 *)a0 + 0xE); + rec = func_801290DC(0x77, &sp); + if (rec != NULL) { + *(s16 *)(rec + 0x2C) = 2; + } +} + + +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); +} + + + +extern void func_8012AD44(); +extern void func_8013C9C4(void *a0); +extern void func_8002D4C8(s32 a0, s32 a1); +extern u8 D_801867A0[]; +extern u8 D_80182DD8[]; + +void func_8018000C(s32 arg0) { + func_8012AD44((s32 *)arg0, 2); + func_8013C9C4(D_80182DD8); + *(s16 *)((s32)arg0 + 0x106) = *(u16 *)(D_801867A0 + *(s16 *)((s32)arg0 + 0x70) * 2); + func_8002D4C8(0xB75, 0); +} + + +#include "common.h" + +extern void func_8017DF94(s32 arg0, s16 *arg1, s32 arg2); +extern void func_801805C0(); +extern void func_8012C218(void *arg0); +extern s32 func_8004787C(s32 a0); +extern void func_80180200(void *a0); +extern void func_801802E4(void *a0); +extern void func_8012E014(s32 a0); +extern u16 D_801865DA; + +void func_8018006C(void *a0) { + struct { s16 x; s16 y; s16 z; } sp; + s32 idx; + u16 y; + + if (*(s16 *)((u8 *)a0 + 0xE) - 0x80 < *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xE)) { + func_8017DF94(*(s16 *)((u8 *)a0 + 0x70), (s16 *)&sp, 0); + func_801805C0(a0, *(s16 *)((u8 *)a0 + 0x102)); + func_8012C218(a0); + return; + } + idx = *(s16 *)((u8 *)a0 + 0x70); + y = *(u16 *)((u8 *)a0 + 0xA); + if (*(s16 *)((u8 *)a0 + 0x100) >= 0x400) { + if ((s16)y < -0x1FF) { + *(s16 *)((u8 *)a0 + 0xA) = y + 8; + } else { + func_8017DF94(idx, (s16 *)&sp, 0); + func_8012C218(a0); + return; + } + } else { + *(s16 *)((u8 *)a0 + 0x100) = *(s16 *)((u8 *)a0 + 0x100) + 0x10; + *(s16 *)((u8 *)a0 + 0xA) = *(u16 *)((u8 *)a0 + 0xA) + (func_8004787C(*(s16 *)((u8 *)a0 + 0x100)) >> 9); + } + if (*(s16 *)((u8 *)a0 + 0x106) != 0) { + *(s16 *)((u8 *)a0 + 0x106) = *(s16 *)((u8 *)a0 + 0x106) - 1; + if ((*(s16 *)((u8 *)a0 + 0x106) & 3) == 0) { + func_80180200(a0); + } + } + func_801802E4(a0); + sp.z = 0; + sp.x = 0; + sp.y = *(u16 *)((u8 *)a0 + 0xA) - *(u16 *)((u8 *)&D_801865DA + (*(s16 *)((u8 *)a0 + 0x70) << 3)); + func_8017DF94(*(s16 *)((u8 *)a0 + 0x70), (s16 *)&sp, 1); + if (*(u8 *)((u8 *)a0 + 0x74) != 0) { + func_8012E014((s32)a0); + } +} + + + +extern void (*D_801867DC[])(void); + +void func_801801C4(void *a0) { + D_801867DC[*(u16 *)((s32)a0 + 0x2)](); +} + + +extern u16 D_80186764[]; +extern void func_801803F0(); + +void func_80180200(void *a0) { + struct { s16 x; s16 y; s16 z; } sp; + s32 var_s1; + s32 i; + s32 ret; + + var_s1 = *(u16 *)((u8 *)a0 + 0xA) + D_80186764[*(s16 *)((u8 *)a0 + 0x70)]; + i = 0; + while (i < 3) { + ret = rand(); + sp.x = (*(u16 *)((u8 *)a0 + 6) - 0x80) - (ret & 0x1F); + sp.y = var_s1; + if (*(s16 *)((u8 *)a0 + 0x102) == 1) { + sp.z = *(u16 *)((u8 *)a0 + 0xE) + 0x80; + } else { + sp.z = *(u16 *)((u8 *)a0 + 0xE) + 0xC0; + } + func_801803F0(a0, &sp); + ret = rand(); + i++; + sp.x = (*(u16 *)((u8 *)a0 + 6) + 0x80) + (ret & 0x1F); + func_801803F0(a0, &sp); + var_s1 += 0x20; + } +} + + +extern u16 D_80126B62; +void func_801802E4(void *a0) { + struct { s16 x; s16 y; s16 z; } sp; + + sp.x = (*(u16 *)((u8 *)a0 + 6) - 0x100) - (rand() & 0x1F); + sp.y = D_80126B62 + 0xB0; + if ((s16)(D_80126B62 + 0xB0) < *(s16 *)((u8 *)a0 + 0xA)) { + sp.y = *(s16 *)((u8 *)a0 + 0xA); + } + if (*(s16 *)((u8 *)a0 + 0x102) == 1) { + sp.z = *(u16 *)((u8 *)a0 + 0xE) + (rand() % 0xC0) - 0x60; + } else { + sp.z = *(u16 *)((u8 *)a0 + 0xE) + (rand() % 0x140) - 0xA0; + } + func_801803F0(a0, &sp); +} + + +extern u8 *func_801290DC(); + +void func_801803F0() { + u8 *rec; + s32 r; + + rec = func_801290DC(0x22); + if (rec != NULL) { + *(s32 *)(rec + 0x34) = 0x4000; + r = rand(); + *(s32 *)(rec + 0x14) = -((r & 0x3FF0 | 0x8000) << 4); + } +} + + + +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); + +void func_80180440(s32 arg0) { + s32 i; + + for (i = 0; i < 30; i++) { + func_8012C658(0x3a5, i, arg0); + } +} + + +extern s32 *D_80186800[]; +extern s32 *D_80186810[]; + +void func_80180490(void *a0) { + s32 ret; + s16 idx; + s32 *p0, *p1; + + ret = func_8012C1B8(); + *(s32 *)((u8 *)a0 + 0x20) = ret; + if (ret == 0) { + func_8012CAE4(a0); + return; + } + + *(u16 *)((u8 *)a0 + 0xFE) = (*(u16 *)((u8 *)a0 + 0x70) >> 8) & 7; + *(u16 *)((u8 *)a0 + 0x70) = *(u16 *)((u8 *)a0 + 0x70) & 0xF; + idx = *(s16 *)((u8 *)a0 + 0xFE); + p0 = D_80186800[idx]; + p1 = D_80186810[idx]; + p1[*(s16 *)((u8 *)a0 + 0x70) * 2] = p0[*(s16 *)((u8 *)a0 + 0x70)]; + p1[*(s16 *)((u8 *)a0 + 0x70) * 2 + 1] = 0; + func_8001C214(*(s32 *)((u8 *)a0 + 0x20), &p1[*(s16 *)((u8 *)a0 + 0x70) * 2]); + + *(u16 *)((u8 *)a0 + 0x106) = rand() & 0xF0; + *(u16 *)((u8 *)a0 + 0x108) = rand() & 0xF0; + func_8012B23C(a0); + *(s32 *)((u8 *)a0 + 0x1C) = 0x20; + func_8012AD50(a0); +} + + + +extern void (*D_80186840[])(void); + +void func_80180584(void *a0) { + D_80186840[*(u16 *)((s32)a0 + 0x2)](); +} + + +#include "common.h" + +extern s32 D_801867E8[]; +extern s32 D_80186820[]; +extern void *D_80186830[]; +extern u16 D_80186848[]; +extern u16 D_80186850[]; +extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); +extern void func_8018091C(void *a0, void *a1); +extern void func_80180704(void *a0); +extern void func_80180790(s32 self); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_801805C0(s32 arg0, s32 arg1) { + s32 idx; + s32 i; + s32 rec; + char *base; + + idx = D_801867E8[arg1]; + base = (char *)D_80186830[idx]; + for (i = 0; i < D_80186820[idx]; i++) { + rec = func_8012C658(0x3C4, (idx << 8) + i, arg0); + if (rec != 0) { + func_8018091C((void *)rec, base + i * 0xC); + *(u16 *)(rec + 0xA) += *(u16 *)(arg0 + 0xA) - D_80186848[idx]; + *(u16 *)(rec + 0xE) += *(u16 *)(arg0 + 0xE) - D_80186850[idx]; + func_80180704((void *)rec); + func_80180790(rec); + } + } + func_8002D4C8(0xC02, 0); +} + + +extern s32 rand(void); + +void func_80180704(void *a0) { + s32 v0; + + *(s32 *)((u8 *)a0 + 0x10) = (*(s16 *)((u8 *)a0 + 6) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 6)) << 11; + *(s32 *)((u8 *)a0 + 0x14) = ((*(s16 *)((u8 *)a0 + 0xA) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xA)) << 10) - 0x200000; + v0 = rand() & 0xFF; + *(s32 *)((u8 *)a0 + 0x18) = ((*(s16 *)((u8 *)a0 + 0xE) - *(s16 *)(*(s32 *)((u8 *)a0 + 0x64) + 0xE)) + v0 - 0x80) << 12; +} + + +extern s32 func_80132EF4(s32 a0, s32 a1); + +void func_80180790(s32 self) { + s32 obj; + char *prim; + + obj = func_80132EF4(self, 0x22); + if (obj != 0) { + prim = *(char **)(obj + 0x20); + *(s32 *)(obj + 0x34) = 0x7002; + *(u16 *)(prim + 0x2C) = 0xC020; + *(s32 *)(obj + 0x10) = (*(s32 *)(self + 0x10) >> 2) * 3; + *(s32 *)(obj + 0x14) = *(s32 *)(self + 0x14) >> 2; + *(s32 *)(obj + 0x18) = (*(s32 *)(self + 0x18) >> 2) * 3; + } +} + + + +extern void (*D_80186858[])(void); + +void func_80180818(void *a0) { + D_80186858[*(u16 *)((s32)a0 + 0x2)](); +} + + +extern u8 D_801ADEA0[]; +extern void func_8018091C(); +extern void func_8018096C(void *a0); +extern s32 func_80132EF4(s32 a0, s32 a1); +extern s32 func_8012C658(s32 a0, s32 a1, s32 a2); + +void func_80180854(void) +{ + register s32 s0 __asm__("$16"); + register s32 s1 __asm__("$17"); + register s32 s2 __asm__("$18"); + s32 v1; + + s1 = 0; + s2 = 0; + do { + s0 = func_8012C658(0x3A3, s1, 0); + if (s0 != 0) { + func_8018091C(s0, D_801ADEA0 + s2); + func_8018096C(s0); + v1 = func_80132EF4(s0, 0x22); + if (v1 != 0) { + *(s32 *)(v1 + 0x34) = 0x7002; + *(s32 *)(v1 + 0x10) = *(s32 *)(s0 + 0x10) >> 2; + *(s32 *)(v1 + 0x14) = *(s32 *)(s0 + 0x14) >> 2; + *(s32 *)(v1 + 0x18) = *(s32 *)(s0 + 0x18) >> 2; + } + } + s1++; + s2 += 0xC; + } while (s1 < 0xE); +} + + + + +void func_8018091C(void *a0, void *a1) { + *(u16 *)((s32)a0 + 0x6) = *(u16 *)((s32)a1 + 0x0); + *(u16 *)((s32)a0 + 0xA) = *(u16 *)((s32)a1 + 0x2); + *(u16 *)((s32)a0 + 0xE) = *(u16 *)((s32)a1 + 0x4); + *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x10) = *(u16 *)((s32)a1 + 0x6); + *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x12) = *(u16 *)((s32)a1 + 0x8); + *(u16 *)(*(s32 *)((s32)a0 + 0x20) + 0x14) = *(u16 *)((s32)a1 + 0xA); +} + + +void func_8018096C(void *a0) { + *(s32 *)((s32)a0 + 0x10) = *(s16 *)((s32)a0 + 0x06) << 13; + *(s32 *)((s32)a0 + 0x14) = (*(s16 *)((s32)a0 + 0x0A) + 0x400) << 13; + *(s32 *)((s32)a0 + 0x18) = (*(s16 *)((s32)a0 + 0x0E) - 0x180) * 3 << 13; +} + + +#include "common.h" + +extern s32 func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern void D_801B9C88; +extern void D_80186550; +extern void func_8017F888(s32 *a0, s32 *a1); +extern s32 func_80143970(s32 a0); +extern void D_801BCCAC; +extern void func_8012A828(); +extern void func_8017F4F8(s32 a0); +extern void func_8017EE40(s32 a0); + +void func_801809A4(void *a0) { + s32 ret; + s32 p; + + ret = func_8012C1B8(); + *(s32 *)((u8 *)a0 + 0x20) = ret; + if (ret == 0) { + func_8012CAE4(a0); + return; + } + + func_8001C214(ret, (s32)&D_801B9C88); + + p = *(s32 *)((u8 *)a0 + 0x20); + *(u16 *)((u8 *)p + 0x2C) |= 0x10; + func_8017F888((s32 *)a0, (s32 *)&D_80186550); + + func_80143970((s32)a0); + + func_8012A828(a0, &D_801BCCAC); + + func_8017F4F8(0); + + func_8017EE40((s32)a0); +} + + +void func_80180A3C(s32 a0) { + func_8012AD80(a0); + + *(u32 *)(a0 + 0x1C) = *(u32 *)(a0 + 0x1C) + 1; + if ((*(u32 *)(a0 + 0x1C) & 7) == 0) { + func_8017F3FC(a0); + } + + if (*(s16 *)(a0 + 0xE) >= 0x361) { + func_8017EE8C(a0); + } +} + + +extern s16 D_801D0B7C; +extern void func_8017EEC0(void); +void func_80180AA4(void *a0) { + s32 a1; + s32 v1; + short v; + a1 = *(s32 *)(a0 + 0x20); + v = *(s16 *)(a1 + 0x12); + if (v != 0) { + *(s16 *)(a1 + 0x12) = v - 0x100; + v1 = *(s32 *)(a0 + 0x20); + if (*(s16 *)(v1 + 0x12) < 0) { + *(s16 *)(v1 + 0x12) = 0; + } + if (*(s16 *)(*(s32 *)(a0 + 0x20) + 0x12) == 0) { + D_801D0B7C = 1; + } + } else { + if (*(u16 *)&D_801D0B7C == 2) { + func_8017EEC0(); + } + } +} + + +void func_80180B3C(s32 a0) +{ + extern s16 D_801D0B7C; + extern void func_8017F098(); + extern s32 func_8012B8A4(s16 *a0); + extern void func_8017F464(); + + if ((*(u16 *)&D_801D0B7C) == 4) { + ((void (*)())func_8017F098)(); + } + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x12) = func_8012B8A4((s16 *)a0); + func_8017F464(a0); +} + + +extern void func_80142414(s32 a0, s16 a1); +extern void func_8017F0D0(s32 a0); +extern s16 D_801D0B7C; + +void func_80180B90(s32 ent) { + s16 t; + + switch (*(u16 *)(ent + 0x34)) { + case 0: + t = *(s16 *)(*(s32 *)(ent + 0x20) + 0x12); + if (t != 0) { + *(s16 *)(*(s32 *)(ent + 0x20) + 0x12) = t - 0x100; + if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) < 0) { + *(u16 *)(*(s32 *)(ent + 0x20) + 0x12) = 0; + } + if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) != 0) { + break; + } + } + *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; + break; + case 1: + func_80142414(ent, -0xA0); + *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; + break; + case 2: + break; + } + if (*(u16 *)&D_801D0B7C == 6) { + func_8017F0D0(ent); + } +} + + +#include "common.h" + +extern s32 func_8012C1B8(void); +extern void func_8012CAE4(void *a0); +extern void func_8001C214(s32 a0, s32 a1); +extern void func_8012A828(); +extern void func_8017F888(s32 *a0, s32 *a1); +extern void func_80029124(s32, s32); +extern s16 D_801CC230; +extern u8 D_801C0DEC; +extern void D_80186584; + +void func_80180C68(void *a0) { + s32 ret; + extern s32 func_8012AD50(void *a0); + + ret = func_8012C1B8(); + *(s32 *)((u8 *)a0 + 0x20) = ret; + if (ret == 0) { + func_8012CAE4(a0); + return; + } + + func_8001C214(ret, (s32)&D_801C0DEC); + func_8012A828(a0, &D_801CC230); + func_8017F888((s32 *)a0, (s32 *)&D_80186584); + func_80029124(0x135, 0); + func_8012AD50(a0); +} + + +extern s16 D_801D0B7C; +extern u8 D_801CC8D8[]; + +void func_80180CEC(s32 a0) { + s32 s0 = a0; + s32 v1, v0; + + *(s16 *)(*(s32 *)(s0 + 0x20) + 0x12) = func_8012B8A4((s16 *)s0); + + v1 = *(u16 *)(s0 + 0x34); + if (v1 != 1) { + if (v1 < 2) { + if (v1 == 0) { + if ((func_80029178(0x135) & 0xFF) != 0) { + func_8012A828(s0, D_801CC8D8); + v0 = *(u16 *)(s0 + 0x34) + 1; + *(u16 *)(s0 + 0x34) = v0; + } + } + } + } else { + if (*(s32 *)(s0 + 0x94) == 0) { + *(s16 *)(s0 + 0x98) = 0; + v0 = *(u16 *)(s0 + 0x34) + 1; + *(u16 *)(s0 + 0x34) = v0; + } + } + + if (*(u16 *)&D_801D0B7C == 4) { + func_8017F554(s0); + } + func_8017F8B8(s0); +} + + +extern s16 D_801D0B7C; + +void func_80180DB4(s32 ent) { + s16 t; + + switch (*(u16 *)(ent + 0x34)) { + case 0: + t = *(s16 *)(*(s32 *)(ent + 0x20) + 0x12); + if (t != 0) { + *(s16 *)(*(s32 *)(ent + 0x20) + 0x12) = t - 0x100; + if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) < 0) { + *(u16 *)(*(s32 *)(ent + 0x20) + 0x12) = 0; + } + if (*(s16 *)(*(s32 *)(ent + 0x20) + 0x12) != 0) { + break; + } + } + *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; + break; + case 1: + func_80142414(ent, -0x80); + *(s32 *)(ent + 0x1C) = 0x10; + *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; + break; + case 2: + if (func_8012BEE8(ent) == 0) { + break; + } + func_8017FE5C(ent); + *(u16 *)(ent + 0x34) = *(u16 *)(ent + 0x34) + 1; + break; + } + if (*(u16 *)&D_801D0B7C == 5) { + func_8017F59C(ent); + } +} + + +extern void func_8017FB38(); +struct D_801D0630_s { u16 f0; u16 f2; u16 pad[2]; }; +extern struct D_801D0630_s D_801D0630[]; +struct D_801D0660_s { u16 f0; u16 f2; }; +extern struct D_801D0660_s D_801D0660[]; +extern struct D_801D0660_s D_801D0662[]; + +void func_80180ED0(s32 arg0) { + register s32 a3 __asm__("$7") = arg0; + register s32 i __asm__("$6"); + register s32 a1 __asm__("$5"); + + if (*(s32 *)(a3 + 0x1C) != 0) { + (*(s32 *)(a3 + 0x1C))--; + for (i = 0, a1 = (s32)D_801D0630; i < 12; i += 2) { + *(u16 *)(a1 + 0) += D_801D0660[i >> 1].f0; + *(u16 *)(a1 + 2) += D_801D0662[i >> 1].f0; + a1 += 8; + } + *(u16 *)(*(s32 *)(a3 + 0x20) + 0x18) += 0x200; + *(u16 *)(*(s32 *)(a3 + 0x20) + 0x1A) += 0x200; + } else { + *(s32 *)(a3 + 0x1C) = 4; + *(u16 *)(a3 + 0x2) += 1; + } + func_8017FB38(a3); +} + + +#include "common.h" + +extern u8 D_801D0620[]; +extern u8 D_801865A8[]; +extern u8 D_801865A9; +extern u8 D_801865AA; +extern void func_801292C8(u8 *a0); +extern void func_8017FB38(); + +void func_80180FA8(void *a0) { + register s32 s0 __asm__("$16") = (s32)a0; + void *ptr; + s32 v0; + + v0 = *(s32 *)(s0 + 0x1C); + v0 = v0 - 1; + *(s32 *)(s0 + 0x1C) = v0; + if (v0 == 0) { + func_801292C8((u8 *)s0); + } + + D_801D0620[0] -= D_801865A8[0] >> 2; + D_801D0620[1] -= D_801865A9 >> 2; + D_801D0620[2] -= D_801865AA >> 2; + + ptr = *(void **)(s0 + 0x20); + *(u16 *)((s32)ptr + 0x18) += 0x200; + + ptr = *(void **)(s0 + 0x20); + *(u16 *)((s32)ptr + 0x1A) += 0x200; + + func_8017FB38(s0); +} + + +void func_8018107C(s32 arg0) +{ + extern u8 D_801D0678[]; + extern u8 D_801865B8; + extern u8 D_801865B9; + extern u8 D_801865BA; + extern void func_8017FE9C(void *); + + u8 *dst; + s16 t18; + s16 t2e; + s32 cnt; + + dst = &D_801D0678[*(s16 *)(arg0 + 0x2C) << 6]; + t18 = *(s16 *)(*(s32 *)(arg0 + 0x20) + 0x18); + if (t18 < 0xC00) { + *(s16 *)(*(s32 *)(arg0 + 0x20) + 0x18) = t18 + 0x180; + *(u16 *)(*(s32 *)(arg0 + 0x20) + 0x1A) += 0x200; + dst[0] += D_801865B8 >> 3; + dst[1] += D_801865B9 >> 3; + dst[2] += D_801865BA >> 3; + } else { + *(u16 *)(arg0 + 2) += 1; + } + t2e = *(s16 *)(arg0 + 0x2E); + if (t2e != 0) { + cnt = *(s32 *)(arg0 + 0x1C); + if (cnt != 0) { + *(s32 *)(arg0 + 0x1C) = cnt - 1; + } else { + *(s16 *)(arg0 + 0x2E) = t2e - 1; + func_8017FE9C((void *)arg0); + } + } +} + + +extern u8 D_801D0678[]; +extern u8 D_801865B8; +extern u8 D_801865B9; +extern u8 D_801865BA; +extern void func_801292C8(u8 *a0); + +void func_80181174(u8 *a1) { + u8 *a0; + u8 *a2; + u8 *a3; + a0 = (u8*)D_801D0678 + (*(s16*)(a1 + 0x2C) << 6); + a3 = *(u8 **)(a1 + 0x20); + if (*(s16*)(a3 + 0x18) != 0) { + *(s16*)(a3 + 0x18) = *(s16*)(a3 + 0x18) - 0x180; + *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) - 0x200; + *(u8*)(a0 + 0) = *(u8*)(a0 + 0) - (D_801865B8 >> 3); + *(u8*)(a0 + 1) = *(u8*)(a0 + 1) - (D_801865B9 >> 3); + *(u8*)(a0 + 2) = *(u8*)(a0 + 2) - (D_801865BA >> 3); + } else { + func_801292C8(a1); + } +} + + +extern u8 D_801D0678[]; +extern u8 D_801865BC; +extern u8 D_801865BD; +extern u8 D_801865BE; +extern void func_80129350(s32 a0, s32 a1); + +void func_80181228(void *a0) { + u8 *p; + s32 a1; + s32 v1; + s16 v; + + p = &D_801D0678[*(s16 *)((s32)a0 + 0x2C) * 0x40]; + a1 = *(s32 *)((s32)a0 + 0x20); + v = *(s16 *)(a1 + 0x18); + if (v < 0x1000) { + *(s16 *)(a1 + 0x18) = v + 0x200; + v1 = *(s32 *)((s32)a0 + 0x20); + *(u16 *)(v1 + 0x1A) += 0x300; + p[0] += D_801865BC >> 3; + p[1] += D_801865BD >> 3; + p[2] += D_801865BE >> 3; + } + if (*(s32 *)((s32)a0 + 0x34) != 0) { + func_80129350((s32)a0, *(s32 *)((s32)a0 + 0x34)); + *(u16 *)((s32)a0 + 0xA) -= 0x20; + } +} + + +extern u8 D_801D0678[]; +extern u8 D_801865C0; +extern u8 D_801865C1; +extern u8 D_801865C2; +extern void func_801292C8(u8 *a0); + +void func_80181304(u8 *a1) { + u8 *a0; + u8 *a2; + a0 = (u8*)D_801D0678 + (*(s16*)(a1 + 0x2C) << 6); + a2 = *(u8 **)(a1 + 0x20); + if (*(s16*)(a2 + 0x18) < 0x1400) { + *(s16*)(a2 + 0x18) = *(s16*)(a2 + 0x18) + 0x280; + *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1A) + 0x3C0; + *(u16*)(*(u8 **)(a1 + 0x20) + 0x1E) = *(u16*)(*(u8 **)(a1 + 0x20) + 0x1E) + 0x100; + *(u8*)(a0 + 4) = *(u8*)(a0 + 4) - (D_801865C0 >> 3); + *(u8*)(a0 + 5) = *(u8*)(a0 + 5) - (D_801865C1 >> 3); + *(u8*)(a0 + 6) = *(u8*)(a0 + 6) - (D_801865C2 >> 3); + } else { + func_801292C8(a1); + } +} + + +extern u16 D_80126B66; +extern u16 D_801D0BB8; +extern s32 func_8012BEE8(s32 a0); +extern void func_8012E014(s32 a0); +extern void func_8018000C(s32 arg0); + +void func_801813D4(s32 a0) +{ + s32 s0 = a0; + + switch (*(s16 *)((s32)s0 + 0xFE)) { + case 0: + if (*(s16 *)((s32)s0 + 0x104) == 0) { + if ((*(u8 *)((s32)s0 + 0x74) != 0) || + ((s16)(D_80126B66 - *(u16 *)((s32)s0 + 0xE)) >= 0xC1)) { + *(s16 *)((s32)s0 + 0x104) = 1; + } + } else if (func_8012BEE8(s0) != 0) { + ((void (*)())func_8018000C)(s0); + } + break; + case 0x100: + if ((D_801D0BB8 & 2) != 0) { + if (func_8012BEE8(s0) != 0) { + ((void (*)())func_8018000C)(s0); + } + } + break; + } + if (*(u8 *)((s32)s0 + 0x74) != 0) { + func_8012E014(s0); + } +} + + +void func_801814B0(s32 param) +{ + extern s32 func_8012BEE8(s32 arg0); + extern void func_8012C218(void *arg0); + extern void func_8012AD80(s32 arg0); + + if (func_8012BEE8(param) != 0) { + func_8012C218((void *)param); + } else { + func_8012AD80(param); + *(u16 *)(*(s32 *)(param + 0x20) + 0x10) += *(u16 *)(param + 0x106); + *(u16 *)(*(s32 *)(param + 0x20) + 0x14) += *(u16 *)(param + 0x108); + } +} + + +extern s32 D_801ADE64[]; +extern s32 D_801D0900[]; +extern s32 D_801D0904[]; + +void func_80181528(void *a0) { + *(s32 *)((u8 *)a0 + 0x20) = func_8012C1B8(); + if (*(s32 *)((u8 *)a0 + 0x20) == 0) { + func_8012CAE4(a0); + return; + } + + *(s32 *)((s8 *)D_801D0900 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) = + D_801ADE64[*(s16 *)((u8 *)a0 + 0x70)]; + *(s32 *)((s8 *)D_801D0904 + (*(s16 *)((u8 *)a0 + 0x70) << 3)) = 0; + func_8001C214(*(s32 *)((u8 *)a0 + 0x20), + (s32)((s8 *)D_801D0900 + (*(s16 *)((u8 *)a0 + 0x70) << 3))); + + *(u16 *)((u8 *)a0 + 0x106) = rand() & 0xF0; + *(u16 *)((u8 *)a0 + 0x108) = rand() & 0xF0; + func_8012B23C(a0); + *(s32 *)((u8 *)a0 + 0x1C) = 0x20; + func_8012AD50(a0); +} + + +extern s32 func_8012BEE8(s32 arg0); +extern void func_8012C218(void *arg0); +extern void func_8012AD80(s32 arg0); + +void func_801815F8(s32 param) { + if (func_8012BEE8(param) != 0) { + func_8012C218((void *)param); + } else { + func_8012AD80(param); + *(u16 *)(*(s32 *)(param + 0x20) + 0x10) += *(u16 *)(param + 0x106); + *(u16 *)(*(s32 *)(param + 0x20) + 0x14) += *(u16 *)(param + 0x108); + } +} + + + +extern void (*D_80186860[])(void); + +void func_80181670(void *a0) { + D_80186860[*(u16 *)((s32)a0 + 0x2)](); +} + + +extern s32 func_8012AD50(void *a0); + void func_801816AC(u8 *param_1) { + *(short *)(param_1 + 0xfc) = 0; + *(unsigned short *)(param_1 + 0x72) |= 0x1000; + ((void (*)(void))func_8012AD50)(); + } + + +void func_801816D8(void) +{ + extern s32 D_801151D4; + extern s16 func_8012A758(void); + extern s16 D_800B9AB8[]; + extern s16 D_800B9ABA[]; + s32 *base; + u16 arr[2]; + s32 t1; + + base = (s32 *)D_801151D4; + + t1 = (*(base + 0x13) + 0x800) * 120 / 1024; + arr[1] = t1; + if ((s16)t1 < 0) { + arr[1] = 0; + } + + arr[0] = (s16)((s32 (*)(void))func_8012A758)() * 320 / 4096; + arr[0] -= *(base + 0x14) >> 4; + D_800B9AB8[0] = arr[0]; + D_800B9ABA[0] = arr[1]; +} + + +void func_80181790(void) { + + extern s16 D_801D0A84; + s16 *p = &D_801D0A84; + s32 i = 0xF; + do { + *p = 0; + p = (s16 *)((s32)p + 0xe); + i--; + } while (i >= 0); +} + + + +/* func_801817B4 — cookbook §71 (sibling-first). + * func_80181854 is ALREADY MATCHED in the same TU + * (src/ov_SC03_014/ov_SC03_014_jr_8017EB7C.c L4221) as a 3-arg + * `void func_80181854(s32, s32, s32)`, so the untouched $a3 at the first + * jal is just the incoming arg3 living on, not a 4th argument. + * func_80181970 (asm, same TU) reads its 2nd arg as lhu+0 / lhu+2 / lh+4 / + * lh+6 => the sp+0x10 local is a 4 x s16 record. + * + * Two levers took it 32 -> 2 -> 0 (match_one MATCH, rtu_match MATCH): + * 1. LENGTH-DRIFT (-2, cookbook §78): writing `sp10.unk2 = i * 0x100` + * leaves gcc-2.7.2 recomputing `sll v0,s1,8` instead of building the + * strength-reduced giv, so only s0..s3 get saved and the frame is two + * instructions short. An EXPLICIT accumulator (`ang += 0x100`) forces + * the second callee-saved register ($s2) and restores sw/lw $s4. + * 2. REGALLOC-PERM $s1>$s2 (cookbook §3-T2, source order drives emission): + * `ang = 0;` on its own line before the loop emits the $s2 zero-init + * FIRST. Folding it into the for-init (`for (i = 0, ang = 0; ...)`) + * puts $s1's zero-init first, which is the target order. + */ + + +extern void func_80181854(s32 arg0, s32 arg1, s32 arg2); +extern void func_80181970(s32 arg0, Rec_8018A6A4_801817B4 *arg1, s32 arg2, s32 arg3); + +void func_801817B4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + Rec_8018A6A4_801817B4 sp10; + s32 i; + s32 ang; + + func_80181854(arg0, 0x1000, 0); + sp10.unk0 = *(u16 *)(arg3 + 0x0); + sp10.unk4 = *(u16 *)(arg3 + 0x2); + sp10.unk6 = 1; + for (i = 0, ang = 0; i < 16; i++) { + sp10.unk2 = ang; + func_80181970(i, &sp10, arg1, arg2); + ang += 0x100; + } +} + + + + extern s16 D_801D0A7E; + extern s16 D_801D0A80; + extern s16 D_801D0A82; + void func_80181854(s32 arg0, s32 arg1, s32 arg2) { + /* [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_801D0A7C; + D_801D0A7C = *(u16 *)((s32)arg0 + 0x0); + D_801D0A7E = *(u16 *)((s32)arg0 + 0x2); + D_801D0A80 = arg1; + D_801D0A82 = arg2; + } + + + + +extern void func_80015978(s32 a0, s32 *a1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); + +void func_80181884(s32 a0) { + + extern s16 D_801D0A7C; + extern s16 D_801D0A7E; + /* [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_800AF648; + u16 sxy[2]; + s32 pv[4]; + + func_80015978(a0, pv); + func_8004914C(&D_800AF648); + func_800491AC(&D_800AF648); + RotTransPers((s32)pv, (s32)sxy, &pv[2], &pv[3]); + + D_801D0A7C = sxy[0]; + D_801D0A7E = sxy[1]; +} + + +extern s16 D_801D0A82; + void func_801818FC(s32 arg0) { + *(s16 *)((s32)&D_801D0A82 + 0x0) += arg0; + } + + +void func_80181918(s32 arg0, s32 arg1, s32 arg2) { + extern s32 func_80181A44(void); + s32 idx; + + idx = func_80181A44(); + if (idx >= 0) { + func_80181970(idx, arg0, arg1, arg2); + } +} + + + +/* func_80181970 — SPLICE RECONCILE (bytes unchanged from the s6h draft). + * + * THREE in-TU collisions, all fixed without touching an emitted instruction + * (src/ov_SC03_014/ov_SC03_014_jr_801848E4.c): + * + * (1) memcpy — cookbook §2959 / the sibling note at TU L3742. The TU declares + * memcpy THREE times: L81 + L1518 with the builtin-compatible signature + * (void*, const void*, unsigned) and then L1524 as + * `extern void *memcpy(void *dst, void *src, s32 n);`. L1524 disagrees with + * gcc's built-in, so duplicate_decls "throws away the built-in" (warning only, + * because the old decl was still DECL_BUILT_IN) and installs a PLAIN function + * decl. Two consequences at the splice point (L3635): + * a. my own builtin-shaped redeclaration now conflicts with a plain decl — + * hard error ("conflicting types for `memcpy'", :3637 vs :1524); + * b. even if it compiled, the identifier `memcpy` is no longer a builtin + * here, so both copies would lower to `jal memcpy` — but the TARGET + * bytes are the INLINE block move (lwl 3 / lwr 0 / swl / swr, no jal). + * Fix = do not name memcpy at all: a 4-byte STRUCT ASSIGN through an + * ALIGN-1 struct (u8 x4). That is exactly the sibling func_8018ADA8 lever + * in this same TU (TU L3736-3744, cookbook §48-C2): align 1 routes + * mips.c expand_block_move, which copy_addr_to_reg's the source into one + * held register -> the identical lwl/lwr + swl/swr pair, zero memcpy ref. + * The typedef is BLOCK-scoped so it cannot collide with the TU's own + * block-scoped `V4` at L3758. + * + * (2) func_80181970 itself — the TU prototypes it at L3570 as + * `extern void func_80181970(s32, Rec_8018A6A4 *, s32, s32);` (used by the + * matched caller func_8018A6A4 at L3583). Rec_8018A6A4 is a TU-local + * typedef I cannot restate (C89 forbids the redefinition), and the last two + * args are really pointers, so defining the name directly is "conflicting + * types". Fix = §37/§124 ASM-LABEL ALIAS: define aF8018A860 with an + * __asm__("func_80181970") label. Emits the identical symbol, leaves the + * TU's declaration untouched, zero blast radius, zero byte change. + * + * (3) D_801D0A84 / rand — declared VERBATIM as the TU already has them + * (D_801D0A84: TU L3637 + L3671; rand: TU L951), so both are exact + * re-declarations and merge silently. + */ +extern s32 rand(void); /* TU L951, verbatim */ + +void aF8018A860(s32 a0, s16 *a1, u8 *a2, u8 *a3) __asm__("func_80181970"); + +void aF8018A860(s32 a0, s16 *a1, u8 *a2, u8 *a3) +{ + + extern s16 D_801D0A84; /* TU L3637 / L3671, verbatim */ + /* align 1 — §48-C2 */ + s16 *s1; + u16 temp_u16; + s16 temp_s16; + s32 temp_s32, v0; + + s1 = (s16 *)((a0 * 14) + (s32)&D_801D0A84); + + *(u16 *)s1 = *(u16 *)a1; + + *(B4_80181970 *)((u8 *)s1 + 6) = *(B4_80181970 *)a2; + *(u8 *)((u8 *)s1 + 9) = 0; + + *(B4_80181970 *)((u8 *)s1 + 10) = *(B4_80181970 *)a3; + *(u8 *)((u8 *)s1 + 13) = 0; + + v0 = rand() & 0x3f; + temp_u16 = *(u16 *)((u8 *)a1 + 2); + *(u16 *)((u8 *)s1 + 2) = temp_u16 + v0 - 0x20; + + v0 = rand() & 0x7f0; + temp_s16 = *(s16 *)((u8 *)a1 + 4); + temp_s32 = temp_s16 * (v0 + 0xc00); + v0 = (s32)(temp_s32 >> 12); + *(s16 *)((u8 *)s1 + 4) = (s16)v0; + + v0 = *(s16 *)((u8 *)a1 + 6); + if (v0 != 0) { + u16 v1 = *(u16 *)((u8 *)s1 + 4); + *(u8 *)((u8 *)s1 + 9) = 1; + *(u16 *)((u8 *)s1 + 4) = 0; + *(u8 *)((u8 *)s1 + 13) = (u8)v1; + } +} + + + + +s32 func_80181A44(void) { + + extern s16 D_801D0A84; + s32 i = 0; + s32 offset = 0; + + while (i < 0x10) { + u16 val = *(u16*)((u8*)&D_801D0A84 + offset); + if (val == 0) { + return i; + } + i++; + offset += 0xE; + } + return -1; +} + + + + + +void func_80181A80(s32 a0, s32 a1) { + + extern s16 D_801D0A84; + s16 *s1; + u16 val; + + if (a0 >= 0x10) return; + + s1 = (s16 *)((a0 * 14) + (s32)&D_801D0A84); + val = *(u16 *)s1; + + if (val == 0) return; + + if (a1 == 0) { + *(u16 *)s1 = 0; + } else { + *(u8 *)((u8 *)s1 + 9) = 2; + } +} + + + +/* func_80181ACC — 16-entry table walk, stride 0xE, over D_801D0A84. + * §71 sibling: func_8018A680 (same TU, L4199) already matched the + * `extern s16 D_801D0A84; s16 *p = &D_801D0A84; p = (s16*)((s32)p+0xe)` + * shape over the very same array — copy that walker verbatim. + * + * Two induction registers in the target ($s1 = base+0, $s0 = base+4) are NOT + * two source pointers: $s1 is the user pointer (the biv, used for the +0 + * accesses) and $s0 is loop.c's single COMBINED address giv for the + * {+4, +9, +13} group (offsets 0/5/9 off $s0). Declaring a second pointer + * splits that group and costs a third register (iter 1: 53 mismatches). + */ + +extern void func_80181BA8(s32 arg0); + +void func_80181ACC(void) { + + extern s16 D_801D0A84; + s16 *p = &D_801D0A84; + s32 i = 0; + s16 t; + + do { + if (*(u16 *)p != 0) { + func_80181BA8(i); + switch (*(u8 *)((s32)p + 9)) { + case 1: + if (*(s16 *)((s32)p + 4) < *(u8 *)((s32)p + 13)) { + *(s16 *)((s32)p + 4) = *(s16 *)((s32)p + 4) + 8; + } else { + *(u8 *)((s32)p + 9) = 0; + } + break; + case 2: + t = *(s16 *)((s32)p + 4); + if (t != 0) { + t -= 0x10; + *(s16 *)((s32)p + 4) = t; + if (t > 0) { + break; + } + } + *p = 0; + break; + } + } + i++; + p = (s16 *)((s32)p + 0xe); + } while (i < 0x10); +} + + + +/* func_80181BA8 — draws one entry of the 16-slot D_801D0A84 particle table: + * bump-allocates a 0x1C-byte GPU packet out of D_800A5E60, fills it from the + * table entry, runs two RotMatrixZ/ApplyMatrixSV passes to place the two + * endpoints, then link-ins the packet into the current double-buffer's OT + * (the PSY-Q `addPrim` macro pair) and calls func_80016638. + * + * STATUS: byte-MATCH, 177/177 instructions (match_one standalone AND spliced + * into the real TU — the in-TU compile adds ZERO new cc1 diagnostics over the + * unmodified TU baseline). + * + * --------------------------------------------------------------------------- + * LEVERS (each byte-checked against asm/.../func_80181BA8.s) + * + * §48 STRUCT ASSIGN, not a hand-rolled temp copy. `m = D_800AE620;` on a + * 32-byte aggregate routes expr.c move_by_pieces, which emits the exact + * lw/lw/lw + sw/sw/sw (x2) + lw/lw + sw/sw grouping AND picks the + * target's registers ($a2 = source address, $v0/$v1/$a1 = carriers), and + * keeps the arg0*14 allocator chain OUT of the copy. The manual + * three-temp form (DEFINE_func_8012B4B8, engine_core.h L29487) emits the + * same instruction MIX but a different allocation (+60 mismatches). + * + * §21/T6 The double-buffer index D_800B9A02 is read at ALL THREE use sites + * (three `lhu`s off ONE materialised `la`). A PLAIN read is CSEd down to + * two AND keeps -G0 symbol addressing (lui+lhu per read, +1 insn); a + * POINTER local gives the `la` but lets cse fold the third read. The + * `volatile u16 *` pointer local reproduces BOTH properties and leaves + * the TU's own `extern s16 D_800B9A02;` untouched. + * + * T6 The OT base is bound to an s32 local (`ot`) so the tag read/write keep + * the `0x40($v1)` displacement form instead of folding into the pointer. + * + * L4 `mp`, a pointer local bound to &m, is what puts the matrix address in a + * callee-saved register ($s2) and turns each argument setup into a move; + * passing the array directly re-materialises `addiu $aN,$sp,0x10` at + * every call site and drops $s6 from the frame entirely. + * + * S1 `t = *(u16 *)ent;` is hoisted ABOVE the two `sh $zero` stores — the + * sp-relative stores are not disambiguated from the $s0-based load, so + * only SOURCE ORDER moves it (4 mismatches). + * + * T-form `u16 bx/by` (not s32) is what makes `addu $v0,$s3,$v0` come out with + * the accumulator first; through s32 locals combine canonicalises the + * zero_extend into operand 0 and both adds emit reversed. + * + * §83c-inverse FRAME: 0x70 = 16 args + 56 declared vars + 32 saved regs + an + * 8-byte COMPILER TEMP that gcc allocates for the two `symbol+register` + * memory references (both D_800A651C). So the DECLARED locals must total + * 56, not 60: m(32)@0x10, sv(8)@0x30, out(8)@0x38, v(8)@0x40 — the third + * word of the vector handed to func_8004901C (sp+0x48) lands INSIDE that + * compiler temp. `s32 v[3]` gives a 0x78 frame and 19 extra mismatches. + * Do NOT invent a dead local to reach the frame size. + * + * --------------------------------------------------------------------------- + * THE TWO RESIDUAL CLUSTERS AND WHAT ACTUALLY CLOSED THEM + * (both are gcc-2.7.2-map/sched.md §1 rule 7 "BIRTHING BOOST" + rule 5(b) + * "potential hazard"; diagnosed from the cc1 `-dS` ready-list trace, which + * names the decision verbatim: `;; insn 245 has a greater potential hazard`.) + * + * (a) The three symbol loads before the first RotMatrixZ came out E4,EA,E6 + * instead of EA,E4,E6. `lh $a0,D_801D0A82` is a single-set SET(REG,…) — + * the sched1 birthing boost sinks it to just before its consumer (the + * jal), i.e. one slot too late. Statement order CANNOT fix this: written + * as a plain local the load is combined into the call's arg setup, so its + * LUID is the call's either way (verified: two source orders, identical + * bytes). `register s32 ang __asm__("$4")` keeps the load a separate insn + * AT its source position — zero extra instructions, +0 bytes. + * + * (b) The tail's `lw $v1,0($s1)` (`*(u32 *)p`) belongs in the load-delay slot + * of `lhu $a0,0($a2)`; ours landed 7 insns later with `lui $a0,0xff00` + * taking the slot. sched1 trace: at T-27 the ready list is + * `247 (7f000001) 245 (7f000001)` — BOTH boosted — and the tie goes to the + * LOAD via `potential_hazard` (memory-unit users beat ALU insns), so the + * load is picked first = placed LAST. TWO edits are needed and neither + * works alone: + * 1. KILL the boost on the load's destination — `pv` gets a second SET + * from a zero-byte dead `__asm__ __volatile__("" : "=r"(pv));` at the + * end of the function (sched.md S2: a plain C reassignment does not + * work, cse/flow removes it; reusing one local across BOTH addPrim + * halves does kill the boost but makes `pv` a 2-death GLOBAL allocno + * that loses $v1, §136). With the boost dead, sched1 emits the + * target order exactly (proved with -fno-schedule-insns2). + * 2. PIN `pv` to $v1 (`register u32 pv __asm__("$3")`). Without it, + * local-alloc gives $v1 to the shorter, denser index quantity and + * `pv` lands in $a1/$t0; sched2 then re-applies rule 5(b) and undoes + * sched1's order. With `pv` in $v1 the index is pushed to $a0, the + * 0xFF000000 constant reuses $a0, and its output-dependence on the + * index's `sll/addu` FREEZES it after them — which is precisely the + * target's shape, and what makes sched2 leave sched1's order alone. + * + * Pin-trim log (all re-scored): dropping the $a2 `bidx` pin — MATCH; + * dropping the $a3 0xFFFFFF pin — MATCH; dropping `ang` — 4 mismatches + * (a dead-volatile boost-kill on `ang` does NOT substitute); dropping + * `pv` — 11; dropping the dead `pv` asm — 11. Two pins are the minimum + * found. + * + * --------------------------------------------------------------------------- + * DECLARATIONS: ApplyMatrixSV, D_800B9A02 and D_801D0A7C/E6/EA/EC are declared + * VERBATIM as the TU already has them at file scope (L163, L2460/2462, + * L3689/3705/3706, L3726, L3879), so they merge silently. D_800AE620, + * D_800A5E60, D_800A651C, D_800A6518, D_801D0A80, RotMatrixZ, func_8004901C and + * func_80016638 have NO file-scope declaration anywhere in the TU and none in + * include/ (checked in one pass, D2), so each is block-scoped here to keep the + * blast radius on the rest of the TU at zero (§103/T51). Verified by splicing + * this body over the INCLUDE_ASM at TU L3917 and compiling the whole TU: same + * 7 stderr lines as the untouched TU, and func_80181BA8 is byte-identical. + */ + +void func_80181BA8(s32 arg0) +{ + /* 32 bytes, align 4 */ + + extern Blk32_8018AA98_80181BA8 D_800AE620; + extern s32 D_800A5E60; + extern s32 D_800A651C; + extern u8 D_800A6518[]; + extern s16 D_801D0A7C; + extern s16 D_801D0A7E; + extern s16 D_801D0A80; + extern s16 D_801D0A84; + extern void RotMatrixZ(s32 a0, void *a1); + extern void ApplyMatrixSV(void *a0, void *a1, void *a2); + extern void func_8004901C(void *a0, void *a1); + extern void func_80016638(void *a0, s32 a1, s32 a2); + + Blk32_8018AA98_80181BA8 m; /* sp+0x10 */ + s16 sv[4]; /* sp+0x30 */ + s16 out[4]; /* sp+0x38 */ + s32 v[2]; /* sp+0x40 — 3rd word lives in the temp area */ + void *mp; + u8 *p; + u8 *ent; + s32 ot; + u16 bx; + u16 by; + register s32 ang __asm__("$4"); /* §17 pin — see residual (a) */ + volatile u16 *bidx; + s32 t; + register u32 pv __asm__("$3"); /* §17 pin — see residual (b) */ + + m = D_800AE620; + mp = &m; + + ent = (u8 *)((arg0 * 14) + (s32)&D_801D0A84); + p = (u8 *)D_800A5E60; + D_800A5E60 = (s32)p + 0x1C; + + p[3] = 6; + p[7] = 0x32; + p[4] = ent[6]; + p[5] = ent[7]; + p[6] = ent[8]; + p[0xC] = ent[0xA]; + p[0xD] = ent[0xB]; + p[0xE] = ent[0xC]; + p[0x14] = ent[0xA]; + p[0x15] = ent[0xB]; + p[0x16] = ent[0xC]; + + ang = D_801D0A82; + bx = (u16)D_801D0A7C; + by = (u16)D_801D0A7E; + RotMatrixZ(ang, mp); + + *(s32 *)((u8 *)v + 8) = D_801D0A80; + v[1] = *(s32 *)((u8 *)v + 8); + v[0] = v[1]; + func_8004901C(mp, v); + + t = *(u16 *)ent; + sv[2] = 0; + sv[1] = 0; + sv[0] = t; + *(s16 *)(p + 8) = bx; + *(s16 *)(p + 0xA) = by; + + RotMatrixZ(*(s16 *)(ent + 2) - (((s32)*(u16 *)(ent + 4) << 16) >> 17), mp); + ApplyMatrixSV(mp, sv, out); + *(s16 *)(p + 0x10) = bx + (u16)out[0]; + *(s16 *)(p + 0x12) = by + (u16)out[1]; + + RotMatrixZ(*(s16 *)(ent + 4), mp); + ApplyMatrixSV(mp, sv, out); + bx += (u16)out[0]; + *(s16 *)(p + 0x18) = bx; + by += (u16)out[1]; + *(s16 *)(p + 0x1A) = by; + + /* addPrim(otp, p) == setaddr(p, getaddr(otp)), setaddr(otp, p) */ + bidx = (volatile u16 *)&D_800B9A02; + pv = *(u32 *)p; + *(u32 *)p = (pv & 0xFF000000) | + (*(u32 *)(*(s32 *)((u8 *)&D_800A651C + + (*bidx * 20)) + 0x40) & 0xFFFFFF); + ot = *(s32 *)((u8 *)&D_800A651C + (*bidx * 20)); + *(u32 *)(ot + 0x40) = (*(u32 *)(ot + 0x40) & 0xFF000000) | ((u32)p & 0xFFFFFF); + func_80016638(&D_800A6518[*bidx * 20], 0x10, 1); + __asm__ __volatile__("" : "=r"(pv)); /* zero-byte 2nd SET: kills the sched1 birthing boost */ +} + + +void func_80181E6C(void) { + + extern s16 D_801D097C; + s16 *p = &D_801D097C; + s32 i = 0xF; + do { + *p = 0; + p = (s16 *)((s32)p + 0x10); + i--; + } while (i >= 0); +} + + + + +extern void func_80015978(s32 a0, s32 *a1); +extern void func_80181EB8(s32 a0); + +void func_80181E90(s32 a0) { + s32 pv[2]; + func_80015978(a0, pv); + func_80181EB8((s32)pv); +} + + + +/* func_80181EB8 — §71 sibling of func_8018A774 / func_8018AF0C (same TU): the + * RotTransPers wrapper family. Here the SVECTOR comes in as the parameter + * instead of being produced by func_80015978, so pv[0..1] is free and carries + * the 4-byte word copied out of D_801CE7A8 instead. + * + * Frame proof (0x38 = 0x10 outgoing + 0x18 var + 0x10 saved s0/s1/ra): + * sp+0x10 u16 sxy[4] (8 bytes) -> RotTransPers a1, func_80181F40 arg0 + * sp+0x18 s32 pv[4] (16 bytes) -> pv[0] = copy dest, &pv[2]/&pv[3] = 0x20/0x24 + * + * The lwl 0x3 / lwr 0x0 / swl 0x1B / swr 0x18 block move: a 4-byte struct assign + * whose type has ALIGNMENT 1 (cookbook §48-C2). Align 1 (not 2) is load-bearing — + * it is what pushes the copy off the move_by_pieces path (which keeps the SYMBOL + * in the address and emits a fresh `lui $at,%hi` per reference) onto mips.c + * expand_block_move, which copy_addr_to_reg's the source address into ONE held + * register first -> `lui $a1,%hi; addiu $a1,$a1,%lo; lwl 3($a1); lwr 0($a1)`. + * A {u16,u16} (align 2) struct compiles to the same opcode sequence but with the + * folded-symbol addressing: 4 mismatches. Struct assign, NOT memcpy (memcpy + * byte-matches in isolation but lowers to `jal memcpy` in any TU that declares + * it — §2959). + * + * All four callee prototypes are copied VERBATIM from this TU (func_8004914C / + * func_800491AC / RotTransPers at file scope L3484-3486; func_80181F40 from its + * own definition at L3612). D_800AF648 is block-scoped `extern u8` exactly as + * the two matched siblings do it. D_801CE7A8 appears nowhere else in the TU. + */ + +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); +extern void func_80181F40(void *arg0, void *arg1, s32 arg2, s32 arg3); + +void func_80181EB8(s32 a0) { + extern u8 D_800AF648; + extern V4_80181EB8 D_801CE7A8; + u16 sxy[4]; + s32 pv[4]; + + *(V4_80181EB8 *)pv = D_801CE7A8; + func_8004914C(&D_800AF648); + func_800491AC(&D_800AF648); + RotTransPers(a0, (s32)sxy, &pv[2], &pv[3]); + func_80181F40(sxy, pv, 0x10, 0x18); +} + + + +extern void func_80181FAC(void *a0, void *a1, s16 a2); +extern void func_801820E0(s32 a0, s16 a1, u16 a2); + +void func_80181F40(void *arg0, void *arg1, s32 arg2, s32 arg3) { + /* The target frame is 0x30: 0x10 outgoing-arg area + 0x10 var_size + + * 0x10 saved regs (s0/s1/s2/ra at 0x20..0x2C). gcc-2.7.2 allocates a + * declared aggregate even when it is never referenced, so this 16-byte + * local reproduces the original's var_size exactly. */ + s32 unused[4]; + s32 i; + s32 j; + + func_80181FAC(arg0, arg1, arg2); + for (i = 0, j = 0; i < 0x10; i++, j += 0x100) { + func_801820E0(i, j, arg3); + } +} + + + + + +void func_80181FAC(void *a0, void *a1, s16 a2) { + + extern s16 D_801D0970; + extern s16 D_801D0972; + extern u8 D_801D0978; + extern u8 D_801D0979; + extern u8 D_801D097A; + extern u32 D_801D0974; + if (a0 != NULL) { + D_801D0970 = *(u16 *)a0; + D_801D0972 = *(u16 *)((s32)a0 + 2); + } else { + D_801D0970 = 0; + D_801D0972 = 0; + } + + D_801D0978 = *(u8 *)a1; + D_801D0979 = *(u8 *)((s32)a1 + 1); + D_801D097A = *(u8 *)((s32)a1 + 2); + D_801D0974 = (u32)a2 << 16; +} + + + + +extern void func_80015978(s32 a0, s32 *a1); +extern void func_8004914C(void *a0); +extern void func_800491AC(void *a0); +extern s32 RotTransPers(s32 a0, s32 a1, s32 *a2, s32 *a3); + +void func_8018201C(s32 a0) { + + extern s16 D_801D0970; + extern s16 D_801D0972; + /* [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_800AF648; + u16 sxy[2]; + s32 pv[4]; + + func_80015978(a0, pv); + func_8004914C(&D_800AF648); + func_800491AC(&D_800AF648); + RotTransPers((s32)pv, (s32)sxy, &pv[2], &pv[3]); + + D_801D0970 = sxy[0]; + D_801D0972 = sxy[1]; +} + + + + +extern s32 func_801821FC(void); +extern void func_801820E0(s32 a0, s16 a1, u16 a2); + +void func_80182094(s32 a0, s32 a1) { + s32 result = func_801821FC(); + if (result >= 0) { + s16 ext_a0 = (s16)a0; + func_801820E0(result, ext_a0, (u16)a1); + } +} + + + +/* func_801820E0 — particle/ripple spawner for slot `a0` of the 16-entry, + * 0x10-byte-stride table at D_801D097C. + * + * Declaration notes (the TU already carries all of these — nothing is invented): + * - rand / func_80047948 / func_8004787C : verbatim re-declarations of the + * TU's own file-scope prototypes (L951, L2197, L2198) -> merge silently. + * - D_801D097C : block-scope `extern s16` exactly as func_8018AD5C (L3869) + * and func_8018B0EC (L3982) declare it. + * - D_801D0976 : its own dlabel in asm/ov_SC03_014/data/tail19.data.s:5868; + * undeclared anywhere in the TU, so a block-scope extern is conflict-free. + * It is declared as an ARRAY on purpose: the ARRAY_REF sets MEM_IN_STRUCT_P, + * which restores the true_dependence() edge against the in-struct `p->f2` + * store and stops sched2 from hoisting the load above it (cookbook §135/2). + * - The TU's own prototype for this function is + * extern void func_801820E0(s32 a0, s16 a1, u16 a2); (L3929) + * but the body byte-proves the params are plain s32 (no `sll/sra` on $a1 and + * a single `andi` at the use, not the promoted-var `move`+`andi` pair). So the + * definition uses the §37/§124 ASM-LABEL ALIAS — exactly what this same TU + * already does for `aF8018A860` — leaving the TU's declaration untouched. + */ + +extern s32 rand(void); +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); + +void aF8018AFD0(s32 a0, s32 a1, s32 a2) __asm__("func_801820E0"); + +void aF8018AFD0(s32 a0, s32 a1, s32 a2) +{ + + extern s16 D_801D097C; + extern s16 D_801D0976[]; + + s32 unused[4]; /* dead locals — reproduces var_size 0x10 (frame 0x38) */ + P_801820E0 *p; + u16 rad; + s32 m; + s32 ang; + s32 t8; + s16 tC; + + p = (P_801820E0 *)((s32)&D_801D097C + (a0 << 4)); + + rad = a2; + rad = a2 + (rand() % (rad >> 2) - (rad >> 3)); + + ang = a1 + (rand() & 0x3f) - 0x20; + p->f6 = ang; + + m = rad; + t8 = (func_80047948(p->f6) * m) >> 12; + tC = (func_8004787C(p->f6) * m) >> 12; + p->f8 = t8 << 16; + p->fC = tC << 16; + + p->f0 = (rand() & 0xf) + 0x10; + p->f2 = m << 6; + p->f4 = (s32)D_801D0976[0] * 64; +} + + + + +s32 func_801821FC(void) { + + extern s16 D_801D097C; + s32 i = 0; + s32 offset = 0; + + while (i < 0x10) { + u16 val = *(u16*)((u8*)&D_801D097C + offset); + if (val == 0) { + return i; + } + i++; + offset += 0x10; + } + return -1; +} + + + + +/* func_80182238 — the 16-slot particle/effect stepper over D_801D097C[16] + * (0x10-byte records; slot 0 = the `active` u16 that func_8018AD5C clears and + * func_8018B0EC scans). Layout used here, all as byte-offsets off ONE walked + * base pointer: + * +0x0 u16 active +0x2 s16 angle +0x4 u16 dangle + * +0x6 s16 dir +0x8 s32 x +0xC s32 z + * + * IV shape (cookbook §3-Giv / gcc-map L1): the target has ONE biv (the walked + * base, kept alive by the bare +0x0 accesses, which find_mem_givs excludes from + * giv formation) plus ONE combined DEST_ADDR giv anchored at base+2 + * (`addiu $s1, $s2, 0x2`). combine_givs takes g1 from the list HEAD and + * record_giv PREPENDS, so *the last-emitted offset reference anchors*: the + * `+= dangle` statement (which ends on a +0x2 store) must therefore come LAST + * in the body. Written before the two s32 updates it anchors at base+0xC + * instead -> 14 mismatched immediates. + * + * Both rsin/rcos products are computed BEFORE any store because gcc-2.7.2's + * sched.c makes every mem ref depend on last_function_call — a store emitted + * between the two `jal`s could not have floated below the second one. + * + * `i++` precedes the pointer bump in the for-increment: that emission order is + * what puts `addiu $s4,$s4,1` ahead of the giv's `addiu $s1,$s1,0x10` (the + * biv's own bump then fills the branch delay slot). + * + * func_80047948 / func_8004787C keep this TU's file-scope prototypes verbatim + * (L2197-2198, `s32` param) — the s16 field is sign-extended at the call site + * by the `lh`, so the narrower m2c-style `s16` prototype is not needed (§17a-1). + * D_801D097C uses the TU's existing block-scope `extern s16` spelling + * (func_8018AD5C L3869, func_8018B0EC L3982). + */ + +extern s32 func_80047948(s32 a0); +extern s32 func_8004787C(s32 a0); + +void func_80182238(void) { + + extern s16 D_801D0976; + extern s16 D_801D097C; + extern void func_8018234C(s32); + + s16 *p; + s32 i; + s16 ang; + s32 vx; + s32 vz; + + ang = D_801D0976; + p = &D_801D097C; + + for (i = 0; i < 0x10; i++, p = (s16 *)((s32)p + 0x10)) { + if (*(u16 *)p != 0) { + if ((ang > 0 && *(s16 *)((s32)p + 2) > 0x4000) || + (ang < 0 && *(s16 *)((s32)p + 2) <= 0)) { + *p = 0; + } else { + func_8018234C(i); + vx = func_80047948(*(s16 *)((s32)p + 6)) * ang * 0x10; + vz = func_8004787C(*(s16 *)((s32)p + 6)) * ang * 0x10; + *(s32 *)((s32)p + 8) += vx; + *(s32 *)((s32)p + 12) += vz; + *(u16 *)((s32)p + 2) += *(u16 *)((s32)p + 4); + } + } + } +} + + + +/* func_8018234C — spawns one 0x14-byte GPU packet from D_800A5E60, rotates / + * scales a matrix copy of D_800AE620 by the D_801D097C[a0] record, projects the + * four corner offsets into the packet, then links the packet into the OT. + * + * Byte-verified levers (all three were needed; each is worth 8-31 insns): + * + * A. THE OT LINK IS THE libgpu P_TAG BITFIELD, NOT HAND-MASKING. Writing + * `*(u32*)q = (*(u32*)q & 0xFF000000) | (ot & 0xFFFFFF)` is byte-correct + * arithmetic but gives the WRONG register assignment (16 mismatches: the + * 0xFFFFFF / 0xFF000000 / &D_800B9A02 pseudos land in a0/a2/a3 permuted, + * and the `lw $v1,0($s3)` gets serialised behind the index load). The + * `unsigned addr:24; unsigned len:8` bitfield insert reproduces both the + * allocation and the schedule exactly. This is just `addPrim(ot, q)`. + * + * B. THE OT TABLE MUST BE AN ARRAY_REF (`D_800A651C[i].a`), NOT + * `*(s32*)((u8*)&D_800A651C + i*20)`. With the pointer-arith spelling gcc + * allocates a phantom 8-byte stack temp that is never referenced, pushing + * the frame from 0x68 to 0x70 (cookbook D6 in reverse: the frame is too + * BIG). The temp only appears when the SAME lookup expression occurs in + * two statements; the ARRAY_REF form (engine_core.h `OtBlk`) kills it. + * + * C. THE LAST ApplyMatrixSV RECOMPUTES THE MATRIX ADDRESS. The first four + * matrix arguments come out of $s4 (`addu $aX,$s4,$zero`), but the fifth is + * `addiu $a0,$sp,0x10`. cse.c cannot be talked out of folding a fifth + * `&m` into the existing pseudo: the conditional above it is a + * "branch around a block", so cse_end_of_basic_block EXTENDS the basic + * block through the join label (status AROUND) and the equivalence class + * for (plus fp 16) is still live. Every source-level attempt to break it + * (pointer local, `mp = m` in the skipped arm, a §21 zero-byte re-tie, + * do{}while(0) loop notes) either changed nothing or cost 3 insns by + * turning the pointer into a two-def global allocno. Pinning a reader to + * $sp makes the expression `(plus (reg 29) 16)` — a different rtx from + * `(plus (reg fp) 16)`, so cse never looks it up, and the single-use pseudo + * is folded by combine into the one `addiu` the target has. + * + * The svp/outp block around the FIRST ApplyMatrixSV is load-bearing too: + * removing it costs 6 insns and two extra callee-saved registers. + */ + +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern void RotMatrixZ(s32 a0, void *a1); +extern void func_8004901C(void *a0, void *a1); +extern void func_80016638(void *a0, s32 a1, s32 a2); + + +/* 0x10-byte-stride record table at D_801D097C (same table as func_8018AD5C) */ + + /* the 0x20-byte matrix */ + /* == engine_types.h OtBlk */ + /* the D_800B9A02 buffer index */ + /* libgpu P_TAG */ + +void func_8018234C(s32 a0) { + + extern s16 D_801D0970; + extern s16 D_801D0972; + extern u8 D_801D0978; + extern u8 D_801D0979; + extern u8 D_801D097A; + + extern s16 D_801D097C; + extern u8 *D_800A5E60; + extern s32 D_800AE620; + extern u8 D_800A6518[]; + extern Ot_8018B23C_8018234C D_800A651C[]; + + s32 m[8]; /* sp+0x10 */ + u8 sv[8]; /* sp+0x30 */ + u16 out[4]; /* sp+0x38 */ + s32 scale[4]; /* sp+0x40 */ + + u8 *q; + Rec_8018B23C_8018234C *p; + s32 x; + s32 y; + s32 ang; + + q = D_800A5E60; + + *(Mat32_8018B23C_8018234C *)m = *(Mat32_8018B23C_8018234C *)&D_800AE620; + + D_800A5E60 = q + 0x14; + *(u8 *)(q + 3) = 4; + *(u8 *)(q + 7) = 0x22; + *(u8 *)(q + 4) = D_801D0978; + *(u8 *)(q + 5) = D_801D0979; + *(u8 *)(q + 6) = D_801D097A; + + p = (Rec_8018B23C_8018234C *)((s32)&D_801D097C + (a0 << 4)); + x = p->fA + (u16)D_801D0970; + y = p->fE + (u16)D_801D0972; + RotMatrixZ(p->f6, m); + + scale[0] = *(s16 *)((s32)p + 2); + scale[1] = *(s16 *)((s32)p + 2); + scale[2] = *(s16 *)((s32)p + 2); + func_8004901C(m, scale); + + *(s16 *)(sv + 4) = 0; + *(s16 *)(sv + 2) = 0; + *(s16 *)(sv + 0) = p->f0; + { + void *svp = sv; + void *outp = out; + ApplyMatrixSV(m, svp, outp); + __asm__ __volatile__("" : "=r"(svp)); + __asm__ __volatile__("" : "=r"(outp)); + } + + *(s16 *)(q + 0x8) = x + ((s16)out[0] >> 1) * 3; + *(s16 *)(q + 0xA) = y + ((s16)out[1] >> 1) * 3; + *(s16 *)(q + 0xC) = x - ((s16)out[0] >> 1); + *(s16 *)(q + 0xE) = y - ((s16)out[1] >> 1); + x = x + out[0]; + *(s16 *)(q + 0x10) = x; + y = y + out[1]; + *(s16 *)(q + 0x12) = y; + + ang = -0x400; + if (p->f0 & 1) { + ang = 0x400; + } + RotMatrixZ(ang, m); + + *(s16 *)(sv + 0) = 2; + { + /* lever C: sp+0x10 IS &m, but spelled so cse cannot fold it to $s4 */ + register u8 *spr __asm__("$29"); + ApplyMatrixSV(spr + 0x10, sv, out); + } + + *(s16 *)(q + 0x10) = *(u16 *)(q + 0x10) + out[0]; + *(s16 *)(q + 0x12) = *(u16 *)(q + 0x12) + out[1]; + + { + Bidx_8018B23C_8018234C *bp = (Bidx_8018B23C_8018234C *)&D_800B9A02; + + /* addPrim(&D_800A651C[bp->f].a[0x10], q) */ + ((PTag_8018B23C_8018234C *)q)->addr = + ((PTag_8018B23C_8018234C *)(D_800A651C[bp->f].a + 0x40))->addr; + ((PTag_8018B23C_8018234C *)(D_800A651C[bp->f].a + 0x40))->addr = (u32)q; + func_80016638(&D_800A6518[bp->f * 20], 0x10, 1); + } +} + + + + + + diff --git a/tools/jr_isolate_all.py b/tools/jr_isolate_all.py index f07c54c95..9f4b38714 100644 --- a/tools/jr_isolate_all.py +++ b/tools/jr_isolate_all.py @@ -530,6 +530,20 @@ def _engine_types(): return _ENGINE_TYPES + +# `} __attribute__((packed, aligned(1))) Blk4_9B4;` — the ATTRIBUTE SITS BETWEEN THE BRACE AND THE +# NAME (P31 S71, §323 blocker 2). Every type-name scan here matched `\}\s*(\w+)\s*;`, which reads +# `__attribute__` as the name, fails on the following `((`, and yields NOTHING — so a packed +# file-local typedef never entered `carried`, every decl naming it read as "unknown type", and +# jr_isolate_all REFUSED the whole overlay. That is the entire §323 carve blocker 2, on +# ov_SC07_000 (`Blk4_9B4`, `Blk4`) and ov_SC03_029 (`Block8_80181600`). Strip attributes first. +_ATTR = re.compile(r'__attribute__\s*\(\((?:[^()]|\([^()]*\))*\)\)') + + +def _strip_attrs(block): + return _ATTR.sub(' ', block) + + def _file_scope_decls(items): """[(line, [syms])] for every decl that stood at FILE SCOPE in the original TU, in item order. TWO sources — the second is the §8b scoping-wall fix: @@ -559,6 +573,7 @@ def _file_scope_decls(items): carried = set() for _, _, _kind, text in items: for block in oss.file_scope_types(text): + block = _strip_attrs(block) for a, b in re.findall(r'\}\s*([A-Za-z_]\w*)\s*;|\b(?:struct|union|enum)\s+([A-Za-z_]\w*)', block): carried.add(a or b) carried |= set(re.findall(r'typedef\s+[^;{}]*?\(\s*\*\s*([A-Za-z_]\w*)\s*\)\s*\([^;]*\)\s*;', block)) @@ -580,6 +595,7 @@ def _file_scope_decls(items): seen_types, type_conflicts = {}, [] def _type_names(block): + block = _strip_attrs(block) names = {a or b for a, b in re.findall(r'\}\s*([A-Za-z_]\w*)\s*;|\b(?:struct|union|enum)\s+([A-Za-z_]\w*)', block)} names |= set(re.findall(r'typedef\s+[^;{}]*?\(\s*\*\s*([A-Za-z_]\w*)\s*\)\s*\([^;]*\)\s*;', block))