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))