From 432396ca643d0f37b33129c57d91ceea16b3dd4b Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Sun, 19 Jul 2026 13:33:26 -0600 Subject: [PATCH] feat(phase-29 crack-wave3): func_8015C32C jtbl bank ov_SC06_018 (transient crash recovery) --- config/overlays.mk | 2 +- config/splat.ov_SC06_018.yaml | 13 +- src/ov_SC06_018/ov_SC06_018_jr_8015AE2C.c | 4587 ---------------- src/ov_SC06_018/ov_SC06_018_jr_8015C32C.c | 5926 +++++++++++++++++++++ 4 files changed, 5935 insertions(+), 4593 deletions(-) create mode 100644 src/ov_SC06_018/ov_SC06_018_jr_8015C32C.c diff --git a/config/overlays.mk b/config/overlays.mk index ad80bac4c..0ff6e88b7 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -3021,7 +3021,7 @@ ov_SC06_018_ELF := $(ov_SC06_018_OUT).elf ov_SC06_018_MAPFILE := $(ov_SC06_018_OUT).map ov_SC06_018_LD_SCRIPT := $(ov_SC06_018_OUT).ld ov_SC06_018_SPLAT_YAML := config/splat.ov_SC06_018.yaml -ov_SC06_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_018_jr_8012ACE0.o,tail2.data.o,ov_SC06_018_jr_801380E0.o,tail3.data.o,ov_SC06_018_jr_8013F350.o,tail4.data.o,ov_SC06_018_jr_8013FFD8.o,tail5.data.o,ov_SC06_018_jr_8015444C.o,tail6.data.o,ov_SC06_018_jr_80159C84.o,tail7.data.o,ov_SC06_018_jr_8015A3C8.o,tail8.data.o,ov_SC06_018_jr_8015AE2C.o,tail9.data.o,ov_SC06_018_jr_8016AB6C.o,tail10.data.o,ov_SC06_018_jr_801734BC.o,tail11.data.o,ov_SC06_018_jr_80178D40.o,tail12.data.o,ov_SC06_018_jr_8017A4AC.o,tail13.data.o,ov_SC06_018_jr_8017C24C.o,tail14.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve +ov_SC06_018_JTBL_INTERLEAVE := --order tail.data.o,ov_SC06_018_jr_8012ACE0.o,tail2.data.o,ov_SC06_018_jr_801380E0.o,tail3.data.o,ov_SC06_018_jr_8013F350.o,tail4.data.o,ov_SC06_018_jr_8013FFD8.o,tail5.data.o,ov_SC06_018_jr_8015444C.o,tail6.data.o,ov_SC06_018_jr_80159C84.o,tail7.data.o,ov_SC06_018_jr_8015A3C8.o,tail8.data.o,ov_SC06_018_jr_8015AE2C.o,tail9.data.o,ov_SC06_018_jr_8015C32C.o,tail10.data.o,ov_SC06_018_jr_8016AB6C.o,tail11.data.o,ov_SC06_018_jr_801734BC.o,tail12.data.o,ov_SC06_018_jr_80178D40.o,tail13.data.o,ov_SC06_018_jr_8017A4AC.o,tail14.data.o,ov_SC06_018_jr_8017C24C.o,tail15.data.o,trailing.o # Phase-26 §8 jtbl-rodata carve build/src/ov_SC06_018/ov_SC06_018_jr_8012ACE0.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) build/src/ov_SC06_018/ov_SC06_018_jr_8013F350.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC06_018/ov_SC06_018_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 diff --git a/config/splat.ov_SC06_018.yaml b/config/splat.ov_SC06_018.yaml index 872e5b102..686653397 100644 --- a/config/splat.ov_SC06_018.yaml +++ b/config/splat.ov_SC06_018.yaml @@ -104,6 +104,7 @@ segments: - [0x31b2c, c, ov_SC06_018_jr_80159C84] - [0x32270, c, ov_SC06_018_jr_8015A3C8] - [0x32cd4, c, ov_SC06_018_jr_8015AE2C] + - [0x341d4, c, ov_SC06_018_jr_8015C32C] - [0x42a14, c, ov_SC06_018_jr_8016AB6C] - [0x4b364, c, ov_SC06_018_jr_801734BC] - [0x50be8, c, ov_SC06_018_jr_80178D40] @@ -126,16 +127,18 @@ segments: - [0xab2e8, data, tail8] - [0xab2ec, .rodata, ov_SC06_018_jr_8015AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xab308, data, tail9] + - [0xab32c, .rodata, ov_SC06_018_jr_8015C32C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) + - [0xab348, data, tail10] - [0xab360, .rodata, ov_SC06_018_jr_8016AB6C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab380, data, tail10] + - [0xab380, data, tail11] - [0xab400, .rodata, ov_SC06_018_jr_801734BC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab414, data, tail11] + - [0xab414, data, tail12] - [0xab5bc, .rodata, ov_SC06_018_jr_80178D40] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab734, data, tail12] + - [0xab734, data, tail13] - [0xab7c4, .rodata, ov_SC06_018_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab850, data, tail13] + - [0xab850, data, tail14] - [0xab868, .rodata, ov_SC06_018_jr_8017C24C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xab888, data, tail14] + - [0xab888, data, tail15] - [0xADA44, bin, trailing] # final 3 bytes (EOF not 4-aligned; spimdisasm drops a partial word) - [0xADA47] # EOF marker = the 0.4.dec byte length # @TRAILING@ (above) is replaced by tools/new_overlay.sh: for a non-4-aligned overlay it becomes diff --git a/src/ov_SC06_018/ov_SC06_018_jr_8015AE2C.c b/src/ov_SC06_018/ov_SC06_018_jr_8015AE2C.c index 625c246db..c5ff18b67 100644 --- a/src/ov_SC06_018/ov_SC06_018_jr_8015AE2C.c +++ b/src/ov_SC06_018/ov_SC06_018_jr_8015AE2C.c @@ -1621,4590 +1621,3 @@ s32 func_8015C128(s32 param_1) { ((void(*)(int))func_8015BE94)(((int)param_1)); } } - - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8015C32C); - -DEFINE_func_8015C6A4() /* dedup: shared engine-core @0x8015C6A4 (src/shared) */ - -DEFINE_func_8015C6AC() /* dedup: shared engine-core @0x8015C6AC (src/shared) */ - -DEFINE_func_8015C6E0() /* dedup: shared engine-core @0x8015C6E0 (src/shared) */ - - -extern void (*D_80195DFC[])(void); - -void func_8015C714(void *a0) { - D_80195DFC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015C750() /* dedup: shared engine-core @0x8015C750 (src/shared) */ - -DEFINE_func_8015C788() /* dedup: shared engine-core @0x8015C788 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (match_one 88/88); fn-ptr-array dispatch, top-level if/else needed branch-polarity invert (small block falls through, big block at L854) - -extern s32 func_80161B18(void *a0); -extern s32 func_80161B84(void *a0); -extern s32 func_801496D4(void *a0); -extern u16 func_801487F4(s32 *a0); -extern s32 func_801488A8(u8 *a0); -extern void func_80161240(void *a0); -extern s32 func_80146E98(s32 a0); -extern void func_80149704(void); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_80148AAC(u8 *a0); -extern void func_80146DB8(s32 *a0, s32 *a1); -extern void func_80146E90(s32 *a0, s32 a1); -extern void func_80146CA0(void *a0); -extern void func_80161C24(s32, s32); -extern void func_8014C010(s32 a0, s32 a1); - - -void func_8015C7E4(u16 *param_1) -{ - - extern void (*D_80195C70[])(void*); - extern int D_80195C14; - s32 iVar1; - u32 uVar2; - - iVar1 = ((s32 (*)(u16 *))func_80161B18)(param_1); - if ((iVar1 == 0) && (iVar1 = ((s32 (*)(u16 *))func_80161B84)(param_1), iVar1 == 0)) { - iVar1 = ((s32 (*)(u16 *))func_801496D4)(param_1); - if (iVar1 != 0) { - ((void (**)(u16*))D_80195C70)[*param_1](param_1); - ((void (*)(u16 *))func_80149704)(param_1); - } else { - uVar2 = ((s32 (*)(u16 *))func_801487F4)(param_1); - if (((uVar2 & 0x80) == 0) && (iVar1 = ((s32 (*)(u16 *))func_801488A8)(param_1), iVar1 == 0)) { - ((void (**)(u16*))D_80195C70)[*param_1](param_1); - ((void (*)(u16 *, s32))func_80147078)(param_1, 0); - ((void (*)(u16 *))func_80159B70)(param_1); - } else { - iVar1 = ((s32 (*)(u16 *))func_80161240)(param_1); - if (iVar1 == 0) { - iVar1 = ((s32 (*)(u16 *))func_80146E98)(param_1); - if (iVar1 != 0) { - ((void (*)(u16 *))func_80148AAC)(param_1); - ((void (*)(u16 *, void *))func_80146DB8)(param_1, &D_80195C14); - ((void (*)(u16 *, s32))func_80146E90)(param_1, 0x14); - ((void (*)(u16 *))func_80146CA0)(param_1); - } - if ((param_1[0x5c] & 0x2000) != 0) { - ((void (*)(u16 *, s32))func_80161C24)(param_1, param_1[0xb7]); - ((void (*)(u16 *, s32))func_8014C010)(param_1, 2); - } - } - } - } - } - return; -} - - - - -// @class: struct -// @stuck: none — dispatch + control flow on a single callee-saved param; expect MATCH - -extern s32 func_80149FB0(s32 a0); -extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_801473EC(s32 *a0); -extern void func_8014D738(void); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_80161240(void *a0); -extern s32 func_80146E98(s32 a0); -extern void func_80146CA0(void *a0); -extern void func_80161C24(s32, s32); - - -void func_8015C944(int param_1) { - - extern void (*D_80195C70[])(); - func_80149FB0(param_1); - func_80147AD4(param_1, 0, 0, 0); - ((void (*)(int))func_801473EC)(param_1); - ((void (*)(int))func_8014D738)(param_1); - if (*(int *)(param_1 + 0x170) == 0) { - (*D_80195C70[*(unsigned short *)param_1])(param_1); - ((void (*)(int, int))func_80147078)(param_1, 0); - ((void (*)(int))func_80159B70)(param_1); - } else { - if (((int (*)(int))func_80161240)(param_1) == 0) { - if (func_80146E98(param_1) != 0) { - ((void (*)(int))func_80146CA0)(param_1); - } - if ((*(unsigned short *)(param_1 + 0xb8) & 0x2000) != 0) { - func_80161C24(param_1, *(unsigned short *)(param_1 + 0x16e)); - } - } - } -} - - - -// @class: schedule -// @stuck: none — MATCH (goto forces the func_80161240 block to the function tail; bnez-to-end layout vs early-return fall-through) - - -extern s32 func_80149FB0(s32 a0); -extern s32 func_80161B18(void *a0); -extern s32 func_80161B84(void *a0); -extern s32 func_801496D4(void *a0); -extern u16 func_801487F4(s32 *a0); -extern s32 func_801488A8(u8 *a0); -extern void func_80148AAC(u8 *a0); -extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_801473EC(s32 *a0); -extern void func_8014D738(void); -extern void func_80146DB8(s32 *a0, s32 *a1); -extern void func_80146E90(s32 *a0, s32 a1); -extern void func_80146C98(s32 *a0, s16 a1); -extern void func_80161240(void *a0); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_80149704(void); - - -void func_8015CA28(u16 *param_1) { - - extern void (*D_80195C70[])(void*); - extern int D_80195C14; - ((void (*)(void))func_80149FB0)(); - if (((int (*)(u16 *))func_80161B18)(param_1) != 0) return; - if (((int (*)(u16 *))func_80161B84)(param_1) != 0) return; - if (((int (*)(u16 *))func_801496D4)(param_1) != 0) { - ((void (**)(u16*))D_80195C70)[*param_1](param_1); - ((void (*)(u16 *))func_80149704)(param_1); - return; - } - if ((((u32 (*)(u16 *))func_801487F4)(param_1) & 0x80) != 0 || ((int (*)(u16 *))func_801488A8)(param_1) != 0) { - if ((((int (*)(u16 *))func_80148AAC)(param_1) & 0xff) != 0) { - ((void (*)(u16 *, int, int, int))func_80147AD4)(param_1, 0, 0, 0); - ((void (*)(u16 *))func_801473EC)(param_1); - } - if (((int (*)(u16 *))func_8014D738)(param_1) != 0) { - ((void (*)(u16 *, void *))func_80146DB8)(param_1, &D_80195C14); - ((void (*)(u16 *, int))func_80146E90)(param_1, 0x14); - ((void (*)(u16 *, int))func_80146C98)(param_1, 2); - } - if (*(int *)(param_1 + 0xb8) != 0) - goto do161240; - } - ((void (**)(u16*))D_80195C70)[*param_1](param_1); - ((void (*)(u16 *, int))func_80147078)(param_1, 0); - ((void (*)(u16 *))func_80159B70)(param_1); - return; -do161240: - ((void (*)(u16 *))func_80161240)(param_1); -} - - -DEFINE_func_8015CB94() /* dedup: shared engine-core @0x8015CB94 (src/shared) */ - -DEFINE_func_8015CBCC() /* dedup: shared engine-core @0x8015CBCC (src/shared) */ - -DEFINE_func_8015CBD4() /* dedup: shared engine-core @0x8015CBD4 (src/shared) */ - -DEFINE_func_8015CBDC() /* dedup: shared engine-core @0x8015CBDC (src/shared) */ - -DEFINE_func_8015CBE4() /* dedup: shared engine-core @0x8015CBE4 (src/shared) */ - -DEFINE_func_8015CBEC() /* dedup: shared engine-core @0x8015CBEC (src/shared) */ - -DEFINE_func_8015CBF4() /* dedup: shared engine-core @0x8015CBF4 (src/shared) */ - -DEFINE_func_8015CBFC() /* dedup: shared engine-core @0x8015CBFC (src/shared) */ - -DEFINE_func_8015CC04() /* dedup: shared engine-core @0x8015CC04 (src/shared) */ - -DEFINE_func_8015CC0C() /* dedup: shared engine-core @0x8015CC0C (src/shared) */ - -DEFINE_func_8015CC40() /* dedup: shared engine-core @0x8015CC40 (src/shared) */ - - - -void func_8015CC74(s32 *a0) { - - extern void (*D_80195E0C[])(void); - D_80195E0C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015CCB0() /* dedup: shared engine-core @0x8015CCB0 (src/shared) */ - -DEFINE_func_8015CCD0() /* dedup: shared engine-core @0x8015CCD0 (src/shared) */ - -#define NULL 0 - -struct Sub_8015CD20 { - u8 pad0[0x12]; - u16 unk12; /* +0x12 */ -}; - -struct Ent_8015CD20 { - u16 unk0; /* +0x00 */ - u8 pad2[0x1E]; - struct Sub_8015CD20 *unk20; /* +0x20 */ - u8 pad24[0x94]; - s16 unkB8; /* +0xB8 */ - u8 pad1BA[0x102]; - s8 unk1BC; /* +0x1BC */ - u8 pad1BD[0x77]; - s32 unk234; /* +0x234 */ -}; - - - -s32 func_8015CD20(s32 arg0) { - extern void (*D_80195C70[])(struct Ent_8015CD20 *); - extern u8 D_80195C24; - extern u8 D_80195E14; - extern u8 D_80195E24; - - s32 temp_v0; - s32 var_v0; - struct Sub_8015CD20 *sp; - - ((void(*)())func_80149FB0)(); - if (((s32(*)(struct Ent_8015CD20 *))func_801496D4)(((struct Ent_8015CD20 *)arg0)) != 0) { - D_80195C70[((struct Ent_8015CD20 *)arg0)->unk0](((struct Ent_8015CD20 *)arg0)); - ((struct Ent_8015CD20 *)arg0)->unk1BC = 0xA; - ((s32(*)(struct Ent_8015CD20 *))func_80149724)(((struct Ent_8015CD20 *)arg0)); - if (((s32(*)(struct Ent_8015CD20 *))func_80148AFC)(((struct Ent_8015CD20 *)arg0)) & 0xFF) { - ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195C24); - } else { - ((void(*)(struct Ent_8015CD20 *))func_80146D90)(((struct Ent_8015CD20 *)arg0)); - } - return; - } - temp_v0 = ((struct Ent_8015CD20 *)arg0)->unk234; - if (temp_v0 == 0) { - if (((s32(*)(struct Ent_8015CD20 *))func_80148980)(((struct Ent_8015CD20 *)arg0)) != 0) { - ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195E14); - ((void(*)(struct Ent_8015CD20 *))func_80147A84)(((struct Ent_8015CD20 *)arg0)); - ((void(*)(struct Ent_8015CD20 *))func_801473EC)(((struct Ent_8015CD20 *)arg0)); - ((void(*)(struct Ent_8015CD20 *, s32))func_80154150)(((struct Ent_8015CD20 *)arg0), 0x15); - sp = ((struct Ent_8015CD20 *)arg0)->unk20; - var_v0 = sp->unk12 - 0xAA; - goto block_13; - } - if (((s32(*)(struct Ent_8015CD20 *))func_8014891C)(((struct Ent_8015CD20 *)arg0)) != 0) { - ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195E24); - ((void(*)(struct Ent_8015CD20 *))func_80147A84)(((struct Ent_8015CD20 *)arg0)); - ((void(*)(struct Ent_8015CD20 *))func_801473EC)(((struct Ent_8015CD20 *)arg0)); - ((void(*)(struct Ent_8015CD20 *, s32))func_80154150)(((struct Ent_8015CD20 *)arg0), 0x14); - ((struct Ent_8015CD20 *)arg0)->unkB8 = 1; - } - if (((s32(*)(struct Ent_8015CD20 *))func_801489E8)(((struct Ent_8015CD20 *)arg0)) != 0) { - sp = ((struct Ent_8015CD20 *)arg0)->unk20; - var_v0 = sp->unk12 + 0x71; - goto block_13; - } - if (((s32(*)(struct Ent_8015CD20 *))func_80148A48)(((struct Ent_8015CD20 *)arg0)) != 0) { - sp = ((struct Ent_8015CD20 *)arg0)->unk20; - var_v0 = sp->unk12 - 0x71; -block_13: - sp->unk12 = var_v0 & 0xFFF; - } - } else { - ((struct Ent_8015CD20 *)arg0)->unk234 = temp_v0 - 1; - } - ((void(*)(struct Ent_8015CD20 *))func_8014FA04)(((struct Ent_8015CD20 *)arg0)); - if (((s32(*)(struct Ent_8015CD20 *))func_8014E434)(((struct Ent_8015CD20 *)arg0)) == 0) { - D_80195C70[((struct Ent_8015CD20 *)arg0)->unk0](((struct Ent_8015CD20 *)arg0)); - ((void(*)(struct Ent_8015CD20 *, s32))func_80147078)(((struct Ent_8015CD20 *)arg0), 0); - ((void(*)(struct Ent_8015CD20 *))func_80159B70)(((struct Ent_8015CD20 *)arg0)); - } else { - ((void(*)(struct Ent_8015CD20 *))func_801725E0)(((struct Ent_8015CD20 *)arg0)); - } -} - - - -DEFINE_func_8015CF24() /* dedup: shared engine-core @0x8015CF24 (src/shared) */ - -DEFINE_func_8015CF58() /* dedup: shared engine-core @0x8015CF58 (src/shared) */ - -DEFINE_func_8015CF8C() /* dedup: shared engine-core @0x8015CF8C (src/shared) */ - - - -void func_8015CFC0(s32 *a0) { - - extern void (*D_80195E44[])(void); - D_80195E44[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015CFFC() /* dedup: shared engine-core @0x8015CFFC (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (uVar1 pinned $s3, uVar5 pinned $s1; param_1->s2, iVar4->s0 fall out) - - -void func_8015D01C(int param_1) { - extern s32 func_801725F4(u8 *a0); - extern int D_800D550C; - extern int D_80195E34; - - int iVar4; - register unsigned short uVar1 __asm__("$19"); - register unsigned short uVar5 __asm__("$17"); - short sVar2; - short sVar3; - - ((void (*)(int, void *))func_80154274)(param_1, &D_800D550C); - *(short *)(*(int *)(param_1 + 0x20) + 0x10) = 0; - iVar4 = *(short *)(*(int *)(param_1 + 0x20) + 0x12); - uVar1 = *(unsigned short *)(*(int *)(*(int *)(param_1 + 0x180) + 0x20) + 0x12); - uVar5 = (uVar1 + 0x800) & 0xfff; - sVar2 = func_80012A60(iVar4, (short)uVar1); - sVar3 = func_80012A60(iVar4, uVar5); - if (sVar2 < sVar3) { - *(short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar1; - } else { - *(unsigned short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar5; - } - *(int *)(param_1 + 0x38) = (int)&D_80195E34 | 0x40000000; - ((void (*)(int))func_801725F4)(param_1); - ((void (*)(int))func_80146CA0)(param_1); -} - - - - - -// @class: struct -// @stuck: none — MATCH (pending gate) - -extern s32 func_80149FB0(s32 a0); -extern void func_8014FA04(s32 a0); -extern void func_8014E6A0(void); -extern void (*D_80195C70[])(void *); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_801725F4(u8 *a0); -extern void func_80146CA0(void *a0); - -void func_8015D104(void *arg0) { - ((void (*)(void))func_80149FB0)(); - ((void (*)(void *))func_8014FA04)(arg0); - if (((s32 (*)(void *))func_8014E6A0)(arg0) == 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 0); - func_80159B70(arg0); - } else { - ((void (*)(void *))func_801725F4)(arg0); - *(s32 *)((u8 *)arg0 + 0x234) = 0xFF1D0000; - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x10) = 0x600; - *(u16 *)((u8 *)arg0 + 0x244) = *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x10); - func_80146CA0(arg0); - } -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8015D1B8); - - -// @class: regalloc-order -// @stuck: pinning a0->$s1 and buffer-ptr->$s0; body copy already matches -extern void func_80013F3C(s32 a0); -extern void func_80012558(s32 a0, s32 a1); -extern void func_800126C4(s32 a0, s32 a1); -extern void ApplyMatrixSV(void *a0, void *a1, void *a2); -extern void *memcpy(void *dst, const void *src, u32 n); - -extern s32 D_80195EA0; - -void func_8015D380(s32 a0) { - s16 out[4]; - s32 buf[8]; - register s32 s1 __asm__("$17") = a0; - register s32 *s0 __asm__("$16") = buf; - ((void (*)(void *))func_80013F3C)((void *)s0); - ((void (*)(void *, s32))func_80012558)((void *)s0, *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12)); - ((void (*)(void *, s32))func_800126C4)((void *)s0, *(s16 *)(*(s32 *)(s1 + 0x20) + 0x10)); - ApplyMatrixSV((void *)s0, (void *)&D_80195EA0, (void *)out); - memcpy((void *)(s1 + 0x138), (void *)out, 8); -} - - - - -// @class: plumbing -// @stuck: none — MATCH - -extern unsigned char D_80194F84[]; - -extern void func_801553C0(s32 a0); -extern void func_80154A74(s32 a0, s32 a1); - -void func_8015D414(int param_1) -{ - *(unsigned char *)(param_1 + 0x1bd) = 8; - *(unsigned char **)(param_1 + 0x38) = D_80194F84; - *(short *)(param_1 + 0x138) = 0; - *(short *)(param_1 + 0x13a) = 0; - *(short *)(param_1 + 0x13c) = 0; - *(short *)(param_1 + 0x13e) = 0; - *(short *)(param_1 + 0xA) = *(short *)(param_1 + 0xA) + 0x48; - *(short *)(*(int *)(param_1 + 0x20) + 0x10) = 0; - ((void (*)(void))func_801553C0)(); - func_80154A74(param_1, 0x11); -} - - -DEFINE_func_8015D480() /* dedup: shared engine-core @0x8015D480 (src/shared) */ - -DEFINE_func_8015D4B4() /* dedup: shared engine-core @0x8015D4B4 (src/shared) */ - - - -s32 func_8015D4E8(s16 *a0) { - - extern void (*D_80195EA8[])(void); - D_80195EA8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015D524() /* dedup: shared engine-core @0x8015D524 (src/shared) */ - -DEFINE_func_8015D544() /* dedup: shared engine-core @0x8015D544 (src/shared) */ - -DEFINE_func_8015D57C() /* dedup: shared engine-core @0x8015D57C (src/shared) */ - - -// @class: loose-typing -// @stuck: none — MATCH (field 0xb8 compared as u16 == 0x8000, not s16 == -0x8000) - -extern s32 func_80161B18(void *a0); -extern s32 func_80161B84(void *a0); -extern void func_80154A74(int, int); -extern s32 func_80161208(); -extern void func_80154150(int, int); -extern void func_80146CA0(void *a0); -extern void func_80149374(int, int); - -extern unsigned char D_80195EB4[]; - -void func_8015D5E8(int param_1) -{ - int iVar1; - int iVar2; - - if (((int (*)(void))func_80161B18)() != 0) - return; - if (((int (*)(int))func_80161B84)(param_1) != 0) - return; - if ((*(unsigned short *)(param_1 + 0xb8) & 0x4000) != 0) - func_80154A74(param_1, 0x17); - if (((int (*)(int))func_80161208)(param_1) != 0) - return; - if (*(unsigned short *)(param_1 + 0xb8) == 0x8000) { - *(int *)(param_1 + 0x234) = *(int *)(param_1 + 0x234) + -3; - func_80154150(param_1, 0x1a); - ((void (*)(int))func_80146CA0)(param_1); - } else { - iVar1 = *(int *)(param_1 + 0x178); - if (iVar1 != 0) { - iVar2 = *(int *)(param_1 + 0x234); - *(int *)(param_1 + 0x234) = iVar2 + 1; - *(short *)(iVar1 + 6) = - (short)((signed char)D_80195EB4[iVar2] + - *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0xc)); - iVar2 = *(int *)(param_1 + 0x234); - *(int *)(param_1 + 0x234) = iVar2 + 1; - *(short *)(iVar1 + 10) = - (short)((signed char)D_80195EB4[iVar2] + - *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0xe)); - iVar2 = *(int *)(param_1 + 0x234); - *(int *)(param_1 + 0x234) = iVar2 + 1; - *(short *)(iVar1 + 0xe) = - (short)((signed char)D_80195EB4[iVar2] + - *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0x10)); - func_80149374(param_1, iVar1 + 4); - } - } -} - - - -extern int func_80148AFC(void*); -extern s32 func_80161B18(void *); -extern s32 func_80161B84(void *); -extern u16 func_80148800(s32*); -extern u8 func_8014BEF8(void); -extern s32 func_80165624(s32); -extern s32 func_801488A8(u8*); -extern void func_8014D738(void); -extern s32 func_80161208(); -extern void func_80154A74(s32, s32); -extern void func_8015DAC4(s32*); -extern void func_8015DE24(s32*); -extern void func_8015DA5C(s32); -extern void func_8015F948(s32*); -extern void func_800CAF14(void *); -extern void func_80154150(s32, s32); -extern void func_80146DB8(s32*, s32*); -extern void func_80147A84(s32); -extern void func_801473EC(s32*); -extern void func_80149374(s32, s32); -extern void func_80147078(s32*, s16); -extern void func_80159B70(void *); -extern void func_8015C714(void *); -extern void func_801483E8(void); - -extern void (*D_80195C70[])(void *); -extern u8 D_80078E78[]; -extern u8 D_80195EB4[]; - -void func_8015D738(void *arg0) { - - extern u8 D_80195C34[]; - extern u8 D_80195C44[]; - u8 *p = D_80078E78; - s32 s1; - ((void (*)(void))func_80148AFC)(); - if (func_80161B18(arg0) != 0) return; - if (func_80161B84(arg0) != 0) return; - s1 = *(s32 *)((char *)arg0 + 0x178); - if (s1 != 0) { - if (*(u16 *)s1 == 0x360) goto block_808; - } - __asm__ __volatile__(""); - if (s1 != 0) { - if (*(u16 *)s1 != 0) goto block_7F4; - } - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s32))func_80147078)(arg0, 0); - func_80159B70(arg0); - return; -block_7F4: - if (((s32 (*)(void *))func_80148800)(arg0) & 0x80) { - block_808: - ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); - ((void (*)(void *))func_8015DAC4)(arg0); - return; - } - if ((((s32 (*)(void *))func_80148800)(arg0) & 0x10) && ((s32 (*)(void *))func_8014BEF8)(arg0) != 0) { - ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); - ((void (*)(void *))func_8015DE24)(arg0); - return; - } - if ((((s32 (*)(void *))func_80148800)(arg0) & 0x20) && p[0x49] == 0xA) { - if (((s32 (*)(void *))func_80165624)(arg0) != 0) { - ((void (*)(void *))func_8015DA5C)(arg0); - ((void (*)(void *))func_8015F948)(arg0); - return; - } - ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); - func_800CAF14(arg0); - return; - } - if (((s32 (*)(void *))func_801488A8)(arg0) != 0 && *(u16 *)(*(s32 *)((char *)arg0 + 0x178)) != 0x82) { - ((void (*)(void *, s32))func_80154150)(arg0, 0x1B); - ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80195C34); - } else { - ((void (*)(void *, s32))func_80154150)(arg0, 0x1A); - ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80195C44); - } - ((void (*)(void *))func_80147A84)(arg0); - ((void (*)(void *))func_801473EC)(arg0); - s1 = *(s32 *)((char *)arg0 + 0x178); - *(s16 *)(s1 + 6) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234)] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xc)); - *(s16 *)(s1 + 0xa) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234) + 1] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xe)); - *(s16 *)(s1 + 0xe) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234) + 2] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0x10)); - ((void (*)(void *, void *))func_80149374)(arg0, (void *)(s1 + 4)); - *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12) = (*(u16 *)(*(s32 *)((char *)arg0 + 0x20) + 0x12) + 0x800) & 0xFFF; - if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s32))func_80147078)(arg0, 9); - func_8015C714(arg0); - return; - } - if (func_80161208(arg0) != 0) return; - ((void (*)(void *))func_801483E8)(arg0); -} - - -DEFINE_func_8015DA5C() /* dedup: shared engine-core @0x8015DA5C (src/shared) */ - -DEFINE_func_8015DA90() /* dedup: shared engine-core @0x8015DA90 (src/shared) */ - -DEFINE_func_8015DAC4() /* dedup: shared engine-core @0x8015DAC4 (src/shared) */ - - - -void func_8015DAF8(s32 *a0) { - - extern void (*D_80195EE8[])(void); - D_80195EE8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015DB34() /* dedup: shared engine-core @0x8015DB34 (src/shared) */ - -DEFINE_func_8015DB6C() /* dedup: shared engine-core @0x8015DB6C (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (mirrors byte-matched func_8015F89C/func_8015F9A4 in same overlay) - -extern void (*D_80195C70[])(void *); -extern int func_8015DD74(int); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_80161208(); -extern void func_8015DCB8(s32 a0); - -void func_8015DBD4(void *arg0) { - if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x4000) { - ((void (*)(void))func_8015DD74)(); - } - if (*(u16 *)((u8 *)arg0 + 0xB8) == 0x8000) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 0); - func_80159B70(arg0); - } else { - if (*(s32 *)((u8 *)arg0 + 0x178) != 0) { - ((void (*)(void *))func_8015DCB8)(arg0); - } - ((s32 (*)(void *))func_80161208)(arg0); - } -} - - -DEFINE_func_8015DC84() /* dedup: shared engine-core @0x8015DC84 (src/shared) */ - - -// @class: other -// @stuck: none — MATCH (proxy gate) - -extern s8 D_80195EF0[]; -extern void func_80149374(s32 a0, s32 a1); - -void func_8015DCB8(s32 param_1) { - s32 iVar1; - s32 iVar2; - - iVar2 = *(s32 *)(param_1 + 0x178); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 6) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xc); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 10) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xe); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 0xe) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0x10); - - func_80149374(param_1, iVar2 + 4); -} - - -DEFINE_func_8015DD74() /* dedup: shared engine-core @0x8015DD74 (src/shared) */ - -DEFINE_func_8015DDF0() /* dedup: shared engine-core @0x8015DDF0 (src/shared) */ - -DEFINE_func_8015DE24() /* dedup: shared engine-core @0x8015DE24 (src/shared) */ - - - -void func_8015DE58(s32 *a0) { - - extern void (*D_80195F08[])(void); - D_80195F08[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015DE94() /* dedup: shared engine-core @0x8015DE94 (src/shared) */ - -DEFINE_func_8015DECC() /* dedup: shared engine-core @0x8015DECC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (mirrors byte-matched func_8015F89C/func_8015F9A4 in same overlay) - -extern void (*D_80195C70[])(void *); -extern int func_8015E0D4(int); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_80161208(); -extern void func_8015E018(s32 a0); - -void func_8015DF34(void *arg0) { - if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x4000) { - ((void (*)(void))func_8015E0D4)(); - } - if (*(u16 *)((u8 *)arg0 + 0xB8) == 0x8000) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 0); - func_80159B70(arg0); - } else { - if (*(s32 *)((u8 *)arg0 + 0x178) != 0) { - ((void (*)(void *))func_8015E018)(arg0); - } - ((s32 (*)(void *))func_80161208)(arg0); - } -} - - -DEFINE_func_8015DFE4() /* dedup: shared engine-core @0x8015DFE4 (src/shared) */ - - -// @class: other -// @stuck: none — MATCH (proxy gate) - -extern s8 D_80195EF0[]; -extern void func_80149374(s32 a0, s32 a1); - -void func_8015E018(s32 param_1) { - s32 iVar1; - s32 iVar2; - - iVar2 = *(s32 *)(param_1 + 0x178); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 6) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xc); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 10) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xe); - - iVar1 = *(s32 *)(param_1 + 0x234); - *(s32 *)(param_1 + 0x234) = iVar1 + 1; - *(s16 *)(iVar2 + 0xe) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0x10); - - func_80149374(param_1, iVar2 + 4); -} - - -DEFINE_func_8015E0D4() /* dedup: shared engine-core @0x8015E0D4 (src/shared) */ - -DEFINE_func_8015E150() /* dedup: shared engine-core @0x8015E150 (src/shared) */ - -DEFINE_func_8015E184() /* dedup: shared engine-core @0x8015E184 (src/shared) */ - - - -s32 func_8015E1B8(s32 a0) { - - extern void (*D_80195F28[])(void); - D_80195F28[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015E1F4() /* dedup: shared engine-core @0x8015E1F4 (src/shared) */ - -DEFINE_func_8015E22C() /* dedup: shared engine-core @0x8015E22C (src/shared) */ - -DEFINE_func_8015E288() /* dedup: shared engine-core @0x8015E288 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (pending whole-binary gate); fn-ptr table folds %lo via extern array, 0x234 single word store - - -extern void func_8015E40C(s32 a0); -extern s32 func_80161B18(void *a0); -extern s32 func_80161B84(void *a0); -extern s32 func_80161208(); -extern void func_8015E5B0(u8*); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159BE4(s32 arg0); - -extern void (*D_80195C70[])(void*); - -void func_8015E344(u16 *param_1) -{ - ((s32 (*)(void))func_8015E40C)(); - if (((s32 (*)(u16 *))func_80161B18)(param_1) == 0 && - ((s32 (*)(u16 *))func_80161B84)(param_1) == 0 && - ((s32 (*)(u16 *))func_80161208)(param_1) == 0) { - if ((param_1[0x5c] & 0x4000) != 0) { - ((void (*)(u16 *))func_8015E5B0)(param_1); - *(s32 *)((char *)param_1 + 0x234) = 1; - } - if ((param_1[0x5c] & 0x8000) != 0) { - ((void (**)(u16*))D_80195C70)[param_1[0]](param_1); - ((s32 (*)(u16 *, s32))func_80147078)(param_1, 0); - ((s32 (*)(u16 *))func_80159BE4)(param_1); - } - } -} - - -DEFINE_func_8015E40C() /* dedup: shared engine-core @0x8015E40C (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (pending whole-binary gate); s16 v[3] array forces all 3 locals addressable (reload-from-stack), u16* psVar1 → lhu null/flag check - - -extern u16 D_80195F38; -extern u16 D_80195F3A; -extern u16 D_80195F3C; -extern s32 D_80195F40; - -extern void func_80149350(s32 arg0); -extern void func_80013E94(void *a0, void *a1); -extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); - -void func_8015E4B0(s32 param_1) -{ - u16 *psVar1; - s16 v[3]; - s32 local_10; - - psVar1 = *(u16 **)(param_1 + 0x18c); - if ((psVar1 != (u16 *)0) && (*psVar1 != 0)) { - v[0] = D_80195F38 + *(u16 *)(*(s32 *)(psVar1 + 0x3c) + 0xc); - v[1] = D_80195F3A + *(s16 *)(*(s32 *)(psVar1 + 0x3c) + 0xe) * 2; - v[2] = D_80195F3C + *(u16 *)(*(s32 *)(psVar1 + 0x3c) + 0x10); - ((s32 (*)(s32, s16 *, s16 *))func_80149350)(param_1, &v[0], &v[0]); - ((s32 (*)(s32 *, s32 *))func_80013E94)(&D_80195F40, &local_10); - ((s32 (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x1f, param_1, v[0], v[1], v[2], local_10, 0); - } - return; -} - - - - -extern void func_8013C9C4(void *a0); -extern s32 D_80195F48; - -void func_8015E588(void) { - func_8013C9C4(&D_80195F48); -} - - -DEFINE_func_8015E5B0() /* dedup: shared engine-core @0x8015E5B0 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (clean -O2 reconstruction; table-of-fnptr indexed by param_1[0]) - - -extern s32 func_80161208(); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159BE4(s32 arg0); - -/* function-pointer dispatch table */ -extern void (*D_80195C70[])(void*); - -void func_8015E698(u16 *param_1) -{ - if (func_80161208() == 0 && (param_1[0x5c] & 0x8000) != 0) { - ((void (**)(u16*))D_80195C70)[param_1[0]](param_1); - ((void (*)(u16 *, s32))func_80147078)(param_1, 0); - ((void (*)(u16 *))func_80159BE4)(param_1); - } -} - - -DEFINE_func_8015E714() /* dedup: shared engine-core @0x8015E714 (src/shared) */ - -DEFINE_func_8015E84C() /* dedup: shared engine-core @0x8015E84C (src/shared) */ - -DEFINE_func_8015E880() /* dedup: shared engine-core @0x8015E880 (src/shared) */ - -DEFINE_func_8015E8B4() /* dedup: shared engine-core @0x8015E8B4 (src/shared) */ - - - -void func_8015E8E8(s32 *a0) { - - extern void (*D_80195F5C[])(void); - D_80195F5C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015E924() /* dedup: shared engine-core @0x8015E924 (src/shared) */ - -DEFINE_func_8015E95C() /* dedup: shared engine-core @0x8015E95C (src/shared) */ - -DEFINE_func_8015E9B8() /* dedup: shared engine-core @0x8015E9B8 (src/shared) */ - - -extern u16 func_801487F4(s32*); -extern void func_80147078(s32*, s16); -extern void func_80159B70(void *a0); -extern s32 func_80149D10(s32); -extern void func_80175150(void *a0); -extern void func_8016EE40(s32 a0, s32 a1); -extern s32 func_80149744(struct S_80149744*); -extern void func_80149788(void); -extern s32 func_80161B84(void *a0); -extern s32 func_8014A4B4(void *a0); -extern void func_8014A4FC(void); -extern s32 func_80149AA8(s32*); -extern void func_80149AD4(s32*); -extern s32 func_80149B54(s32*); -extern void func_80149BAC(s32*); -extern s32 func_800CF8B4(void); -extern s32 func_801491C4(s32); -extern s32 func_80148E54(void *a0); -extern void func_8001382C(s32 a0, void *a1, void *a2); -extern void func_80146DB8(s32*, s32*); -extern void func_80147A84(s32); -extern void func_801473EC(s32*); -extern void func_80154150(s32, s32); -extern void func_8014D738(void); -extern void func_8015C714(void *a0); -extern s32 func_80161208(); /* canonical no-proto (§17a-1) */ -extern void func_801483E8(void); - -extern void (*D_80195C70[])(void *); - -void func_8015EA3C(void *arg0) { - - extern s16 D_801152A0; - s32 invec[4]; - s32 outbuf[4]; - s32 temp; - s32 r; - - if (!(((s32 (*)(void))func_801487F4)() & 8)) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 0); - func_80159B70(arg0); - return; - } - r = ((s32 (*)(void *))func_80149D10)(arg0); - if (r == 1) goto Lcase1; - if (r < 2) goto Ldefault; - if (r == 2) goto Lcase2; - goto Ldefault; -Lcase1: - D_80195C70[*(u16 *)arg0](arg0); - func_80175150(arg0); - return; -Lcase2: - func_8016EE40(*(s32 *)((u8 *)arg0 + 0x21C), 0x01000000); - return; -Ldefault: - if (((s32 (*)(void *))func_80149744)(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *))func_80149788)(arg0); - return; - } - if (func_80161B84(arg0) != 0) { - return; - } - if (func_8014A4B4(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *))func_8014A4FC)(arg0); - return; - } - if (((s32 (*)(void *))func_80149AA8)(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *))func_80149AD4)(arg0); - return; - } - if (((s32 (*)(void *))func_80149B54)(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *))func_80149BAC)(arg0); - return; - } - if (func_800CF8B4() != 0) { - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12) = - ((*(u16 *)&D_801152A0) + ((s32 (*)(void *))func_801491C4)(arg0)) & 0xFFF; - } - temp = func_80148E54(arg0); - if ((s16)temp >= 0) { - s32 d = temp - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12); - invec[0] = 0; - invec[1] = 0; - invec[2] = 0xFFFC0000; - func_8001382C((s16)d, invec, outbuf); - ((void (*)(void *, void *))func_80146DB8)(arg0, outbuf); - ((void (*)(void *))func_80147A84)(arg0); - ((void (*)(void *))func_801473EC)(arg0); - ((void (*)(void *, s32))func_80154150)(arg0, 0x1E); - } else { - ((void (*)(void *, s32))func_80154150)(arg0, 0x1D); - } - if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 9); - func_8015C714(arg0); - return; - } - if (((s32 (*)(s32))func_80161208)(arg0) == 0) { /* §17a-1 */ - ((void (*)(void *))func_801483E8)(arg0); - } -} - - -DEFINE_func_8015ED6C() /* dedup: shared engine-core @0x8015ED6C (src/shared) */ - -DEFINE_func_8015EDA0() /* dedup: shared engine-core @0x8015EDA0 (src/shared) */ - -DEFINE_func_8015EDD4() /* dedup: shared engine-core @0x8015EDD4 (src/shared) */ - - - -s32 func_8015EE08(s32 a0) { - - extern void (*D_80195F64[])(void); - D_80195F64[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015EE44() /* dedup: shared engine-core @0x8015EE44 (src/shared) */ - - -// @class: plumbing -// @stuck: none — MATCH (straight STUB call sequence; param saved to $s0 across calls) - -extern void func_8014CBF8(void *a0); -extern void func_801474EC(s32 *a0); -extern void func_80154274(s32 *a0, s32 a1); -extern void func_80146DB8(s32 *a0, s32 *a1); -extern void func_801477E8(s32 *a0, s32 a1); -extern void func_80146CA0(void *a0); - -extern int D_800D4C48; -extern int D_80195C54; - -void func_8015EE7C(s32 param_1) -{ - ((int (*)(void))func_8014CBF8)(); - ((int (*)(int))func_801474EC)(param_1); - ((int (*)(int, void *))func_80154274)(param_1, &D_800D4C48); - ((int (*)(int, void *))func_80146DB8)(param_1, &D_80195C54); - ((int (*)(int, int))func_801477E8)(param_1, 0xFFF40000); - ((int (*)(int))func_80146CA0)(param_1); -} - - - -extern void (*D_80195C70[])(void *); - -extern void func_80148038(s32 a0, s32 a1); -extern void func_80147460(s32 a0); -extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_801473EC(s32 *a0); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_80161418(void *a0); -extern s32 func_801725A4(u8 *a0); - -void func_8015EEE0(void *arg0) -{ - ((void (*)(void *, s32))func_80148038)(arg0, 0x10000); - ((void (*)(void *))func_80147460)(arg0); - ((void (*)(void *, s32, s32, s32))func_80147AD4)(arg0, 0, 0, 0x1000); - ((void (*)(void *))func_801473EC)(arg0); - if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x8000) { - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s32))func_80147078)(arg0, 0); - func_80159B70(arg0); - } else { - if (((s32 (*)(void *))func_80161418)(arg0) == 0) { - ((void (*)(void *))func_801725A4)(arg0); - } - } -} - - -DEFINE_func_8015EF9C() /* dedup: shared engine-core @0x8015EF9C (src/shared) */ - -DEFINE_func_8015EFA4() /* dedup: shared engine-core @0x8015EFA4 (src/shared) */ - -DEFINE_func_8015EFD8() /* dedup: shared engine-core @0x8015EFD8 (src/shared) */ - - - -void func_8015F00C(s32 *a0) { - - extern void (*D_80195F6C[])(void); - D_80195F6C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015F048() /* dedup: shared engine-core @0x8015F048 (src/shared) */ - -DEFINE_func_8015F080() /* dedup: shared engine-core @0x8015F080 (src/shared) */ - -extern s32 D_80062BE8; -extern void (*D_80195C70[])(void *); -extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_8014AB5C(void); -extern void func_80159B70(void *a0); -extern void func_80019064(void *a0); -extern void func_80147324(s32 a0); -extern s32 func_80161208(void); -extern int func_80155FF8(int arg, int a1); - -void func_8015F118(void *a0) { - u16 flag; - - *(s32 *)((u8 *)a0 + 0x44) = *(s32 *)((u8 *)a0 + 0x44) | 2; - flag = *(u16 *)((u8 *)a0 + 0xB8); - if (flag == 0x8000) { - (*D_80195C70[*(u16 *)a0])(a0); - ((void (*)(void *, s32))func_80147078)(a0, 0); - func_80159B70(a0); - } else { - if (flag & 0x4000) { - ((void (*)(s32))func_8014AB5C)(0x19); - ((void (*)(s32))func_8014AB5C)(0x1D); - func_801466F0(0x19, (s32)a0, 0, 0, 0, 0, 0, 1); - func_801466F0(0x19, (s32)a0, 0, 0, 0, 1, 0, 1); - func_801466F0(0x1D, (s32)a0, 0, 0, 0, 0, 0, 1); - func_80019064(&D_80062BE8); - func_80147324(0x9DA); - } - if (((s32 (*)(s32 *))func_80161208)(a0) == 0) { - func_80155FF8((int)a0, *(u8 *)((u8 *)a0 + 0x1AA)); - } - } -} - - -DEFINE_func_8015F260() /* dedup: shared engine-core @0x8015F260 (src/shared) */ - -DEFINE_func_8015F2BC() /* dedup: shared engine-core @0x8015F2BC (src/shared) */ - -DEFINE_func_8015F2F0() /* dedup: shared engine-core @0x8015F2F0 (src/shared) */ - - - -void func_8015F324(s32 *a0) { - - extern void (*D_80195F74[])(void); - D_80195F74[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015F360() /* dedup: shared engine-core @0x8015F360 (src/shared) */ - -DEFINE_func_8015F380() /* dedup: shared engine-core @0x8015F380 (src/shared) */ - - -extern void (*D_80195C70[])(void *); - -extern s32 func_80149884(void); -extern s32 func_801496D4(void*); -extern void func_80149724(void); -extern void func_801477E8(s32*, s32); -extern u16 func_80148800(s32*); -extern s32 func_80148980(u8*); -extern void func_8014F1F4(void); -extern void func_8014FCFC(void); -extern s32 func_80146A6C(s32, void*, s32, s32, s32, s32, s32); -extern void func_80147A84(s32 a0); -extern void func_801473EC(s32*); -extern void func_80146DB8(s32*, s32*); -extern void func_80146E90(s32*, s32); -extern void func_8014ED28(s32 a0); -extern void func_8014FA04(s32 a0); -extern s32 func_801725B8(u8*); -extern void func_80147324(s32 a0); -extern void func_80019064(void*); -extern void func_801484B0(s32, s32); -extern void func_80148534(s32, s32); - -void func_8015F448(s32 arg0) { - - extern u8 D_80062BD0; - extern s32 D_80195F7C; - extern s32 D_80195F8C; - extern s32 D_80195F9C; - s32 sp20[2]; - s32 sp28[2]; - - if (((*(u32 *)(arg0 + 0x44) & 0x100) && (func_80149884() != 0)) || - (((s32 (*)(s32))func_801496D4)(arg0) != 0)) { - D_80195C70[*(u16 *)arg0]((void *)arg0); - *(u8 *)(arg0 + 0x1BE) = 0xA; - ((void (*)(s32))func_80149724)(arg0); - ((void (*)(s32, s32))func_801477E8)(arg0, 0); - return; - } - - if (*(u8 *)(arg0 + 0x245) == 0) { - if (*(u8 *)(arg0 + 0x244) == 0) { - if (((s32 (*)(s32))func_80148800)(arg0) & 0x10) { - *(u8 *)(arg0 + 0x244) = 1; - *(u8 *)(arg0 + 0x245) = 1; - } - } else if (((s32 (*)(s32))func_80148800)(arg0) & 0x80) { - *(u8 *)(arg0 + 0x244) = 0; - *(u8 *)(arg0 + 0x245) = 1; - } - } - - if (*(u16 *)(arg0 + 0xB8) & 0x3000) { - if (*(u16 *)(arg0 + 0xB8) & 0x2000) { - ((void (*)(void *, void *))func_801484B0)(sp20, sp28); - func_80147324(0x56D); - } else { - ((void (*)(void *, void *))func_80148534)(sp20, sp28); - func_80147324(0x56E); - } - ((void (*)(s32 *))func_80019064)(&(*(s32 *)&D_80062BD0)); - ((void (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x25, arg0, *(s16 *)(arg0 + 6), - (s16)(*(u16 *)(arg0 + 0xA) - 0x14), - *(s16 *)(arg0 + 0xE), 0, 0); - ((void (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x25, arg0, *(s16 *)(arg0 + 6), - (s16)(*(u16 *)(arg0 + 0xA) - 0x14), - *(s16 *)(arg0 + 0xE), 1, 0); - } - - if (*(u16 *)(arg0 + 0xB8) & 0x8000) { - if (*(u8 *)(arg0 + 0x245) != 0) { - *(u8 *)(arg0 + 0x245) = 0; - *(u16 *)(arg0 + 0xB8) = *(u16 *)(arg0 + 0xBA); - if (((s32 (*)(s32))func_80148980)(arg0) != 0) { - ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F7C); - } else { - ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F8C); - } - } - } else { - *(u16 *)(arg0 + 0x246) = *(u16 *)(arg0 + 6); - *(u16 *)(arg0 + 0x248) = *(u16 *)(arg0 + 0xA); - *(u16 *)(arg0 + 0x24A) = *(u16 *)(arg0 + 0xE); - func_80147A84(arg0); - ((void (*)(s32))func_801473EC)(arg0); - if (((s32 (*)(s32))func_8014F1F4)(arg0) != 0) { - *(u16 *)(arg0 + 6) = *(u16 *)(arg0 + 0x246); - *(u16 *)(arg0 + 0xA) = *(u16 *)(arg0 + 0x248); - *(u16 *)(arg0 + 0xE) = *(u16 *)(arg0 + 0x24A); - } - } - - if (((s32 (*)(s32))func_8014FCFC)(arg0) == 0) { - D_80195C70[*(u16 *)arg0]((void *)arg0); - *(u8 *)(arg0 + 0x1BE) = 0xA; - ((void (*)(s32))func_80149724)(arg0); - ((void (*)(s32, s32))func_801477E8)(arg0, 0xFFE80000); - ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F9C); - ((void (*)(s32, s32))func_80146E90)(arg0, 0x10); - return; - } - - func_8014ED28(arg0); - func_8014FA04(arg0); - ((void (*)(s32))func_801725B8)(arg0); -} - - -DEFINE_func_8015F738() /* dedup: shared engine-core @0x8015F738 (src/shared) */ - -DEFINE_func_8015F76C() /* dedup: shared engine-core @0x8015F76C (src/shared) */ - -DEFINE_func_8015F7A0() /* dedup: shared engine-core @0x8015F7A0 (src/shared) */ - - - -s32 func_8015F7D4(s32 a0) { - - extern void (*D_80195FAC[])(void); - D_80195FAC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8015F810() /* dedup: shared engine-core @0x8015F810 (src/shared) */ - -DEFINE_func_8015F848() /* dedup: shared engine-core @0x8015F848 (src/shared) */ - - -extern void (*D_80195C70[])(void *); -extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); -extern void func_80147078(s32 *, s16); -extern void func_80159B70(void *); -extern s32 func_80161208(void); - -void func_8015F89C(void *arg0) { - u16 flags = *(u16 *)((u8 *)arg0 + 0xB8); - if (!(flags & 0x4000)) { - if (flags & 0x8000) { - D_80195C70[*(u16 *)arg0](arg0); - func_80147078(arg0, 0); - func_80159B70(arg0); - return; - } - } else { - func_801466F0(1, arg0, 0, -0x1E, 0, 0, 0, 0); - } - ((s32 (*)(void *))func_80161208)(arg0); -} - - -DEFINE_func_8015F948() /* dedup: shared engine-core @0x8015F948 (src/shared) */ - - -extern void (*D_80195C70[])(void *); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_80161208(void); - -void func_8015F9A4(void *arg0) { - if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x8000) { - D_80195C70[*(u16 *)arg0](arg0); - func_80147078(arg0, 0); - func_80159B70(arg0); - } else { - ((s32 (*)(void *))func_80161208)(arg0); - } -} - - -DEFINE_func_8015FA24() /* dedup: shared engine-core @0x8015FA24 (src/shared) */ - -DEFINE_func_8015FA44() /* dedup: shared engine-core @0x8015FA44 (src/shared) */ - -DEFINE_func_8015FA78() /* dedup: shared engine-core @0x8015FA78 (src/shared) */ - - - -void func_8015FAAC(s32 *a0) { - - extern void (*D_80195FB8[])(void); - D_80195FB8[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern s32 func_801612B8(void *a0, s32 a1); -extern void func_8016007C(s32 a0); -extern void (*D_80195C70[])(void *); -extern void func_80147078(s32 *a0, s16 a1); -extern s32 func_8015BE94(); -extern void func_8015C0C4(s32 a0); -extern void func_8015FBE0(s32 *a0); - -void func_8015FAE8(void *arg0) { - s32 v; - - v = func_801612B8(arg0, 0); - if (v == 0 || v == 0x8000) { - ((void (*)(void *))func_8016007C)(arg0); - *(u32 *)((u8 *)arg0 + 0x184) |= 0x80000000; - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 3); - ((void (*)(void *))func_8015BE94)(arg0); - } else if ((v & 0x4000) != 0) { - ((void (*)(void *))func_8016007C)(arg0); - *(u32 *)((u8 *)arg0 + 0x184) |= 0x80000000; - D_80195C70[*(u16 *)arg0](arg0); - ((void (*)(void *, s16))func_80147078)(arg0, 4); - ((void (*)(void *))func_8015C0C4)(arg0); - } else { - ((void (*)(void *))func_8015FBE0)(arg0); - } -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8015FBE0); - -extern void func_801599A4(void *a0); - -// @class: struct -// @stuck: none — MATCH (indexed fn-ptr table call + byte-offset struct stores; mirrors sibling func_801599A4 idiom) - -extern s32 D_800AE6B0; -extern void (*D_80195C70[])(void *); - -extern void func_8016007C(s32 a0); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_8014BFF4(s32 a0, s32 a1); -extern void func_80146CA0(void *a0); - -void func_8015FCC8(void *param_1) { - if ((D_800AE6B0 & 0x80FFFFFF) != 0) { - ((void (*)(void))func_8016007C)(); - D_80195C70[*(u16 *)param_1](param_1); - ((void (*)(void *, s32))func_80147078)(param_1, 0); - func_80159B70(param_1); - } else { - *(u8 *)((s32)param_1 + 0x197) = 0; - *(u8 *)((s32)param_1 + 0xBE) = 0; - *(u8 *)((s32)param_1 + 0xBF) = 0; - *(u8 *)((s32)param_1 + 0x1A0) = (u8)*(s32 *)((s32)param_1 + 0x184); - ((s32 (*)(void *, s32))func_8014BFF4)(param_1, 1); - func_80146CA0(param_1); - } -} - - - -// @class: plumbing -// @stuck: none — MATCH expected; simple 3-call sequence with global table index - -extern unsigned int D_80195FCC[]; - -extern void func_80147324(s32 arg0); -extern s32 func_8013767C(s32 a0); -extern void func_80146CA0(void *a0); - -void func_8015FD74(int param_1) -{ - ((int (*)(int))func_80147324)(0x18); - *(int *)(param_1 + 0x198) = func_8013767C(D_80195FCC[*(unsigned char *)(param_1 + 0x1a0)]); - ((int (*)(int))func_80146CA0)(param_1); -} - - -DEFINE_func_8015FDCC() /* dedup: shared engine-core @0x8015FDCC (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (fn-ptr-table dispatch + ushort struct fields) - - -extern void (*D_80195C70[])(void*); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern void func_80154A74(s32 a0, s32 a1); -extern s32 func_80161208(); - -void func_8015FE70(u16 *param_1) -{ - if ((param_1[0x5c] & 0x8000) != 0) { - if (param_1[0x5d] == 0) { - ((void (**)())D_80195C70)[param_1[0]](); - ((void (*)(u16 *, s16))func_80147078)(param_1, 0); - ((void (*)(u16 *))func_80159B70)(param_1); - return; - } - param_1[0x5c] = param_1[0x5d]; - } - if ((param_1[0x5c] & 0x4000) != 0) { - ((void (*)(u16 *, s16))func_80154A74)(param_1, 0x11); - } - ((void (*)(u16 *))func_80161208)(param_1); -} - - - -extern s32 D_800AE6B0; -extern void (*D_80195C70[])(void *); -extern u8 D_80078EC1; -extern u8 D_80078EC2; -extern u16 D_801270C0; - -extern void func_8016007C(s32 a0); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern u8 func_801656E8(s32 a0, s32 a1); -extern void func_80150820(s32 a0, s32 a1); -extern void func_8014BFF4(s32 a0, s32 a1); -extern void func_80165670(s32 a0, s32 a1); -extern void func_80165840(void); -extern void func_801658DC(void); -extern void func_80154A74(s32 a0, s32 a1); -extern void func_8016004C(s32 a0); - -void func_8015FF20(void *param_1) { - s32 v2; - u8 cur; - - if ((D_800AE6B0 & 0x80FFFFFF) != 0) { - ((void (*)(void))func_8016007C)(); - D_80195C70[*(u16 *)param_1](param_1); - ((void (*)(void *, s16))func_80147078)(param_1, 0); - func_80159B70(param_1); - return; - } - - v2 = *(s32 *)((s32)param_1 + 0x184); - if (v2 < 0) { - func_80150820((s32)param_1, func_801656E8((s32)param_1, v2 & 0xFF) & 0xFF); - } else { - if (*(u8 *)((s32)param_1 + 0x1A0) != *(u8 *)((s32)param_1 + 0x196)) { - *(u8 *)((s32)param_1 + 0x1A0) = (u8)v2; - *(u8 *)((s32)param_1 + 0x197) = 0; - *(u8 *)((s32)param_1 + 0xBE) = 0; - *(u8 *)((s32)param_1 + 0xBF) = 0; - func_8014BFF4((s32)param_1, 1); - } - - cur = *(u8 *)((s32)param_1 + 0x1A0); - D_80078EC1 = cur; - D_80078EC2 = cur; - func_80165670((s32)param_1, cur); - ((void (*)(void *))func_80165840)(param_1); - ((void (*)(void *))func_801658DC)(param_1); - func_80154A74((s32)param_1, 0x11); - D_801270C0 = 1; - } - - ((void (*)(void *))func_8016004C)(param_1); -} - - -DEFINE_func_8016004C() /* dedup: shared engine-core @0x8016004C (src/shared) */ - -DEFINE_func_8016007C() /* dedup: shared engine-core @0x8016007C (src/shared) */ - -DEFINE_func_801600D0() /* dedup: shared engine-core @0x801600D0 (src/shared) */ - -DEFINE_func_80160104() /* dedup: shared engine-core @0x80160104 (src/shared) */ - - - -void func_80160138(s32 *a0) { - - extern void (*D_80196048[])(void); - D_80196048[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80160174() /* dedup: shared engine-core @0x80160174 (src/shared) */ - -DEFINE_func_801601AC() /* dedup: shared engine-core @0x801601AC (src/shared) */ - -DEFINE_func_801601E4() /* dedup: shared engine-core @0x801601E4 (src/shared) */ - -DEFINE_func_80160244() /* dedup: shared engine-core @0x80160244 (src/shared) */ - - -extern void (*D_80195C70[])(void*); -extern void func_80154A74(s32 a0, s32 a1); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_80161208(); - -void func_801602A4(s32 *a0) { - if (*(u16 *)((u8 *)a0 + 0xB8) == 0x8000) { - ((void (**)())D_80195C70)[*(u16 *)a0](); - func_80154A74((s32)a0, 0x11); - ((void (*)(s32, s32))func_80147078)((s32)a0, 0); - func_80159B70(a0); - } else { - ((s32 (*)(s32 *))func_80161208)(a0); - } -} - - -DEFINE_func_8016032C() /* dedup: shared engine-core @0x8016032C (src/shared) */ - -DEFINE_func_80160334() /* dedup: shared engine-core @0x80160334 (src/shared) */ - -DEFINE_func_80160368() /* dedup: shared engine-core @0x80160368 (src/shared) */ - - - -void func_8016039C(s32 *a0) { - - extern void (*D_80196058[])(void); - D_80196058[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_801603D8() /* dedup: shared engine-core @0x801603D8 (src/shared) */ - -DEFINE_func_80160410() /* dedup: shared engine-core @0x80160410 (src/shared) */ - - - - - - - -/* data */ -extern u8 D_80078EC0; -extern u8 D_80078EBF; -extern void (*D_80195C70[])(void *); - -/* callees (engine_core.h canonical sigs) */ -extern void func_80149020(s32 *a0); -extern void func_80149034(s32 *a0); -extern u16 func_80148800(s32 *a0); -extern s32 func_80149B54(s32 *a0); -extern void func_80149BAC(s32 *a0); -extern s32 func_80149AA8(s32 *a0); -extern void func_80149AD4(s32 *a0); -extern s32 func_80146E98(s32 a0); -extern u16 func_801487F4(s32 *a0); -extern void func_8015E9B8(s32 *a0); -extern void func_80159B70(void *a0); -extern s32 func_800CF8B4(); -extern s32 func_801491C4(s32 a0); -extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); -extern void func_801473EC(s32 *a0); -extern void func_8014D738(void); -extern void func_8015C714(void *a0); -extern s32 func_80161208(); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_8015F00C(s32 *a0); - -void func_80160534(u8 *p) { - - extern s16 D_801152A0; - func_80149020((s32 *)p); - func_80149034((s32 *)p); - if ((D_80078EC0 & 0x7F) != 0 && (func_80148800((s32 *)p) & 0x90) != 0) { - if (D_80078EBF == 0x80) { - D_80195C70[*(u16 *)p](p); - func_80147078((s32 *)p, 0x13); - func_8015F00C((s32 *)p); - return; - } - if (func_80149B54((s32 *)p) != 0) { - D_80195C70[*(u16 *)p](p); - func_80149BAC((s32 *)p); - return; - } - } - if (func_80149AA8((s32 *)p) != 0) { - D_80195C70[*(u16 *)p](p); - func_80149AD4((s32 *)p); - return; - } - if (func_80146E98((s32)p) != 0) { - if ((func_801487F4((s32 *)p) & 8) != 0) { - D_80195C70[*(u16 *)p](p); - func_80147078((s32 *)p, 0x11); - func_8015E9B8((s32 *)p); - } else { - D_80195C70[*(u16 *)p](p); - func_80147078((s32 *)p, 0); - func_80159B70(p); - } - return; - } - if (func_800CF8B4() != 0) { - *(u16 *)(*(s32 *)(p + 0x20) + 0x12) = - ((*(u16 *)&D_801152A0) + func_801491C4((s32)p)) & 0xFFF; - } - func_80147AD4((s32)p, *(s32 *)(p + 0x234), *(s32 *)(p + 0x238), - *(s32 *)(p + 0x23C)); - func_801473EC((s32 *)p); - if (((s32 (*)(s32 *))func_8014D738)((s32 *)p) != 0) { - D_80195C70[*(u16 *)p](p); - func_80147078((s32 *)p, 9); - func_8015C714(p); - } else { - ((s32 (*)(void *))func_80161208)(p); - } -} - - -DEFINE_func_801607B8() /* dedup: shared engine-core @0x801607B8 (src/shared) */ - -DEFINE_func_801607E4() /* dedup: shared engine-core @0x801607E4 (src/shared) */ - -DEFINE_func_80160818() /* dedup: shared engine-core @0x80160818 (src/shared) */ - - - -void func_8016084C(s32 *a0) { - - extern void (*D_80196060[])(void); - D_80196060[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80160888() /* dedup: shared engine-core @0x80160888 (src/shared) */ - -DEFINE_func_801608C0() /* dedup: shared engine-core @0x801608C0 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (function-pointer table folds %lo via extern array indexed by halfword) - -typedef void (*code)(unsigned short *); - -extern void (*D_80195C70[])(void*); - -extern u16 func_801487F4(s32 *a0); -extern s32 func_80161208(); -extern void func_80160A74(s32 *a0); -extern void func_80154150(s32 a0, s32 a1); -extern void func_80146CA0(void *a0); - -void func_80160920(unsigned short *param_1) -{ - if ((((int (*)(void))func_801487F4)() & 8) == 0) { - ((code *)D_80195C70)[*param_1](param_1); - ((void (*)(unsigned short *))func_80160A74)(param_1); - } else { - if (((int (*)(unsigned short *))func_80161208)(param_1) == 0 && param_1[0x5c] == 0x8000) { - ((void (*)(unsigned short *, int))func_80154150)(param_1, 0x25); - ((void (*)(unsigned short *))func_80146CA0)(param_1); - } - } - return; -} - - - - -// @class: struct -// @stuck: none — MATCH (pending byte-gate); function-pointer table %lo-fold via extern array - - -extern u16 func_801487F4(s32 *a0); -extern void func_80160A74(s32 *a0); -extern s32 func_80161208(); - -/* function-pointer dispatch table; indexed by *param_1 (×4 = ptr size) */ -extern void (*D_80195C70[])(void*); - -void func_801609B8(u16 *param_1) { - if ((((u32 (*)(void))func_801487F4)() & 8) == 0) { - ((void (**)(u16*))D_80195C70)[*param_1](param_1); - ((void (*)(u16 *))func_80160A74)(param_1); - } else { - ((void (*)(u16 *))func_80161208)(param_1); - } -} - - -DEFINE_func_80160A28() /* dedup: shared engine-core @0x80160A28 (src/shared) */ - -DEFINE_func_80160A74() /* dedup: shared engine-core @0x80160A74 (src/shared) */ - -DEFINE_func_80160ACC() /* dedup: shared engine-core @0x80160ACC (src/shared) */ - -DEFINE_func_80160B00() /* dedup: shared engine-core @0x80160B00 (src/shared) */ - - - -s32 func_80160B34(s32 a0) { - - extern void (*D_8019606C[])(void); - D_8019606C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80160B70() /* dedup: shared engine-core @0x80160B70 (src/shared) */ - -DEFINE_func_80160BB4() /* dedup: shared engine-core @0x80160BB4 (src/shared) */ - -DEFINE_func_80160C28() /* dedup: shared engine-core @0x80160C28 (src/shared) */ - -DEFINE_func_80160CB4() /* dedup: shared engine-core @0x80160CB4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (mirrors byte-matched func_8015DBD4 in same overlay; dispatch via D_80195C70 + func_80147078/func_80159B70 tail, func_80161208 else) - -extern void (*D_80195C70[])(void *); -extern u16 func_80148800(s32 *a0); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); -extern s32 func_80161208(); - -void func_80160D10(void *arg0) { - if (*(u32 *)((u8 *)arg0 + 0x44) & 0x10) { - D_80195C70[*(u16 *)arg0](arg0); - } else { - if (*(s32 *)((u8 *)arg0 + 0x1AC) == 0) { - if ((((s32 (*)(void *))func_80148800)(arg0) & 0xF0) == 0) { - goto dd0; - } - } else { - s32 t = *(s32 *)((u8 *)arg0 + 0x1AC) - 0xAAA8; - *(s32 *)((u8 *)arg0 + 0x1AC) = t; - if (t >= 0) { - goto dd0; - } - } - D_80195C70[*(u16 *)arg0](arg0); - } - ((void (*)(void *, s16))func_80147078)(arg0, 0); - func_80159B70(arg0); - return; -dd0: - ((s32 (*)(void *))func_80161208)(arg0); -} - - -DEFINE_func_80160DEC() /* dedup: shared engine-core @0x80160DEC (src/shared) */ - -DEFINE_func_80160E3C() /* dedup: shared engine-core @0x80160E3C (src/shared) */ - -DEFINE_func_80160E70() /* dedup: shared engine-core @0x80160E70 (src/shared) */ - - -extern void (*D_8019607C[])(void); - -void func_80160EA4(void *a0) { - D_8019607C[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80160EE0() /* dedup: shared engine-core @0x80160EE0 (src/shared) */ - -DEFINE_func_80160F00() /* dedup: shared engine-core @0x80160F00 (src/shared) */ - -DEFINE_func_80160F70() /* dedup: shared engine-core @0x80160F70 (src/shared) */ - -DEFINE_func_80160FE0() /* dedup: shared engine-core @0x80160FE0 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH - -extern void func_80149020(s32 *a0); -extern void (*D_80195C70[])(void *); -extern void func_80147078(s32 *a0, s16 a1); -extern void func_80159B70(void *a0); - -void func_80161034(void *a0) -{ - func_80149020(a0); - D_80195C70[*(u16 *)a0](a0); - func_80147078(a0, 0); - func_80159B70(a0); -} - - -DEFINE_func_80161094() /* dedup: shared engine-core @0x80161094 (src/shared) */ - -DEFINE_func_801610FC() /* dedup: shared engine-core @0x801610FC (src/shared) */ - -DEFINE_func_80161104() /* dedup: shared engine-core @0x80161104 (src/shared) */ - -DEFINE_func_80161124() /* dedup: shared engine-core @0x80161124 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161208); - -DEFINE_func_80161240() /* dedup: shared engine-core @0x80161240 (src/shared) */ - -DEFINE_func_80161278() /* dedup: shared engine-core @0x80161278 (src/shared) */ - -DEFINE_func_801612B8() /* dedup: shared engine-core @0x801612B8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8016130C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161374); - -DEFINE_func_80161418() /* dedup: shared engine-core @0x80161418 (src/shared) */ - -DEFINE_func_80161450() /* dedup: shared engine-core @0x80161450 (src/shared) */ - -DEFINE_func_80161488() /* dedup: shared engine-core @0x80161488 (src/shared) */ - -DEFINE_func_801614E4() /* dedup: shared engine-core @0x801614E4 (src/shared) */ - -DEFINE_func_8016151C() /* dedup: shared engine-core @0x8016151C (src/shared) */ - -DEFINE_func_80161554() /* dedup: shared engine-core @0x80161554 (src/shared) */ - -DEFINE_func_8016158C() /* dedup: shared engine-core @0x8016158C (src/shared) */ - -DEFINE_func_801615C4() /* dedup: shared engine-core @0x801615C4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8016163C); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161774); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161888); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8016191C); - -DEFINE_func_8016197C() /* dedup: shared engine-core @0x8016197C (src/shared) */ - -DEFINE_func_801619A4() /* dedup: shared engine-core @0x801619A4 (src/shared) */ - -DEFINE_func_801619D0() /* dedup: shared engine-core @0x801619D0 (src/shared) */ - -DEFINE_func_80161A00() /* dedup: shared engine-core @0x80161A00 (src/shared) */ - -DEFINE_func_80161A30() /* dedup: shared engine-core @0x80161A30 (src/shared) */ - -DEFINE_func_80161A60() /* dedup: shared engine-core @0x80161A60 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161A90); - -DEFINE_func_80161B18() /* dedup: shared engine-core @0x80161B18 (src/shared) */ - -DEFINE_func_80161B84() /* dedup: shared engine-core @0x80161B84 (src/shared) */ - -DEFINE_func_80161BE0() /* dedup: shared engine-core @0x80161BE0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161C24); - - -// @class: struct -// @stuck: none — MATCH (indexed-global %lo-fold via extern u16 array, §18) - -extern u16 D_801960AC[]; -extern void func_80147324(s32 arg0); - -void func_80161C98(int param_1, u32 param_2) -{ - if (param_2 < 8) { - func_80147324(D_801960AC[param_2]); - } - return; -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161CD0); - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80161D20); - -DEFINE_func_80161D58() /* dedup: shared engine-core @0x80161D58 (src/shared) */ - - -// @class: other -// @stuck: none — MATCH (short-circuit && chain; reused 0x80FFFFFF mask const, andi-0xFF on callee ret) - -extern s32 D_800AE6B0; -extern s32 D_800AE6A8; -extern s32 func_80029178(s32 arg); -extern void func_80029124(s32, s32); -extern void func_800D1734(void *); -extern s32 D_80196110; - -void func_80161D88(void) { - if ((D_800AE6B0 & 0x80FFFFFF) == 0 && (D_800AE6A8 & 0x80FFFFFF) == 0 && - (func_80029178(0x141) & 0xFF) != 0) { - func_80029124(0x141, 0); - func_80029124(0x95, 1); - func_800D1734(&D_80196110); - } -} - - -// @class: regalloc-order -// @stuck: none — MATCH (175 ins, relocation-masked). Giant, 3 similar guarded blocks. base=&D_800AF630 -// hoisted to $s2 (referenced only to build the 3 stored pointers base+0x65A8/0x65E0/0x6618 -> $s1); -// guard reads (D_800B5BD8/C10/C48) + the "=1" + coord stores use direct symbols. Coord idiom: -// -(s32)(u16)D_800AF7BC/2 + K (negu;srl31;addu;sra1). a2=func_800291DC(8) survives in $s3 for the -// final (a2&0x7FFF)==(s16)D_80078EB0 test. KEY RESIDUAL (cracked): target computes each pointer into -// scratch $v0 then `addu $s1,$v0` (dead-intermediate copy) and stores $s1 — natural C ALWAYS coalesces -// that copy into a direct `addiu $s1,$s2,off` (172 ins, 3 short). Forcing the un-coalesced copy needs -// an explicit `move` inline-asm (an empty "=r"/"0" re-tie is only a barrier, won't emit the copy). -#include "common.h" - - - - - - - -void func_80161E08(s32 param_1) { - extern void func_80024054(void *a0, void *a1); - extern void func_8001CE28(void *a0, void *a1); - extern void func_800242D0(s32 a0, void *a1, s32 a2); - extern void func_8001CE68(void *a0, void *a1); - extern int func_801620C4(void); - extern void func_801622C4(void); - extern u16 D_800AF7BC; - extern u16 D_800AF7BE; - extern s16 D_80078EB0; - extern u16 D_800B5BD8; - extern s16 D_800B5C04; - extern u8 D_800B5BFF; - extern s16 D_800B5BE0; - extern s16 D_800B5BE2; - extern u16 D_800B5C10; - extern s16 D_800B5C3C; - extern u8 D_800B5C37; - extern s16 D_800B5C18; - extern s16 D_800B5C1A; - extern u16 D_800B5C48; - extern s16 D_800B5C74; - extern s16 D_800B5C50; - extern s16 D_800B5C52; - extern u8 * D_801D3DC8[]; - extern u8 D_801960DC[]; - extern u8 D_801960FC[]; - extern u8 D_801D3DD4[]; - extern u8 D_801D3DFC[]; - extern u8 D_801D3E14[]; - - u8 *base = &(*(u8 *)&D_800AF630); - u8 *p; - s32 a2; - - if (*((u16 *)param_1) != 0x1A && - currentLocationId != 0x3012 && - currentLocationId != 0x3054 && - currentLocationId != 0x3079 && - currentLocationId != 0x3096 && - ((a2 = func_800291DC(8)) & 0x8000) != 0) { - - if (D_800B5BD8 == 0) { - __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x65A8)); - D_801D3DC8[0] = p; - func_80024054(&D_801960DC, &D_801D3DD4); - func_8001CE28(p, &D_801D3DD4); - D_800B5C04 = 1; - D_800B5BFF = 1; - D_800B5BE0 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; - D_800B5BE2 = -(s32)(u16)D_800AF7BE / 2 + 0x28; - } - - if (D_800B5C10 == 0) { - __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x65E0)); - D_801D3DC8[1] = p; - func_80024054(&D_801960FC, &D_801D3DFC); - func_8001CE28(p, &D_801D3DFC); - D_800B5C3C = 1; - D_800B5C37 = 1; - D_800B5C18 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; - D_800B5C1A = -(s32)(u16)D_800AF7BE / 2 + 0x30; - } - - if (D_800B5C48 == 0) { - __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x6618)); - D_801D3DC8[2] = p; - func_800242D0((s16)func_801620C4(), &D_801D3E14, 0x84); - func_8001CE68(p, &D_801D3E14); - D_800B5C74 = 1; - D_800B5C50 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; - D_800B5C52 = -(s32)(u16)D_800AF7BE / 2 + 0x10; - } - - func_800242D0((s16)func_801620C4(), &D_801D3E14, 0x84); - if ((a2 & 0x7FFF) == (s32)D_80078EB0) { - func_801622C4(); - } - } -} - - - -DEFINE_func_801620C4() /* dedup: shared engine-core @0x801620C4 (src/shared) */ - -DEFINE_func_80162120() /* dedup: shared engine-core @0x80162120 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (do-while scan over 3-entry global; increments placed AFTER the call so p++ schedules between load and jal, i++ into the delay slot) - -extern void func_800291C8(s32, s32); -extern void func_80016714(void *a0, s32 a1); - -extern int D_801D3DC8[]; - -void func_8016216C(void) -{ - int *p; - int i; - - func_800291C8(8, 0); - i = 0; - p = D_801D3DC8; - do { - int v = *p; - ((void (*)(int, int))func_80016714)(v, 0x38); - p = p + 1; - i = i + 1; - } while (i < 3); -} - - - -extern s32 func_800291DC(s32); -extern u8 D_80078E78[]; -extern u8 D_80078EB0; -extern u8 D_80078EB1; -extern s32 D_80196110; - -s32 func_801621CC(s32 arg0) { - register s32 s0 __asm__("$16") = arg0; /* $s0: arg0, crosses the call */ - register u8 *s1 __asm__("$17") = D_80078E78; /* $s1: base, hoisted for the loop */ - register s32 i __asm__("$5"); /* $a1: counter (pin fixes the i/d swap) */ - u32 a2; - s32 d; /* $a0: natural alloc; load via $v0 temp */ - s32 v, last, hi, lo; - char pad[8]; /* phantom 8B local -> frame 0x28 (vars=8) */ - - a2 = func_800291DC(8); - if ((a2 & 0x8000) == 0) { - return 0; - } - a2 &= 0x7FFF; - if (((a2 >> 8) == D_80078EB1) && ((a2 & 0xFF) <= (u32)D_80078EB0)) { - return (s32)&D_80196110; - } - d = s1[0x39] - 1; - i = 0; - if (s0 <= 0) { - return 0; - } - hi = (a2 >> 8) & 0xFF; - last = s0 - 1; - lo = a2 & 0xFF; - do { - if ((s8)d < 0) { - d = 0x17; - } - v = (s8)d; - if (hi == v) { - if (i != last) { - return (s32)&D_80196110; - } - i++; - if ((u32)s1[0x38] < (u32)lo) { - return (s32)&D_80196110; - } - goto bot; - } - i++; - bot: - d--; - } while (i < s0); - return 0; -} - - - - -// @class: schedule -// @stuck: none — MATCH -extern void func_80029124(s32, s32); -extern void func_800291C8(s32, s32); -extern void func_80016714(void *a0, s32 a1); -extern int D_801D3DC8[]; - -void func_801622C4(void) -{ - int *p; - int i; - - ((int (*)(int, int))func_80029124)(0x141, 1); - ((int (*)(int, int))func_800291C8)(8, 0); - i = 0; - p = &D_801D3DC8; - do { - ((int (*)(int, int))func_80016714)(*p, 0x38); - p = p + 1; - i = i + 1; - } while (i < 3); -} - - - -extern void (*D_80196134[])(void); - -void func_80162330(void *a0) { - D_80196134[*(u8 *)((s32)a0 + 0x15)](); -} - - -DEFINE_func_8016236C() /* dedup: shared engine-core @0x8016236C (src/shared) */ - -DEFINE_func_801623B8() /* dedup: shared engine-core @0x801623B8 (src/shared) */ - -DEFINE_func_80162414() /* dedup: shared engine-core @0x80162414 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (160 ins, relocation-masked). Keys: (1) base=&D_800AF630 hoisted, pinned $s2; -// uVar2 UNPINNED (a $s3 pin forced the final `uVar2 & 0x7FFF` in-place+early, breaking the lh delay -// slot). (2) item pinned $s1, dest INLINED (D_801D96Dx in both call args) so it lands $s0 AFTER a0. -// (3) base assigned BEFORE the func_800291DC call so the return-copy `addu $s3,$v0` schedules after -// the base lui/addiu. (4) THE MOVE: each block's `addu $s1,$v0,$zero` = compute `base+off` into a -// $v0-PINNED temp `t`, then `item = t`. Two distinct hard regs ($v0 vs $s1) can't coalesce, forcing -// the exact `addiu $v0,$s2,off ; addu $s1,$v0` pair the target emits (plain `item=base+off` coalesces -// into one `addiu $s1` — 3 ins short). (5) store D_801D3E20[i] via `extern int D_801D3E20[]` (folds -// %lo, consistent with func_80162760). Coord = (s16)(-D_800AF7Bx / 2 + K) (negu; srl 31; addu; sra 1). - -#include "common.h" - - - - - - - - -s32 func_80162438(s32 _unused0) { - extern void func_80024054(void *, void *); - extern void func_8001CE28(void *, void *); - extern void func_8001CE68(void *, void *); - extern void func_800242D0(s32, void *, s32); - extern s32 func_801626B8(void); - extern void func_80162760(void); - extern u8 D_80196140[]; - extern s32 D_80196158; - extern u8 D_801D3E2C[]; - extern u8 D_801D3E54[]; - extern u8 D_801D3E70[]; - extern int D_801D3E20[]; - extern u16 D_800B5BD8; - extern u16 D_800B5C10; - extern u16 D_800B5C48; - extern u16 D_800AF7BC; - extern u16 D_800AF7BE; - extern s16 D_800B5BE0; - extern s16 D_800B5BE2; - extern s16 D_800B5C04; - extern u8 D_800B5BFF; - extern s16 D_800B5C18; - extern s16 D_800B5C1A; - extern s16 D_800B5C3C; - extern u8 D_800B5C37; - extern s16 D_800B5C50; - extern s16 D_800B5C52; - extern s16 D_800B5C74; - - u32 uVar2; - register u8 *base __asm__("$18"); - register u8 *item __asm__("$17"); - - base = &(*(u8 *)&D_800AF630); - uVar2 = func_800291DC(0x12); - if ((uVar2 & 0x8000) != 0) { - if (D_800B5BD8 == 0) { - register u8 *t __asm__("$2") = base + 0x65A8; - item = t; - D_801D3E20[0] = (s32)item; - func_80024054(D_80196140, D_801D3E2C); - func_8001CE28(item, D_801D3E2C); - D_800B5C04 = 1; - D_800B5BFF = 1; - D_800B5BE0 = -D_800AF7BC / 2 + 0xD0; - D_800B5BE2 = -D_800AF7BE / 2 + 0x28; - } - if (D_800B5C10 == 0) { - register u8 *t __asm__("$2") = base + 0x65E0; - item = t; - D_801D3E20[1] = (s32)item; - func_80024054(((u8 *)&D_80196158), D_801D3E54); - func_8001CE28(item, D_801D3E54); - D_800B5C3C = 1; - D_800B5C37 = 1; - D_800B5C18 = -D_800AF7BC / 2 + 0xD0; - D_800B5C1A = -D_800AF7BE / 2 + 0x30; - } - if (D_800B5C48 == 0) { - register u8 *t __asm__("$2") = base + 0x6618; - item = t; - D_801D3E20[2] = (s32)item; - func_800242D0((s16)func_801626B8(), D_801D3E70, 0x84); - func_8001CE68(item, D_801D3E70); - D_800B5C74 = 1; - D_800B5C50 = -D_800AF7BC / 2 + 0xD0; - D_800B5C52 = -D_800AF7BE / 2 + 0x10; - } - func_800242D0((s16)func_801626B8(), D_801D3E70, 0x84); - if ((uVar2 & 0x7FFF) == (s32)(*(s16 *)&D_80078EB0)) { - func_80162760(); - } - } -} - - - -DEFINE_func_801626B8() /* dedup: shared engine-core @0x801626B8 (src/shared) */ - -DEFINE_func_80162714() /* dedup: shared engine-core @0x80162714 (src/shared) */ - - -// @class: schedule -// @stuck: none — MATCH (24 ins). do-while; load+call first, then p++ and i++ AFTER the call so gcc schedules p++/arg ahead of jal and i++ into the delay slot. - -extern void func_800291C8(s32, s32); -extern void func_80016714(void *a0, s32 a1); - -extern int D_801D3E20[]; - -void func_80162760(void) -{ - int *p; - int i; - - func_800291C8(0x12, 0); - i = 0; - p = D_801D3E20; - do { - int v = *p; - ((void (*)(int, int))func_80016714)(v, 0x38); - p = p + 1; - i = i + 1; - } while (i < 3); -} - - -DEFINE_func_801627C0() /* dedup: shared engine-core @0x801627C0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_801627E8); - - -extern void (*D_8019617C[])(void); - -void func_80162834(void *a0) { - D_8019617C[*(u8 *)((s32)a0 + 0x1)](); -} - - - -// @class: plumbing -// @stuck: none — MATCH (stub: alloc + global init + two calls; $s0 holds param_1 across calls) - -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_8019616C; -extern s32 D_800B5CBC; -extern u8 D_800B5CDF; -extern s32 D_800B5CEC; - -void func_80162870(s32 param_1) { - *(s32 *)(param_1 + 8) = (s32)&D_800B5CB8; - func_8001CB6C(&D_800B5CB8, (s32)&D_8019616C, 0x250, 0x1A0); - D_800B5CEC = param_1 + 0xC; - D_800B5CDF = 0x14; - D_800B5CBC |= 0x60000000; - func_80162968(param_1); - func_80162ACC((u8 *)param_1); -} - - -DEFINE_func_801628F4() /* dedup: shared engine-core @0x801628F4 (src/shared) */ - -DEFINE_func_80162968() /* dedup: shared engine-core @0x80162968 (src/shared) */ - -DEFINE_func_80162AC0() /* dedup: shared engine-core @0x80162AC0 (src/shared) */ - -DEFINE_func_80162ACC() /* dedup: shared engine-core @0x80162ACC (src/shared) */ - -DEFINE_func_80162AE0() /* dedup: shared engine-core @0x80162AE0 (src/shared) */ - -DEFINE_func_80162AF4() /* dedup: shared engine-core @0x80162AF4 (src/shared) */ - -DEFINE_func_80162B1C() /* dedup: shared engine-core @0x80162B1C (src/shared) */ - -DEFINE_func_80162CC4() /* dedup: shared engine-core @0x80162CC4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80162CCC); - -DEFINE_func_80162D28() /* dedup: shared engine-core @0x80162D28 (src/shared) */ - -DEFINE_func_80162D88() /* dedup: shared engine-core @0x80162D88 (src/shared) */ - -DEFINE_func_80162DE8() /* dedup: shared engine-core @0x80162DE8 (src/shared) */ - -DEFINE_func_80162E48() /* dedup: shared engine-core @0x80162E48 (src/shared) */ - -DEFINE_func_80162EA8() /* dedup: shared engine-core @0x80162EA8 (src/shared) */ - -DEFINE_func_80162F08() /* dedup: shared engine-core @0x80162F08 (src/shared) */ - -DEFINE_func_80162F60() /* dedup: shared engine-core @0x80162F60 (src/shared) */ - -DEFINE_func_80162F80() /* dedup: shared engine-core @0x80162F80 (src/shared) */ - -DEFINE_func_80162FA0() /* dedup: shared engine-core @0x80162FA0 (src/shared) */ - -DEFINE_func_80162FC0() /* dedup: shared engine-core @0x80162FC0 (src/shared) */ - -DEFINE_func_80162FF4() /* dedup: shared engine-core @0x80162FF4 (src/shared) */ - -DEFINE_func_801630C4() /* dedup: shared engine-core @0x801630C4 (src/shared) */ - -DEFINE_func_80163194() /* dedup: shared engine-core @0x80163194 (src/shared) */ - -DEFINE_func_80163234() /* dedup: shared engine-core @0x80163234 (src/shared) */ - -DEFINE_func_8016325C() /* dedup: shared engine-core @0x8016325C (src/shared) */ - -DEFINE_func_801632E0() /* dedup: shared engine-core @0x801632E0 (src/shared) */ - -DEFINE_func_801632F0() /* dedup: shared engine-core @0x801632F0 (src/shared) */ - -DEFINE_func_80163328() /* dedup: shared engine-core @0x80163328 (src/shared) */ - -DEFINE_func_801633A8() /* dedup: shared engine-core @0x801633A8 (src/shared) */ - -// @class: struct -// @stuck: none — MATCH (21 ins, relocation-masked) - - -s32 func_80163408(s32 param_1, s32 param_2, s32 param_3, s32 param_4) { - extern int func_8016345C(int, unsigned short, int, unsigned short, void *); - extern unsigned char D_801D34A0[8]; - - unsigned char sp18[8]; - memcpy(sp18, D_801D34A0, 8); - return func_8016345C(((int)param_1), ((int)param_2), ((int)param_3), ((int)param_4), sp18); -} - - - -DEFINE_func_8016345C() /* dedup: shared engine-core @0x8016345C (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (unaligned 8-byte memcpy from global into stack buffer, then forward to callee) - -extern char D_801D34A0[8]; - -extern void *memcpy(void *dst, const void *src, unsigned int n); -extern void func_80163534(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); - -void func_801634D8(s32 param_1, u16 param_2, u16 param_3, s32 param_4, u16 param_5) -{ - char buf[8]; - - memcpy(buf, D_801D34A0, 8); - ((void (*)(s32, u16, u16, s32, u16, s32))func_80163534)(param_1, param_2, param_3, param_4, param_5, (s32)buf); -} - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80163534); - -DEFINE_func_80163664() /* dedup: shared engine-core @0x80163664 (src/shared) */ - -DEFINE_func_801636D0() /* dedup: shared engine-core @0x801636D0 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80163764); - -DEFINE_func_8016380C() /* dedup: shared engine-core @0x8016380C (src/shared) */ - -DEFINE_func_801638A0() /* dedup: shared engine-core @0x801638A0 (src/shared) */ - -DEFINE_func_80163950() /* dedup: shared engine-core @0x80163950 (src/shared) */ - - -extern void (*D_80196184[])(void); - -void func_80163A58(void *a0) { - D_80196184[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80163A94() /* dedup: shared engine-core @0x80163A94 (src/shared) */ - -DEFINE_func_80163C2C() /* dedup: shared engine-core @0x80163C2C (src/shared) */ - - -void func_80163EC8(s32 param_1) { - extern Blk8 D_801D34A8; - extern u16 D_800B99DA; - extern u8 func_801656D0(s32 a0, s32 a1); - extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); - extern void func_80015978(s32 a0, s32 *a1); - extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4); - - Blk8 in; - u16 out[4]; - s16 buf[4]; - s32 psVar6; - s32 iVar8; - s32 iVar7; - register s32 uVar5 __asm__("$2"); /* PIN (flagged): uVar5 -> $v0 */ - u16 uVar4; - u8 uVar3; - - in = D_801D34A8; - psVar6 = *(s32 *)(param_1 + 0x4c); - iVar8 = *(s32 *)(param_1 + 0x20); - func_80162D88((s32 *)param_1); - - if (*(s32 *)(psVar6 + 0x184) == 0) { - uVar5 = *(s32 *)(psVar6 + 0x44); - *(s16 *)(psVar6 + 0x18a) = 0; - *(s16 *)(psVar6 + 0x188) = 0; - *(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20; - func_80146CA0((void *)param_1); - func_80146CA0((void *)param_1); - return; - } - if (*(s16 *)(*(s32 *)(psVar6 + 0x184) + 0x36) == *(u16 *)(psVar6 + 0x194)) { - goto LAB_matched; - } - *(s32 *)(psVar6 + 0x184) = 0; - uVar5 = *(s32 *)(psVar6 + 0x44); - *(s16 *)(psVar6 + 0x18a) = 0; - *(s16 *)(psVar6 + 0x188) = 0; - *(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20; - func_80146CA0((void *)param_1); - func_80146CA0((void *)param_1); - return; - -LAB_matched: - *(s16 *)(psVar6 + 0x18a) = *(u16 *)(psVar6 + 0x18a) + 1; - if ((D_800B99DA & 3) == 0) { - if (*(s16 *)(psVar6 + 0x188) >= *(u8 *)(param_1 + 0x67)) { - *(s16 *)(psVar6 + 0x188) = *(s16 *)(psVar6 + 0x188) - *(u8 *)(param_1 + 0x67); - } else { - *(s16 *)(psVar6 + 0x188) = 0; - } - if (*(s16 *)(psVar6 + 0x188) < 0) { - *(s16 *)(psVar6 + 0x188) = 0; - } - } - - *(s16 *)(param_1 + 0x66) = *(u16 *)(param_1 + 0x66) + 0x40; - uVar5 = func_80148800((s32 *)psVar6); - if ((uVar5 & 0x80) != 0) { - *(s16 *)(param_1 + 0x66) = 0; - uVar3 = func_801656D0(psVar6, func_8014CA00(*(s32 *)(psVar6 + 0x184)) & 0xff); - *(s16 *)(psVar6 + 0x188) = *(u16 *)(psVar6 + 0x188) + uVar3; - *(s16 *)(iVar8 + 0x1a) = 0x4000; - *(s16 *)(iVar8 + 0x18) = 0x4000; - *(s32 *)(iVar8 + 0x48) = *(s16 *)(param_1 + 0x58); - *(s32 *)(iVar8 + 0x4c) = *(s16 *)(param_1 + 0x5a); - *(s32 *)(iVar8 + 0x50) = *(s16 *)(param_1 + 0x5c); - ((void (*)(s32, s32, s32))func_80149350)(param_1, (s32)&in, (s32)out); - *(s16 *)(param_1 + 0x6) = out[0]; - *(s16 *)(param_1 + 0xa) = out[1]; - *(s16 *)(param_1 + 0xe) = out[2]; - } - - if (0x80 < *(s16 *)(psVar6 + 0x188)) { - *(s16 *)(psVar6 + 0x188) = 0x80; - } - if (*(s16 *)(psVar6 + 0x188) >= 0x80) { - iVar7 = *(s32 *)(psVar6 + 0x184); - if (iVar7 != 0) { - func_80015978(iVar7 + 4, (s32 *)buf); - buf[3] = 0; - uVar4 = func_80156370(0xe); - func_8014C4AC(iVar7, 0xe, uVar4, buf, *(s16 *)(iVar8 + 0x12)); - func_80146994(0x33, param_1, 0, iVar7); - } - } else { - if (*(s16 *)(psVar6 + 0x18a) < 0x80 && *(u16 *)psVar6 != 0x19) { - goto LAB_end; - } - iVar7 = *(s32 *)(psVar6 + 0x184); - if (iVar7 != 0) { - func_80015978(iVar7 + 4, (s32 *)buf); - buf[3] = 0; - uVar4 = func_80156370(0x21); - func_8014C4AC(iVar7, 0x21, uVar4, buf, *(s16 *)(iVar8 + 0x12)); - if ((*(s32 *)(iVar7 + 0xb4) & 0x40000) != 0) { - func_8014AD30(param_1, (u16 *)buf, 0, *(s16 *)(iVar7 + 0x60)); - } - } - } - - uVar5 = func_8014CA00(iVar7); - *(s32 *)(psVar6 + 0x184) = uVar5; - if (0x1e < (u32)uVar5) { - *(s32 *)(psVar6 + 0x184) = 0; - } - func_80146E90((s32 *)param_1, 0x20); - *(s32 *)(psVar6 + 0x44) = *(s32 *)(psVar6 + 0x44) & ~0x20; - func_80147324(0x449); - func_80146CA0((void *)param_1); - func_80146CA0((void *)param_1); - -LAB_end: - uVar4 = func_80012F74(*(s16 *)(iVar8 + 0x1a), 0x1800, 3, 1); - *(s16 *)(iVar8 + 0x1a) = uVar4; - *(s16 *)(iVar8 + 0x18) = uVar4; - uVar4 = func_80012F74(*(s16 *)(param_1 + 0x6), *(s16 *)(param_1 + 0x58), 8, 1); - *(s16 *)(param_1 + 0x6) = uVar4; - uVar4 = func_80012F74(*(s16 *)(param_1 + 0xa), *(s16 *)(param_1 + 0x5a), 8, 1); - *(s16 *)(param_1 + 0xa) = uVar4; - uVar4 = func_80012F74(*(s16 *)(param_1 + 0xe), *(s16 *)(param_1 + 0x5c), 8, 1); - *(s16 *)(param_1 + 0xe) = uVar4; -} - - -DEFINE_func_80164270() /* dedup: shared engine-core @0x80164270 (src/shared) */ - -DEFINE_func_801642AC() /* dedup: shared engine-core @0x801642AC (src/shared) */ - -DEFINE_func_8016432C() /* dedup: shared engine-core @0x8016432C (src/shared) */ - -DEFINE_func_80164410() /* dedup: shared engine-core @0x80164410 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80164418); - -DEFINE_func_80164530() /* dedup: shared engine-core @0x80164530 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH expected (fn-ptr table dispatch via u16 idx, $s0 holds *(s32*)(p+0x20) across the call) - -extern void (*D_801961D8[])(void); -extern void func_80162D28(s32 *a0); - -void func_80164744(s32 param_1) -{ - s32 iVar1; - - iVar1 = *(s32 *)(param_1 + 0x20); - D_801961D8[*(u16 *)(param_1 + 2)](); - if (iVar1 != 0) { - ((void (*)(s32))func_80162D28)(param_1); - } -} - - - - -// @class: other -// @stuck: none — MATCH (relocation-masked); key was `if (iVar1 != 0) { big } else { func_80164930 }` (non-zero case first → beqz, not bnez) - - -extern void func_8014659C(void); -extern void func_8001C810(s32 a0, s32 a1); -extern void func_80164A74(s32 *a0); -extern void func_80146CA0(void *a0); -extern void func_80164930(s32 a); - -extern u16 D_800DF2E0; -extern s32 D_801961A0; -extern s16 D_801961D4; -extern s16 D_801961D2; -extern s16 D_801961D0; - -void func_801647A4(int param_1) { - s32 iVar1; - - iVar1 = ((s32 (*)(void))func_8014659C)(); - *(s32 *)(param_1 + 0x20) = iVar1; - if (iVar1 != 0) { - ((void (*)(s32, void *))func_8001C810)(iVar1, &D_800DF2E0); - *(s32 **)(iVar1 + 0x80) = &D_801961A0; - *(u32 *)(iVar1 + 4) = *(u32 *)(iVar1 + 4) | 0x50000000; - *(u16 *)(iVar1 + 0x2c) = *(u16 *)(iVar1 + 0x2c) | 0xb0; - D_801961D4 = 0x80; - D_801961D2 = 0x80; - D_801961D0 = 0x80; - *(u16 *)(iVar1 + 0x1a) = 0; - *(u16 *)(param_1 + 0x60) = 0; - *(u16 *)(param_1 + 0x62) = 0x200; - ((s32 (*)(s32))func_80164A74)(param_1); - ((void (*)(s32))func_80146CA0)(param_1); - } else { - func_80164930(param_1); - } -} - - -DEFINE_func_80164864() /* dedup: shared engine-core @0x80164864 (src/shared) */ - -// @class: regalloc-order — wave-3 real-TU crack (§42a); cracked at Max. -// Fix: D_801961D4 read needs direct-addressed `lhu` (u16). Cannot use `*(u16*)&D_801961D4` -// (forces &sym into a held reg -> drift) NOR a block-scoped `extern u16` (conflicting-types -// ERROR vs the ambient s16, cc1 exit 33). Solution: flip the file-scope decl (5802) to u16 — -// byte-neutral to the only other user (func_801647A4 store-only) — and reference directly. -typedef struct { - u16 f0; - u8 pad0[0x4e]; - int f50; - u8 pad1[0x14]; -} Ent_80164930_80164930; - - -void func_80164930(s32 param_1) { - int iVar3 = *(int *)(((int)param_1) + 0x20); - if (*(int *)(((int)param_1) + 0x50) == 0) { - short sVar1 = *(u16 *)(iVar3 + 0x1c) + 0x100; - short nv; - *(short *)(iVar3 + 0x1c) = sVar1; - *(short *)(iVar3 + 0x18) = sVar1; - *(short *)(iVar3 + 0x12) = *(u16 *)(iVar3 + 0x12) + 0x71; - nv = D_801961D4 - 8; - D_801961D4 = nv; - D_801961D2 = nv; - D_801961D0 = nv; - if (nv < -0x80) { - int i, lim; - Ent_80164930_80164930 *p; - for (i = 0, lim = 0x19, p = ((Ent_80164930_80164930 *)&D_8011F9D0); i < 0x14; i++) { - if (p->f0 == lim && p->f50 != 0) { - ((void(*)(Ent_80164930_80164930 *))func_80162CCC)(p); - } - p++; - } - ((void(*)(Ent_80164930_80164930 *))func_80162CCC)((Ent_80164930_80164930 *)((int)param_1)); - } else { - ((void(*)(int))func_80164ACC)(((int)param_1)); - } - } else { - short sVar1 = *(u16 *)(iVar3 + 0x1c) + 0x40; - u16 uVar2; - *(short *)(iVar3 + 0x1c) = sVar1; - *(short *)(iVar3 + 0x18) = sVar1; - uVar2 = *(u16 *)(iVar3 + 0x1a) - 0x200; - *(u16 *)(iVar3 + 0x1a) = uVar2; - if ((int)((unsigned)uVar2 << 0x10) < 0) { - *(short *)(iVar3 + 0x1a) = 0; - } - *(short *)(iVar3 + 0x12) = *(u16 *)(iVar3 + 0x12) - 0x71; - } -} - - - -DEFINE_func_80164A74() /* dedup: shared engine-core @0x80164A74 (src/shared) */ - -DEFINE_func_80164ACC() /* dedup: shared engine-core @0x80164ACC (src/shared) */ - - -extern void (*D_801961E4[])(void); - -void func_80164BA0(void *a0) { - D_801961E4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void func_80146578(void); -extern void func_8001CD50(s32 a0, s32 a1); -extern void func_800233CC(void *, unsigned short); -extern void func_80164DD0(s32 a0); -extern void func_80146CA0(void *a0); -extern void func_80164DB0(void); - -extern u8 D_801D3E80; -extern u8 D_801D3E81; -extern u8 D_801D3E82; -extern u8 D_801D3E83; -extern u8 D_801D3E84; -extern u8 D_801D3E85; -extern u8 D_801D3E86; -extern u8 D_801D3E87; - -void func_80164BDC(s32 param_1) -{ - register s32 p1 __asm__("$17"); /* $s1 */ - register s32 iVar1 __asm__("$16"); /* $s0 */ - register s32 base __asm__("$18"); /* $s2 */ - - p1 = param_1; - iVar1 = ((s32 (*)(void))func_80146578)(); - base = (s32)&D_801D3E80; - *(s32 *)(p1 + 0x20) = iVar1; - if (iVar1 != 0) { - func_8001CD50(iVar1, base); - ((void (*)(s32, s32))func_800233CC)(base, 0x60); - *(u32 *)(iVar1 + 4) = *(u32 *)(iVar1 + 4) | 0x50000000; - D_801D3E81 = 0xf0; - *(u8 *)base = 0xf0; - D_801D3E82 = 0xc0; - D_801D3E86 = 0; - D_801D3E85 = 0; - D_801D3E84 = 0; - D_801D3E87 = 0; - D_801D3E83 = 0; - *(s16 *)(iVar1 + 0x1e) = 0xccc; - *(s16 *)(iVar1 + 0x10) = 0x400; - *(s16 *)(p1 + 0x60) = 0x700; - *(s16 *)(p1 + 0x62) = -0x60; - func_80164DD0(p1); - ((void (*)(s32))func_80146CA0)(p1); - } else { - ((void (*)(s32))func_80164DB0)(p1); - } -} - - -DEFINE_func_80164CD4() /* dedup: shared engine-core @0x80164CD4 (src/shared) */ - -DEFINE_func_80164D4C() /* dedup: shared engine-core @0x80164D4C (src/shared) */ - -DEFINE_func_80164DB0() /* dedup: shared engine-core @0x80164DB0 (src/shared) */ - -DEFINE_func_80164DD0() /* dedup: shared engine-core @0x80164DD0 (src/shared) */ - - - - - -extern u8 D_801D3E80; -extern u8 D_801D3E81; -extern u8 D_801D3E82; - -s32 func_80164E40(void) { - u8 *p = &D_801D3E80; - if (*p != 0) { - *p -= 0x10; - } - if (D_801D3E81 != 0) { - D_801D3E81 -= 0x10; - } - if (D_801D3E82 != 0) { - D_801D3E82 -= 0x10; - } - return *(s32 *)p == 0; -} - - - -extern void (*D_801961F4[])(void); - -void func_80164EA4(void *a0) { - D_801961F4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: struct -// @stuck: none — MATCH - - /* stride 0x10 */ -extern DStruct D_801D3ECC[]; - -extern void func_80165124(void *a0); -extern void func_80146CA0(void *a0); - -void func_80164EE0(int param_1) -{ - int i; - - for (i = 7; i >= 0; i--) { - D_801D3ECC[i].f0 = 0; - } - *(short *)(param_1 + 0x2e) = 0x4000; - *(short *)(param_1 + 0x2c) = 0x4000; - *(short *)(param_1 + 0x60) = 0; - *(short *)(param_1 + 0x62) = 0; - ((void (*)(int))func_80165124)(param_1); - *(short *)(param_1 + 0x66) = 0; - ((void (*)(int))func_80146CA0)(param_1); -} - - -DEFINE_func_80164F44() /* dedup: shared engine-core @0x80164F44 (src/shared) */ - -DEFINE_func_80165024() /* dedup: shared engine-core @0x80165024 (src/shared) */ - -DEFINE_func_80165064() /* dedup: shared engine-core @0x80165064 (src/shared) */ - -DEFINE_func_801650C4() /* dedup: shared engine-core @0x801650C4 (src/shared) */ - -DEFINE_func_80165124() /* dedup: shared engine-core @0x80165124 (src/shared) */ - -// @class: struct -// @stuck: none — MATCH (30 ins) -// -// Unaligned slot-fill: loop over 8 slots (0x10 stride) of a global table, -// fill the first free one (field @0xC == 0). Two unaligned block copies from -// param_1 (packed struct assigns -> lwl/lwr/swl/swr). Key: recompute -// p = &D_801D3EC0[i] each iteration (NOT p++) so gcc reduces base+i*0x10 into -// a SINGLE pointer IV with immediate offsets 0/8/0xC. Hand-incrementing p makes -// combine_givs split the field offsets into a second pointer IV (+2 ins). - - -typedef struct { u8 d[8]; } __attribute__((packed, aligned(1))) B8_80165140; -typedef struct { u8 d[4]; } __attribute__((packed, aligned(1))) B4_80165140; -typedef struct { B8_80165140 a; B4_80165140 b; s32 used; } Slot_80165140; - - -s32 func_80165140(s32 param_1) { - extern Slot_80165140 D_801D3EC0[8]; - - int i; - Slot_80165140 *p; - for (i = 0; i < 8; i++) { - p = &D_801D3EC0[i]; - if (p->used == 0) { - p->used = 8; - p->a = *(B8_80165140 *)(((u8 *)param_1) + 0x2c); - p->b = *(B4_80165140 *)(((u8 *)param_1) + 0x50); - return; - } - } -} - - - - -// @class: schedule -// @stuck: none — MATCH (pins $s2/$s1/$s0 + zero-code barrier hoists $a0 copy into beqz delay slot) - -extern void func_80165240(void *param_1, void *param_2, void *param_3); -extern s32 D_801D3EC0; - -void func_801651B8(void * param_1) -{ - register s32 *puVar1 __asm__("$16"); /* $s0 */ - register s32 iVar2 __asm__("$17"); /* $s1 */ - register s32 p __asm__("$18"); /* $s2 */ - - p = param_1; - ((s32 (*)(s32, s32, s32))func_80165240)(p, p + 0x2c, p + 0x50); - iVar2 = 0; - puVar1 = &D_801D3EC0; - do { - if (puVar1[3] != 0) { - s32 a0v = p; - __asm__ __volatile__("" : "=r"(a0v) : "0"(a0v)); - ((s32 (*)(s32, s32, s32))func_80165240)(a0v, (s32)puVar1, (s32)(puVar1 + 2)); - puVar1[3] = puVar1[3] + -1; - } - iVar2 = iVar2 + 1; - puVar1 = puVar1 + 4; - } while (iVar2 < 8); -} - - -struct W4 { u32 w; } __attribute__((packed, aligned(1))); -extern void func_80016ED4(void *a0); -extern s32 func_80017DC4(void *a0, void *a1); - -void func_80165240(void *param_1, void *param_2, void *param_3) -{ - - extern u8 D_80196208[]; - extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; - extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; - extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; - extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; - u8 prim[0x40]; /* $sp+0x10 .. 0x50 */ - u8 mat[0x20]; /* $sp+0x50 .. 0x70 */ - u8 *p = prim; - - func_80017DC4(param_2, mat); - ApplyMatrixSV(mat, &D_80196208[0x00], p); - ApplyMatrixSV(mat, &D_80196208[0x08], prim + 0x08); - ApplyMatrixSV(mat, &D_80196208[0x10], prim + 0x10); - ApplyMatrixSV(mat, &D_80196208[0x18], prim + 0x18); - - *(s16 *)(prim + 0x04) = 3; - prim[0x38] = 0x2c; - *(u32 *)(prim + 0x20) = D_80196230; - *(u32 *)(prim + 0x24) = D_80196228; - *(u32 *)(prim + 0x28) = D_80196234; - *(u32 *)(prim + 0x2c) = D_8019622C; - *(struct W4 *)(prim + 0x30) = *(struct W4 *)param_3; - *(u32 *)(prim + 0x34) = 0x50000000; - - func_80016ED4(p); -} - - -DEFINE_func_8016533C() /* dedup: shared engine-core @0x8016533C (src/shared) */ - -DEFINE_func_80165374() /* dedup: shared engine-core @0x80165374 (src/shared) */ - -DEFINE_func_801653B8() /* dedup: shared engine-core @0x801653B8 (src/shared) */ - -DEFINE_func_801653F4() /* dedup: shared engine-core @0x801653F4 (src/shared) */ - - -// @class: struct -// @stuck: none — MATCH (54 ins) - -extern u8 D_80078E78[]; -extern u8 D_80078EC1; -extern void (*D_80196238[])(void); -extern u8 func_80165658(s32 a0, s32 a1); -extern void func_800CAE0C(s32 a0); - -void func_801654A8(s32 arg0) -{ - u8 *s1 = D_80078E78; - - if (*(u16 *)arg0 == 0x16) { - return; - } - if (*(u16 *)arg0 != 0x1A) { - if ((*(s32 *)(arg0 + 0x1F8) & 0x80FFFFFF) == 0) { - if (func_80165658(arg0, D_80078EC1) & 0x80) { - ((void (*)(s32))D_80196238[D_80078EC1 & 0x7F])(arg0); - } - } - } - if (*(u16 *)arg0 == 0x16) { - return; - } - if (*(u16 *)arg0 == 0x1A) { - return; - } - if (s1[0x49] == 0x19) { - func_800CAE0C(arg0); - } -} - - - -// @class: struct -// @stuck: none — MATCH (function-pointer-array dispatch; & 0x80 branch + & 0x7f index fold) - -extern u8 D_80078EC5; -extern u8 D_80078EC1; -extern void (*D_80196238[])(void); -extern void func_80165B28(void *a0); - -void func_80165580(s32 _arg0) -{ - if (D_80078EC5 & 0x80) { - ((void (*)(void))func_80165B28)(); - } else { - D_80196238[D_80078EC1 & 0x7F](); - } -} - - -DEFINE_func_801655E4() /* dedup: shared engine-core @0x801655E4 (src/shared) */ - -DEFINE_func_80165624() /* dedup: shared engine-core @0x80165624 (src/shared) */ - - -extern u8 D_801962B4[]; - -u8 func_80165658(s32 a0, s32 a1) { - return D_801962B4[a1 & 0x7F]; -} - - - -extern s32 D_801962D4[]; -extern s32 D_80078EC8; - -void func_80165670(s32 a0, s32 a1) { - D_80078EC8 = D_801962D4[a1 & 0x7F]; -} - - -DEFINE_func_80165694() /* dedup: shared engine-core @0x80165694 (src/shared) */ - - -extern u8 D_80196350[]; - -u8 func_801656D0(s32 a0, s32 a1) { - return D_80196350[a1 & 0x7F]; -} - - - -extern u8 D_80196370[]; - -u8 func_801656E8(s32 a0, s32 a1) { - return D_80196370[a1 & 0x7F]; -} - - - -extern u8 D_80196390[]; - -u8 func_80165700(s32 a0, s32 a1) { - return D_80196390[a1 & 0x7F]; -} - - -DEFINE_func_80165718() /* dedup: shared engine-core @0x80165718 (src/shared) */ - -DEFINE_func_80165770() /* dedup: shared engine-core @0x80165770 (src/shared) */ - -DEFINE_func_801657A0() /* dedup: shared engine-core @0x801657A0 (src/shared) */ - -DEFINE_func_801657D8() /* dedup: shared engine-core @0x801657D8 (src/shared) */ - -DEFINE_func_80165840() /* dedup: shared engine-core @0x80165840 (src/shared) */ - -DEFINE_func_80165874() /* dedup: shared engine-core @0x80165874 (src/shared) */ - -DEFINE_func_801658DC() /* dedup: shared engine-core @0x801658DC (src/shared) */ - -DEFINE_func_801658EC() /* dedup: shared engine-core @0x801658EC (src/shared) */ - -DEFINE_func_80165900() /* dedup: shared engine-core @0x80165900 (src/shared) */ - -DEFINE_func_80165910() /* dedup: shared engine-core @0x80165910 (src/shared) */ - -DEFINE_func_80165938() /* dedup: shared engine-core @0x80165938 (src/shared) */ - -DEFINE_func_80165958() /* dedup: shared engine-core @0x80165958 (src/shared) */ - -DEFINE_func_80165978() /* dedup: shared engine-core @0x80165978 (src/shared) */ - -DEFINE_func_80165988() /* dedup: shared engine-core @0x80165988 (src/shared) */ - -DEFINE_func_801659A8() /* dedup: shared engine-core @0x801659A8 (src/shared) */ - -DEFINE_func_801659B8() /* dedup: shared engine-core @0x801659B8 (src/shared) */ - -DEFINE_func_801659CC() /* dedup: shared engine-core @0x801659CC (src/shared) */ - - - -s32 func_801659DC(u8 *a0) { - - extern void (*D_801963B0[])(void); - D_801963B0[*(u8 *)((s32)a0 + 0x1A0)](); -} - - -DEFINE_func_80165A18() /* dedup: shared engine-core @0x80165A18 (src/shared) */ - -DEFINE_func_80165A20() /* dedup: shared engine-core @0x80165A20 (src/shared) */ - -DEFINE_func_80165A50() /* dedup: shared engine-core @0x80165A50 (src/shared) */ - -DEFINE_func_80165A78() /* dedup: shared engine-core @0x80165A78 (src/shared) */ - - -extern u8 D_80078EC1; -extern void (*D_8019642C[])(void); - -void func_80165AC8(void) { - D_8019642C[D_80078EC1 & 0x7F](); -} - - -DEFINE_func_80165B08() /* dedup: shared engine-core @0x80165B08 (src/shared) */ - -DEFINE_func_80165B10() /* dedup: shared engine-core @0x80165B10 (src/shared) */ - -DEFINE_func_80165B18() /* dedup: shared engine-core @0x80165B18 (src/shared) */ - -DEFINE_func_80165B20() /* dedup: shared engine-core @0x80165B20 (src/shared) */ - - -extern void (*D_801964A8[])(void); - -void func_80165B28(void *a0) { - *(u32 *)((s32)a0 + 0x44) |= 8; - D_801964A8[*(u8 *)((s32)a0 + 0x197)](); -} - - -DEFINE_func_80165B6C() /* dedup: shared engine-core @0x80165B6C (src/shared) */ - -DEFINE_func_80165BB4() /* dedup: shared engine-core @0x80165BB4 (src/shared) */ - -DEFINE_func_80165BFC() /* dedup: shared engine-core @0x80165BFC (src/shared) */ - -DEFINE_func_80165C58() /* dedup: shared engine-core @0x80165C58 (src/shared) */ - -DEFINE_func_80165C78() /* dedup: shared engine-core @0x80165C78 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80165CA0); - -extern M2C_UNK D_801D34B0; - -void func_80165E2C(u16 *arg0) { - func_8001534C(0, &D_801D34B0, 0x80, 0x80, 0, 0); - func_800153CC(1, *arg0, 0xA8, 0x80, 0x40, 0); -} - - -DEFINE_func_80165E90() /* dedup: shared engine-core @0x80165E90 (src/shared) */ - -DEFINE_func_80165FA4() /* dedup: shared engine-core @0x80165FA4 (src/shared) */ - - -extern void (*D_801964B4[])(void); - -void func_80166018(void *a0) { - D_801964B4[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80166054() /* dedup: shared engine-core @0x80166054 (src/shared) */ - -DEFINE_func_801661CC() /* dedup: shared engine-core @0x801661CC (src/shared) */ - -DEFINE_func_80166244() /* dedup: shared engine-core @0x80166244 (src/shared) */ - -DEFINE_func_8016629C() /* dedup: shared engine-core @0x8016629C (src/shared) */ - -DEFINE_func_801662F4() /* dedup: shared engine-core @0x801662F4 (src/shared) */ - -DEFINE_func_8016634C() /* dedup: shared engine-core @0x8016634C (src/shared) */ - -DEFINE_func_801663A4() /* dedup: shared engine-core @0x801663A4 (src/shared) */ - - -extern void (*D_801964BC[])(void); - -void func_801663FC(void *a0) { - D_801964BC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80166438() /* dedup: shared engine-core @0x80166438 (src/shared) */ - -DEFINE_func_801665B4() /* dedup: shared engine-core @0x801665B4 (src/shared) */ - - -extern void (*D_80196584[])(void); - -void func_80166618(void *a0) { - D_80196584[*(u16 *)((s32)a0 + 0x2)](); -} - - - -extern void (*D_80196594[])(void); - -void func_80166654(void *a0) { - D_80196594[*(u16 *)((s32)a0 + 0x2)](); -} - - -#include "common.h" - -typedef struct { u16 h[6]; } Rec_80166690_80166690; /* 12-byte sub-table record (stride 0xC) */ - -typedef struct { - short v0, v1, v2, pad06, w0, w1, w2, pad0E; /* 0x00..0x0F */ - short v3, v4, v5, pad16, w3, w4, w5, pad1E; /* 0x10..0x1F */ - u8 c00, c01, c02, pad23; /* 0x20 */ - u8 c10, c11, c12, pad27; /* 0x24 */ - u8 c20, c21, c22, pad2B; /* 0x28 */ - u8 c30, c31, c32, pad2F; /* 0x2C */ - int tag; /* 0x30 -> struct size 0x34; tag lands at sp+0x40 */ -} Frame_80166690_80166690; - - -s32 func_80166690(s32 param_1, s32 param_2) -{ - extern s32 func_80017758(void *a0, void *a1); - extern Blk20 D_800AE620; - extern u8 D_801D3F40[]; - - Frame_80166690_80166690 c; - Blk20 blk; - Rec_80166690_80166690 *sub; - Rec_80166690_80166690 *pv; - u8 *rec; - int i6; - int lt2; - int p2; - unsigned int uVar7, uVar8, uVar9; - int iVar3; - unsigned int w9, w7, w, t, w3b; - int w3; - short sVar10; - register unsigned int zr __asm__("$0"); - - blk = D_800AE620; - i6 = (short)param_1; - c.tag = 0x50000000; - rec = &D_801D3F40[i6 * 0xC4]; - sVar10 = 0; - if (rec[0] == 0) { - return 0; - } - sub = (Rec_80166690_80166690 *)(rec + 4); - uVar9 = rec[1]; - uVar8 = rec[3]; - uVar7 = uVar8 >> 1; - iVar3 = rec[2]; - w3 = iVar3 - 1; - iVar3 = w3 + zr; - if (w3 != -1) { - lt2 = i6 < 2; - p2 = (short)param_2; - do { - pv = &sub[(short)uVar9]; - c.v0 = pv->h[0]; - c.v1 = pv->h[1]; - c.v2 = pv->h[2]; - c.w0 = pv->h[3]; - c.w1 = pv->h[4]; - c.w2 = pv->h[5]; - sVar10 = sVar10 + 1; - - if (lt2) { - if (p2 == 0) { - t = uVar8 + zr; - c.c12 = t; c.c02 = t; - t = uVar7 + zr; - } else { - w = ((int)(uVar8 << 16) >> 17) + ((int)(uVar8 << 16) >> 19); - uVar7 = w + zr; - c.c12 = w; c.c02 = w; - t = uVar8 + zr; - } - c.c11 = t; c.c01 = t; c.c10 = t; c.c00 = t; - } else { - t = uVar8 + zr; - c.c10 = t; c.c00 = t; - t = uVar7 + zr; - c.c12 = t; c.c02 = t; c.c11 = t; c.c01 = t; - } - - w9 = uVar9 - 1; - uVar9 = w9 + zr; - if ((int)(w9 << 16) < 0) { - uVar9 = 0xF; - } - pv = &sub[(short)uVar9]; - c.v3 = pv->h[0]; - c.v4 = pv->h[1]; - c.v5 = pv->h[2]; - c.w3 = pv->h[3]; - c.w4 = pv->h[4]; - uVar8 = uVar8 - 0x10; - w7 = uVar7 - 0x10; - uVar7 = w7 + zr; - c.w5 = pv->h[5]; - if ((int)(w7 << 16) < 0) { - uVar7 = 0; - } - - if (lt2) { - if (p2 == 0) { - t = uVar8 + zr; - c.c32 = t; c.c22 = t; - t = uVar7 + zr; - } else { - t = uVar7 + zr; - c.c32 = t; c.c22 = t; - t = uVar8 + zr; - } - c.c31 = t; c.c21 = t; c.c30 = t; c.c20 = t; - } else { - t = uVar8 + zr; - c.c30 = t; c.c20 = t; - t = uVar7 + zr; - c.c32 = t; c.c22 = t; c.c31 = t; c.c21 = t; - } - - __asm__ __volatile__("" :: "r"(iVar3)); - func_80017758(&c, &blk); - w3b = iVar3 - 1; - iVar3 = w3b + zr; - } while ((short)w3b != -1); - } - return (short)sVar10; -} - - - - -/* func_80166994 — trail/afterimage ring recorder (0xC4-stride Trail records at D_801D3F40). - * param_2: 0=init, 1=advance(record), 2=fadeout; param_3: trail index (s16); param_4: divisor (s16). - * - * K&R definition: true s16 params => callee-side lazy per-use narrow/extend with raw pseudos - * (s3/t0/s4 hold raw a1/a2/a3; first-use extension allocates IN PLACE into the arg reg), while - * the promoted K&R type (int x4) stays compatible with the canon-sig s32 prototype in the TU. - * Returns s32 (v0=1 when the fadeout completes, else 0) => the //@EDIT above flips the split's - * canon-sig prototype return type, AND engine_core.h needs the once-global ec_edit (all 5 sites, - * byte-neutral: every caller discards the result): - * ec_edit old: "extern void func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); \" - * ec_edit new: "extern s32 func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); \" - * Without the ec_edit, cc1 hard-errors (conflicting types vs the void decls in DEFINE_ macros). - * - * Fully block-scoped (typedefs + externs inside the body) so the crack propagates ×134 via - * family_remap with zero file-scope footprint. No register pins. - */ -s32 func_80166994(param_1, param_2, param_3, param_4) - s32 param_1; - s16 param_2; - s16 param_3; - s16 param_4; -{ - typedef struct { s16 f0, f1, f2, f3, f4, f5; } TrailEntry; - typedef struct { u8 flag, idx, count, timer; TrailEntry e[16]; } Trail; - extern u8 D_801D3F40[]; - extern void RotTransSV(void *a0, void *a1, void *a2); - extern s32 VectorNormalSS(void *a0, void *a1); - - Trail *p = &((Trail *)D_801D3F40)[param_3]; - s32 uVar6 = *(s32 *)(param_1 + 0x34); - s16 v10[4]; - s16 v18[4]; - s16 v20[4]; - s16 v28[4]; - s16 out[4]; - s32 c; - - switch (param_2) { - case 0: - p->flag = 1; - p->count = 0; - p->idx = 0; - p->timer = 0xf4; - break; - case 1: - v20[0] = p->e[p->idx].f0; - v20[1] = p->e[p->idx].f1; - v20[2] = p->e[p->idx].f2; - v28[0] = p->e[p->idx].f3; - v28[1] = p->e[p->idx].f4; - v28[2] = p->e[p->idx].f5; - c = p->idx; - p->idx = c + 1; - if ((u8)(c + 1) > 0xf) { - p->idx = 0; - } - if (p->count < 0xf) { - p->count = p->count + 1; - } - break; - case 2: { - u8 bVar3 = p->timer - 0x10; - p->timer = bVar3; - if (bVar3 < 0x10) { - p->flag = 0; - return 1; - } - { - u8 bVar1 = p->count; - if (bVar1 >= 2 && (bVar3 >> 4) < bVar1) { - p->count = bVar1 - 1; - } - } - return 0; - } - } - - if (param_3 < 2) { - func_801484B0((s32)v10, (s32)v18); - } else { - func_80148534((s32)v10, (s32)v18); - } - func_80165FA4(uVar6, (s32)v10, (s32)v18); - ((void (*)(s32, s32, s32))func_80149350)(uVar6, (s32)v10, (s32)v10); - RotTransSV(v18, v18, out); - - if (param_2 != 0) { - v20[0] = (v10[0] + v20[0]) >> 1; - v20[1] = (v10[1] + v20[1]) >> 1; - v20[2] = (v10[2] + v20[2]) >> 1; - v28[0] = (v18[0] + v28[0]) >> 1; - v28[1] = (v18[1] + v28[1]) >> 1; - v28[2] = (v18[2] + v28[2]) >> 1; - v20[0] = v20[0] - v28[0]; - v20[1] = v20[1] - v28[1]; - v20[2] = v20[2] - v28[2]; - VectorNormalSS(v20, v20); - v20[0] = v28[0] + v20[0] / param_4; - v20[1] = v28[1] + v20[1] / param_4; - v20[2] = v28[2] + v20[2] / param_4; - p->e[p->idx].f0 = v20[0]; - p->e[p->idx].f1 = v20[1]; - p->e[p->idx].f2 = v20[2]; - p->e[p->idx].f3 = v28[0]; - p->e[p->idx].f4 = v28[1]; - p->e[p->idx].f5 = v28[2]; - c = p->idx; - p->idx = c + 1; - if ((u8)(c + 1) > 0xf) { - p->idx = 0; - } - if (p->count < 0xf) { - p->count = p->count + 1; - } - } - - p->e[p->idx].f0 = v10[0]; - p->e[p->idx].f1 = v10[1]; - p->e[p->idx].f2 = v10[2]; - p->e[p->idx].f3 = v18[0]; - p->e[p->idx].f4 = v18[1]; - p->e[p->idx].f5 = v18[2]; - return 0; -} - - -// @class: regalloc-order -// @stuck: none — MATCH (69 ins). Pins $s4/$s1 for param_2/param_3 + a1/a2-pinned temps -// with non-volatile SHB barriers force the sign-ext move-form; short iVar2 (unpinned) -// gives the temp-form counter increment that fills the skip-branch delay slots; -// loop-invariant eq=(p2==p3) hoisted; SHB(p2) after the move serializes param_2 before -// param_3's sign-ext (last ordering swap); param_1/param_4 left natural (arg-order saves). - - -#define SHB(x) __asm__("" : "=r"(x) : "0"(x)) - -s32 func_80166F58(s32 param_1, s32 param_2, s32 param_3, s32 param_4) -{ - extern unsigned char D_801D3F40[]; - - register int p2 __asm__("$20"); /* $s4 */ - register int p3 __asm__("$17"); /* $s1 */ - register int t2 __asm__("$5"); /* a1 */ - register int t3 __asm__("$6"); /* a2 */ - unsigned short *puVar1; - short iVar2; - int eq; - - iVar2 = 0; - puVar1 = ((unsigned short *)&D_8011D030); - t2 = ((short)param_2); SHB(t2); p2 = t2; SHB(p2); - t3 = ((short)param_3); SHB(t3); p3 = t3; - eq = (p2 == p3); - do { - if ((puVar1 != ((unsigned short *)param_1)) && - ((unsigned int)*puVar1 == p2 || (unsigned int)*puVar1 == p3) && - (!eq || - *(int *)(puVar1 + 0x16) == *(int *)(((unsigned short *)param_1) + 0x16))) { - ((void(*)(unsigned short *))func_80146C3C)(puVar1); - } - iVar2 = iVar2 + 1; - puVar1 = puVar1 + 0x2c; - } while (iVar2 < 0x1e); - ((void(*)(void *, int))func_80016714)(&D_801D3F40[((short)param_4) * 0xc4], 0xc4); -} - - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_8016706C); - - -// @class: schedule -// @stuck: 16/279 masked. 3 runs, ONE residual class: gcc's list-scheduler puts `la $s2` (p=DATA) + `addu $s4,$zero,$zero` (i=0) BEFORE the callee-arg address setup (addiu $a1,$sp,0x10 / addu $a2,$a1,$zero); the target emits them AFTER. Inert to ~40 statement-order permutations + pin/barrier combos (sched priority dominates the LUID tie-break, sched.c rank_for_schedule). Runs: 19-24 (blk1), 111-114 (region-B cx-load rotation), 177-182 (blk3). Permuter fuel. - - - - -extern void func_80149350(s32); -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 RotMatrixYXZ(void *a0, void *a1); -extern s32 func_80017758(void *a0, void *a1); -extern s32 func_80017DC4(void *a0, void *a1); -extern void func_80048EAC(void *a0, void *a1); - - -s32 func_801670E4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { - - extern u8 D_801964D8[]; - extern u8 D_801964C4[]; - extern u8 D_801964EC[]; - extern s32 D_801269A4; - extern s32 D_801269A8; - extern s32 D_801269AC; - extern u16 D_80126CE0; - Fr_801670E4 f; - register u8 *p __asm__("$18"); /* $s2 */ - register s32 ent __asm__("$19"); /* $s3 */ - s16 i; - s32 d; - s32 node; - u16 c; - u8 cv; - u8 cv2; - register s32 gA __asm__("$2"); - register s32 cxv __asm__("$4"); - register s32 czv __asm__("$5"); - u8 *vc; - u8 *ap; - u8 *mp; - u8 *va; - u8 *vb; - - ent = arg0; - node = *(s32 *)(ent + 0x34); - f.v[1].z = 0; - f.v[1].y = 0; - f.v[1].x = 0; - f.v[3].z = 0; - f.v[2].z = 0; - f.v[0].z = 0; - f.col[1].b = 0x70; - cv = *(u8 *)(ent + 0x12); - f.cx = arg1; - __asm__ __volatile__(""); - va = (u8 *)&f.cx; - __asm__ __volatile__("" : "=r"(va) : "0"(va)); - f.cy = arg2; - vb = va; - __asm__ __volatile__("" : "=r"(vb) : "0"(vb)); - p = D_801964D8; - i = 0; - f.col[0].b = 0; - f.col[0].g = 0; - f.col[0].r = 0; - f.col[2].b = 0; - f.col[2].g = 0; - f.col[2].r = 0; - f.col[3].b = 0; - f.col[3].g = 0; - f.col[3].r = 0; - f.code = 0x50000000; - f.cz = arg3; - f.col[1].r = cv; - f.col[1].g = cv; - ((void (*)(s32, void *, void *))func_80149350)(node, va, vb); - - c = f.cx; - *(s16 *)(ent + 0x06) = c; - *(s32 *)(ent + 0x4C) = (s16)c; - c = f.cy; - *(s16 *)(ent + 0x0A) = c; - *(s32 *)(ent + 0x50) = (s16)c; - c = f.cz; - *(s16 *)(ent + 0x0E) = c; - *(s32 *)(ent + 0x54) = (s16)c; - func_800D20C0(&f.cx, f.a8, 7); - func_80017E68(&f.cx, f.m1); - func_800D23D0(f.a8); - RotMatrixYXZ(f.a8, f.m1); - - do { - f.v[0].x = (s8)*p++; - f.v[0].y = (s8)*p++; - f.v[2].x = (s8)*p++; - f.v[2].y = (s8)*p++; - f.v[3].x = (s8)*p++; - f.v[3].y = (s8)*p--; - func_80017758(f.v, f.m1); - } while ((i = i + 1) < 4); - - p = D_801964C4; - gA = 0xA0; - cxv = (s16)f.cx; - f.col[1].g = gA; - gA = D_801269A4; - czv = (s16)f.cz; - f.col[1].b = 0x10; - f.col[1].r = 0x10; - f.pos[0] = gA - cxv; - i = 0; - f.v[3].y = 0; - f.v[2].y = 0; - f.v[0].y = 0; - f.pos[1] = D_801269A8 - (s16)f.cy; - f.pos[2] = D_801269AC - czv; - - do { - f.v[0].x = (s8)*p++; - f.v[0].z = (s8)*p++; - f.v[2].x = (s8)*p++; - f.v[2].z = (s8)*p++; - f.v[3].x = (s8)*p++; - f.v[3].z = (s8)*p--; - func_80017758(f.v, (void *)(ent + 0x38)); - } while ((i = i + 1) < 4); - - if (*(s32 *)(ent + 0x30) > 0) { - vc = (u8 *)&f.cx; - __asm__ __volatile__("" : "=r"(vc) : "0"(vc)); - mp = f.m1; - ap = mp; - __asm__ __volatile__("" : "=r"(ap) : "0"(ap)); - p = D_801964EC; - i = 0; - d = (s16)f.a8[0] >> 6; - f.cx += d; - f.cy += d; - f.cz += d; - func_80017E68(vc, ap); - f.cx = f.cy = f.cz = ((u32)*(s32 *)(ent + 0x30) >> 1) + D_80126CE0 * 0x20; - func_80017DC4(&f.cx, f.m2); - func_80048EAC(f.m2, mp); - f.v[3].z = 0; - f.v[2].z = 0; - f.v[0].z = 0; - cv2 = *(u8 *)(ent + 0x12); - f.col[1].b = 0x20; - f.col[1].r = 0x20; - f.col[3].b = 0; - f.col[3].r = 0; - f.col[2].b = 0; - f.col[2].r = 0; - f.col[0].b = 0; - f.col[0].r = 0; - f.col[3].g = 0; - f.col[2].g = 0; - f.col[0].g = 0; - f.col[1].g = cv2 + 0x60; - do { - f.v[0].x = (s8)*p++; - f.v[0].y = (s8)*p++; - f.v[2].x = (s8)*p++; - f.v[2].y = (s8)*p++; - f.v[3].x = (s8)*p++; - f.v[3].y = (s8)*p--; - func_80017758(f.v, f.m1); - } while ((i = i + 1) < 8); - } -} - - - -typedef struct { s32 m[8]; } Mat_80167540; /* 0x20 bytes */ - -struct Src_80167540 { - u8 pad0[0x34]; - Mat_80167540 mat; /* 0x34 */ -}; - -struct Sub2_80167540 { - u8 pad0[0x44]; - s32 unk44; /* 0x44 */ -}; - -struct Node_80167540 { - /* 0x0 */ u16 unk0; - u8 pad2[0x4]; - /* 0x6 */ s16 unk6; - u8 pad8[0x2]; - /* 0xA */ s16 unkA; - u8 padC[0x2]; - /* 0xE */ s16 unkE; - u8 pad10[0x10]; - /* 0x20 */ struct Src_80167540 *unk20; - u8 pad24[0x28]; - /* 0x4C */ struct Sub2_80167540 *unk4C; -}; - -struct Entity_80167540 { - /* 0x0 */ s16 unk0; - /* 0x2 */ u16 unk2; - u8 pad4[0xC]; - /* 0x10 */ s16 unk10; - /* 0x12 */ s16 unk12; - u8 pad14[0x8]; - /* 0x1C */ s32 unk1C; - u8 pad20[0x10]; - /* 0x30 */ s32 unk30; - /* 0x34 */ struct Node_80167540 *unk34; - /* 0x38 */ Mat_80167540 mat; -}; - - -s32 func_80167540(s32 arg0) { - - struct Node_80167540 *node; - struct Entity_80167540 *ent; - s32 v; - - node = ((struct Entity_80167540 *)arg0)->unk34; - if (node->unk0 == 1) { - if (((struct Entity_80167540 *)arg0)->unk12 > ((struct Entity_80167540 *)arg0)->unk10) { - if (((struct Entity_80167540 *)arg0)->unk1C > 0) { - ((struct Entity_80167540 *)arg0)->unk10 = (s16) (rand() & 0x30); - v = -0x30; - goto shared; - } - } else if (((struct Entity_80167540 *)arg0)->unk1C < 0) { - ((struct Entity_80167540 *)arg0)->unk10 = (s16) ((rand() & 0x30) + 0x40); - v = 0x30; -shared: - ((struct Entity_80167540 *)arg0)->unk1C = v; - } - ((struct Entity_80167540 *)arg0)->unk12 = (s16) (((struct Entity_80167540 *)arg0)->unk12 + ((struct Entity_80167540 *)arg0)->unk1C); - ((struct Entity_80167540 *)arg0)->mat = node->unk20->mat; - ((void (*)(struct Entity_80167540 *, s32, s32, s32))func_801670E4)(((struct Entity_80167540 *)arg0), 0, 0, 0); - ent = ((struct Entity_80167540 *(*)(s32, struct Entity_80167540 *, s16, s16, s32, s32, s32))func_80146A6C)(0xE, ((struct Entity_80167540 *)arg0), node->unk6, node->unkA, node->unkE, 0, 0); - if (ent != 0) { - ent->mat = node->unk20->mat; - } - if (((struct Entity_80167540 *)arg0)->unk34->unk4C->unk44 & 0x20) { - ((struct Entity_80167540 *)arg0)->unk30 = 0x600; - ((struct Entity_80167540 *)arg0)->unk2 = (u16) (((struct Entity_80167540 *)arg0)->unk2 + 1); - } - } else { - ((void(*)(struct Entity_80167540 *))func_80146C3C)(((struct Entity_80167540 *)arg0)); - } -} - - - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80167714); - - -extern void (*D_801965A4[])(void); - -void func_801678B4(void *a0) { - D_801965A4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -DEFINE_func_801678F0() /* dedup: shared engine-core @0x801678F0 (src/shared) */ - - - -extern void (*D_801965B0[])(void); - -void func_80167A9C(void *a0) { - D_801965B0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH expected; mirrors already-matched sibling func_8016A290 (same 3-loop tail), swapping the inline matrix-setup for a func_80168070 call + constant color block. - -#include "common.h" - - - -typedef struct { s16 x, y, z, pad; } SVEC_80167AE0; - -struct Fr_80167AE0 { - u8 matrix[0x20]; /* 0x00 -> sp+0x10 */ - SVEC_80167AE0 v[4]; /* 0x20 -> sp+0x30 */ - struct { u8 r, g, b, pad; } col[4]; /* 0x40 -> sp+0x50 */ - u32 code; /* 0x50 -> sp+0x60 */ -}; - -s32 func_80167AE0(s32 param_1, s32 param_2, s32 param_3) { - extern void func_80168070(s32 param_1, s16 *param_2, s16 *param_3, void *param_4); - extern s32 func_80017758(void *a0, void *a1); - extern u8 D_801966BC; - extern u8 D_801966D0[]; - - struct Fr_80167AE0 fr; - u8 *p; - s32 i; - register s32 t __asm__("$2"); - register s32 zr __asm__("$0"); - s32 flags; - - func_80168070(param_1, ((s16 *)param_2), ((s16 *)param_3), fr.matrix); - - fr.v[3].z = 0; - fr.v[2].z = 0; - fr.v[0].z = 0; - fr.v[1].z = 0; - fr.v[1].y = 0; - fr.v[1].x = 0; - flags = D_800B99DA; - if (flags & 1) { - fr.col[1].r = 0xa0; - } else if (flags & 2) { - fr.col[1].r = 0xc0; - } else { - fr.col[1].r = 0x80; - } - - p = ((u8 *)&D_801966BC); - fr.col[0].b = 0; - fr.col[0].g = 0; - fr.col[0].r = 0; - fr.col[2].b = 0; - fr.col[2].g = 0; - fr.col[2].r = 0; - fr.col[3].b = 0; - fr.col[3].g = 0; - fr.col[3].r = 0; - fr.code = 0x50000000; - fr.col[1].b = fr.col[1].r >> 2; - fr.col[1].g = fr.col[1].r >> 2; - i = 0; -L1: - fr.v[0].x = (s8)*p++; - fr.v[0].y = (s8)*p++; - fr.v[2].x = (s8)*p++; - fr.v[2].y = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].y = (s8)*p--; - func_80017758(fr.v, fr.matrix); - t = i + 1; - i = t + zr; - if ((s16)t < 4) goto L1; - - fr.v[3].y = 0; - fr.v[2].y = 0; - fr.v[0].y = 0; - fr.v[1].y = 0; - fr.v[1].x = 0; - fr.v[1].z = -0x20; - p = D_801966D0; - i = 0; -L2: - fr.v[0].x = (s8)*p++; - fr.v[0].z = (s8)*p++; - fr.v[2].x = (s8)*p++; - fr.v[2].z = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].z = (s8)*p--; - func_80017758(fr.v, fr.matrix); - if ((s16)i == 1) { - fr.v[1].z = 0x20; - p += 2; - } - t = i + 1; - i = t + zr; - if ((s16)t < 4) goto L2; - - p += 2; - fr.v[0].x = 0; - fr.v[0].z = -0x20; - fr.col[0].r = fr.col[1].r; - fr.col[0].b = fr.col[1].g; - fr.col[0].g = fr.col[1].g; - i = 0; -L3: - fr.v[2].x = (s8)*p++; - fr.v[2].z = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].z = (s8)*p++; - func_80017758(fr.v, fr.matrix); - t = i + 1; - i = t + zr; - if ((s16)t < 2) goto L3; -} - - - - -// @class: schedule -// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. - -extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); -extern u16 D_800B99DA; -extern u8 D_80196510[]; -extern u8 D_80196524[]; - -s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { - u8 buf[0x54]; - u8 *p; - s16 i; - - func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); - - *(s16 *)(buf + 0x3C) = 0; - *(s16 *)(buf + 0x34) = 0; - *(s16 *)(buf + 0x24) = 0; - *(s16 *)(buf + 0x2C) = 0; - *(s16 *)(buf + 0x2A) = 0; - *(s16 *)(buf + 0x28) = 0; - if (D_800B99DA & 1) { - buf[0x46] = 0x58; - } else { - buf[0x46] = 0x48; - } - buf[0x45] = buf[0x46] >> 2; - buf[0x44] = buf[0x45]; - if (((u8 (*)(s32))func_80029178)(0x81) != 0) { - buf[0x45] = buf[0x45] << 2; - buf[0x46] = buf[0x46] >> 1; - } - - p = D_80196510; - buf[0x42] = 0; - buf[0x41] = 0; - buf[0x40] = 0; - buf[0x4A] = 0; - buf[0x49] = 0; - buf[0x48] = 0; - buf[0x4E] = 0; - buf[0x4D] = 0; - buf[0x4C] = 0; - *(s32 *)(buf + 0x50) = 0x50000000; - - for (i = 0; i < 4; i++) { - *(s16 *)(buf + 0x20) = (s8)*p++; - *(s16 *)(buf + 0x22) = (s8)*p++; - *(s16 *)(buf + 0x30) = (s8)*p++; - *(s16 *)(buf + 0x32) = (s8)*p++; - *(s16 *)(buf + 0x38) = (s8)*p++; - *(s16 *)(buf + 0x3A) = (s8)*p--; - func_80017758(buf + 0x20, buf); - } - - p = D_80196524; - *(s16 *)(buf + 0x2C) = -0x12; - *(s16 *)(buf + 0x3A) = 0; - *(s16 *)(buf + 0x32) = 0; - *(s16 *)(buf + 0x22) = 0; - *(s16 *)(buf + 0x2A) = 0; - *(s16 *)(buf + 0x28) = 0; - buf[0x46] = buf[0x46] << 1; - buf[0x44] = buf[0x45] = buf[0x45] << 1; - - for (i = 0; i < 4; i++) { - *(s16 *)(buf + 0x20) = (s8)*p++; - *(s16 *)(buf + 0x24) = (s8)*p++; - *(s16 *)(buf + 0x30) = (s8)*p++; - *(s16 *)(buf + 0x34) = (s8)*p++; - *(s16 *)(buf + 0x38) = (s8)*p++; - *(s16 *)(buf + 0x3C) = (s8)*p--; - if (i == 2) { - buf[0x4E] = buf[0x46]; - buf[0x4D] = buf[0x44]; - buf[0x4C] = buf[0x4D]; - } else if (i == 3) { - buf[0x4E] = 0; - buf[0x4D] = 0; - buf[0x4C] = buf[0x4D]; - buf[0x42] = buf[0x46]; - buf[0x41] = buf[0x44]; - buf[0x40] = buf[0x44]; - } - func_80017758(buf + 0x20, buf); - } -} - - -DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_801681FC); - -DEFINE_func_8016829C() /* dedup: shared engine-core @0x8016829C (src/shared) */ - -DEFINE_func_80168328() /* dedup: shared engine-core @0x80168328 (src/shared) */ - -DEFINE_func_801683D8() /* dedup: shared engine-core @0x801683D8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80168430); - -DEFINE_func_801684B4() /* dedup: shared engine-core @0x801684B4 (src/shared) */ - -DEFINE_func_80168540() /* dedup: shared engine-core @0x80168540 (src/shared) */ - -DEFINE_func_801685EC() /* dedup: shared engine-core @0x801685EC (src/shared) */ - -DEFINE_func_80168640() /* dedup: shared engine-core @0x80168640 (src/shared) */ - -DEFINE_func_80168664() /* dedup: shared engine-core @0x80168664 (src/shared) */ - - -extern void (*D_801965C8[])(void); - -void func_80168744(void *a0) { - D_801965C8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80168780() /* dedup: shared engine-core @0x80168780 (src/shared) */ - -DEFINE_func_801687CC() /* dedup: shared engine-core @0x801687CC (src/shared) */ - -// @class: decl-conflict (reconcile) — MATCH (108 ins), real-TU verified via rtu_match -// @crack: The wave-2 "8-residual SCHEDULE" note was a STALE-OBJECT / isolation phantom (§42b): -// in the real TU the draft NOCOMPILEs — DEFINE_func_801687CC() (split line ~6757) expands -// `extern void func_80168828(void);` right before the def, so `void func_80168828(s32 param_1)` -// is a HARD `conflicting types` error (cc1 exit 33). RECONCILE-FIRST fix (sweep-safe, lives -// entirely in the def — no //@EDIT, no macro edit): declare the fn `(void)` and capture a0 via -// register s32 a0v __asm__("$4"); s32 param_1 = a0v; -// The register-var binds incoming $a0; copying it into a NORMAL pseudo (live across the calls) -// makes gcc allocate param_1 to a callee-saved reg, emitting the target's `addu $s1,$a0,$zero` -// at idx2. NOTE: a DIRECT `register s32 param_1 __asm__("$4")` FAILS (param_1 stays in the -// call-clobbered $a0 → 100-off). With this reconcile, gcc's natural schedule places the CSE'd -// `li $v1,0x40` at idx15 with ZERO extra levers — the §42a lever-4 consumer-block reorder was -// never needed. The $v1 pin (register c40 __asm__("$3")) is still load-bearing (else 0x40 folds -// to a $v0 immediate). 134-overlay family exemplar: only D_801965B8 differs -> banks x134. -#include "common.h" - -typedef struct { - u16 f00, f02, f04, f06; - s16 f08; - u16 f0a, f0c, f0e, f10, f12, f14, f16; - u8 f18, f19, f1a, f1b, f1c, f1d, f1e, f1f, f20, f21, f22, f23; - u32 f24; -} Thing_80168828_80168828; - - -void func_80168828() -{ - extern s32 func_80017DC4(void *a0, void *a1); - extern void func_80049CAC(s32 a0, s32 a1); - extern void func_800173BC(void *a0, void *a1); - extern u16 D_801965B8[]; - - - register s32 a0v __asm__("$4"); - s32 param_1 = a0v; - Thing_80168828_80168828 thing; - s16 matA[16]; - s16 matB[16]; - s16 svec[4]; - u16 *p; - short i; - register s32 c40 __asm__("$3"); /* $v1: hold the CSE'd 0x40 (else gcc folds to $v0 immediate) */ - - c40 = 0x40; - thing.f04 = 2; - thing.f0c = 0x24; - thing.f14 = 0x28; - thing.f08 = -3; - thing.f10 = 3; - thing.f02 = 0; - thing.f00 = 0; - thing.f12 = 0; - thing.f0a = 0; - thing.f18 = c40; - thing.f19 = c40; - thing.f22 = c40; - thing.f1e = c40; - thing.f1a = 0x10; - thing.f20 = 0xff; - thing.f1c = 0xff; - thing.f21 = 0xc0; - thing.f1d = 0xc0; - thing.f24 = 0x50000000; - - svec[0] = *(u16 *)(param_1 + 6); - svec[1] = *(u16 *)(param_1 + 0xA); - svec[2] = *(u16 *)(param_1 + 0xE); - func_80017E68(svec, matA); - - svec[0] = svec[1] = svec[2] = (*(s32 *)(param_1 + 0x1C) << 11) + 0x1000; - ((void (*)(void *, void *))func_80017DC4)(svec, matA); - - svec[0] = *(u16 *)(param_1 + 0x12); - svec[1] = *(u16 *)(param_1 + 0x16); - svec[2] = *(u16 *)(param_1 + 0x1A); - RotMatrixYXZ(svec, matB); - - func_80048EAC(matA, matB); - - svec[1] = 0; - p = D_801965B8; - for (i = 0; i < 4; i++) { - svec[0] = *p++; - svec[2] = *p++; - ((void (*)(void *, void *))func_80049CAC)(svec, matA); - func_80048EAC(matB, matA); - func_800173BC(&thing, matA); - } -} - - - - -extern void (*D_801965D0[])(void); - -void func_801689D8(void *a0) { - D_801965D0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80168A14() /* dedup: shared engine-core @0x80168A14 (src/shared) */ - -DEFINE_func_80168A88() /* dedup: shared engine-core @0x80168A88 (src/shared) */ - - -extern void (*D_801965D8[])(void); - -void func_80168AA8(void *a0) { - D_801965D8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80168AE4() /* dedup: shared engine-core @0x80168AE4 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80168B70); - -DEFINE_func_80168BDC() /* dedup: shared engine-core @0x80168BDC (src/shared) */ - - -extern void (*D_801965E0[])(void); - -void func_80168D58(void *a0) { - D_801965E0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80168D94() /* dedup: shared engine-core @0x80168D94 (src/shared) */ - -DEFINE_func_80168EC4() /* dedup: shared engine-core @0x80168EC4 (src/shared) */ - -DEFINE_func_80168F40() /* dedup: shared engine-core @0x80168F40 (src/shared) */ - - -extern void (*D_801965E8[])(void); - -void func_8016901C(void *a0) { - D_801965E8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80169058() /* dedup: shared engine-core @0x80169058 (src/shared) */ - -DEFINE_func_801691B8() /* dedup: shared engine-core @0x801691B8 (src/shared) */ - -INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015AE2C", func_80169228); - - -extern void (*D_801965F0[])(void); - -void func_801693CC(void *a0) { - D_801965F0[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_80169408() /* dedup: shared engine-core @0x80169408 (src/shared) */ - -DEFINE_func_8016951C() /* dedup: shared engine-core @0x8016951C (src/shared) */ - -DEFINE_func_80169584() /* dedup: shared engine-core @0x80169584 (src/shared) */ - -DEFINE_func_801696D8() /* dedup: shared engine-core @0x801696D8 (src/shared) */ - - -extern void (*D_801965F8[])(void); - -void func_80169830(void *a0) { - D_801965F8[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8016986C() /* dedup: shared engine-core @0x8016986C (src/shared) */ - -DEFINE_func_801699D0() /* dedup: shared engine-core @0x801699D0 (src/shared) */ - -DEFINE_func_80169A4C() /* dedup: shared engine-core @0x80169A4C (src/shared) */ - - -extern void (*D_801966AC[])(void); - -void func_80169B80(void *a0) { - D_801966AC[*(u16 *)((s32)a0 + 0x2)](); -} - - - - -extern void func_800D2318(void); -extern void RotMatrixYXZ(void *a0, void *a1); -extern void ApplyMatrixSV(void *a0, void *a1, void *a2); -extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); -extern s32 func_800D222C(void *a0, void *a1, s32 a2); -extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); -extern s32 ratan2(s32 a0, s32 a1); -extern void func_80048D9C(void *a0, void *a1); -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); -extern void func_80146C3C(void); - -void func_80169BBC(s32 arg0) { - - extern s32 D_801269A4; - extern s32 D_801269A8; - extern s32 D_801269AC; - extern u16 D_80196600[]; - extern u8 D_80196670[]; - extern u8 D_801966A0[]; - extern u8 D_801D5A58[]; - u16 rot[4]; - s16 vec[4]; - s32 pos[4]; - s16 mtx[16]; - s32 p1; - s32 s2; - - func_800D2318(); - rot[0] = *(u16 *)(arg0 + 0x12); - rot[1] = *(u16 *)(arg0 + 0x16); - rot[2] = 0; - RotMatrixYXZ(rot, mtx); - vec[0] = 0; - vec[1] = -2; - vec[2] = -0x14; - ApplyMatrixSV(mtx, vec, vec); - *(u16 *)(arg0 + 6) = *(u16 *)(arg0 + 6) + (u16)vec[0]; - *(u16 *)(arg0 + 0xA) = *(u16 *)(arg0 + 0xA) + (u16)vec[1]; - *(u16 *)(arg0 + 0xE) = *(u16 *)(arg0 + 0xE) + (u16)vec[2]; - p1 = func_80146A6C(9, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), - *(s16 *)(arg0 + 0xE), 0, 0); - if (p1 != 0) { - *(u16 *)(p1 + 0x12) = rot[0]; - *(u16 *)(p1 + 0x16) = rot[1]; - *(u16 *)(p1 + 0x1A) = rot[2]; - } - func_80146A6C(0xC, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), - *(s16 *)(arg0 + 0xE), 0, 0); - s2 = func_800D222C((void *)arg0, D_801966A0, 0x17); - if (s2 != 0) { - *(s32 *)(arg0 + 0x20) = s2; - rot[0] = rot[0] + D_80196600[*(s32 *)(arg0 + 0x30)]; - rot[1] = rot[1] - 0x400; - RotMatrixYXZ(rot, mtx); - pos[0] = D_801269A4 - *(s16 *)(arg0 + 6); - pos[1] = D_801269A8 - *(s16 *)(arg0 + 0xA); - pos[2] = D_801269AC - *(s16 *)(arg0 + 0xE); - ApplyTransposeMatrixLV(mtx, pos, pos); - rot[2] = -ratan2(pos[0], pos[1]); - vec[0] = 0x400; - vec[1] = -0x400; - vec[2] = 0; - RotMatrixYXZ(vec, mtx); - *(s32 *)(s2 + 0x34) = (s32)D_801D5A58; - RotMatrixYXZ(rot, D_801D5A58); - func_80048D9C(D_801D5A58, mtx); - *(u16 *)(s2 + 0x18) = 0x5000; - *(u16 *)(s2 + 0x1A) = 0x2000; - *(s32 *)(s2 + 4) = *(s32 *)(s2 + 4) | 0xC000140; - func_80128EA8(s2, arg0 + 0x24, (s32)D_80196670); - *(u16 *)(arg0 + 2) = *(u16 *)(arg0 + 2) + 1; - } else { - ((void (*)(s32))func_80146C3C)(arg0); - } -} - - -DEFINE_func_80169E44() /* dedup: shared engine-core @0x80169E44 (src/shared) */ - - -extern void (*D_801966B4[])(void); - -void func_80169F00(void *a0) { - D_801966B4[*(u16 *)((s32)a0 + 0x2)](); -} - - - -// @class: plumbing -// @stuck: none — MATCH (expected; simple straight-line + single branch, one call-crossing local in $s0) - -extern void func_800D1FC8(s32 a0, s32 a1); -extern s32 func_800D21C4(s32 a0, void *a1, s32 a2); -extern void func_80128EA8(s32 a0, s32 a1, s32 a2); -extern void func_80146C3C(void); - -extern char D_80196664[]; -extern char D_80196624[]; - -void func_80169F3C(int param_1) -{ - int iVar1; - - ((int (*)(int, int))func_800D1FC8)(param_1, 6); - iVar1 = func_800D21C4(param_1, D_80196664, 0x16); - if (iVar1 != 0) { - *(int *)(param_1 + 0x20) = iVar1; - *(short *)(iVar1 + 0x1a) = 0x2000; - *(short *)(iVar1 + 0x18) = 0x2000; - *(char *)(iVar1 + 0x26) = 0x60; - *(char *)(iVar1 + 0x25) = 0x60; - *(char *)(iVar1 + 0x24) = 0x60; - *(unsigned int *)(iVar1 + 4) = *(unsigned int *)(iVar1 + 4) | 0x50000000; - ((void (*)(int, int, void *))func_80128EA8)(iVar1, param_1 + 0x24, D_80196624); - *(short *)(param_1 + 2) = *(short *)(param_1 + 2) + 1; - } else { - ((void (*)(int))func_80146C3C)(param_1); - } -} - - -DEFINE_func_80169FE0() /* dedup: shared engine-core @0x80169FE0 (src/shared) */ - - -extern void (*D_801966EC[])(void); - -void func_8016A020(void *a0) { - D_801966EC[*(u16 *)((s32)a0 + 0x2)](); -} - - -DEFINE_func_8016A05C() /* dedup: shared engine-core @0x8016A05C (src/shared) */ - -DEFINE_func_8016A08C() /* dedup: shared engine-core @0x8016A08C (src/shared) */ - -DEFINE_func_8016A1CC() /* dedup: shared engine-core @0x8016A1CC (src/shared) */ - -// @class: regalloc-order -// @stuck: none — MATCH (284 ins). Loop-counter biv update: pinned $v0 temp + $0-add opaque copy (i = t + zr) forces the target's 2-insn `addiu v0,s1,1; addu s1,v0,zero` and keeps CSE from rewriting the (s16)t test to read s1. - -#include "common.h" - - - -typedef struct { s16 x, y, z, pad; } SVEC_8016A290; - -struct Fr_8016A290 { - SVEC_8016A290 center; /* 0x00 -> sp+0x10 */ - SVEC_8016A290 diff; /* 0x08 -> sp+0x18 */ - s32 pos[3]; /* 0x10 -> sp+0x20 */ - s32 _pad1c; /* 0x1C -> sp+0x2C */ - s16 mtx[32]; /* 0x20 -> sp+0x30 */ - SVEC_8016A290 v[4]; /* 0x60 -> sp+0x70 */ - struct { u8 r, g, b, pad; } col[4]; /* 0x80 -> sp+0x90 */ - u32 code; /* 0x90 -> sp+0xA0 */ -}; - -void func_8016A290(s32 param_1, void *param_2, void *param_3) { - extern u8 D_801966BC; - extern u8 D_801966D0[]; - - struct Fr_8016A290 fr; - u8 *p; - s32 i; - register s32 t __asm__("$2"); - register s32 zr __asm__("$0"); - s32 flags; - s32 iVar3; - - iVar3 = *(s32 *)(param_1 + 0x34); - - fr.center.x = (*((s16 *)param_2) + *((s16 *)param_3)) >> 1; - fr.center.y = (((s16 *)param_2)[1] + ((s16 *)param_3)[1]) >> 1; - fr.center.z = (((s16 *)param_2)[2] + ((s16 *)param_3)[2]) >> 1; - ((void(*)(s32, void *, void *))func_80149350)(iVar3, &fr.center, &fr.center); - - *(u16 *)(param_1 + 0x6) = *(u16 *)&fr.center.x; - *(u16 *)(param_1 + 0xA) = *(u16 *)&fr.center.y; - *(u16 *)(param_1 + 0xE) = *(u16 *)&fr.center.z; - func_800D20C0(&fr.center, &fr.diff, 8); - func_80017E68(&fr.center, fr.mtx); - - fr.diff.x = *(u16 *)((s16 *)param_3) - *(u16 *)((s16 *)param_2); - fr.diff.y = *(u16 *)(((s16 *)param_3) + 1) - *(u16 *)(((s16 *)param_2) + 1); - fr.diff.z = *(u16 *)(((s16 *)param_3) + 2) - *(u16 *)(((s16 *)param_2) + 2); - ((void(*)(s32, void *, void *))ApplyMatrixSV)(*(s32 *)(iVar3 + 0x20) + 0x34, &fr.diff, &fr.diff); - func_800D23D0(&fr.diff); - RotMatrixYXZ(&fr.diff, fr.mtx); - - fr.pos[0] = D_801269A4 - fr.center.x; - fr.pos[1] = D_801269A8 - fr.center.y; - fr.pos[2] = D_801269AC - fr.center.z; - ApplyTransposeMatrixLV(fr.mtx, fr.pos, fr.pos); - fr.diff.z = -ratan2(fr.pos[0], fr.pos[1]); - RotMatrixYXZ(&fr.diff, fr.mtx); - - fr.v[3].z = 0; - fr.v[2].z = 0; - fr.v[0].z = 0; - fr.v[1].z = 0; - fr.v[1].y = 0; - fr.v[1].x = 0; - flags = D_800B99DA; - if (flags & 1) { - fr.col[1].r = *(s32 *)(param_1 + 0x30) + 0x20; - } else if (flags & 2) { - fr.col[1].r = *(s32 *)(param_1 + 0x30) + 0x40; - } else { - fr.col[1].r = *(s32 *)(param_1 + 0x30); - } - - p = ((u8 *)&D_801966BC); - fr.col[0].b = 0; - fr.col[0].g = 0; - fr.col[0].r = 0; - fr.col[2].b = 0; - fr.col[2].g = 0; - fr.col[2].r = 0; - fr.col[3].b = 0; - fr.col[3].g = 0; - fr.col[3].r = 0; - fr.code = 0x50000000; - fr.col[1].b = fr.col[1].r >> 3; - fr.col[1].g = fr.col[1].r >> 3; - i = 0; -L1: - fr.v[0].x = (s8)*p++; - fr.v[0].y = (s8)*p++; - fr.v[2].x = (s8)*p++; - fr.v[2].y = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].y = (s8)*p--; - func_80017758(fr.v, fr.mtx); - t = i + 1; - i = t + zr; - if ((s16)t < 4) goto L1; - - fr.v[3].y = 0; - fr.v[2].y = 0; - fr.v[0].y = 0; - fr.v[1].y = 0; - fr.v[1].x = 0; - fr.v[1].z = -0x20; - p = D_801966D0; - i = 0; -L2: - fr.v[0].x = (s8)*p++; - fr.v[0].z = (s8)*p++; - fr.v[2].x = (s8)*p++; - fr.v[2].z = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].z = (s8)*p--; - func_80017758(fr.v, fr.mtx); - if ((s16)i == 1) { - fr.v[1].z = 0x20; - p += 2; - } - t = i + 1; - i = t + zr; - if ((s16)t < 4) goto L2; - - p += 2; - fr.v[0].x = 0; - fr.v[0].z = -0x20; - fr.col[0].r = fr.col[1].r; - fr.col[0].b = fr.col[1].g; - fr.col[0].g = fr.col[1].g; - i = 0; -L3: - fr.v[2].x = (s8)*p++; - fr.v[2].z = (s8)*p++; - fr.v[3].x = (s8)*p++; - fr.v[3].z = (s8)*p++; - func_80017758(fr.v, fr.mtx); - t = i + 1; - i = t + zr; - if ((s16)t < 2) goto L3; -} - - - - -extern void (*D_801966F8[])(void); - -void func_8016A700(void *a0) { - D_801966F8[*(u16 *)((s32)a0 + 0x2)](); -} - - -// Seed for func_8016A73C (ov_SC01_077 exemplar). Overlay-local struct guessed. -typedef struct SubB_8016A73C { char pad[0x20]; int unk20; } SubB_8016A73C; -typedef struct SubA_8016A73C { char pad[0x34]; SubB_8016A73C *unk34; } SubA_8016A73C; - -typedef struct Mat_8016A73C { int w[8]; } Mat_8016A73C; - -typedef struct Obj_8016A73C { - short unk0; - short unk2; - short unk4; - short unk6; - short unk8; - short unkA; - short unkC; - short unkE; - char pad10[0x24]; /* 0x10 .. 0x33 */ - SubA_8016A73C *unk34; /* 0x34 */ - Mat_8016A73C mat; /* 0x38 .. 0x57 */ -} Obj_8016A73C; - - - -s32 func_8016A73C(s32 arg0) { - int sp10[8]; - short v[3]; /* sp30, sp32, sp34 */ - int r; - short tmp; - - r = ((int(*)())rand)(); - v[1] = ((r & 0x7F) << 4) + 0x400; - v[0] = ((unsigned)(r & 0x7F00) >> 5) - 0x300; - v[2] = 0; - ((void(*)(short *, void *))RotMatrixYXZ)(v, sp10); - ((void(*)(int, void *))func_80048EAC)(((Obj_8016A73C *)arg0)->unk34->unk34->unk20 + 0x34, sp10); - v[0] = 0; - v[1] = 0; - v[2] = -0x50; - ((int(*)(void *, short *, short *))ApplyMatrixSV)(sp10, v, v); - - ((Obj_8016A73C *)arg0)->mat = (*(Mat_8016A73C*)&D_800AE620); - - tmp = ((Obj_8016A73C *)arg0)->unk6 + v[0]; - ((Obj_8016A73C *)arg0)->unk6 = tmp; - ((Obj_8016A73C *)arg0)->mat.w[5] = tmp; - tmp = ((Obj_8016A73C *)arg0)->unkA + v[1]; - ((Obj_8016A73C *)arg0)->unkA = tmp; - ((Obj_8016A73C *)arg0)->mat.w[6] = tmp; - tmp = ((Obj_8016A73C *)arg0)->unkE + v[2]; - ((Obj_8016A73C *)arg0)->unkE = tmp; - ((Obj_8016A73C *)arg0)->unk2 = ((Obj_8016A73C *)arg0)->unk2 + 1; - ((Obj_8016A73C *)arg0)->mat.w[7] = tmp; -} - - - -DEFINE_func_8016A890() /* dedup: shared engine-core @0x8016A890 (src/shared) */ - - -// @class: struct -// @stuck: none — expect MATCH (single-call leaf, stack-struct prim build + averaging writeback) - -DEFINE_func_8016A8FC() /* dedup: shared engine-core @0x8016A8FC (src/shared) */ - - -DEFINE_func_8016AA50() /* dedup: shared engine-core @0x8016AA50 (src/shared) */ - - -extern void (*D_80196740[])(void); - -void func_8016AB30(void *a0) { - D_80196740[*(u16 *)((s32)a0 + 0x2)](); -} diff --git a/src/ov_SC06_018/ov_SC06_018_jr_8015C32C.c b/src/ov_SC06_018/ov_SC06_018_jr_8015C32C.c new file mode 100644 index 000000000..8f6986524 --- /dev/null +++ b/src/ov_SC06_018/ov_SC06_018_jr_8015C32C.c @@ -0,0 +1,5926 @@ +#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. */ +struct Ent_801506A4 { + unsigned short unk0; /* 0x0 */ + char pad[0x5A]; + unsigned short unk5C; /* 0x5C */ + char pad2[0x12]; + short unk70; /* 0x70 */ +}; +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_80195B0C; +extern u8 D_80195A7C; +extern u8 D_80195A58; +extern u8 D_80195A34; +extern u8 D_80195AE8; +extern u8 D_80195AC4; +extern u8 D_80195AA0; +extern u8 D_80195A10; +extern void func_80145934(void); +extern u8 D_80195B9C; +extern u8 D_80195B78; +extern u8 D_80195B54; +extern u8 D_80195B30; +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_80194F94[]; +extern unsigned char D_80194FC4[]; +extern unsigned char D_80195014[]; +extern unsigned char D_80195044[]; +extern unsigned char D_80195074[]; +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(void); +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_801950C4[])(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); +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(s32); +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 s32 func_8012E5CC(s32 a0, s32 a1, s32 a2); +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_8019518C[]; +extern u8 D_80078E78[]; +extern s32 func_80149FB0(s32 a0); +extern s32 func_80135260(s32, s32, s32, s32); +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_80195214[]; +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_8019521C; +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 struct Packed8 D_80126C98; +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 void func_8014CF04(s32 a0, void *a1, void *a2); +extern void func_8014CD80(s32 a0, void *a1, void *a2); +extern void func_8014D0A4(s32 a0); +extern void func_8014D2A0(s32 a0, void *a1, void *a2); +extern void 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 void 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 void func_8014D820(s32 a0, void *a1, void *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_801D3D70; +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_801D3D74; +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_8019524C; +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 void 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_801952F4[])(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_80195318[])(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_80195308; +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_8019532C[])(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_80195338[]; +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_80195348[])(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_80195360[])(void); +extern void func_8015282C(void *a0); +extern void func_801528B0(s32 a0); +extern void func_80152868(s32 a0); +extern M2C_UNK D_80195350; +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_80195374[])(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_80195390[])(void); +extern void func_80152D24(void *a0); +extern void func_80152DA8(s32 a0); +extern void func_80152D60(s32 a0); +extern M2C_UNK D_80195380; +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_801953A4[])(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_801953B8[])(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_801953CC; +extern void (*D_801953F4[])(void *a0); +extern void func_80153CCC(S80153CCC *a0); +extern void func_80153D7C(s32 a0); +extern void func_80153D34(s32 a0); +extern u8 D_801953D4; +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_80195440[])(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_80195444[])(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 S801563EC *func_801563EC(u16 idx); +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 S801563EC * func_801563EC(u16 idx); +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(void *a0); +extern void func_801567BC(s32 a0); +extern B8 D_80128120[]; +extern B8 D_80128138[]; +extern S8 D_80126AF0[]; +extern u8 D_80126730[]; +extern void func_80156848(s32 param_1, s32 param_2); +extern unsigned char D_8011520C[]; +extern unsigned short D_801958A8[]; +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 s32 func_80135260(s32 a0, s32 a1, s32 a2, s32 a3); +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_801958B8[])(void); +extern void func_8014CC28(s32 a0); /* defined */ +extern void 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_801D3DA8; +extern void func_801578C0(s32 a0); +extern void func_80157788(int param_1); +extern void func_801577C8(s32 arg0); +extern void (*D_801958E0[])(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_801958C0; +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_801958D0; +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_80195920[])(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_80195928[])(void); +extern void func_80158038(void *); +extern void func_80158000(void *a0); +extern s32 D_800D51E0; +extern s32 D_801958F4; +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_80195934[])(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_80195904; +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_801D3DB0; +extern s32 D_801D3DBC; +extern s32 D_801D3DC0; +extern void func_80158880(s32 *param); +extern void func_8015879C(s32 param_1); +extern void func_80158814(void *arg0); +extern void (*D_80195970[])(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_80195944[]; +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_801D3DB8; +extern void func_8015934C(void *arg0); +extern void func_801593E4(A801593E4 *a0); +extern void (*D_80195BC0[])(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_801959E0[]; +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_80195C64[])(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_80195DB8[])(void); +extern void func_80159BAC(s32 a0); +extern s32 func_80172590(u8 *a0); +extern unsigned char D_80195BD4; +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_80195DC0[])(void); +extern void func_8015A2A0(s32 a0); +extern int D_80195BE4; +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_80195C04; +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_80195DC8[])(void); +extern void func_8015ADB0(s32); +extern void func_8015AD78(s32 a0); +extern void func_8015ADB0(s32 arg0); +extern s32 func_80161A60(s32 a0); +extern s32 func_801619A4(s32 *a0); +extern s32 func_80149C08(s32 a0); +extern s32 func_8015B6F4(s32 a0); +extern s32 func_8015B7B4(s32 a0); +extern void func_8015B8F8(s32 *a0); +extern void func_800CCCC0(s32 a0); +extern s32 func_8015B858(u8 *a0); +extern s32 func_800CF8B4(void); +extern void func_80147A84(s32 a0); +extern s32 func_80172644(u8 *a0); +extern void func_800CCB78(s32 a0); +extern s32 func_80161488(void *a0); +extern void func_8015CC40(s32 *a0); +extern void func_8015CF8C(s32 *a0); +extern s32 func_8015AE2C(); +extern s32 D_800D4A9C; +extern int func_8015B6F4(int param_1); +extern u8 D_800D4F8C[]; +extern u8 D_800D4BE0[]; +extern s32 func_8014A51C(void); +extern s32 D_800D4B48; +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_8015BEC4(void); +extern s32 func_8015B950(void); +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_80195DF0[])(void); +extern void func_8015C0C4(s32); +extern void func_8015C08C(s32 a0); +extern s32 func_8015C128(s32 param_1); +/* ==== end §8b carried decl layer ==== */ + + + + +extern u16 D_800B99DA; + +extern s32 func_80149FB0(s32 a0); +extern s32 func_801496D4(void*); +extern void func_80149704(void); +extern s32 func_801619A4(s32*); +extern s32 func_80149AA8(s32*); +extern void func_80149AD4(s32*); +extern s32 func_80149B54(s32*); +extern void func_80149BAC(s32*); +extern s32 func_801498E0(s32*); +extern s32 func_80149954(s32); +extern s32 func_80149A64(s32*); +extern void func_800CCCC0(s32 a0); +extern int func_80148AFC(void *a0); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80147A84(s32 a0); +extern void func_801473EC(s32*); +extern void func_8014C010(s32 a0, s32 a1); +extern void func_80147324(s32 a0); +extern void func_8014D738(void); +extern void func_8014CC28(s32); +extern void func_8014F3E8(s32); +extern s32 func_80146E98(s32 a0); +extern void func_80147078(s32 *a0, s16 a1); +extern s32 func_8015BE94(); +extern void func_80159BE4(s32 a0); +extern void func_8015C0C4(s32 a0); +extern void func_8015C6E0(s32*); + +void func_8015C32C(s32 arg0) { + + extern void (*D_80195C70[])(void *); + s32 iVar2; + u32 uVar4; + s32 vin[4]; + s32 vout[4]; + + func_80149FB0(arg0); + if (((s32 (*)(s32))func_801496D4)(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + ((void (*)(s32))func_80149704)(arg0); + return; + } + switch (((s32 (*)(s32))func_801619A4)(arg0)) { + case 0: + case 1: + case 6: + if (((s32 (*)(s32))func_80149AA8)(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + ((void (*)(s32))func_80149AD4)(arg0); + return; + } + if (((s32 (*)(s32))func_80149B54)(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + ((void (*)(s32))func_80149BAC)(arg0); + return; + } + break; + case 3: + ((void (*)(s32))func_801498E0)(arg0); + break; + case 4: + ((void (*)(s32))func_80149954)(arg0); + break; + case 5: + if (((s32 (*)(s32))func_80149A64)(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + func_800CCCC0(arg0); + return; + } + } + if ((func_80148AFC((void *)arg0) & 0xff) != 0) { + vin[0] = 0; + vin[1] = 0; + vin[2] = -0x4000; + func_8001382C((s32)*(s16 *)(*(s32 *)(arg0 + 0x20) + 0x12), vin, vout); + *(s32 *)(arg0 + 0x234) += vout[0]; + *(s32 *)(arg0 + 0x238) += vout[1]; + *(s32 *)(arg0 + 0x23c) += vout[2]; + } + func_8001382C((s16)-*(u16 *)(*(s32 *)(arg0 + 0x20) + 0x12), (void *)(arg0 + 0x234), vout); + func_80146DB8((s32 *)arg0, vout); + func_80147A84(arg0); + ((void (*)(s32))func_801473EC)(arg0); + if ((D_800B99DA & 3) == 0) { + func_8014C010(arg0, 1); + func_80147324(0x65f); + } + if (((s32 (*)(s32))func_8014D738)(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + ((void (*)(s32))func_8015C6E0)(arg0); + return; + } + iVar2 = ((s32 (*)(s32))func_8014CC28)(arg0); + uVar4 = ((u32 (*)(s32))func_8014F3E8)(arg0); + if (uVar4 != 0) { + if ((uVar4 & 0x4000) == 0) { + if (func_80146E98(arg0) != 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + func_80147078((s32 *)arg0, 0); + func_80159BE4(arg0); + } + } else { + func_80147078((s32 *)arg0, 4); + func_8015C0C4(arg0); + } + } else { + if (iVar2 == 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + func_80147078((s32 *)arg0, 3); + ((void (*)(s32))func_8015BE94)(arg0); + } + } +} + + +DEFINE_func_8015C6A4() /* dedup: shared engine-core @0x8015C6A4 (src/shared) */ + +DEFINE_func_8015C6AC() /* dedup: shared engine-core @0x8015C6AC (src/shared) */ + +DEFINE_func_8015C6E0() /* dedup: shared engine-core @0x8015C6E0 (src/shared) */ + + +extern void (*D_80195DFC[])(void); + +void func_8015C714(void *a0) { + D_80195DFC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015C750() /* dedup: shared engine-core @0x8015C750 (src/shared) */ + +DEFINE_func_8015C788() /* dedup: shared engine-core @0x8015C788 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (match_one 88/88); fn-ptr-array dispatch, top-level if/else needed branch-polarity invert (small block falls through, big block at L854) + +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern s32 func_801496D4(void *a0); +extern u16 func_801487F4(s32 *a0); +extern s32 func_801488A8(u8 *a0); +extern void func_80161240(void *a0); +extern s32 func_80146E98(s32 a0); +extern void func_80149704(void); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_80148AAC(u8 *a0); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80146E90(s32 *a0, s32 a1); +extern void func_80146CA0(void *a0); +extern void func_80161C24(s32, s32); +extern void func_8014C010(s32 a0, s32 a1); + + +void func_8015C7E4(u16 *param_1) +{ + + extern void (*D_80195C70[])(void*); + extern int D_80195C14; + s32 iVar1; + u32 uVar2; + + iVar1 = ((s32 (*)(u16 *))func_80161B18)(param_1); + if ((iVar1 == 0) && (iVar1 = ((s32 (*)(u16 *))func_80161B84)(param_1), iVar1 == 0)) { + iVar1 = ((s32 (*)(u16 *))func_801496D4)(param_1); + if (iVar1 != 0) { + ((void (**)(u16*))D_80195C70)[*param_1](param_1); + ((void (*)(u16 *))func_80149704)(param_1); + } else { + uVar2 = ((s32 (*)(u16 *))func_801487F4)(param_1); + if (((uVar2 & 0x80) == 0) && (iVar1 = ((s32 (*)(u16 *))func_801488A8)(param_1), iVar1 == 0)) { + ((void (**)(u16*))D_80195C70)[*param_1](param_1); + ((void (*)(u16 *, s32))func_80147078)(param_1, 0); + ((void (*)(u16 *))func_80159B70)(param_1); + } else { + iVar1 = ((s32 (*)(u16 *))func_80161240)(param_1); + if (iVar1 == 0) { + iVar1 = ((s32 (*)(u16 *))func_80146E98)(param_1); + if (iVar1 != 0) { + ((void (*)(u16 *))func_80148AAC)(param_1); + ((void (*)(u16 *, void *))func_80146DB8)(param_1, &D_80195C14); + ((void (*)(u16 *, s32))func_80146E90)(param_1, 0x14); + ((void (*)(u16 *))func_80146CA0)(param_1); + } + if ((param_1[0x5c] & 0x2000) != 0) { + ((void (*)(u16 *, s32))func_80161C24)(param_1, param_1[0xb7]); + ((void (*)(u16 *, s32))func_8014C010)(param_1, 2); + } + } + } + } + } + return; +} + + + + +// @class: struct +// @stuck: none — dispatch + control flow on a single callee-saved param; expect MATCH + +extern s32 func_80149FB0(s32 a0); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801473EC(s32 *a0); +extern void func_8014D738(void); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_80161240(void *a0); +extern s32 func_80146E98(s32 a0); +extern void func_80146CA0(void *a0); +extern void func_80161C24(s32, s32); + + +void func_8015C944(int param_1) { + + extern void (*D_80195C70[])(); + func_80149FB0(param_1); + func_80147AD4(param_1, 0, 0, 0); + ((void (*)(int))func_801473EC)(param_1); + ((void (*)(int))func_8014D738)(param_1); + if (*(int *)(param_1 + 0x170) == 0) { + (*D_80195C70[*(unsigned short *)param_1])(param_1); + ((void (*)(int, int))func_80147078)(param_1, 0); + ((void (*)(int))func_80159B70)(param_1); + } else { + if (((int (*)(int))func_80161240)(param_1) == 0) { + if (func_80146E98(param_1) != 0) { + ((void (*)(int))func_80146CA0)(param_1); + } + if ((*(unsigned short *)(param_1 + 0xb8) & 0x2000) != 0) { + func_80161C24(param_1, *(unsigned short *)(param_1 + 0x16e)); + } + } + } +} + + + +// @class: schedule +// @stuck: none — MATCH (goto forces the func_80161240 block to the function tail; bnez-to-end layout vs early-return fall-through) + + +extern s32 func_80149FB0(s32 a0); +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern s32 func_801496D4(void *a0); +extern u16 func_801487F4(s32 *a0); +extern s32 func_801488A8(u8 *a0); +extern void func_80148AAC(u8 *a0); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801473EC(s32 *a0); +extern void func_8014D738(void); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_80146E90(s32 *a0, s32 a1); +extern void func_80146C98(s32 *a0, s16 a1); +extern void func_80161240(void *a0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_80149704(void); + + +void func_8015CA28(u16 *param_1) { + + extern void (*D_80195C70[])(void*); + extern int D_80195C14; + ((void (*)(void))func_80149FB0)(); + if (((int (*)(u16 *))func_80161B18)(param_1) != 0) return; + if (((int (*)(u16 *))func_80161B84)(param_1) != 0) return; + if (((int (*)(u16 *))func_801496D4)(param_1) != 0) { + ((void (**)(u16*))D_80195C70)[*param_1](param_1); + ((void (*)(u16 *))func_80149704)(param_1); + return; + } + if ((((u32 (*)(u16 *))func_801487F4)(param_1) & 0x80) != 0 || ((int (*)(u16 *))func_801488A8)(param_1) != 0) { + if ((((int (*)(u16 *))func_80148AAC)(param_1) & 0xff) != 0) { + ((void (*)(u16 *, int, int, int))func_80147AD4)(param_1, 0, 0, 0); + ((void (*)(u16 *))func_801473EC)(param_1); + } + if (((int (*)(u16 *))func_8014D738)(param_1) != 0) { + ((void (*)(u16 *, void *))func_80146DB8)(param_1, &D_80195C14); + ((void (*)(u16 *, int))func_80146E90)(param_1, 0x14); + ((void (*)(u16 *, int))func_80146C98)(param_1, 2); + } + if (*(int *)(param_1 + 0xb8) != 0) + goto do161240; + } + ((void (**)(u16*))D_80195C70)[*param_1](param_1); + ((void (*)(u16 *, int))func_80147078)(param_1, 0); + ((void (*)(u16 *))func_80159B70)(param_1); + return; +do161240: + ((void (*)(u16 *))func_80161240)(param_1); +} + + +DEFINE_func_8015CB94() /* dedup: shared engine-core @0x8015CB94 (src/shared) */ + +DEFINE_func_8015CBCC() /* dedup: shared engine-core @0x8015CBCC (src/shared) */ + +DEFINE_func_8015CBD4() /* dedup: shared engine-core @0x8015CBD4 (src/shared) */ + +DEFINE_func_8015CBDC() /* dedup: shared engine-core @0x8015CBDC (src/shared) */ + +DEFINE_func_8015CBE4() /* dedup: shared engine-core @0x8015CBE4 (src/shared) */ + +DEFINE_func_8015CBEC() /* dedup: shared engine-core @0x8015CBEC (src/shared) */ + +DEFINE_func_8015CBF4() /* dedup: shared engine-core @0x8015CBF4 (src/shared) */ + +DEFINE_func_8015CBFC() /* dedup: shared engine-core @0x8015CBFC (src/shared) */ + +DEFINE_func_8015CC04() /* dedup: shared engine-core @0x8015CC04 (src/shared) */ + +DEFINE_func_8015CC0C() /* dedup: shared engine-core @0x8015CC0C (src/shared) */ + +DEFINE_func_8015CC40() /* dedup: shared engine-core @0x8015CC40 (src/shared) */ + + + +void func_8015CC74(s32 *a0) { + + extern void (*D_80195E0C[])(void); + D_80195E0C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015CCB0() /* dedup: shared engine-core @0x8015CCB0 (src/shared) */ + +DEFINE_func_8015CCD0() /* dedup: shared engine-core @0x8015CCD0 (src/shared) */ + +#define NULL 0 + +struct Sub_8015CD20 { + u8 pad0[0x12]; + u16 unk12; /* +0x12 */ +}; + +struct Ent_8015CD20 { + u16 unk0; /* +0x00 */ + u8 pad2[0x1E]; + struct Sub_8015CD20 *unk20; /* +0x20 */ + u8 pad24[0x94]; + s16 unkB8; /* +0xB8 */ + u8 pad1BA[0x102]; + s8 unk1BC; /* +0x1BC */ + u8 pad1BD[0x77]; + s32 unk234; /* +0x234 */ +}; + + + +s32 func_8015CD20(s32 arg0) { + extern void (*D_80195C70[])(struct Ent_8015CD20 *); + extern u8 D_80195C24; + extern u8 D_80195E14; + extern u8 D_80195E24; + + s32 temp_v0; + s32 var_v0; + struct Sub_8015CD20 *sp; + + ((void(*)())func_80149FB0)(); + if (((s32(*)(struct Ent_8015CD20 *))func_801496D4)(((struct Ent_8015CD20 *)arg0)) != 0) { + D_80195C70[((struct Ent_8015CD20 *)arg0)->unk0](((struct Ent_8015CD20 *)arg0)); + ((struct Ent_8015CD20 *)arg0)->unk1BC = 0xA; + ((s32(*)(struct Ent_8015CD20 *))func_80149724)(((struct Ent_8015CD20 *)arg0)); + if (((s32(*)(struct Ent_8015CD20 *))func_80148AFC)(((struct Ent_8015CD20 *)arg0)) & 0xFF) { + ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195C24); + } else { + ((void(*)(struct Ent_8015CD20 *))func_80146D90)(((struct Ent_8015CD20 *)arg0)); + } + return; + } + temp_v0 = ((struct Ent_8015CD20 *)arg0)->unk234; + if (temp_v0 == 0) { + if (((s32(*)(struct Ent_8015CD20 *))func_80148980)(((struct Ent_8015CD20 *)arg0)) != 0) { + ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195E14); + ((void(*)(struct Ent_8015CD20 *))func_80147A84)(((struct Ent_8015CD20 *)arg0)); + ((void(*)(struct Ent_8015CD20 *))func_801473EC)(((struct Ent_8015CD20 *)arg0)); + ((void(*)(struct Ent_8015CD20 *, s32))func_80154150)(((struct Ent_8015CD20 *)arg0), 0x15); + sp = ((struct Ent_8015CD20 *)arg0)->unk20; + var_v0 = sp->unk12 - 0xAA; + goto block_13; + } + if (((s32(*)(struct Ent_8015CD20 *))func_8014891C)(((struct Ent_8015CD20 *)arg0)) != 0) { + ((void(*)(struct Ent_8015CD20 *, u8 *))func_80146DB8)(((struct Ent_8015CD20 *)arg0), &D_80195E24); + ((void(*)(struct Ent_8015CD20 *))func_80147A84)(((struct Ent_8015CD20 *)arg0)); + ((void(*)(struct Ent_8015CD20 *))func_801473EC)(((struct Ent_8015CD20 *)arg0)); + ((void(*)(struct Ent_8015CD20 *, s32))func_80154150)(((struct Ent_8015CD20 *)arg0), 0x14); + ((struct Ent_8015CD20 *)arg0)->unkB8 = 1; + } + if (((s32(*)(struct Ent_8015CD20 *))func_801489E8)(((struct Ent_8015CD20 *)arg0)) != 0) { + sp = ((struct Ent_8015CD20 *)arg0)->unk20; + var_v0 = sp->unk12 + 0x71; + goto block_13; + } + if (((s32(*)(struct Ent_8015CD20 *))func_80148A48)(((struct Ent_8015CD20 *)arg0)) != 0) { + sp = ((struct Ent_8015CD20 *)arg0)->unk20; + var_v0 = sp->unk12 - 0x71; +block_13: + sp->unk12 = var_v0 & 0xFFF; + } + } else { + ((struct Ent_8015CD20 *)arg0)->unk234 = temp_v0 - 1; + } + ((void(*)(struct Ent_8015CD20 *))func_8014FA04)(((struct Ent_8015CD20 *)arg0)); + if (((s32(*)(struct Ent_8015CD20 *))func_8014E434)(((struct Ent_8015CD20 *)arg0)) == 0) { + D_80195C70[((struct Ent_8015CD20 *)arg0)->unk0](((struct Ent_8015CD20 *)arg0)); + ((void(*)(struct Ent_8015CD20 *, s32))func_80147078)(((struct Ent_8015CD20 *)arg0), 0); + ((void(*)(struct Ent_8015CD20 *))func_80159B70)(((struct Ent_8015CD20 *)arg0)); + } else { + ((void(*)(struct Ent_8015CD20 *))func_801725E0)(((struct Ent_8015CD20 *)arg0)); + } +} + + + +DEFINE_func_8015CF24() /* dedup: shared engine-core @0x8015CF24 (src/shared) */ + +DEFINE_func_8015CF58() /* dedup: shared engine-core @0x8015CF58 (src/shared) */ + +DEFINE_func_8015CF8C() /* dedup: shared engine-core @0x8015CF8C (src/shared) */ + + + +void func_8015CFC0(s32 *a0) { + + extern void (*D_80195E44[])(void); + D_80195E44[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015CFFC() /* dedup: shared engine-core @0x8015CFFC (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (uVar1 pinned $s3, uVar5 pinned $s1; param_1->s2, iVar4->s0 fall out) + + +void func_8015D01C(int param_1) { + extern s32 func_801725F4(u8 *a0); + extern int D_800D550C; + extern int D_80195E34; + + int iVar4; + register unsigned short uVar1 __asm__("$19"); + register unsigned short uVar5 __asm__("$17"); + short sVar2; + short sVar3; + + ((void (*)(int, void *))func_80154274)(param_1, &D_800D550C); + *(short *)(*(int *)(param_1 + 0x20) + 0x10) = 0; + iVar4 = *(short *)(*(int *)(param_1 + 0x20) + 0x12); + uVar1 = *(unsigned short *)(*(int *)(*(int *)(param_1 + 0x180) + 0x20) + 0x12); + uVar5 = (uVar1 + 0x800) & 0xfff; + sVar2 = func_80012A60(iVar4, (short)uVar1); + sVar3 = func_80012A60(iVar4, uVar5); + if (sVar2 < sVar3) { + *(short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar1; + } else { + *(unsigned short *)(*(int *)(param_1 + 0x20) + 0x12) = uVar5; + } + *(int *)(param_1 + 0x38) = (int)&D_80195E34 | 0x40000000; + ((void (*)(int))func_801725F4)(param_1); + ((void (*)(int))func_80146CA0)(param_1); +} + + + + + +// @class: struct +// @stuck: none — MATCH (pending gate) + +extern s32 func_80149FB0(s32 a0); +extern void func_8014FA04(s32 a0); +extern void func_8014E6A0(void); +extern void (*D_80195C70[])(void *); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_801725F4(u8 *a0); +extern void func_80146CA0(void *a0); + +void func_8015D104(void *arg0) { + ((void (*)(void))func_80149FB0)(); + ((void (*)(void *))func_8014FA04)(arg0); + if (((s32 (*)(void *))func_8014E6A0)(arg0) == 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 0); + func_80159B70(arg0); + } else { + ((void (*)(void *))func_801725F4)(arg0); + *(s32 *)((u8 *)arg0 + 0x234) = 0xFF1D0000; + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x10) = 0x600; + *(u16 *)((u8 *)arg0 + 0x244) = *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x10); + func_80146CA0(arg0); + } +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8015D1B8); + + +// @class: regalloc-order +// @stuck: pinning a0->$s1 and buffer-ptr->$s0; body copy already matches +extern void func_80013F3C(s32 a0); +extern void func_80012558(s32 a0, s32 a1); +extern void func_800126C4(s32 a0, s32 a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern void *memcpy(void *dst, const void *src, u32 n); + +extern s32 D_80195EA0; + +void func_8015D380(s32 a0) { + s16 out[4]; + s32 buf[8]; + register s32 s1 __asm__("$17") = a0; + register s32 *s0 __asm__("$16") = buf; + ((void (*)(void *))func_80013F3C)((void *)s0); + ((void (*)(void *, s32))func_80012558)((void *)s0, *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12)); + ((void (*)(void *, s32))func_800126C4)((void *)s0, *(s16 *)(*(s32 *)(s1 + 0x20) + 0x10)); + ApplyMatrixSV((void *)s0, (void *)&D_80195EA0, (void *)out); + memcpy((void *)(s1 + 0x138), (void *)out, 8); +} + + + + +// @class: plumbing +// @stuck: none — MATCH + +extern unsigned char D_80194F84[]; + +extern void func_801553C0(s32 a0); +extern void func_80154A74(s32 a0, s32 a1); + +void func_8015D414(int param_1) +{ + *(unsigned char *)(param_1 + 0x1bd) = 8; + *(unsigned char **)(param_1 + 0x38) = D_80194F84; + *(short *)(param_1 + 0x138) = 0; + *(short *)(param_1 + 0x13a) = 0; + *(short *)(param_1 + 0x13c) = 0; + *(short *)(param_1 + 0x13e) = 0; + *(short *)(param_1 + 0xA) = *(short *)(param_1 + 0xA) + 0x48; + *(short *)(*(int *)(param_1 + 0x20) + 0x10) = 0; + ((void (*)(void))func_801553C0)(); + func_80154A74(param_1, 0x11); +} + + +DEFINE_func_8015D480() /* dedup: shared engine-core @0x8015D480 (src/shared) */ + +DEFINE_func_8015D4B4() /* dedup: shared engine-core @0x8015D4B4 (src/shared) */ + + + +s32 func_8015D4E8(s16 *a0) { + + extern void (*D_80195EA8[])(void); + D_80195EA8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015D524() /* dedup: shared engine-core @0x8015D524 (src/shared) */ + +DEFINE_func_8015D544() /* dedup: shared engine-core @0x8015D544 (src/shared) */ + +DEFINE_func_8015D57C() /* dedup: shared engine-core @0x8015D57C (src/shared) */ + + +// @class: loose-typing +// @stuck: none — MATCH (field 0xb8 compared as u16 == 0x8000, not s16 == -0x8000) + +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern void func_80154A74(int, int); +extern s32 func_80161208(); +extern void func_80154150(int, int); +extern void func_80146CA0(void *a0); +extern void func_80149374(int, int); + +extern unsigned char D_80195EB4[]; + +void func_8015D5E8(int param_1) +{ + int iVar1; + int iVar2; + + if (((int (*)(void))func_80161B18)() != 0) + return; + if (((int (*)(int))func_80161B84)(param_1) != 0) + return; + if ((*(unsigned short *)(param_1 + 0xb8) & 0x4000) != 0) + func_80154A74(param_1, 0x17); + if (((int (*)(int))func_80161208)(param_1) != 0) + return; + if (*(unsigned short *)(param_1 + 0xb8) == 0x8000) { + *(int *)(param_1 + 0x234) = *(int *)(param_1 + 0x234) + -3; + func_80154150(param_1, 0x1a); + ((void (*)(int))func_80146CA0)(param_1); + } else { + iVar1 = *(int *)(param_1 + 0x178); + if (iVar1 != 0) { + iVar2 = *(int *)(param_1 + 0x234); + *(int *)(param_1 + 0x234) = iVar2 + 1; + *(short *)(iVar1 + 6) = + (short)((signed char)D_80195EB4[iVar2] + + *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0xc)); + iVar2 = *(int *)(param_1 + 0x234); + *(int *)(param_1 + 0x234) = iVar2 + 1; + *(short *)(iVar1 + 10) = + (short)((signed char)D_80195EB4[iVar2] + + *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0xe)); + iVar2 = *(int *)(param_1 + 0x234); + *(int *)(param_1 + 0x234) = iVar2 + 1; + *(short *)(iVar1 + 0xe) = + (short)((signed char)D_80195EB4[iVar2] + + *(unsigned short *)(*(int *)(iVar1 + 0x78) + 0x10)); + func_80149374(param_1, iVar1 + 4); + } + } +} + + + +extern int func_80148AFC(void*); +extern s32 func_80161B18(void *); +extern s32 func_80161B84(void *); +extern u16 func_80148800(s32*); +extern u8 func_8014BEF8(void); +extern s32 func_80165624(s32); +extern s32 func_801488A8(u8*); +extern void func_8014D738(void); +extern s32 func_80161208(); +extern void func_80154A74(s32, s32); +extern void func_8015DAC4(s32*); +extern void func_8015DE24(s32*); +extern void func_8015DA5C(s32); +extern void func_8015F948(s32*); +extern void func_800CAF14(void *); +extern void func_80154150(s32, s32); +extern void func_80146DB8(s32*, s32*); +extern void func_80147A84(s32); +extern void func_801473EC(s32*); +extern void func_80149374(s32, s32); +extern void func_80147078(s32*, s16); +extern void func_80159B70(void *); +extern void func_8015C714(void *); +extern void func_801483E8(void); + +extern void (*D_80195C70[])(void *); +extern u8 D_80078E78[]; +extern u8 D_80195EB4[]; + +void func_8015D738(void *arg0) { + + extern u8 D_80195C34[]; + extern u8 D_80195C44[]; + u8 *p = D_80078E78; + s32 s1; + ((void (*)(void))func_80148AFC)(); + if (func_80161B18(arg0) != 0) return; + if (func_80161B84(arg0) != 0) return; + s1 = *(s32 *)((char *)arg0 + 0x178); + if (s1 != 0) { + if (*(u16 *)s1 == 0x360) goto block_808; + } + __asm__ __volatile__(""); + if (s1 != 0) { + if (*(u16 *)s1 != 0) goto block_7F4; + } + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; +block_7F4: + if (((s32 (*)(void *))func_80148800)(arg0) & 0x80) { + block_808: + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DAC4)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x10) && ((s32 (*)(void *))func_8014BEF8)(arg0) != 0) { + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + ((void (*)(void *))func_8015DE24)(arg0); + return; + } + if ((((s32 (*)(void *))func_80148800)(arg0) & 0x20) && p[0x49] == 0xA) { + if (((s32 (*)(void *))func_80165624)(arg0) != 0) { + ((void (*)(void *))func_8015DA5C)(arg0); + ((void (*)(void *))func_8015F948)(arg0); + return; + } + ((void (*)(void *, s32))func_80154A74)(arg0, 0x11); + func_800CAF14(arg0); + return; + } + if (((s32 (*)(void *))func_801488A8)(arg0) != 0 && *(u16 *)(*(s32 *)((char *)arg0 + 0x178)) != 0x82) { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1B); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80195C34); + } else { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1A); + ((void (*)(void *, void *))func_80146DB8)(arg0, &D_80195C44); + } + ((void (*)(void *))func_80147A84)(arg0); + ((void (*)(void *))func_801473EC)(arg0); + s1 = *(s32 *)((char *)arg0 + 0x178); + *(s16 *)(s1 + 6) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234)] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xc)); + *(s16 *)(s1 + 0xa) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234) + 1] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0xe)); + *(s16 *)(s1 + 0xe) = (s16)((s8)D_80195EB4[*(s32 *)((char *)arg0 + 0x234) + 2] + *(u16 *)(*(s32 *)(s1 + 0x78) + 0x10)); + ((void (*)(void *, void *))func_80149374)(arg0, (void *)(s1 + 4)); + *(s16 *)(*(s32 *)(s1 + 0x20) + 0x12) = (*(u16 *)(*(s32 *)((char *)arg0 + 0x20) + 0x12) + 0x800) & 0xFFF; + if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 9); + func_8015C714(arg0); + return; + } + if (func_80161208(arg0) != 0) return; + ((void (*)(void *))func_801483E8)(arg0); +} + + +DEFINE_func_8015DA5C() /* dedup: shared engine-core @0x8015DA5C (src/shared) */ + +DEFINE_func_8015DA90() /* dedup: shared engine-core @0x8015DA90 (src/shared) */ + +DEFINE_func_8015DAC4() /* dedup: shared engine-core @0x8015DAC4 (src/shared) */ + + + +void func_8015DAF8(s32 *a0) { + + extern void (*D_80195EE8[])(void); + D_80195EE8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015DB34() /* dedup: shared engine-core @0x8015DB34 (src/shared) */ + +DEFINE_func_8015DB6C() /* dedup: shared engine-core @0x8015DB6C (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (mirrors byte-matched func_8015F89C/func_8015F9A4 in same overlay) + +extern void (*D_80195C70[])(void *); +extern int func_8015DD74(int); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_80161208(); +extern void func_8015DCB8(s32 a0); + +void func_8015DBD4(void *arg0) { + if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x4000) { + ((void (*)(void))func_8015DD74)(); + } + if (*(u16 *)((u8 *)arg0 + 0xB8) == 0x8000) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 0); + func_80159B70(arg0); + } else { + if (*(s32 *)((u8 *)arg0 + 0x178) != 0) { + ((void (*)(void *))func_8015DCB8)(arg0); + } + ((s32 (*)(void *))func_80161208)(arg0); + } +} + + +DEFINE_func_8015DC84() /* dedup: shared engine-core @0x8015DC84 (src/shared) */ + + +// @class: other +// @stuck: none — MATCH (proxy gate) + +extern s8 D_80195EF0[]; +extern void func_80149374(s32 a0, s32 a1); + +void func_8015DCB8(s32 param_1) { + s32 iVar1; + s32 iVar2; + + iVar2 = *(s32 *)(param_1 + 0x178); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 6) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xc); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 10) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xe); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 0xe) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0x10); + + func_80149374(param_1, iVar2 + 4); +} + + +DEFINE_func_8015DD74() /* dedup: shared engine-core @0x8015DD74 (src/shared) */ + +DEFINE_func_8015DDF0() /* dedup: shared engine-core @0x8015DDF0 (src/shared) */ + +DEFINE_func_8015DE24() /* dedup: shared engine-core @0x8015DE24 (src/shared) */ + + + +void func_8015DE58(s32 *a0) { + + extern void (*D_80195F08[])(void); + D_80195F08[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015DE94() /* dedup: shared engine-core @0x8015DE94 (src/shared) */ + +DEFINE_func_8015DECC() /* dedup: shared engine-core @0x8015DECC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (mirrors byte-matched func_8015F89C/func_8015F9A4 in same overlay) + +extern void (*D_80195C70[])(void *); +extern int func_8015E0D4(int); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_80161208(); +extern void func_8015E018(s32 a0); + +void func_8015DF34(void *arg0) { + if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x4000) { + ((void (*)(void))func_8015E0D4)(); + } + if (*(u16 *)((u8 *)arg0 + 0xB8) == 0x8000) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 0); + func_80159B70(arg0); + } else { + if (*(s32 *)((u8 *)arg0 + 0x178) != 0) { + ((void (*)(void *))func_8015E018)(arg0); + } + ((s32 (*)(void *))func_80161208)(arg0); + } +} + + +DEFINE_func_8015DFE4() /* dedup: shared engine-core @0x8015DFE4 (src/shared) */ + + +// @class: other +// @stuck: none — MATCH (proxy gate) + +extern s8 D_80195EF0[]; +extern void func_80149374(s32 a0, s32 a1); + +void func_8015E018(s32 param_1) { + s32 iVar1; + s32 iVar2; + + iVar2 = *(s32 *)(param_1 + 0x178); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 6) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xc); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 10) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0xe); + + iVar1 = *(s32 *)(param_1 + 0x234); + *(s32 *)(param_1 + 0x234) = iVar1 + 1; + *(s16 *)(iVar2 + 0xe) = (s16)D_80195EF0[iVar1] + *(s16 *)(*(s32 *)(iVar2 + 0x78) + 0x10); + + func_80149374(param_1, iVar2 + 4); +} + + +DEFINE_func_8015E0D4() /* dedup: shared engine-core @0x8015E0D4 (src/shared) */ + +DEFINE_func_8015E150() /* dedup: shared engine-core @0x8015E150 (src/shared) */ + +DEFINE_func_8015E184() /* dedup: shared engine-core @0x8015E184 (src/shared) */ + + + +s32 func_8015E1B8(s32 a0) { + + extern void (*D_80195F28[])(void); + D_80195F28[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015E1F4() /* dedup: shared engine-core @0x8015E1F4 (src/shared) */ + +DEFINE_func_8015E22C() /* dedup: shared engine-core @0x8015E22C (src/shared) */ + +DEFINE_func_8015E288() /* dedup: shared engine-core @0x8015E288 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (pending whole-binary gate); fn-ptr table folds %lo via extern array, 0x234 single word store + + +extern void func_8015E40C(s32 a0); +extern s32 func_80161B18(void *a0); +extern s32 func_80161B84(void *a0); +extern s32 func_80161208(); +extern void func_8015E5B0(u8*); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159BE4(s32 arg0); + +extern void (*D_80195C70[])(void*); + +void func_8015E344(u16 *param_1) +{ + ((s32 (*)(void))func_8015E40C)(); + if (((s32 (*)(u16 *))func_80161B18)(param_1) == 0 && + ((s32 (*)(u16 *))func_80161B84)(param_1) == 0 && + ((s32 (*)(u16 *))func_80161208)(param_1) == 0) { + if ((param_1[0x5c] & 0x4000) != 0) { + ((void (*)(u16 *))func_8015E5B0)(param_1); + *(s32 *)((char *)param_1 + 0x234) = 1; + } + if ((param_1[0x5c] & 0x8000) != 0) { + ((void (**)(u16*))D_80195C70)[param_1[0]](param_1); + ((s32 (*)(u16 *, s32))func_80147078)(param_1, 0); + ((s32 (*)(u16 *))func_80159BE4)(param_1); + } + } +} + + +DEFINE_func_8015E40C() /* dedup: shared engine-core @0x8015E40C (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (pending whole-binary gate); s16 v[3] array forces all 3 locals addressable (reload-from-stack), u16* psVar1 → lhu null/flag check + + +extern u16 D_80195F38; +extern u16 D_80195F3A; +extern u16 D_80195F3C; +extern s32 D_80195F40; + +extern void func_80149350(s32 arg0); +extern void func_80013E94(void *a0, void *a1); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); + +void func_8015E4B0(s32 param_1) +{ + u16 *psVar1; + s16 v[3]; + s32 local_10; + + psVar1 = *(u16 **)(param_1 + 0x18c); + if ((psVar1 != (u16 *)0) && (*psVar1 != 0)) { + v[0] = D_80195F38 + *(u16 *)(*(s32 *)(psVar1 + 0x3c) + 0xc); + v[1] = D_80195F3A + *(s16 *)(*(s32 *)(psVar1 + 0x3c) + 0xe) * 2; + v[2] = D_80195F3C + *(u16 *)(*(s32 *)(psVar1 + 0x3c) + 0x10); + ((s32 (*)(s32, s16 *, s16 *))func_80149350)(param_1, &v[0], &v[0]); + ((s32 (*)(s32 *, s32 *))func_80013E94)(&D_80195F40, &local_10); + ((s32 (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x1f, param_1, v[0], v[1], v[2], local_10, 0); + } + return; +} + + + + +extern void func_8013C9C4(void *a0); +extern s32 D_80195F48; + +void func_8015E588(void) { + func_8013C9C4(&D_80195F48); +} + + +DEFINE_func_8015E5B0() /* dedup: shared engine-core @0x8015E5B0 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (clean -O2 reconstruction; table-of-fnptr indexed by param_1[0]) + + +extern s32 func_80161208(); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159BE4(s32 arg0); + +/* function-pointer dispatch table */ +extern void (*D_80195C70[])(void*); + +void func_8015E698(u16 *param_1) +{ + if (func_80161208() == 0 && (param_1[0x5c] & 0x8000) != 0) { + ((void (**)(u16*))D_80195C70)[param_1[0]](param_1); + ((void (*)(u16 *, s32))func_80147078)(param_1, 0); + ((void (*)(u16 *))func_80159BE4)(param_1); + } +} + + +DEFINE_func_8015E714() /* dedup: shared engine-core @0x8015E714 (src/shared) */ + +DEFINE_func_8015E84C() /* dedup: shared engine-core @0x8015E84C (src/shared) */ + +DEFINE_func_8015E880() /* dedup: shared engine-core @0x8015E880 (src/shared) */ + +DEFINE_func_8015E8B4() /* dedup: shared engine-core @0x8015E8B4 (src/shared) */ + + + +void func_8015E8E8(s32 *a0) { + + extern void (*D_80195F5C[])(void); + D_80195F5C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015E924() /* dedup: shared engine-core @0x8015E924 (src/shared) */ + +DEFINE_func_8015E95C() /* dedup: shared engine-core @0x8015E95C (src/shared) */ + +DEFINE_func_8015E9B8() /* dedup: shared engine-core @0x8015E9B8 (src/shared) */ + + +extern u16 func_801487F4(s32*); +extern void func_80147078(s32*, s16); +extern void func_80159B70(void *a0); +extern s32 func_80149D10(s32); +extern void func_80175150(void *a0); +extern void func_8016EE40(s32 a0, s32 a1); +extern s32 func_80149744(struct S_80149744*); +extern void func_80149788(void); +extern s32 func_80161B84(void *a0); +extern s32 func_8014A4B4(void *a0); +extern void func_8014A4FC(void); +extern s32 func_80149AA8(s32*); +extern void func_80149AD4(s32*); +extern s32 func_80149B54(s32*); +extern void func_80149BAC(s32*); +extern s32 func_800CF8B4(void); +extern s32 func_801491C4(s32); +extern s32 func_80148E54(void *a0); +extern void func_8001382C(s32 a0, void *a1, void *a2); +extern void func_80146DB8(s32*, s32*); +extern void func_80147A84(s32); +extern void func_801473EC(s32*); +extern void func_80154150(s32, s32); +extern void func_8014D738(void); +extern void func_8015C714(void *a0); +extern s32 func_80161208(); /* canonical no-proto (§17a-1) */ +extern void func_801483E8(void); + +extern void (*D_80195C70[])(void *); + +void func_8015EA3C(void *arg0) { + + extern s16 D_801152A0; + s32 invec[4]; + s32 outbuf[4]; + s32 temp; + s32 r; + + if (!(((s32 (*)(void))func_801487F4)() & 8)) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; + } + r = ((s32 (*)(void *))func_80149D10)(arg0); + if (r == 1) goto Lcase1; + if (r < 2) goto Ldefault; + if (r == 2) goto Lcase2; + goto Ldefault; +Lcase1: + D_80195C70[*(u16 *)arg0](arg0); + func_80175150(arg0); + return; +Lcase2: + func_8016EE40(*(s32 *)((u8 *)arg0 + 0x21C), 0x01000000); + return; +Ldefault: + if (((s32 (*)(void *))func_80149744)(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *))func_80149788)(arg0); + return; + } + if (func_80161B84(arg0) != 0) { + return; + } + if (func_8014A4B4(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *))func_8014A4FC)(arg0); + return; + } + if (((s32 (*)(void *))func_80149AA8)(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *))func_80149AD4)(arg0); + return; + } + if (((s32 (*)(void *))func_80149B54)(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *))func_80149BAC)(arg0); + return; + } + if (func_800CF8B4() != 0) { + *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12) = + ((*(u16 *)&D_801152A0) + ((s32 (*)(void *))func_801491C4)(arg0)) & 0xFFF; + } + temp = func_80148E54(arg0); + if ((s16)temp >= 0) { + s32 d = temp - *(u16 *)(*(s32 *)((u8 *)arg0 + 0x20) + 0x12); + invec[0] = 0; + invec[1] = 0; + invec[2] = 0xFFFC0000; + func_8001382C((s16)d, invec, outbuf); + ((void (*)(void *, void *))func_80146DB8)(arg0, outbuf); + ((void (*)(void *))func_80147A84)(arg0); + ((void (*)(void *))func_801473EC)(arg0); + ((void (*)(void *, s32))func_80154150)(arg0, 0x1E); + } else { + ((void (*)(void *, s32))func_80154150)(arg0, 0x1D); + } + if (((s32 (*)(void *))func_8014D738)(arg0) != 0) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 9); + func_8015C714(arg0); + return; + } + if (((s32 (*)(s32))func_80161208)(arg0) == 0) { /* §17a-1 */ + ((void (*)(void *))func_801483E8)(arg0); + } +} + + +DEFINE_func_8015ED6C() /* dedup: shared engine-core @0x8015ED6C (src/shared) */ + +DEFINE_func_8015EDA0() /* dedup: shared engine-core @0x8015EDA0 (src/shared) */ + +DEFINE_func_8015EDD4() /* dedup: shared engine-core @0x8015EDD4 (src/shared) */ + + + +s32 func_8015EE08(s32 a0) { + + extern void (*D_80195F64[])(void); + D_80195F64[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015EE44() /* dedup: shared engine-core @0x8015EE44 (src/shared) */ + + +// @class: plumbing +// @stuck: none — MATCH (straight STUB call sequence; param saved to $s0 across calls) + +extern void func_8014CBF8(void *a0); +extern void func_801474EC(s32 *a0); +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80146DB8(s32 *a0, s32 *a1); +extern void func_801477E8(s32 *a0, s32 a1); +extern void func_80146CA0(void *a0); + +extern int D_800D4C48; +extern int D_80195C54; + +void func_8015EE7C(s32 param_1) +{ + ((int (*)(void))func_8014CBF8)(); + ((int (*)(int))func_801474EC)(param_1); + ((int (*)(int, void *))func_80154274)(param_1, &D_800D4C48); + ((int (*)(int, void *))func_80146DB8)(param_1, &D_80195C54); + ((int (*)(int, int))func_801477E8)(param_1, 0xFFF40000); + ((int (*)(int))func_80146CA0)(param_1); +} + + + +extern void (*D_80195C70[])(void *); + +extern void func_80148038(s32 a0, s32 a1); +extern void func_80147460(s32 a0); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801473EC(s32 *a0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_80161418(void *a0); +extern s32 func_801725A4(u8 *a0); + +void func_8015EEE0(void *arg0) +{ + ((void (*)(void *, s32))func_80148038)(arg0, 0x10000); + ((void (*)(void *))func_80147460)(arg0); + ((void (*)(void *, s32, s32, s32))func_80147AD4)(arg0, 0, 0, 0x1000); + ((void (*)(void *))func_801473EC)(arg0); + if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x8000) { + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s32))func_80147078)(arg0, 0); + func_80159B70(arg0); + } else { + if (((s32 (*)(void *))func_80161418)(arg0) == 0) { + ((void (*)(void *))func_801725A4)(arg0); + } + } +} + + +DEFINE_func_8015EF9C() /* dedup: shared engine-core @0x8015EF9C (src/shared) */ + +DEFINE_func_8015EFA4() /* dedup: shared engine-core @0x8015EFA4 (src/shared) */ + +DEFINE_func_8015EFD8() /* dedup: shared engine-core @0x8015EFD8 (src/shared) */ + + + +void func_8015F00C(s32 *a0) { + + extern void (*D_80195F6C[])(void); + D_80195F6C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015F048() /* dedup: shared engine-core @0x8015F048 (src/shared) */ + +DEFINE_func_8015F080() /* dedup: shared engine-core @0x8015F080 (src/shared) */ + +extern s32 D_80062BE8; +extern void (*D_80195C70[])(void *); +extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_8014AB5C(void); +extern void func_80159B70(void *a0); +extern void func_80019064(void *a0); +extern void func_80147324(s32 a0); +extern s32 func_80161208(void); +extern int func_80155FF8(int arg, int a1); + +void func_8015F118(void *a0) { + u16 flag; + + *(s32 *)((u8 *)a0 + 0x44) = *(s32 *)((u8 *)a0 + 0x44) | 2; + flag = *(u16 *)((u8 *)a0 + 0xB8); + if (flag == 0x8000) { + (*D_80195C70[*(u16 *)a0])(a0); + ((void (*)(void *, s32))func_80147078)(a0, 0); + func_80159B70(a0); + } else { + if (flag & 0x4000) { + ((void (*)(s32))func_8014AB5C)(0x19); + ((void (*)(s32))func_8014AB5C)(0x1D); + func_801466F0(0x19, (s32)a0, 0, 0, 0, 0, 0, 1); + func_801466F0(0x19, (s32)a0, 0, 0, 0, 1, 0, 1); + func_801466F0(0x1D, (s32)a0, 0, 0, 0, 0, 0, 1); + func_80019064(&D_80062BE8); + func_80147324(0x9DA); + } + if (((s32 (*)(s32 *))func_80161208)(a0) == 0) { + func_80155FF8((int)a0, *(u8 *)((u8 *)a0 + 0x1AA)); + } + } +} + + +DEFINE_func_8015F260() /* dedup: shared engine-core @0x8015F260 (src/shared) */ + +DEFINE_func_8015F2BC() /* dedup: shared engine-core @0x8015F2BC (src/shared) */ + +DEFINE_func_8015F2F0() /* dedup: shared engine-core @0x8015F2F0 (src/shared) */ + + + +void func_8015F324(s32 *a0) { + + extern void (*D_80195F74[])(void); + D_80195F74[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015F360() /* dedup: shared engine-core @0x8015F360 (src/shared) */ + +DEFINE_func_8015F380() /* dedup: shared engine-core @0x8015F380 (src/shared) */ + + +extern void (*D_80195C70[])(void *); + +extern s32 func_80149884(void); +extern s32 func_801496D4(void*); +extern void func_80149724(void); +extern void func_801477E8(s32*, s32); +extern u16 func_80148800(s32*); +extern s32 func_80148980(u8*); +extern void func_8014F1F4(void); +extern void func_8014FCFC(void); +extern s32 func_80146A6C(s32, void*, s32, s32, s32, s32, s32); +extern void func_80147A84(s32 a0); +extern void func_801473EC(s32*); +extern void func_80146DB8(s32*, s32*); +extern void func_80146E90(s32*, s32); +extern void func_8014ED28(s32 a0); +extern void func_8014FA04(s32 a0); +extern s32 func_801725B8(u8*); +extern void func_80147324(s32 a0); +extern void func_80019064(void*); +extern void func_801484B0(s32, s32); +extern void func_80148534(s32, s32); + +void func_8015F448(s32 arg0) { + + extern u8 D_80062BD0; + extern s32 D_80195F7C; + extern s32 D_80195F8C; + extern s32 D_80195F9C; + s32 sp20[2]; + s32 sp28[2]; + + if (((*(u32 *)(arg0 + 0x44) & 0x100) && (func_80149884() != 0)) || + (((s32 (*)(s32))func_801496D4)(arg0) != 0)) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + *(u8 *)(arg0 + 0x1BE) = 0xA; + ((void (*)(s32))func_80149724)(arg0); + ((void (*)(s32, s32))func_801477E8)(arg0, 0); + return; + } + + if (*(u8 *)(arg0 + 0x245) == 0) { + if (*(u8 *)(arg0 + 0x244) == 0) { + if (((s32 (*)(s32))func_80148800)(arg0) & 0x10) { + *(u8 *)(arg0 + 0x244) = 1; + *(u8 *)(arg0 + 0x245) = 1; + } + } else if (((s32 (*)(s32))func_80148800)(arg0) & 0x80) { + *(u8 *)(arg0 + 0x244) = 0; + *(u8 *)(arg0 + 0x245) = 1; + } + } + + if (*(u16 *)(arg0 + 0xB8) & 0x3000) { + if (*(u16 *)(arg0 + 0xB8) & 0x2000) { + ((void (*)(void *, void *))func_801484B0)(sp20, sp28); + func_80147324(0x56D); + } else { + ((void (*)(void *, void *))func_80148534)(sp20, sp28); + func_80147324(0x56E); + } + ((void (*)(s32 *))func_80019064)(&(*(s32 *)&D_80062BD0)); + ((void (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x25, arg0, *(s16 *)(arg0 + 6), + (s16)(*(u16 *)(arg0 + 0xA) - 0x14), + *(s16 *)(arg0 + 0xE), 0, 0); + ((void (*)(s32, s32, s32, s32, s32, s32, s32))func_80146A6C)(0x25, arg0, *(s16 *)(arg0 + 6), + (s16)(*(u16 *)(arg0 + 0xA) - 0x14), + *(s16 *)(arg0 + 0xE), 1, 0); + } + + if (*(u16 *)(arg0 + 0xB8) & 0x8000) { + if (*(u8 *)(arg0 + 0x245) != 0) { + *(u8 *)(arg0 + 0x245) = 0; + *(u16 *)(arg0 + 0xB8) = *(u16 *)(arg0 + 0xBA); + if (((s32 (*)(s32))func_80148980)(arg0) != 0) { + ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F7C); + } else { + ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F8C); + } + } + } else { + *(u16 *)(arg0 + 0x246) = *(u16 *)(arg0 + 6); + *(u16 *)(arg0 + 0x248) = *(u16 *)(arg0 + 0xA); + *(u16 *)(arg0 + 0x24A) = *(u16 *)(arg0 + 0xE); + func_80147A84(arg0); + ((void (*)(s32))func_801473EC)(arg0); + if (((s32 (*)(s32))func_8014F1F4)(arg0) != 0) { + *(u16 *)(arg0 + 6) = *(u16 *)(arg0 + 0x246); + *(u16 *)(arg0 + 0xA) = *(u16 *)(arg0 + 0x248); + *(u16 *)(arg0 + 0xE) = *(u16 *)(arg0 + 0x24A); + } + } + + if (((s32 (*)(s32))func_8014FCFC)(arg0) == 0) { + D_80195C70[*(u16 *)arg0]((void *)arg0); + *(u8 *)(arg0 + 0x1BE) = 0xA; + ((void (*)(s32))func_80149724)(arg0); + ((void (*)(s32, s32))func_801477E8)(arg0, 0xFFE80000); + ((void (*)(s32, s32 *))func_80146DB8)(arg0, &D_80195F9C); + ((void (*)(s32, s32))func_80146E90)(arg0, 0x10); + return; + } + + func_8014ED28(arg0); + func_8014FA04(arg0); + ((void (*)(s32))func_801725B8)(arg0); +} + + +DEFINE_func_8015F738() /* dedup: shared engine-core @0x8015F738 (src/shared) */ + +DEFINE_func_8015F76C() /* dedup: shared engine-core @0x8015F76C (src/shared) */ + +DEFINE_func_8015F7A0() /* dedup: shared engine-core @0x8015F7A0 (src/shared) */ + + + +s32 func_8015F7D4(s32 a0) { + + extern void (*D_80195FAC[])(void); + D_80195FAC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8015F810() /* dedup: shared engine-core @0x8015F810 (src/shared) */ + +DEFINE_func_8015F848() /* dedup: shared engine-core @0x8015F848 (src/shared) */ + + +extern void (*D_80195C70[])(void *); +extern void func_801466F0(s32, s32, s32, s32, s32, s32, s32, s32); +extern void func_80147078(s32 *, s16); +extern void func_80159B70(void *); +extern s32 func_80161208(void); + +void func_8015F89C(void *arg0) { + u16 flags = *(u16 *)((u8 *)arg0 + 0xB8); + if (!(flags & 0x4000)) { + if (flags & 0x8000) { + D_80195C70[*(u16 *)arg0](arg0); + func_80147078(arg0, 0); + func_80159B70(arg0); + return; + } + } else { + func_801466F0(1, arg0, 0, -0x1E, 0, 0, 0, 0); + } + ((s32 (*)(void *))func_80161208)(arg0); +} + + +DEFINE_func_8015F948() /* dedup: shared engine-core @0x8015F948 (src/shared) */ + + +extern void (*D_80195C70[])(void *); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_80161208(void); + +void func_8015F9A4(void *arg0) { + if (*(u16 *)((u8 *)arg0 + 0xB8) & 0x8000) { + D_80195C70[*(u16 *)arg0](arg0); + func_80147078(arg0, 0); + func_80159B70(arg0); + } else { + ((s32 (*)(void *))func_80161208)(arg0); + } +} + + +DEFINE_func_8015FA24() /* dedup: shared engine-core @0x8015FA24 (src/shared) */ + +DEFINE_func_8015FA44() /* dedup: shared engine-core @0x8015FA44 (src/shared) */ + +DEFINE_func_8015FA78() /* dedup: shared engine-core @0x8015FA78 (src/shared) */ + + + +void func_8015FAAC(s32 *a0) { + + extern void (*D_80195FB8[])(void); + D_80195FB8[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern s32 func_801612B8(void *a0, s32 a1); +extern void func_8016007C(s32 a0); +extern void (*D_80195C70[])(void *); +extern void func_80147078(s32 *a0, s16 a1); +extern s32 func_8015BE94(); +extern void func_8015C0C4(s32 a0); +extern void func_8015FBE0(s32 *a0); + +void func_8015FAE8(void *arg0) { + s32 v; + + v = func_801612B8(arg0, 0); + if (v == 0 || v == 0x8000) { + ((void (*)(void *))func_8016007C)(arg0); + *(u32 *)((u8 *)arg0 + 0x184) |= 0x80000000; + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 3); + ((void (*)(void *))func_8015BE94)(arg0); + } else if ((v & 0x4000) != 0) { + ((void (*)(void *))func_8016007C)(arg0); + *(u32 *)((u8 *)arg0 + 0x184) |= 0x80000000; + D_80195C70[*(u16 *)arg0](arg0); + ((void (*)(void *, s16))func_80147078)(arg0, 4); + ((void (*)(void *))func_8015C0C4)(arg0); + } else { + ((void (*)(void *))func_8015FBE0)(arg0); + } +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8015FBE0); + +extern void func_801599A4(void *a0); + +// @class: struct +// @stuck: none — MATCH (indexed fn-ptr table call + byte-offset struct stores; mirrors sibling func_801599A4 idiom) + +extern s32 D_800AE6B0; +extern void (*D_80195C70[])(void *); + +extern void func_8016007C(s32 a0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_8014BFF4(s32 a0, s32 a1); +extern void func_80146CA0(void *a0); + +void func_8015FCC8(void *param_1) { + if ((D_800AE6B0 & 0x80FFFFFF) != 0) { + ((void (*)(void))func_8016007C)(); + D_80195C70[*(u16 *)param_1](param_1); + ((void (*)(void *, s32))func_80147078)(param_1, 0); + func_80159B70(param_1); + } else { + *(u8 *)((s32)param_1 + 0x197) = 0; + *(u8 *)((s32)param_1 + 0xBE) = 0; + *(u8 *)((s32)param_1 + 0xBF) = 0; + *(u8 *)((s32)param_1 + 0x1A0) = (u8)*(s32 *)((s32)param_1 + 0x184); + ((s32 (*)(void *, s32))func_8014BFF4)(param_1, 1); + func_80146CA0(param_1); + } +} + + + +// @class: plumbing +// @stuck: none — MATCH expected; simple 3-call sequence with global table index + +extern unsigned int D_80195FCC[]; + +extern void func_80147324(s32 arg0); +extern s32 func_8013767C(s32 a0); +extern void func_80146CA0(void *a0); + +void func_8015FD74(int param_1) +{ + ((int (*)(int))func_80147324)(0x18); + *(int *)(param_1 + 0x198) = func_8013767C(D_80195FCC[*(unsigned char *)(param_1 + 0x1a0)]); + ((int (*)(int))func_80146CA0)(param_1); +} + + +DEFINE_func_8015FDCC() /* dedup: shared engine-core @0x8015FDCC (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (fn-ptr-table dispatch + ushort struct fields) + + +extern void (*D_80195C70[])(void*); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern void func_80154A74(s32 a0, s32 a1); +extern s32 func_80161208(); + +void func_8015FE70(u16 *param_1) +{ + if ((param_1[0x5c] & 0x8000) != 0) { + if (param_1[0x5d] == 0) { + ((void (**)())D_80195C70)[param_1[0]](); + ((void (*)(u16 *, s16))func_80147078)(param_1, 0); + ((void (*)(u16 *))func_80159B70)(param_1); + return; + } + param_1[0x5c] = param_1[0x5d]; + } + if ((param_1[0x5c] & 0x4000) != 0) { + ((void (*)(u16 *, s16))func_80154A74)(param_1, 0x11); + } + ((void (*)(u16 *))func_80161208)(param_1); +} + + + +extern s32 D_800AE6B0; +extern void (*D_80195C70[])(void *); +extern u8 D_80078EC1; +extern u8 D_80078EC2; +extern u16 D_801270C0; + +extern void func_8016007C(s32 a0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern u8 func_801656E8(s32 a0, s32 a1); +extern void func_80150820(s32 a0, s32 a1); +extern void func_8014BFF4(s32 a0, s32 a1); +extern void func_80165670(s32 a0, s32 a1); +extern void func_80165840(void); +extern void func_801658DC(void); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_8016004C(s32 a0); + +void func_8015FF20(void *param_1) { + s32 v2; + u8 cur; + + if ((D_800AE6B0 & 0x80FFFFFF) != 0) { + ((void (*)(void))func_8016007C)(); + D_80195C70[*(u16 *)param_1](param_1); + ((void (*)(void *, s16))func_80147078)(param_1, 0); + func_80159B70(param_1); + return; + } + + v2 = *(s32 *)((s32)param_1 + 0x184); + if (v2 < 0) { + func_80150820((s32)param_1, func_801656E8((s32)param_1, v2 & 0xFF) & 0xFF); + } else { + if (*(u8 *)((s32)param_1 + 0x1A0) != *(u8 *)((s32)param_1 + 0x196)) { + *(u8 *)((s32)param_1 + 0x1A0) = (u8)v2; + *(u8 *)((s32)param_1 + 0x197) = 0; + *(u8 *)((s32)param_1 + 0xBE) = 0; + *(u8 *)((s32)param_1 + 0xBF) = 0; + func_8014BFF4((s32)param_1, 1); + } + + cur = *(u8 *)((s32)param_1 + 0x1A0); + D_80078EC1 = cur; + D_80078EC2 = cur; + func_80165670((s32)param_1, cur); + ((void (*)(void *))func_80165840)(param_1); + ((void (*)(void *))func_801658DC)(param_1); + func_80154A74((s32)param_1, 0x11); + D_801270C0 = 1; + } + + ((void (*)(void *))func_8016004C)(param_1); +} + + +DEFINE_func_8016004C() /* dedup: shared engine-core @0x8016004C (src/shared) */ + +DEFINE_func_8016007C() /* dedup: shared engine-core @0x8016007C (src/shared) */ + +DEFINE_func_801600D0() /* dedup: shared engine-core @0x801600D0 (src/shared) */ + +DEFINE_func_80160104() /* dedup: shared engine-core @0x80160104 (src/shared) */ + + + +void func_80160138(s32 *a0) { + + extern void (*D_80196048[])(void); + D_80196048[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80160174() /* dedup: shared engine-core @0x80160174 (src/shared) */ + +DEFINE_func_801601AC() /* dedup: shared engine-core @0x801601AC (src/shared) */ + +DEFINE_func_801601E4() /* dedup: shared engine-core @0x801601E4 (src/shared) */ + +DEFINE_func_80160244() /* dedup: shared engine-core @0x80160244 (src/shared) */ + + +extern void (*D_80195C70[])(void*); +extern void func_80154A74(s32 a0, s32 a1); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_80161208(); + +void func_801602A4(s32 *a0) { + if (*(u16 *)((u8 *)a0 + 0xB8) == 0x8000) { + ((void (**)())D_80195C70)[*(u16 *)a0](); + func_80154A74((s32)a0, 0x11); + ((void (*)(s32, s32))func_80147078)((s32)a0, 0); + func_80159B70(a0); + } else { + ((s32 (*)(s32 *))func_80161208)(a0); + } +} + + +DEFINE_func_8016032C() /* dedup: shared engine-core @0x8016032C (src/shared) */ + +DEFINE_func_80160334() /* dedup: shared engine-core @0x80160334 (src/shared) */ + +DEFINE_func_80160368() /* dedup: shared engine-core @0x80160368 (src/shared) */ + + + +void func_8016039C(s32 *a0) { + + extern void (*D_80196058[])(void); + D_80196058[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_801603D8() /* dedup: shared engine-core @0x801603D8 (src/shared) */ + +DEFINE_func_80160410() /* dedup: shared engine-core @0x80160410 (src/shared) */ + + + + + + + +/* data */ +extern u8 D_80078EC0; +extern u8 D_80078EBF; +extern void (*D_80195C70[])(void *); + +/* callees (engine_core.h canonical sigs) */ +extern void func_80149020(s32 *a0); +extern void func_80149034(s32 *a0); +extern u16 func_80148800(s32 *a0); +extern s32 func_80149B54(s32 *a0); +extern void func_80149BAC(s32 *a0); +extern s32 func_80149AA8(s32 *a0); +extern void func_80149AD4(s32 *a0); +extern s32 func_80146E98(s32 a0); +extern u16 func_801487F4(s32 *a0); +extern void func_8015E9B8(s32 *a0); +extern void func_80159B70(void *a0); +extern s32 func_800CF8B4(); +extern s32 func_801491C4(s32 a0); +extern void func_80147AD4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_801473EC(s32 *a0); +extern void func_8014D738(void); +extern void func_8015C714(void *a0); +extern s32 func_80161208(); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_8015F00C(s32 *a0); + +void func_80160534(u8 *p) { + + extern s16 D_801152A0; + func_80149020((s32 *)p); + func_80149034((s32 *)p); + if ((D_80078EC0 & 0x7F) != 0 && (func_80148800((s32 *)p) & 0x90) != 0) { + if (D_80078EBF == 0x80) { + D_80195C70[*(u16 *)p](p); + func_80147078((s32 *)p, 0x13); + func_8015F00C((s32 *)p); + return; + } + if (func_80149B54((s32 *)p) != 0) { + D_80195C70[*(u16 *)p](p); + func_80149BAC((s32 *)p); + return; + } + } + if (func_80149AA8((s32 *)p) != 0) { + D_80195C70[*(u16 *)p](p); + func_80149AD4((s32 *)p); + return; + } + if (func_80146E98((s32)p) != 0) { + if ((func_801487F4((s32 *)p) & 8) != 0) { + D_80195C70[*(u16 *)p](p); + func_80147078((s32 *)p, 0x11); + func_8015E9B8((s32 *)p); + } else { + D_80195C70[*(u16 *)p](p); + func_80147078((s32 *)p, 0); + func_80159B70(p); + } + return; + } + if (func_800CF8B4() != 0) { + *(u16 *)(*(s32 *)(p + 0x20) + 0x12) = + ((*(u16 *)&D_801152A0) + func_801491C4((s32)p)) & 0xFFF; + } + func_80147AD4((s32)p, *(s32 *)(p + 0x234), *(s32 *)(p + 0x238), + *(s32 *)(p + 0x23C)); + func_801473EC((s32 *)p); + if (((s32 (*)(s32 *))func_8014D738)((s32 *)p) != 0) { + D_80195C70[*(u16 *)p](p); + func_80147078((s32 *)p, 9); + func_8015C714(p); + } else { + ((s32 (*)(void *))func_80161208)(p); + } +} + + +DEFINE_func_801607B8() /* dedup: shared engine-core @0x801607B8 (src/shared) */ + +DEFINE_func_801607E4() /* dedup: shared engine-core @0x801607E4 (src/shared) */ + +DEFINE_func_80160818() /* dedup: shared engine-core @0x80160818 (src/shared) */ + + + +void func_8016084C(s32 *a0) { + + extern void (*D_80196060[])(void); + D_80196060[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80160888() /* dedup: shared engine-core @0x80160888 (src/shared) */ + +DEFINE_func_801608C0() /* dedup: shared engine-core @0x801608C0 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (function-pointer table folds %lo via extern array indexed by halfword) + +typedef void (*code)(unsigned short *); + +extern void (*D_80195C70[])(void*); + +extern u16 func_801487F4(s32 *a0); +extern s32 func_80161208(); +extern void func_80160A74(s32 *a0); +extern void func_80154150(s32 a0, s32 a1); +extern void func_80146CA0(void *a0); + +void func_80160920(unsigned short *param_1) +{ + if ((((int (*)(void))func_801487F4)() & 8) == 0) { + ((code *)D_80195C70)[*param_1](param_1); + ((void (*)(unsigned short *))func_80160A74)(param_1); + } else { + if (((int (*)(unsigned short *))func_80161208)(param_1) == 0 && param_1[0x5c] == 0x8000) { + ((void (*)(unsigned short *, int))func_80154150)(param_1, 0x25); + ((void (*)(unsigned short *))func_80146CA0)(param_1); + } + } + return; +} + + + + +// @class: struct +// @stuck: none — MATCH (pending byte-gate); function-pointer table %lo-fold via extern array + + +extern u16 func_801487F4(s32 *a0); +extern void func_80160A74(s32 *a0); +extern s32 func_80161208(); + +/* function-pointer dispatch table; indexed by *param_1 (×4 = ptr size) */ +extern void (*D_80195C70[])(void*); + +void func_801609B8(u16 *param_1) { + if ((((u32 (*)(void))func_801487F4)() & 8) == 0) { + ((void (**)(u16*))D_80195C70)[*param_1](param_1); + ((void (*)(u16 *))func_80160A74)(param_1); + } else { + ((void (*)(u16 *))func_80161208)(param_1); + } +} + + +DEFINE_func_80160A28() /* dedup: shared engine-core @0x80160A28 (src/shared) */ + +DEFINE_func_80160A74() /* dedup: shared engine-core @0x80160A74 (src/shared) */ + +DEFINE_func_80160ACC() /* dedup: shared engine-core @0x80160ACC (src/shared) */ + +DEFINE_func_80160B00() /* dedup: shared engine-core @0x80160B00 (src/shared) */ + + + +s32 func_80160B34(s32 a0) { + + extern void (*D_8019606C[])(void); + D_8019606C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80160B70() /* dedup: shared engine-core @0x80160B70 (src/shared) */ + +DEFINE_func_80160BB4() /* dedup: shared engine-core @0x80160BB4 (src/shared) */ + +DEFINE_func_80160C28() /* dedup: shared engine-core @0x80160C28 (src/shared) */ + +DEFINE_func_80160CB4() /* dedup: shared engine-core @0x80160CB4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (mirrors byte-matched func_8015DBD4 in same overlay; dispatch via D_80195C70 + func_80147078/func_80159B70 tail, func_80161208 else) + +extern void (*D_80195C70[])(void *); +extern u16 func_80148800(s32 *a0); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); +extern s32 func_80161208(); + +void func_80160D10(void *arg0) { + if (*(u32 *)((u8 *)arg0 + 0x44) & 0x10) { + D_80195C70[*(u16 *)arg0](arg0); + } else { + if (*(s32 *)((u8 *)arg0 + 0x1AC) == 0) { + if ((((s32 (*)(void *))func_80148800)(arg0) & 0xF0) == 0) { + goto dd0; + } + } else { + s32 t = *(s32 *)((u8 *)arg0 + 0x1AC) - 0xAAA8; + *(s32 *)((u8 *)arg0 + 0x1AC) = t; + if (t >= 0) { + goto dd0; + } + } + D_80195C70[*(u16 *)arg0](arg0); + } + ((void (*)(void *, s16))func_80147078)(arg0, 0); + func_80159B70(arg0); + return; +dd0: + ((s32 (*)(void *))func_80161208)(arg0); +} + + +DEFINE_func_80160DEC() /* dedup: shared engine-core @0x80160DEC (src/shared) */ + +DEFINE_func_80160E3C() /* dedup: shared engine-core @0x80160E3C (src/shared) */ + +DEFINE_func_80160E70() /* dedup: shared engine-core @0x80160E70 (src/shared) */ + + +extern void (*D_8019607C[])(void); + +void func_80160EA4(void *a0) { + D_8019607C[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80160EE0() /* dedup: shared engine-core @0x80160EE0 (src/shared) */ + +DEFINE_func_80160F00() /* dedup: shared engine-core @0x80160F00 (src/shared) */ + +DEFINE_func_80160F70() /* dedup: shared engine-core @0x80160F70 (src/shared) */ + +DEFINE_func_80160FE0() /* dedup: shared engine-core @0x80160FE0 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH + +extern void func_80149020(s32 *a0); +extern void (*D_80195C70[])(void *); +extern void func_80147078(s32 *a0, s16 a1); +extern void func_80159B70(void *a0); + +void func_80161034(void *a0) +{ + func_80149020(a0); + D_80195C70[*(u16 *)a0](a0); + func_80147078(a0, 0); + func_80159B70(a0); +} + + +DEFINE_func_80161094() /* dedup: shared engine-core @0x80161094 (src/shared) */ + +DEFINE_func_801610FC() /* dedup: shared engine-core @0x801610FC (src/shared) */ + +DEFINE_func_80161104() /* dedup: shared engine-core @0x80161104 (src/shared) */ + +DEFINE_func_80161124() /* dedup: shared engine-core @0x80161124 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161208); + +DEFINE_func_80161240() /* dedup: shared engine-core @0x80161240 (src/shared) */ + +DEFINE_func_80161278() /* dedup: shared engine-core @0x80161278 (src/shared) */ + +DEFINE_func_801612B8() /* dedup: shared engine-core @0x801612B8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8016130C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161374); + +DEFINE_func_80161418() /* dedup: shared engine-core @0x80161418 (src/shared) */ + +DEFINE_func_80161450() /* dedup: shared engine-core @0x80161450 (src/shared) */ + +DEFINE_func_80161488() /* dedup: shared engine-core @0x80161488 (src/shared) */ + +DEFINE_func_801614E4() /* dedup: shared engine-core @0x801614E4 (src/shared) */ + +DEFINE_func_8016151C() /* dedup: shared engine-core @0x8016151C (src/shared) */ + +DEFINE_func_80161554() /* dedup: shared engine-core @0x80161554 (src/shared) */ + +DEFINE_func_8016158C() /* dedup: shared engine-core @0x8016158C (src/shared) */ + +DEFINE_func_801615C4() /* dedup: shared engine-core @0x801615C4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8016163C); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161774); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161888); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8016191C); + +DEFINE_func_8016197C() /* dedup: shared engine-core @0x8016197C (src/shared) */ + +DEFINE_func_801619A4() /* dedup: shared engine-core @0x801619A4 (src/shared) */ + +DEFINE_func_801619D0() /* dedup: shared engine-core @0x801619D0 (src/shared) */ + +DEFINE_func_80161A00() /* dedup: shared engine-core @0x80161A00 (src/shared) */ + +DEFINE_func_80161A30() /* dedup: shared engine-core @0x80161A30 (src/shared) */ + +DEFINE_func_80161A60() /* dedup: shared engine-core @0x80161A60 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161A90); + +DEFINE_func_80161B18() /* dedup: shared engine-core @0x80161B18 (src/shared) */ + +DEFINE_func_80161B84() /* dedup: shared engine-core @0x80161B84 (src/shared) */ + +DEFINE_func_80161BE0() /* dedup: shared engine-core @0x80161BE0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161C24); + + +// @class: struct +// @stuck: none — MATCH (indexed-global %lo-fold via extern u16 array, §18) + +extern u16 D_801960AC[]; +extern void func_80147324(s32 arg0); + +void func_80161C98(int param_1, u32 param_2) +{ + if (param_2 < 8) { + func_80147324(D_801960AC[param_2]); + } + return; +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161CD0); + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80161D20); + +DEFINE_func_80161D58() /* dedup: shared engine-core @0x80161D58 (src/shared) */ + + +// @class: other +// @stuck: none — MATCH (short-circuit && chain; reused 0x80FFFFFF mask const, andi-0xFF on callee ret) + +extern s32 D_800AE6B0; +extern s32 D_800AE6A8; +extern s32 func_80029178(s32 arg); +extern void func_80029124(s32, s32); +extern void func_800D1734(void *); +extern s32 D_80196110; + +void func_80161D88(void) { + if ((D_800AE6B0 & 0x80FFFFFF) == 0 && (D_800AE6A8 & 0x80FFFFFF) == 0 && + (func_80029178(0x141) & 0xFF) != 0) { + func_80029124(0x141, 0); + func_80029124(0x95, 1); + func_800D1734(&D_80196110); + } +} + + +// @class: regalloc-order +// @stuck: none — MATCH (175 ins, relocation-masked). Giant, 3 similar guarded blocks. base=&D_800AF630 +// hoisted to $s2 (referenced only to build the 3 stored pointers base+0x65A8/0x65E0/0x6618 -> $s1); +// guard reads (D_800B5BD8/C10/C48) + the "=1" + coord stores use direct symbols. Coord idiom: +// -(s32)(u16)D_800AF7BC/2 + K (negu;srl31;addu;sra1). a2=func_800291DC(8) survives in $s3 for the +// final (a2&0x7FFF)==(s16)D_80078EB0 test. KEY RESIDUAL (cracked): target computes each pointer into +// scratch $v0 then `addu $s1,$v0` (dead-intermediate copy) and stores $s1 — natural C ALWAYS coalesces +// that copy into a direct `addiu $s1,$s2,off` (172 ins, 3 short). Forcing the un-coalesced copy needs +// an explicit `move` inline-asm (an empty "=r"/"0" re-tie is only a barrier, won't emit the copy). +#include "common.h" + + + + + + + +void func_80161E08(s32 param_1) { + extern void func_80024054(void *a0, void *a1); + extern void func_8001CE28(void *a0, void *a1); + extern void func_800242D0(s32 a0, void *a1, s32 a2); + extern void func_8001CE68(void *a0, void *a1); + extern int func_801620C4(void); + extern void func_801622C4(void); + extern u16 D_800AF7BC; + extern u16 D_800AF7BE; + extern s16 D_80078EB0; + extern u16 D_800B5BD8; + extern s16 D_800B5C04; + extern u8 D_800B5BFF; + extern s16 D_800B5BE0; + extern s16 D_800B5BE2; + extern u16 D_800B5C10; + extern s16 D_800B5C3C; + extern u8 D_800B5C37; + extern s16 D_800B5C18; + extern s16 D_800B5C1A; + extern u16 D_800B5C48; + extern s16 D_800B5C74; + extern s16 D_800B5C50; + extern s16 D_800B5C52; + extern u8 * D_801D3DC8[]; + extern u8 D_801960DC[]; + extern u8 D_801960FC[]; + extern u8 D_801D3DD4[]; + extern u8 D_801D3DFC[]; + extern u8 D_801D3E14[]; + + u8 *base = &(*(u8 *)&D_800AF630); + u8 *p; + s32 a2; + + if (*((u16 *)param_1) != 0x1A && + currentLocationId != 0x3012 && + currentLocationId != 0x3054 && + currentLocationId != 0x3079 && + currentLocationId != 0x3096 && + ((a2 = func_800291DC(8)) & 0x8000) != 0) { + + if (D_800B5BD8 == 0) { + __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x65A8)); + D_801D3DC8[0] = p; + func_80024054(&D_801960DC, &D_801D3DD4); + func_8001CE28(p, &D_801D3DD4); + D_800B5C04 = 1; + D_800B5BFF = 1; + D_800B5BE0 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; + D_800B5BE2 = -(s32)(u16)D_800AF7BE / 2 + 0x28; + } + + if (D_800B5C10 == 0) { + __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x65E0)); + D_801D3DC8[1] = p; + func_80024054(&D_801960FC, &D_801D3DFC); + func_8001CE28(p, &D_801D3DFC); + D_800B5C3C = 1; + D_800B5C37 = 1; + D_800B5C18 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; + D_800B5C1A = -(s32)(u16)D_800AF7BE / 2 + 0x30; + } + + if (D_800B5C48 == 0) { + __asm__("move %0,%1" : "=r"(p) : "r"(base + 0x6618)); + D_801D3DC8[2] = p; + func_800242D0((s16)func_801620C4(), &D_801D3E14, 0x84); + func_8001CE68(p, &D_801D3E14); + D_800B5C74 = 1; + D_800B5C50 = -(s32)(u16)D_800AF7BC / 2 + 0xD0; + D_800B5C52 = -(s32)(u16)D_800AF7BE / 2 + 0x10; + } + + func_800242D0((s16)func_801620C4(), &D_801D3E14, 0x84); + if ((a2 & 0x7FFF) == (s32)D_80078EB0) { + func_801622C4(); + } + } +} + + + +DEFINE_func_801620C4() /* dedup: shared engine-core @0x801620C4 (src/shared) */ + +DEFINE_func_80162120() /* dedup: shared engine-core @0x80162120 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (do-while scan over 3-entry global; increments placed AFTER the call so p++ schedules between load and jal, i++ into the delay slot) + +extern void func_800291C8(s32, s32); +extern void func_80016714(void *a0, s32 a1); + +extern int D_801D3DC8[]; + +void func_8016216C(void) +{ + int *p; + int i; + + func_800291C8(8, 0); + i = 0; + p = D_801D3DC8; + do { + int v = *p; + ((void (*)(int, int))func_80016714)(v, 0x38); + p = p + 1; + i = i + 1; + } while (i < 3); +} + + + +extern s32 func_800291DC(s32); +extern u8 D_80078E78[]; +extern u8 D_80078EB0; +extern u8 D_80078EB1; +extern s32 D_80196110; + +s32 func_801621CC(s32 arg0) { + register s32 s0 __asm__("$16") = arg0; /* $s0: arg0, crosses the call */ + register u8 *s1 __asm__("$17") = D_80078E78; /* $s1: base, hoisted for the loop */ + register s32 i __asm__("$5"); /* $a1: counter (pin fixes the i/d swap) */ + u32 a2; + s32 d; /* $a0: natural alloc; load via $v0 temp */ + s32 v, last, hi, lo; + char pad[8]; /* phantom 8B local -> frame 0x28 (vars=8) */ + + a2 = func_800291DC(8); + if ((a2 & 0x8000) == 0) { + return 0; + } + a2 &= 0x7FFF; + if (((a2 >> 8) == D_80078EB1) && ((a2 & 0xFF) <= (u32)D_80078EB0)) { + return (s32)&D_80196110; + } + d = s1[0x39] - 1; + i = 0; + if (s0 <= 0) { + return 0; + } + hi = (a2 >> 8) & 0xFF; + last = s0 - 1; + lo = a2 & 0xFF; + do { + if ((s8)d < 0) { + d = 0x17; + } + v = (s8)d; + if (hi == v) { + if (i != last) { + return (s32)&D_80196110; + } + i++; + if ((u32)s1[0x38] < (u32)lo) { + return (s32)&D_80196110; + } + goto bot; + } + i++; + bot: + d--; + } while (i < s0); + return 0; +} + + + + +// @class: schedule +// @stuck: none — MATCH +extern void func_80029124(s32, s32); +extern void func_800291C8(s32, s32); +extern void func_80016714(void *a0, s32 a1); +extern int D_801D3DC8[]; + +void func_801622C4(void) +{ + int *p; + int i; + + ((int (*)(int, int))func_80029124)(0x141, 1); + ((int (*)(int, int))func_800291C8)(8, 0); + i = 0; + p = &D_801D3DC8; + do { + ((int (*)(int, int))func_80016714)(*p, 0x38); + p = p + 1; + i = i + 1; + } while (i < 3); +} + + + +extern void (*D_80196134[])(void); + +void func_80162330(void *a0) { + D_80196134[*(u8 *)((s32)a0 + 0x15)](); +} + + +DEFINE_func_8016236C() /* dedup: shared engine-core @0x8016236C (src/shared) */ + +DEFINE_func_801623B8() /* dedup: shared engine-core @0x801623B8 (src/shared) */ + +DEFINE_func_80162414() /* dedup: shared engine-core @0x80162414 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (160 ins, relocation-masked). Keys: (1) base=&D_800AF630 hoisted, pinned $s2; +// uVar2 UNPINNED (a $s3 pin forced the final `uVar2 & 0x7FFF` in-place+early, breaking the lh delay +// slot). (2) item pinned $s1, dest INLINED (D_801D96Dx in both call args) so it lands $s0 AFTER a0. +// (3) base assigned BEFORE the func_800291DC call so the return-copy `addu $s3,$v0` schedules after +// the base lui/addiu. (4) THE MOVE: each block's `addu $s1,$v0,$zero` = compute `base+off` into a +// $v0-PINNED temp `t`, then `item = t`. Two distinct hard regs ($v0 vs $s1) can't coalesce, forcing +// the exact `addiu $v0,$s2,off ; addu $s1,$v0` pair the target emits (plain `item=base+off` coalesces +// into one `addiu $s1` — 3 ins short). (5) store D_801D3E20[i] via `extern int D_801D3E20[]` (folds +// %lo, consistent with func_80162760). Coord = (s16)(-D_800AF7Bx / 2 + K) (negu; srl 31; addu; sra 1). + +#include "common.h" + + + + + + + + +s32 func_80162438(s32 _unused0) { + extern void func_80024054(void *, void *); + extern void func_8001CE28(void *, void *); + extern void func_8001CE68(void *, void *); + extern void func_800242D0(s32, void *, s32); + extern s32 func_801626B8(void); + extern void func_80162760(void); + extern u8 D_80196140[]; + extern s32 D_80196158; + extern u8 D_801D3E2C[]; + extern u8 D_801D3E54[]; + extern u8 D_801D3E70[]; + extern int D_801D3E20[]; + extern u16 D_800B5BD8; + extern u16 D_800B5C10; + extern u16 D_800B5C48; + extern u16 D_800AF7BC; + extern u16 D_800AF7BE; + extern s16 D_800B5BE0; + extern s16 D_800B5BE2; + extern s16 D_800B5C04; + extern u8 D_800B5BFF; + extern s16 D_800B5C18; + extern s16 D_800B5C1A; + extern s16 D_800B5C3C; + extern u8 D_800B5C37; + extern s16 D_800B5C50; + extern s16 D_800B5C52; + extern s16 D_800B5C74; + + u32 uVar2; + register u8 *base __asm__("$18"); + register u8 *item __asm__("$17"); + + base = &(*(u8 *)&D_800AF630); + uVar2 = func_800291DC(0x12); + if ((uVar2 & 0x8000) != 0) { + if (D_800B5BD8 == 0) { + register u8 *t __asm__("$2") = base + 0x65A8; + item = t; + D_801D3E20[0] = (s32)item; + func_80024054(D_80196140, D_801D3E2C); + func_8001CE28(item, D_801D3E2C); + D_800B5C04 = 1; + D_800B5BFF = 1; + D_800B5BE0 = -D_800AF7BC / 2 + 0xD0; + D_800B5BE2 = -D_800AF7BE / 2 + 0x28; + } + if (D_800B5C10 == 0) { + register u8 *t __asm__("$2") = base + 0x65E0; + item = t; + D_801D3E20[1] = (s32)item; + func_80024054(((u8 *)&D_80196158), D_801D3E54); + func_8001CE28(item, D_801D3E54); + D_800B5C3C = 1; + D_800B5C37 = 1; + D_800B5C18 = -D_800AF7BC / 2 + 0xD0; + D_800B5C1A = -D_800AF7BE / 2 + 0x30; + } + if (D_800B5C48 == 0) { + register u8 *t __asm__("$2") = base + 0x6618; + item = t; + D_801D3E20[2] = (s32)item; + func_800242D0((s16)func_801626B8(), D_801D3E70, 0x84); + func_8001CE68(item, D_801D3E70); + D_800B5C74 = 1; + D_800B5C50 = -D_800AF7BC / 2 + 0xD0; + D_800B5C52 = -D_800AF7BE / 2 + 0x10; + } + func_800242D0((s16)func_801626B8(), D_801D3E70, 0x84); + if ((uVar2 & 0x7FFF) == (s32)(*(s16 *)&D_80078EB0)) { + func_80162760(); + } + } +} + + + +DEFINE_func_801626B8() /* dedup: shared engine-core @0x801626B8 (src/shared) */ + +DEFINE_func_80162714() /* dedup: shared engine-core @0x80162714 (src/shared) */ + + +// @class: schedule +// @stuck: none — MATCH (24 ins). do-while; load+call first, then p++ and i++ AFTER the call so gcc schedules p++/arg ahead of jal and i++ into the delay slot. + +extern void func_800291C8(s32, s32); +extern void func_80016714(void *a0, s32 a1); + +extern int D_801D3E20[]; + +void func_80162760(void) +{ + int *p; + int i; + + func_800291C8(0x12, 0); + i = 0; + p = D_801D3E20; + do { + int v = *p; + ((void (*)(int, int))func_80016714)(v, 0x38); + p = p + 1; + i = i + 1; + } while (i < 3); +} + + +DEFINE_func_801627C0() /* dedup: shared engine-core @0x801627C0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_801627E8); + + +extern void (*D_8019617C[])(void); + +void func_80162834(void *a0) { + D_8019617C[*(u8 *)((s32)a0 + 0x1)](); +} + + + +// @class: plumbing +// @stuck: none — MATCH (stub: alloc + global init + two calls; $s0 holds param_1 across calls) + +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_8019616C; +extern s32 D_800B5CBC; +extern u8 D_800B5CDF; +extern s32 D_800B5CEC; + +void func_80162870(s32 param_1) { + *(s32 *)(param_1 + 8) = (s32)&D_800B5CB8; + func_8001CB6C(&D_800B5CB8, (s32)&D_8019616C, 0x250, 0x1A0); + D_800B5CEC = param_1 + 0xC; + D_800B5CDF = 0x14; + D_800B5CBC |= 0x60000000; + func_80162968(param_1); + func_80162ACC((u8 *)param_1); +} + + +DEFINE_func_801628F4() /* dedup: shared engine-core @0x801628F4 (src/shared) */ + +DEFINE_func_80162968() /* dedup: shared engine-core @0x80162968 (src/shared) */ + +DEFINE_func_80162AC0() /* dedup: shared engine-core @0x80162AC0 (src/shared) */ + +DEFINE_func_80162ACC() /* dedup: shared engine-core @0x80162ACC (src/shared) */ + +DEFINE_func_80162AE0() /* dedup: shared engine-core @0x80162AE0 (src/shared) */ + +DEFINE_func_80162AF4() /* dedup: shared engine-core @0x80162AF4 (src/shared) */ + +DEFINE_func_80162B1C() /* dedup: shared engine-core @0x80162B1C (src/shared) */ + +DEFINE_func_80162CC4() /* dedup: shared engine-core @0x80162CC4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80162CCC); + +DEFINE_func_80162D28() /* dedup: shared engine-core @0x80162D28 (src/shared) */ + +DEFINE_func_80162D88() /* dedup: shared engine-core @0x80162D88 (src/shared) */ + +DEFINE_func_80162DE8() /* dedup: shared engine-core @0x80162DE8 (src/shared) */ + +DEFINE_func_80162E48() /* dedup: shared engine-core @0x80162E48 (src/shared) */ + +DEFINE_func_80162EA8() /* dedup: shared engine-core @0x80162EA8 (src/shared) */ + +DEFINE_func_80162F08() /* dedup: shared engine-core @0x80162F08 (src/shared) */ + +DEFINE_func_80162F60() /* dedup: shared engine-core @0x80162F60 (src/shared) */ + +DEFINE_func_80162F80() /* dedup: shared engine-core @0x80162F80 (src/shared) */ + +DEFINE_func_80162FA0() /* dedup: shared engine-core @0x80162FA0 (src/shared) */ + +DEFINE_func_80162FC0() /* dedup: shared engine-core @0x80162FC0 (src/shared) */ + +DEFINE_func_80162FF4() /* dedup: shared engine-core @0x80162FF4 (src/shared) */ + +DEFINE_func_801630C4() /* dedup: shared engine-core @0x801630C4 (src/shared) */ + +DEFINE_func_80163194() /* dedup: shared engine-core @0x80163194 (src/shared) */ + +DEFINE_func_80163234() /* dedup: shared engine-core @0x80163234 (src/shared) */ + +DEFINE_func_8016325C() /* dedup: shared engine-core @0x8016325C (src/shared) */ + +DEFINE_func_801632E0() /* dedup: shared engine-core @0x801632E0 (src/shared) */ + +DEFINE_func_801632F0() /* dedup: shared engine-core @0x801632F0 (src/shared) */ + +DEFINE_func_80163328() /* dedup: shared engine-core @0x80163328 (src/shared) */ + +DEFINE_func_801633A8() /* dedup: shared engine-core @0x801633A8 (src/shared) */ + +// @class: struct +// @stuck: none — MATCH (21 ins, relocation-masked) + + +s32 func_80163408(s32 param_1, s32 param_2, s32 param_3, s32 param_4) { + extern int func_8016345C(int, unsigned short, int, unsigned short, void *); + extern unsigned char D_801D34A0[8]; + + unsigned char sp18[8]; + memcpy(sp18, D_801D34A0, 8); + return func_8016345C(((int)param_1), ((int)param_2), ((int)param_3), ((int)param_4), sp18); +} + + + +DEFINE_func_8016345C() /* dedup: shared engine-core @0x8016345C (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (unaligned 8-byte memcpy from global into stack buffer, then forward to callee) + +extern char D_801D34A0[8]; + +extern void *memcpy(void *dst, const void *src, unsigned int n); +extern void func_80163534(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); + +void func_801634D8(s32 param_1, u16 param_2, u16 param_3, s32 param_4, u16 param_5) +{ + char buf[8]; + + memcpy(buf, D_801D34A0, 8); + ((void (*)(s32, u16, u16, s32, u16, s32))func_80163534)(param_1, param_2, param_3, param_4, param_5, (s32)buf); +} + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80163534); + +DEFINE_func_80163664() /* dedup: shared engine-core @0x80163664 (src/shared) */ + +DEFINE_func_801636D0() /* dedup: shared engine-core @0x801636D0 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80163764); + +DEFINE_func_8016380C() /* dedup: shared engine-core @0x8016380C (src/shared) */ + +DEFINE_func_801638A0() /* dedup: shared engine-core @0x801638A0 (src/shared) */ + +DEFINE_func_80163950() /* dedup: shared engine-core @0x80163950 (src/shared) */ + + +extern void (*D_80196184[])(void); + +void func_80163A58(void *a0) { + D_80196184[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80163A94() /* dedup: shared engine-core @0x80163A94 (src/shared) */ + +DEFINE_func_80163C2C() /* dedup: shared engine-core @0x80163C2C (src/shared) */ + + +void func_80163EC8(s32 param_1) { + extern Blk8 D_801D34A8; + extern u16 D_800B99DA; + extern u8 func_801656D0(s32 a0, s32 a1); + extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); + extern void func_80015978(s32 a0, s32 *a1); + extern void func_8014C4AC(s32 a0, s32 a1, s32 a2, s16 *a3, s32 a4); + + Blk8 in; + u16 out[4]; + s16 buf[4]; + s32 psVar6; + s32 iVar8; + s32 iVar7; + register s32 uVar5 __asm__("$2"); /* PIN (flagged): uVar5 -> $v0 */ + u16 uVar4; + u8 uVar3; + + in = D_801D34A8; + psVar6 = *(s32 *)(param_1 + 0x4c); + iVar8 = *(s32 *)(param_1 + 0x20); + func_80162D88((s32 *)param_1); + + if (*(s32 *)(psVar6 + 0x184) == 0) { + uVar5 = *(s32 *)(psVar6 + 0x44); + *(s16 *)(psVar6 + 0x18a) = 0; + *(s16 *)(psVar6 + 0x188) = 0; + *(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20; + func_80146CA0((void *)param_1); + func_80146CA0((void *)param_1); + return; + } + if (*(s16 *)(*(s32 *)(psVar6 + 0x184) + 0x36) == *(u16 *)(psVar6 + 0x194)) { + goto LAB_matched; + } + *(s32 *)(psVar6 + 0x184) = 0; + uVar5 = *(s32 *)(psVar6 + 0x44); + *(s16 *)(psVar6 + 0x18a) = 0; + *(s16 *)(psVar6 + 0x188) = 0; + *(s32 *)(psVar6 + 0x44) = uVar5 & ~0x20; + func_80146CA0((void *)param_1); + func_80146CA0((void *)param_1); + return; + +LAB_matched: + *(s16 *)(psVar6 + 0x18a) = *(u16 *)(psVar6 + 0x18a) + 1; + if ((D_800B99DA & 3) == 0) { + if (*(s16 *)(psVar6 + 0x188) >= *(u8 *)(param_1 + 0x67)) { + *(s16 *)(psVar6 + 0x188) = *(s16 *)(psVar6 + 0x188) - *(u8 *)(param_1 + 0x67); + } else { + *(s16 *)(psVar6 + 0x188) = 0; + } + if (*(s16 *)(psVar6 + 0x188) < 0) { + *(s16 *)(psVar6 + 0x188) = 0; + } + } + + *(s16 *)(param_1 + 0x66) = *(u16 *)(param_1 + 0x66) + 0x40; + uVar5 = func_80148800((s32 *)psVar6); + if ((uVar5 & 0x80) != 0) { + *(s16 *)(param_1 + 0x66) = 0; + uVar3 = func_801656D0(psVar6, func_8014CA00(*(s32 *)(psVar6 + 0x184)) & 0xff); + *(s16 *)(psVar6 + 0x188) = *(u16 *)(psVar6 + 0x188) + uVar3; + *(s16 *)(iVar8 + 0x1a) = 0x4000; + *(s16 *)(iVar8 + 0x18) = 0x4000; + *(s32 *)(iVar8 + 0x48) = *(s16 *)(param_1 + 0x58); + *(s32 *)(iVar8 + 0x4c) = *(s16 *)(param_1 + 0x5a); + *(s32 *)(iVar8 + 0x50) = *(s16 *)(param_1 + 0x5c); + ((void (*)(s32, s32, s32))func_80149350)(param_1, (s32)&in, (s32)out); + *(s16 *)(param_1 + 0x6) = out[0]; + *(s16 *)(param_1 + 0xa) = out[1]; + *(s16 *)(param_1 + 0xe) = out[2]; + } + + if (0x80 < *(s16 *)(psVar6 + 0x188)) { + *(s16 *)(psVar6 + 0x188) = 0x80; + } + if (*(s16 *)(psVar6 + 0x188) >= 0x80) { + iVar7 = *(s32 *)(psVar6 + 0x184); + if (iVar7 != 0) { + func_80015978(iVar7 + 4, (s32 *)buf); + buf[3] = 0; + uVar4 = func_80156370(0xe); + func_8014C4AC(iVar7, 0xe, uVar4, buf, *(s16 *)(iVar8 + 0x12)); + func_80146994(0x33, param_1, 0, iVar7); + } + } else { + if (*(s16 *)(psVar6 + 0x18a) < 0x80 && *(u16 *)psVar6 != 0x19) { + goto LAB_end; + } + iVar7 = *(s32 *)(psVar6 + 0x184); + if (iVar7 != 0) { + func_80015978(iVar7 + 4, (s32 *)buf); + buf[3] = 0; + uVar4 = func_80156370(0x21); + func_8014C4AC(iVar7, 0x21, uVar4, buf, *(s16 *)(iVar8 + 0x12)); + if ((*(s32 *)(iVar7 + 0xb4) & 0x40000) != 0) { + func_8014AD30(param_1, (u16 *)buf, 0, *(s16 *)(iVar7 + 0x60)); + } + } + } + + uVar5 = func_8014CA00(iVar7); + *(s32 *)(psVar6 + 0x184) = uVar5; + if (0x1e < (u32)uVar5) { + *(s32 *)(psVar6 + 0x184) = 0; + } + func_80146E90((s32 *)param_1, 0x20); + *(s32 *)(psVar6 + 0x44) = *(s32 *)(psVar6 + 0x44) & ~0x20; + func_80147324(0x449); + func_80146CA0((void *)param_1); + func_80146CA0((void *)param_1); + +LAB_end: + uVar4 = func_80012F74(*(s16 *)(iVar8 + 0x1a), 0x1800, 3, 1); + *(s16 *)(iVar8 + 0x1a) = uVar4; + *(s16 *)(iVar8 + 0x18) = uVar4; + uVar4 = func_80012F74(*(s16 *)(param_1 + 0x6), *(s16 *)(param_1 + 0x58), 8, 1); + *(s16 *)(param_1 + 0x6) = uVar4; + uVar4 = func_80012F74(*(s16 *)(param_1 + 0xa), *(s16 *)(param_1 + 0x5a), 8, 1); + *(s16 *)(param_1 + 0xa) = uVar4; + uVar4 = func_80012F74(*(s16 *)(param_1 + 0xe), *(s16 *)(param_1 + 0x5c), 8, 1); + *(s16 *)(param_1 + 0xe) = uVar4; +} + + +DEFINE_func_80164270() /* dedup: shared engine-core @0x80164270 (src/shared) */ + +DEFINE_func_801642AC() /* dedup: shared engine-core @0x801642AC (src/shared) */ + +DEFINE_func_8016432C() /* dedup: shared engine-core @0x8016432C (src/shared) */ + +DEFINE_func_80164410() /* dedup: shared engine-core @0x80164410 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80164418); + +DEFINE_func_80164530() /* dedup: shared engine-core @0x80164530 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH expected (fn-ptr table dispatch via u16 idx, $s0 holds *(s32*)(p+0x20) across the call) + +extern void (*D_801961D8[])(void); +extern void func_80162D28(s32 *a0); + +void func_80164744(s32 param_1) +{ + s32 iVar1; + + iVar1 = *(s32 *)(param_1 + 0x20); + D_801961D8[*(u16 *)(param_1 + 2)](); + if (iVar1 != 0) { + ((void (*)(s32))func_80162D28)(param_1); + } +} + + + + +// @class: other +// @stuck: none — MATCH (relocation-masked); key was `if (iVar1 != 0) { big } else { func_80164930 }` (non-zero case first → beqz, not bnez) + + +extern void func_8014659C(void); +extern void func_8001C810(s32 a0, s32 a1); +extern void func_80164A74(s32 *a0); +extern void func_80146CA0(void *a0); +extern void func_80164930(s32 a); + +extern u16 D_800DF2E0; +extern s32 D_801961A0; +extern s16 D_801961D4; +extern s16 D_801961D2; +extern s16 D_801961D0; + +void func_801647A4(int param_1) { + s32 iVar1; + + iVar1 = ((s32 (*)(void))func_8014659C)(); + *(s32 *)(param_1 + 0x20) = iVar1; + if (iVar1 != 0) { + ((void (*)(s32, void *))func_8001C810)(iVar1, &D_800DF2E0); + *(s32 **)(iVar1 + 0x80) = &D_801961A0; + *(u32 *)(iVar1 + 4) = *(u32 *)(iVar1 + 4) | 0x50000000; + *(u16 *)(iVar1 + 0x2c) = *(u16 *)(iVar1 + 0x2c) | 0xb0; + D_801961D4 = 0x80; + D_801961D2 = 0x80; + D_801961D0 = 0x80; + *(u16 *)(iVar1 + 0x1a) = 0; + *(u16 *)(param_1 + 0x60) = 0; + *(u16 *)(param_1 + 0x62) = 0x200; + ((s32 (*)(s32))func_80164A74)(param_1); + ((void (*)(s32))func_80146CA0)(param_1); + } else { + func_80164930(param_1); + } +} + + +DEFINE_func_80164864() /* dedup: shared engine-core @0x80164864 (src/shared) */ + +// @class: regalloc-order — wave-3 real-TU crack (§42a); cracked at Max. +// Fix: D_801961D4 read needs direct-addressed `lhu` (u16). Cannot use `*(u16*)&D_801961D4` +// (forces &sym into a held reg -> drift) NOR a block-scoped `extern u16` (conflicting-types +// ERROR vs the ambient s16, cc1 exit 33). Solution: flip the file-scope decl (5802) to u16 — +// byte-neutral to the only other user (func_801647A4 store-only) — and reference directly. +typedef struct { + u16 f0; + u8 pad0[0x4e]; + int f50; + u8 pad1[0x14]; +} Ent_80164930_80164930; + + +void func_80164930(s32 param_1) { + int iVar3 = *(int *)(((int)param_1) + 0x20); + if (*(int *)(((int)param_1) + 0x50) == 0) { + short sVar1 = *(u16 *)(iVar3 + 0x1c) + 0x100; + short nv; + *(short *)(iVar3 + 0x1c) = sVar1; + *(short *)(iVar3 + 0x18) = sVar1; + *(short *)(iVar3 + 0x12) = *(u16 *)(iVar3 + 0x12) + 0x71; + nv = D_801961D4 - 8; + D_801961D4 = nv; + D_801961D2 = nv; + D_801961D0 = nv; + if (nv < -0x80) { + int i, lim; + Ent_80164930_80164930 *p; + for (i = 0, lim = 0x19, p = ((Ent_80164930_80164930 *)&D_8011F9D0); i < 0x14; i++) { + if (p->f0 == lim && p->f50 != 0) { + ((void(*)(Ent_80164930_80164930 *))func_80162CCC)(p); + } + p++; + } + ((void(*)(Ent_80164930_80164930 *))func_80162CCC)((Ent_80164930_80164930 *)((int)param_1)); + } else { + ((void(*)(int))func_80164ACC)(((int)param_1)); + } + } else { + short sVar1 = *(u16 *)(iVar3 + 0x1c) + 0x40; + u16 uVar2; + *(short *)(iVar3 + 0x1c) = sVar1; + *(short *)(iVar3 + 0x18) = sVar1; + uVar2 = *(u16 *)(iVar3 + 0x1a) - 0x200; + *(u16 *)(iVar3 + 0x1a) = uVar2; + if ((int)((unsigned)uVar2 << 0x10) < 0) { + *(short *)(iVar3 + 0x1a) = 0; + } + *(short *)(iVar3 + 0x12) = *(u16 *)(iVar3 + 0x12) - 0x71; + } +} + + + +DEFINE_func_80164A74() /* dedup: shared engine-core @0x80164A74 (src/shared) */ + +DEFINE_func_80164ACC() /* dedup: shared engine-core @0x80164ACC (src/shared) */ + + +extern void (*D_801961E4[])(void); + +void func_80164BA0(void *a0) { + D_801961E4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void func_80146578(void); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *, unsigned short); +extern void func_80164DD0(s32 a0); +extern void func_80146CA0(void *a0); +extern void func_80164DB0(void); + +extern u8 D_801D3E80; +extern u8 D_801D3E81; +extern u8 D_801D3E82; +extern u8 D_801D3E83; +extern u8 D_801D3E84; +extern u8 D_801D3E85; +extern u8 D_801D3E86; +extern u8 D_801D3E87; + +void func_80164BDC(s32 param_1) +{ + register s32 p1 __asm__("$17"); /* $s1 */ + register s32 iVar1 __asm__("$16"); /* $s0 */ + register s32 base __asm__("$18"); /* $s2 */ + + p1 = param_1; + iVar1 = ((s32 (*)(void))func_80146578)(); + base = (s32)&D_801D3E80; + *(s32 *)(p1 + 0x20) = iVar1; + if (iVar1 != 0) { + func_8001CD50(iVar1, base); + ((void (*)(s32, s32))func_800233CC)(base, 0x60); + *(u32 *)(iVar1 + 4) = *(u32 *)(iVar1 + 4) | 0x50000000; + D_801D3E81 = 0xf0; + *(u8 *)base = 0xf0; + D_801D3E82 = 0xc0; + D_801D3E86 = 0; + D_801D3E85 = 0; + D_801D3E84 = 0; + D_801D3E87 = 0; + D_801D3E83 = 0; + *(s16 *)(iVar1 + 0x1e) = 0xccc; + *(s16 *)(iVar1 + 0x10) = 0x400; + *(s16 *)(p1 + 0x60) = 0x700; + *(s16 *)(p1 + 0x62) = -0x60; + func_80164DD0(p1); + ((void (*)(s32))func_80146CA0)(p1); + } else { + ((void (*)(s32))func_80164DB0)(p1); + } +} + + +DEFINE_func_80164CD4() /* dedup: shared engine-core @0x80164CD4 (src/shared) */ + +DEFINE_func_80164D4C() /* dedup: shared engine-core @0x80164D4C (src/shared) */ + +DEFINE_func_80164DB0() /* dedup: shared engine-core @0x80164DB0 (src/shared) */ + +DEFINE_func_80164DD0() /* dedup: shared engine-core @0x80164DD0 (src/shared) */ + + + + + +extern u8 D_801D3E80; +extern u8 D_801D3E81; +extern u8 D_801D3E82; + +s32 func_80164E40(void) { + u8 *p = &D_801D3E80; + if (*p != 0) { + *p -= 0x10; + } + if (D_801D3E81 != 0) { + D_801D3E81 -= 0x10; + } + if (D_801D3E82 != 0) { + D_801D3E82 -= 0x10; + } + return *(s32 *)p == 0; +} + + + +extern void (*D_801961F4[])(void); + +void func_80164EA4(void *a0) { + D_801961F4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: struct +// @stuck: none — MATCH + + /* stride 0x10 */ +extern DStruct D_801D3ECC[]; + +extern void func_80165124(void *a0); +extern void func_80146CA0(void *a0); + +void func_80164EE0(int param_1) +{ + int i; + + for (i = 7; i >= 0; i--) { + D_801D3ECC[i].f0 = 0; + } + *(short *)(param_1 + 0x2e) = 0x4000; + *(short *)(param_1 + 0x2c) = 0x4000; + *(short *)(param_1 + 0x60) = 0; + *(short *)(param_1 + 0x62) = 0; + ((void (*)(int))func_80165124)(param_1); + *(short *)(param_1 + 0x66) = 0; + ((void (*)(int))func_80146CA0)(param_1); +} + + +DEFINE_func_80164F44() /* dedup: shared engine-core @0x80164F44 (src/shared) */ + +DEFINE_func_80165024() /* dedup: shared engine-core @0x80165024 (src/shared) */ + +DEFINE_func_80165064() /* dedup: shared engine-core @0x80165064 (src/shared) */ + +DEFINE_func_801650C4() /* dedup: shared engine-core @0x801650C4 (src/shared) */ + +DEFINE_func_80165124() /* dedup: shared engine-core @0x80165124 (src/shared) */ + +// @class: struct +// @stuck: none — MATCH (30 ins) +// +// Unaligned slot-fill: loop over 8 slots (0x10 stride) of a global table, +// fill the first free one (field @0xC == 0). Two unaligned block copies from +// param_1 (packed struct assigns -> lwl/lwr/swl/swr). Key: recompute +// p = &D_801D3EC0[i] each iteration (NOT p++) so gcc reduces base+i*0x10 into +// a SINGLE pointer IV with immediate offsets 0/8/0xC. Hand-incrementing p makes +// combine_givs split the field offsets into a second pointer IV (+2 ins). + + +typedef struct { u8 d[8]; } __attribute__((packed, aligned(1))) B8_80165140; +typedef struct { u8 d[4]; } __attribute__((packed, aligned(1))) B4_80165140; +typedef struct { B8_80165140 a; B4_80165140 b; s32 used; } Slot_80165140; + + +s32 func_80165140(s32 param_1) { + extern Slot_80165140 D_801D3EC0[8]; + + int i; + Slot_80165140 *p; + for (i = 0; i < 8; i++) { + p = &D_801D3EC0[i]; + if (p->used == 0) { + p->used = 8; + p->a = *(B8_80165140 *)(((u8 *)param_1) + 0x2c); + p->b = *(B4_80165140 *)(((u8 *)param_1) + 0x50); + return; + } + } +} + + + + +// @class: schedule +// @stuck: none — MATCH (pins $s2/$s1/$s0 + zero-code barrier hoists $a0 copy into beqz delay slot) + +extern void func_80165240(void *param_1, void *param_2, void *param_3); +extern s32 D_801D3EC0; + +void func_801651B8(void * param_1) +{ + register s32 *puVar1 __asm__("$16"); /* $s0 */ + register s32 iVar2 __asm__("$17"); /* $s1 */ + register s32 p __asm__("$18"); /* $s2 */ + + p = param_1; + ((s32 (*)(s32, s32, s32))func_80165240)(p, p + 0x2c, p + 0x50); + iVar2 = 0; + puVar1 = &D_801D3EC0; + do { + if (puVar1[3] != 0) { + s32 a0v = p; + __asm__ __volatile__("" : "=r"(a0v) : "0"(a0v)); + ((s32 (*)(s32, s32, s32))func_80165240)(a0v, (s32)puVar1, (s32)(puVar1 + 2)); + puVar1[3] = puVar1[3] + -1; + } + iVar2 = iVar2 + 1; + puVar1 = puVar1 + 4; + } while (iVar2 < 8); +} + + +struct W4 { u32 w; } __attribute__((packed, aligned(1))); +extern void func_80016ED4(void *a0); +extern s32 func_80017DC4(void *a0, void *a1); + +void func_80165240(void *param_1, void *param_2, void *param_3) +{ + + extern u8 D_80196208[]; + extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; + extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; + extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; + extern u32 D_80196228, D_8019622C, D_80196230, D_80196234; + u8 prim[0x40]; /* $sp+0x10 .. 0x50 */ + u8 mat[0x20]; /* $sp+0x50 .. 0x70 */ + u8 *p = prim; + + func_80017DC4(param_2, mat); + ApplyMatrixSV(mat, &D_80196208[0x00], p); + ApplyMatrixSV(mat, &D_80196208[0x08], prim + 0x08); + ApplyMatrixSV(mat, &D_80196208[0x10], prim + 0x10); + ApplyMatrixSV(mat, &D_80196208[0x18], prim + 0x18); + + *(s16 *)(prim + 0x04) = 3; + prim[0x38] = 0x2c; + *(u32 *)(prim + 0x20) = D_80196230; + *(u32 *)(prim + 0x24) = D_80196228; + *(u32 *)(prim + 0x28) = D_80196234; + *(u32 *)(prim + 0x2c) = D_8019622C; + *(struct W4 *)(prim + 0x30) = *(struct W4 *)param_3; + *(u32 *)(prim + 0x34) = 0x50000000; + + func_80016ED4(p); +} + + +DEFINE_func_8016533C() /* dedup: shared engine-core @0x8016533C (src/shared) */ + +DEFINE_func_80165374() /* dedup: shared engine-core @0x80165374 (src/shared) */ + +DEFINE_func_801653B8() /* dedup: shared engine-core @0x801653B8 (src/shared) */ + +DEFINE_func_801653F4() /* dedup: shared engine-core @0x801653F4 (src/shared) */ + + +// @class: struct +// @stuck: none — MATCH (54 ins) + +extern u8 D_80078E78[]; +extern u8 D_80078EC1; +extern void (*D_80196238[])(void); +extern u8 func_80165658(s32 a0, s32 a1); +extern void func_800CAE0C(s32 a0); + +void func_801654A8(s32 arg0) +{ + u8 *s1 = D_80078E78; + + if (*(u16 *)arg0 == 0x16) { + return; + } + if (*(u16 *)arg0 != 0x1A) { + if ((*(s32 *)(arg0 + 0x1F8) & 0x80FFFFFF) == 0) { + if (func_80165658(arg0, D_80078EC1) & 0x80) { + ((void (*)(s32))D_80196238[D_80078EC1 & 0x7F])(arg0); + } + } + } + if (*(u16 *)arg0 == 0x16) { + return; + } + if (*(u16 *)arg0 == 0x1A) { + return; + } + if (s1[0x49] == 0x19) { + func_800CAE0C(arg0); + } +} + + + +// @class: struct +// @stuck: none — MATCH (function-pointer-array dispatch; & 0x80 branch + & 0x7f index fold) + +extern u8 D_80078EC5; +extern u8 D_80078EC1; +extern void (*D_80196238[])(void); +extern void func_80165B28(void *a0); + +void func_80165580(s32 _arg0) +{ + if (D_80078EC5 & 0x80) { + ((void (*)(void))func_80165B28)(); + } else { + D_80196238[D_80078EC1 & 0x7F](); + } +} + + +DEFINE_func_801655E4() /* dedup: shared engine-core @0x801655E4 (src/shared) */ + +DEFINE_func_80165624() /* dedup: shared engine-core @0x80165624 (src/shared) */ + + +extern u8 D_801962B4[]; + +u8 func_80165658(s32 a0, s32 a1) { + return D_801962B4[a1 & 0x7F]; +} + + + +extern s32 D_801962D4[]; +extern s32 D_80078EC8; + +void func_80165670(s32 a0, s32 a1) { + D_80078EC8 = D_801962D4[a1 & 0x7F]; +} + + +DEFINE_func_80165694() /* dedup: shared engine-core @0x80165694 (src/shared) */ + + +extern u8 D_80196350[]; + +u8 func_801656D0(s32 a0, s32 a1) { + return D_80196350[a1 & 0x7F]; +} + + + +extern u8 D_80196370[]; + +u8 func_801656E8(s32 a0, s32 a1) { + return D_80196370[a1 & 0x7F]; +} + + + +extern u8 D_80196390[]; + +u8 func_80165700(s32 a0, s32 a1) { + return D_80196390[a1 & 0x7F]; +} + + +DEFINE_func_80165718() /* dedup: shared engine-core @0x80165718 (src/shared) */ + +DEFINE_func_80165770() /* dedup: shared engine-core @0x80165770 (src/shared) */ + +DEFINE_func_801657A0() /* dedup: shared engine-core @0x801657A0 (src/shared) */ + +DEFINE_func_801657D8() /* dedup: shared engine-core @0x801657D8 (src/shared) */ + +DEFINE_func_80165840() /* dedup: shared engine-core @0x80165840 (src/shared) */ + +DEFINE_func_80165874() /* dedup: shared engine-core @0x80165874 (src/shared) */ + +DEFINE_func_801658DC() /* dedup: shared engine-core @0x801658DC (src/shared) */ + +DEFINE_func_801658EC() /* dedup: shared engine-core @0x801658EC (src/shared) */ + +DEFINE_func_80165900() /* dedup: shared engine-core @0x80165900 (src/shared) */ + +DEFINE_func_80165910() /* dedup: shared engine-core @0x80165910 (src/shared) */ + +DEFINE_func_80165938() /* dedup: shared engine-core @0x80165938 (src/shared) */ + +DEFINE_func_80165958() /* dedup: shared engine-core @0x80165958 (src/shared) */ + +DEFINE_func_80165978() /* dedup: shared engine-core @0x80165978 (src/shared) */ + +DEFINE_func_80165988() /* dedup: shared engine-core @0x80165988 (src/shared) */ + +DEFINE_func_801659A8() /* dedup: shared engine-core @0x801659A8 (src/shared) */ + +DEFINE_func_801659B8() /* dedup: shared engine-core @0x801659B8 (src/shared) */ + +DEFINE_func_801659CC() /* dedup: shared engine-core @0x801659CC (src/shared) */ + + + +s32 func_801659DC(u8 *a0) { + + extern void (*D_801963B0[])(void); + D_801963B0[*(u8 *)((s32)a0 + 0x1A0)](); +} + + +DEFINE_func_80165A18() /* dedup: shared engine-core @0x80165A18 (src/shared) */ + +DEFINE_func_80165A20() /* dedup: shared engine-core @0x80165A20 (src/shared) */ + +DEFINE_func_80165A50() /* dedup: shared engine-core @0x80165A50 (src/shared) */ + +DEFINE_func_80165A78() /* dedup: shared engine-core @0x80165A78 (src/shared) */ + + +extern u8 D_80078EC1; +extern void (*D_8019642C[])(void); + +void func_80165AC8(void) { + D_8019642C[D_80078EC1 & 0x7F](); +} + + +DEFINE_func_80165B08() /* dedup: shared engine-core @0x80165B08 (src/shared) */ + +DEFINE_func_80165B10() /* dedup: shared engine-core @0x80165B10 (src/shared) */ + +DEFINE_func_80165B18() /* dedup: shared engine-core @0x80165B18 (src/shared) */ + +DEFINE_func_80165B20() /* dedup: shared engine-core @0x80165B20 (src/shared) */ + + +extern void (*D_801964A8[])(void); + +void func_80165B28(void *a0) { + *(u32 *)((s32)a0 + 0x44) |= 8; + D_801964A8[*(u8 *)((s32)a0 + 0x197)](); +} + + +DEFINE_func_80165B6C() /* dedup: shared engine-core @0x80165B6C (src/shared) */ + +DEFINE_func_80165BB4() /* dedup: shared engine-core @0x80165BB4 (src/shared) */ + +DEFINE_func_80165BFC() /* dedup: shared engine-core @0x80165BFC (src/shared) */ + +DEFINE_func_80165C58() /* dedup: shared engine-core @0x80165C58 (src/shared) */ + +DEFINE_func_80165C78() /* dedup: shared engine-core @0x80165C78 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80165CA0); + +extern M2C_UNK D_801D34B0; + +void func_80165E2C(u16 *arg0) { + func_8001534C(0, &D_801D34B0, 0x80, 0x80, 0, 0); + func_800153CC(1, *arg0, 0xA8, 0x80, 0x40, 0); +} + + +DEFINE_func_80165E90() /* dedup: shared engine-core @0x80165E90 (src/shared) */ + +DEFINE_func_80165FA4() /* dedup: shared engine-core @0x80165FA4 (src/shared) */ + + +extern void (*D_801964B4[])(void); + +void func_80166018(void *a0) { + D_801964B4[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80166054() /* dedup: shared engine-core @0x80166054 (src/shared) */ + +DEFINE_func_801661CC() /* dedup: shared engine-core @0x801661CC (src/shared) */ + +DEFINE_func_80166244() /* dedup: shared engine-core @0x80166244 (src/shared) */ + +DEFINE_func_8016629C() /* dedup: shared engine-core @0x8016629C (src/shared) */ + +DEFINE_func_801662F4() /* dedup: shared engine-core @0x801662F4 (src/shared) */ + +DEFINE_func_8016634C() /* dedup: shared engine-core @0x8016634C (src/shared) */ + +DEFINE_func_801663A4() /* dedup: shared engine-core @0x801663A4 (src/shared) */ + + +extern void (*D_801964BC[])(void); + +void func_801663FC(void *a0) { + D_801964BC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80166438() /* dedup: shared engine-core @0x80166438 (src/shared) */ + +DEFINE_func_801665B4() /* dedup: shared engine-core @0x801665B4 (src/shared) */ + + +extern void (*D_80196584[])(void); + +void func_80166618(void *a0) { + D_80196584[*(u16 *)((s32)a0 + 0x2)](); +} + + + +extern void (*D_80196594[])(void); + +void func_80166654(void *a0) { + D_80196594[*(u16 *)((s32)a0 + 0x2)](); +} + + +#include "common.h" + +typedef struct { u16 h[6]; } Rec_80166690_80166690; /* 12-byte sub-table record (stride 0xC) */ + +typedef struct { + short v0, v1, v2, pad06, w0, w1, w2, pad0E; /* 0x00..0x0F */ + short v3, v4, v5, pad16, w3, w4, w5, pad1E; /* 0x10..0x1F */ + u8 c00, c01, c02, pad23; /* 0x20 */ + u8 c10, c11, c12, pad27; /* 0x24 */ + u8 c20, c21, c22, pad2B; /* 0x28 */ + u8 c30, c31, c32, pad2F; /* 0x2C */ + int tag; /* 0x30 -> struct size 0x34; tag lands at sp+0x40 */ +} Frame_80166690_80166690; + + +s32 func_80166690(s32 param_1, s32 param_2) +{ + extern s32 func_80017758(void *a0, void *a1); + extern Blk20 D_800AE620; + extern u8 D_801D3F40[]; + + Frame_80166690_80166690 c; + Blk20 blk; + Rec_80166690_80166690 *sub; + Rec_80166690_80166690 *pv; + u8 *rec; + int i6; + int lt2; + int p2; + unsigned int uVar7, uVar8, uVar9; + int iVar3; + unsigned int w9, w7, w, t, w3b; + int w3; + short sVar10; + register unsigned int zr __asm__("$0"); + + blk = D_800AE620; + i6 = (short)param_1; + c.tag = 0x50000000; + rec = &D_801D3F40[i6 * 0xC4]; + sVar10 = 0; + if (rec[0] == 0) { + return 0; + } + sub = (Rec_80166690_80166690 *)(rec + 4); + uVar9 = rec[1]; + uVar8 = rec[3]; + uVar7 = uVar8 >> 1; + iVar3 = rec[2]; + w3 = iVar3 - 1; + iVar3 = w3 + zr; + if (w3 != -1) { + lt2 = i6 < 2; + p2 = (short)param_2; + do { + pv = &sub[(short)uVar9]; + c.v0 = pv->h[0]; + c.v1 = pv->h[1]; + c.v2 = pv->h[2]; + c.w0 = pv->h[3]; + c.w1 = pv->h[4]; + c.w2 = pv->h[5]; + sVar10 = sVar10 + 1; + + if (lt2) { + if (p2 == 0) { + t = uVar8 + zr; + c.c12 = t; c.c02 = t; + t = uVar7 + zr; + } else { + w = ((int)(uVar8 << 16) >> 17) + ((int)(uVar8 << 16) >> 19); + uVar7 = w + zr; + c.c12 = w; c.c02 = w; + t = uVar8 + zr; + } + c.c11 = t; c.c01 = t; c.c10 = t; c.c00 = t; + } else { + t = uVar8 + zr; + c.c10 = t; c.c00 = t; + t = uVar7 + zr; + c.c12 = t; c.c02 = t; c.c11 = t; c.c01 = t; + } + + w9 = uVar9 - 1; + uVar9 = w9 + zr; + if ((int)(w9 << 16) < 0) { + uVar9 = 0xF; + } + pv = &sub[(short)uVar9]; + c.v3 = pv->h[0]; + c.v4 = pv->h[1]; + c.v5 = pv->h[2]; + c.w3 = pv->h[3]; + c.w4 = pv->h[4]; + uVar8 = uVar8 - 0x10; + w7 = uVar7 - 0x10; + uVar7 = w7 + zr; + c.w5 = pv->h[5]; + if ((int)(w7 << 16) < 0) { + uVar7 = 0; + } + + if (lt2) { + if (p2 == 0) { + t = uVar8 + zr; + c.c32 = t; c.c22 = t; + t = uVar7 + zr; + } else { + t = uVar7 + zr; + c.c32 = t; c.c22 = t; + t = uVar8 + zr; + } + c.c31 = t; c.c21 = t; c.c30 = t; c.c20 = t; + } else { + t = uVar8 + zr; + c.c30 = t; c.c20 = t; + t = uVar7 + zr; + c.c32 = t; c.c22 = t; c.c31 = t; c.c21 = t; + } + + __asm__ __volatile__("" :: "r"(iVar3)); + func_80017758(&c, &blk); + w3b = iVar3 - 1; + iVar3 = w3b + zr; + } while ((short)w3b != -1); + } + return (short)sVar10; +} + + + + +/* func_80166994 — trail/afterimage ring recorder (0xC4-stride Trail records at D_801D3F40). + * param_2: 0=init, 1=advance(record), 2=fadeout; param_3: trail index (s16); param_4: divisor (s16). + * + * K&R definition: true s16 params => callee-side lazy per-use narrow/extend with raw pseudos + * (s3/t0/s4 hold raw a1/a2/a3; first-use extension allocates IN PLACE into the arg reg), while + * the promoted K&R type (int x4) stays compatible with the canon-sig s32 prototype in the TU. + * Returns s32 (v0=1 when the fadeout completes, else 0) => the //@EDIT above flips the split's + * canon-sig prototype return type, AND engine_core.h needs the once-global ec_edit (all 5 sites, + * byte-neutral: every caller discards the result): + * ec_edit old: "extern void func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); \" + * ec_edit new: "extern s32 func_80166994(s32 a0, s32 a1, s32 a2, s32 a3); \" + * Without the ec_edit, cc1 hard-errors (conflicting types vs the void decls in DEFINE_ macros). + * + * Fully block-scoped (typedefs + externs inside the body) so the crack propagates ×134 via + * family_remap with zero file-scope footprint. No register pins. + */ +s32 func_80166994(param_1, param_2, param_3, param_4) + s32 param_1; + s16 param_2; + s16 param_3; + s16 param_4; +{ + typedef struct { s16 f0, f1, f2, f3, f4, f5; } TrailEntry; + typedef struct { u8 flag, idx, count, timer; TrailEntry e[16]; } Trail; + extern u8 D_801D3F40[]; + extern void RotTransSV(void *a0, void *a1, void *a2); + extern s32 VectorNormalSS(void *a0, void *a1); + + Trail *p = &((Trail *)D_801D3F40)[param_3]; + s32 uVar6 = *(s32 *)(param_1 + 0x34); + s16 v10[4]; + s16 v18[4]; + s16 v20[4]; + s16 v28[4]; + s16 out[4]; + s32 c; + + switch (param_2) { + case 0: + p->flag = 1; + p->count = 0; + p->idx = 0; + p->timer = 0xf4; + break; + case 1: + v20[0] = p->e[p->idx].f0; + v20[1] = p->e[p->idx].f1; + v20[2] = p->e[p->idx].f2; + v28[0] = p->e[p->idx].f3; + v28[1] = p->e[p->idx].f4; + v28[2] = p->e[p->idx].f5; + c = p->idx; + p->idx = c + 1; + if ((u8)(c + 1) > 0xf) { + p->idx = 0; + } + if (p->count < 0xf) { + p->count = p->count + 1; + } + break; + case 2: { + u8 bVar3 = p->timer - 0x10; + p->timer = bVar3; + if (bVar3 < 0x10) { + p->flag = 0; + return 1; + } + { + u8 bVar1 = p->count; + if (bVar1 >= 2 && (bVar3 >> 4) < bVar1) { + p->count = bVar1 - 1; + } + } + return 0; + } + } + + if (param_3 < 2) { + func_801484B0((s32)v10, (s32)v18); + } else { + func_80148534((s32)v10, (s32)v18); + } + func_80165FA4(uVar6, (s32)v10, (s32)v18); + ((void (*)(s32, s32, s32))func_80149350)(uVar6, (s32)v10, (s32)v10); + RotTransSV(v18, v18, out); + + if (param_2 != 0) { + v20[0] = (v10[0] + v20[0]) >> 1; + v20[1] = (v10[1] + v20[1]) >> 1; + v20[2] = (v10[2] + v20[2]) >> 1; + v28[0] = (v18[0] + v28[0]) >> 1; + v28[1] = (v18[1] + v28[1]) >> 1; + v28[2] = (v18[2] + v28[2]) >> 1; + v20[0] = v20[0] - v28[0]; + v20[1] = v20[1] - v28[1]; + v20[2] = v20[2] - v28[2]; + VectorNormalSS(v20, v20); + v20[0] = v28[0] + v20[0] / param_4; + v20[1] = v28[1] + v20[1] / param_4; + v20[2] = v28[2] + v20[2] / param_4; + p->e[p->idx].f0 = v20[0]; + p->e[p->idx].f1 = v20[1]; + p->e[p->idx].f2 = v20[2]; + p->e[p->idx].f3 = v28[0]; + p->e[p->idx].f4 = v28[1]; + p->e[p->idx].f5 = v28[2]; + c = p->idx; + p->idx = c + 1; + if ((u8)(c + 1) > 0xf) { + p->idx = 0; + } + if (p->count < 0xf) { + p->count = p->count + 1; + } + } + + p->e[p->idx].f0 = v10[0]; + p->e[p->idx].f1 = v10[1]; + p->e[p->idx].f2 = v10[2]; + p->e[p->idx].f3 = v18[0]; + p->e[p->idx].f4 = v18[1]; + p->e[p->idx].f5 = v18[2]; + return 0; +} + + +// @class: regalloc-order +// @stuck: none — MATCH (69 ins). Pins $s4/$s1 for param_2/param_3 + a1/a2-pinned temps +// with non-volatile SHB barriers force the sign-ext move-form; short iVar2 (unpinned) +// gives the temp-form counter increment that fills the skip-branch delay slots; +// loop-invariant eq=(p2==p3) hoisted; SHB(p2) after the move serializes param_2 before +// param_3's sign-ext (last ordering swap); param_1/param_4 left natural (arg-order saves). + + +#define SHB(x) __asm__("" : "=r"(x) : "0"(x)) + +s32 func_80166F58(s32 param_1, s32 param_2, s32 param_3, s32 param_4) +{ + extern unsigned char D_801D3F40[]; + + register int p2 __asm__("$20"); /* $s4 */ + register int p3 __asm__("$17"); /* $s1 */ + register int t2 __asm__("$5"); /* a1 */ + register int t3 __asm__("$6"); /* a2 */ + unsigned short *puVar1; + short iVar2; + int eq; + + iVar2 = 0; + puVar1 = ((unsigned short *)&D_8011D030); + t2 = ((short)param_2); SHB(t2); p2 = t2; SHB(p2); + t3 = ((short)param_3); SHB(t3); p3 = t3; + eq = (p2 == p3); + do { + if ((puVar1 != ((unsigned short *)param_1)) && + ((unsigned int)*puVar1 == p2 || (unsigned int)*puVar1 == p3) && + (!eq || + *(int *)(puVar1 + 0x16) == *(int *)(((unsigned short *)param_1) + 0x16))) { + ((void(*)(unsigned short *))func_80146C3C)(puVar1); + } + iVar2 = iVar2 + 1; + puVar1 = puVar1 + 0x2c; + } while (iVar2 < 0x1e); + ((void(*)(void *, int))func_80016714)(&D_801D3F40[((short)param_4) * 0xc4], 0xc4); +} + + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_8016706C); + + +// @class: schedule +// @stuck: 16/279 masked. 3 runs, ONE residual class: gcc's list-scheduler puts `la $s2` (p=DATA) + `addu $s4,$zero,$zero` (i=0) BEFORE the callee-arg address setup (addiu $a1,$sp,0x10 / addu $a2,$a1,$zero); the target emits them AFTER. Inert to ~40 statement-order permutations + pin/barrier combos (sched priority dominates the LUID tie-break, sched.c rank_for_schedule). Runs: 19-24 (blk1), 111-114 (region-B cx-load rotation), 177-182 (blk3). Permuter fuel. + + + + +extern void func_80149350(s32); +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 RotMatrixYXZ(void *a0, void *a1); +extern s32 func_80017758(void *a0, void *a1); +extern s32 func_80017DC4(void *a0, void *a1); +extern void func_80048EAC(void *a0, void *a1); + + +s32 func_801670E4(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + + extern u8 D_801964D8[]; + extern u8 D_801964C4[]; + extern u8 D_801964EC[]; + extern s32 D_801269A4; + extern s32 D_801269A8; + extern s32 D_801269AC; + extern u16 D_80126CE0; + Fr_801670E4 f; + register u8 *p __asm__("$18"); /* $s2 */ + register s32 ent __asm__("$19"); /* $s3 */ + s16 i; + s32 d; + s32 node; + u16 c; + u8 cv; + u8 cv2; + register s32 gA __asm__("$2"); + register s32 cxv __asm__("$4"); + register s32 czv __asm__("$5"); + u8 *vc; + u8 *ap; + u8 *mp; + u8 *va; + u8 *vb; + + ent = arg0; + node = *(s32 *)(ent + 0x34); + f.v[1].z = 0; + f.v[1].y = 0; + f.v[1].x = 0; + f.v[3].z = 0; + f.v[2].z = 0; + f.v[0].z = 0; + f.col[1].b = 0x70; + cv = *(u8 *)(ent + 0x12); + f.cx = arg1; + __asm__ __volatile__(""); + va = (u8 *)&f.cx; + __asm__ __volatile__("" : "=r"(va) : "0"(va)); + f.cy = arg2; + vb = va; + __asm__ __volatile__("" : "=r"(vb) : "0"(vb)); + p = D_801964D8; + i = 0; + f.col[0].b = 0; + f.col[0].g = 0; + f.col[0].r = 0; + f.col[2].b = 0; + f.col[2].g = 0; + f.col[2].r = 0; + f.col[3].b = 0; + f.col[3].g = 0; + f.col[3].r = 0; + f.code = 0x50000000; + f.cz = arg3; + f.col[1].r = cv; + f.col[1].g = cv; + ((void (*)(s32, void *, void *))func_80149350)(node, va, vb); + + c = f.cx; + *(s16 *)(ent + 0x06) = c; + *(s32 *)(ent + 0x4C) = (s16)c; + c = f.cy; + *(s16 *)(ent + 0x0A) = c; + *(s32 *)(ent + 0x50) = (s16)c; + c = f.cz; + *(s16 *)(ent + 0x0E) = c; + *(s32 *)(ent + 0x54) = (s16)c; + func_800D20C0(&f.cx, f.a8, 7); + func_80017E68(&f.cx, f.m1); + func_800D23D0(f.a8); + RotMatrixYXZ(f.a8, f.m1); + + do { + f.v[0].x = (s8)*p++; + f.v[0].y = (s8)*p++; + f.v[2].x = (s8)*p++; + f.v[2].y = (s8)*p++; + f.v[3].x = (s8)*p++; + f.v[3].y = (s8)*p--; + func_80017758(f.v, f.m1); + } while ((i = i + 1) < 4); + + p = D_801964C4; + gA = 0xA0; + cxv = (s16)f.cx; + f.col[1].g = gA; + gA = D_801269A4; + czv = (s16)f.cz; + f.col[1].b = 0x10; + f.col[1].r = 0x10; + f.pos[0] = gA - cxv; + i = 0; + f.v[3].y = 0; + f.v[2].y = 0; + f.v[0].y = 0; + f.pos[1] = D_801269A8 - (s16)f.cy; + f.pos[2] = D_801269AC - czv; + + do { + f.v[0].x = (s8)*p++; + f.v[0].z = (s8)*p++; + f.v[2].x = (s8)*p++; + f.v[2].z = (s8)*p++; + f.v[3].x = (s8)*p++; + f.v[3].z = (s8)*p--; + func_80017758(f.v, (void *)(ent + 0x38)); + } while ((i = i + 1) < 4); + + if (*(s32 *)(ent + 0x30) > 0) { + vc = (u8 *)&f.cx; + __asm__ __volatile__("" : "=r"(vc) : "0"(vc)); + mp = f.m1; + ap = mp; + __asm__ __volatile__("" : "=r"(ap) : "0"(ap)); + p = D_801964EC; + i = 0; + d = (s16)f.a8[0] >> 6; + f.cx += d; + f.cy += d; + f.cz += d; + func_80017E68(vc, ap); + f.cx = f.cy = f.cz = ((u32)*(s32 *)(ent + 0x30) >> 1) + D_80126CE0 * 0x20; + func_80017DC4(&f.cx, f.m2); + func_80048EAC(f.m2, mp); + f.v[3].z = 0; + f.v[2].z = 0; + f.v[0].z = 0; + cv2 = *(u8 *)(ent + 0x12); + f.col[1].b = 0x20; + f.col[1].r = 0x20; + f.col[3].b = 0; + f.col[3].r = 0; + f.col[2].b = 0; + f.col[2].r = 0; + f.col[0].b = 0; + f.col[0].r = 0; + f.col[3].g = 0; + f.col[2].g = 0; + f.col[0].g = 0; + f.col[1].g = cv2 + 0x60; + do { + f.v[0].x = (s8)*p++; + f.v[0].y = (s8)*p++; + f.v[2].x = (s8)*p++; + f.v[2].y = (s8)*p++; + f.v[3].x = (s8)*p++; + f.v[3].y = (s8)*p--; + func_80017758(f.v, f.m1); + } while ((i = i + 1) < 8); + } +} + + + +typedef struct { s32 m[8]; } Mat_80167540; /* 0x20 bytes */ + +struct Src_80167540 { + u8 pad0[0x34]; + Mat_80167540 mat; /* 0x34 */ +}; + +struct Sub2_80167540 { + u8 pad0[0x44]; + s32 unk44; /* 0x44 */ +}; + +struct Node_80167540 { + /* 0x0 */ u16 unk0; + u8 pad2[0x4]; + /* 0x6 */ s16 unk6; + u8 pad8[0x2]; + /* 0xA */ s16 unkA; + u8 padC[0x2]; + /* 0xE */ s16 unkE; + u8 pad10[0x10]; + /* 0x20 */ struct Src_80167540 *unk20; + u8 pad24[0x28]; + /* 0x4C */ struct Sub2_80167540 *unk4C; +}; + +struct Entity_80167540 { + /* 0x0 */ s16 unk0; + /* 0x2 */ u16 unk2; + u8 pad4[0xC]; + /* 0x10 */ s16 unk10; + /* 0x12 */ s16 unk12; + u8 pad14[0x8]; + /* 0x1C */ s32 unk1C; + u8 pad20[0x10]; + /* 0x30 */ s32 unk30; + /* 0x34 */ struct Node_80167540 *unk34; + /* 0x38 */ Mat_80167540 mat; +}; + + +s32 func_80167540(s32 arg0) { + + struct Node_80167540 *node; + struct Entity_80167540 *ent; + s32 v; + + node = ((struct Entity_80167540 *)arg0)->unk34; + if (node->unk0 == 1) { + if (((struct Entity_80167540 *)arg0)->unk12 > ((struct Entity_80167540 *)arg0)->unk10) { + if (((struct Entity_80167540 *)arg0)->unk1C > 0) { + ((struct Entity_80167540 *)arg0)->unk10 = (s16) (rand() & 0x30); + v = -0x30; + goto shared; + } + } else if (((struct Entity_80167540 *)arg0)->unk1C < 0) { + ((struct Entity_80167540 *)arg0)->unk10 = (s16) ((rand() & 0x30) + 0x40); + v = 0x30; +shared: + ((struct Entity_80167540 *)arg0)->unk1C = v; + } + ((struct Entity_80167540 *)arg0)->unk12 = (s16) (((struct Entity_80167540 *)arg0)->unk12 + ((struct Entity_80167540 *)arg0)->unk1C); + ((struct Entity_80167540 *)arg0)->mat = node->unk20->mat; + ((void (*)(struct Entity_80167540 *, s32, s32, s32))func_801670E4)(((struct Entity_80167540 *)arg0), 0, 0, 0); + ent = ((struct Entity_80167540 *(*)(s32, struct Entity_80167540 *, s16, s16, s32, s32, s32))func_80146A6C)(0xE, ((struct Entity_80167540 *)arg0), node->unk6, node->unkA, node->unkE, 0, 0); + if (ent != 0) { + ent->mat = node->unk20->mat; + } + if (((struct Entity_80167540 *)arg0)->unk34->unk4C->unk44 & 0x20) { + ((struct Entity_80167540 *)arg0)->unk30 = 0x600; + ((struct Entity_80167540 *)arg0)->unk2 = (u16) (((struct Entity_80167540 *)arg0)->unk2 + 1); + } + } else { + ((void(*)(struct Entity_80167540 *))func_80146C3C)(((struct Entity_80167540 *)arg0)); + } +} + + + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80167714); + + +extern void (*D_801965A4[])(void); + +void func_801678B4(void *a0) { + D_801965A4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +DEFINE_func_801678F0() /* dedup: shared engine-core @0x801678F0 (src/shared) */ + + + +extern void (*D_801965B0[])(void); + +void func_80167A9C(void *a0) { + D_801965B0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80167AD8() /* dedup: shared engine-core @0x80167AD8 (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH expected; mirrors already-matched sibling func_8016A290 (same 3-loop tail), swapping the inline matrix-setup for a func_80168070 call + constant color block. + +#include "common.h" + + + +typedef struct { s16 x, y, z, pad; } SVEC_80167AE0; + +struct Fr_80167AE0 { + u8 matrix[0x20]; /* 0x00 -> sp+0x10 */ + SVEC_80167AE0 v[4]; /* 0x20 -> sp+0x30 */ + struct { u8 r, g, b, pad; } col[4]; /* 0x40 -> sp+0x50 */ + u32 code; /* 0x50 -> sp+0x60 */ +}; + +s32 func_80167AE0(s32 param_1, s32 param_2, s32 param_3) { + extern void func_80168070(s32 param_1, s16 *param_2, s16 *param_3, void *param_4); + extern s32 func_80017758(void *a0, void *a1); + extern u8 D_801966BC; + extern u8 D_801966D0[]; + + struct Fr_80167AE0 fr; + u8 *p; + s32 i; + register s32 t __asm__("$2"); + register s32 zr __asm__("$0"); + s32 flags; + + func_80168070(param_1, ((s16 *)param_2), ((s16 *)param_3), fr.matrix); + + fr.v[3].z = 0; + fr.v[2].z = 0; + fr.v[0].z = 0; + fr.v[1].z = 0; + fr.v[1].y = 0; + fr.v[1].x = 0; + flags = D_800B99DA; + if (flags & 1) { + fr.col[1].r = 0xa0; + } else if (flags & 2) { + fr.col[1].r = 0xc0; + } else { + fr.col[1].r = 0x80; + } + + p = ((u8 *)&D_801966BC); + fr.col[0].b = 0; + fr.col[0].g = 0; + fr.col[0].r = 0; + fr.col[2].b = 0; + fr.col[2].g = 0; + fr.col[2].r = 0; + fr.col[3].b = 0; + fr.col[3].g = 0; + fr.col[3].r = 0; + fr.code = 0x50000000; + fr.col[1].b = fr.col[1].r >> 2; + fr.col[1].g = fr.col[1].r >> 2; + i = 0; +L1: + fr.v[0].x = (s8)*p++; + fr.v[0].y = (s8)*p++; + fr.v[2].x = (s8)*p++; + fr.v[2].y = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].y = (s8)*p--; + func_80017758(fr.v, fr.matrix); + t = i + 1; + i = t + zr; + if ((s16)t < 4) goto L1; + + fr.v[3].y = 0; + fr.v[2].y = 0; + fr.v[0].y = 0; + fr.v[1].y = 0; + fr.v[1].x = 0; + fr.v[1].z = -0x20; + p = D_801966D0; + i = 0; +L2: + fr.v[0].x = (s8)*p++; + fr.v[0].z = (s8)*p++; + fr.v[2].x = (s8)*p++; + fr.v[2].z = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].z = (s8)*p--; + func_80017758(fr.v, fr.matrix); + if ((s16)i == 1) { + fr.v[1].z = 0x20; + p += 2; + } + t = i + 1; + i = t + zr; + if ((s16)t < 4) goto L2; + + p += 2; + fr.v[0].x = 0; + fr.v[0].z = -0x20; + fr.col[0].r = fr.col[1].r; + fr.col[0].b = fr.col[1].g; + fr.col[0].g = fr.col[1].g; + i = 0; +L3: + fr.v[2].x = (s8)*p++; + fr.v[2].z = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].z = (s8)*p++; + func_80017758(fr.v, fr.matrix); + t = i + 1; + i = t + zr; + if ((s16)t < 2) goto L3; +} + + + + +// @class: schedule +// @stuck: none — MATCH. The between-loops f1/f2 store-swap (0x55/0x56) is fixed by writing f2's assign first, then the chained `buf[0x44] = buf[0x45] = buf[0x45] << 1;` — the chain keeps f1's read first (read order fixed by -0x12 in $v0) while emitting f2's store (0x56) ahead of the f1/f0 pair (0x55,0x54). 173/173. + +extern void func_80168070(s32 a0, s16 *a1, s16 *a2, void *a3); +extern u16 D_800B99DA; +extern u8 D_80196510[]; +extern u8 D_80196524[]; + +s32 func_80167DBC(s32 arg0, s32 arg1, s32 arg2) { + u8 buf[0x54]; + u8 *p; + s16 i; + + func_80168070(arg0, ((s16 *)arg1), ((s16 *)arg2), buf); + + *(s16 *)(buf + 0x3C) = 0; + *(s16 *)(buf + 0x34) = 0; + *(s16 *)(buf + 0x24) = 0; + *(s16 *)(buf + 0x2C) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + if (D_800B99DA & 1) { + buf[0x46] = 0x58; + } else { + buf[0x46] = 0x48; + } + buf[0x45] = buf[0x46] >> 2; + buf[0x44] = buf[0x45]; + if (((u8 (*)(s32))func_80029178)(0x81) != 0) { + buf[0x45] = buf[0x45] << 2; + buf[0x46] = buf[0x46] >> 1; + } + + p = D_80196510; + buf[0x42] = 0; + buf[0x41] = 0; + buf[0x40] = 0; + buf[0x4A] = 0; + buf[0x49] = 0; + buf[0x48] = 0; + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = 0; + *(s32 *)(buf + 0x50) = 0x50000000; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x22) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x32) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3A) = (s8)*p--; + func_80017758(buf + 0x20, buf); + } + + p = D_80196524; + *(s16 *)(buf + 0x2C) = -0x12; + *(s16 *)(buf + 0x3A) = 0; + *(s16 *)(buf + 0x32) = 0; + *(s16 *)(buf + 0x22) = 0; + *(s16 *)(buf + 0x2A) = 0; + *(s16 *)(buf + 0x28) = 0; + buf[0x46] = buf[0x46] << 1; + buf[0x44] = buf[0x45] = buf[0x45] << 1; + + for (i = 0; i < 4; i++) { + *(s16 *)(buf + 0x20) = (s8)*p++; + *(s16 *)(buf + 0x24) = (s8)*p++; + *(s16 *)(buf + 0x30) = (s8)*p++; + *(s16 *)(buf + 0x34) = (s8)*p++; + *(s16 *)(buf + 0x38) = (s8)*p++; + *(s16 *)(buf + 0x3C) = (s8)*p--; + if (i == 2) { + buf[0x4E] = buf[0x46]; + buf[0x4D] = buf[0x44]; + buf[0x4C] = buf[0x4D]; + } else if (i == 3) { + buf[0x4E] = 0; + buf[0x4D] = 0; + buf[0x4C] = buf[0x4D]; + buf[0x42] = buf[0x46]; + buf[0x41] = buf[0x44]; + buf[0x40] = buf[0x44]; + } + func_80017758(buf + 0x20, buf); + } +} + + +DEFINE_func_80168070() /* dedup: shared engine-core @0x80168070 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_801681FC); + +DEFINE_func_8016829C() /* dedup: shared engine-core @0x8016829C (src/shared) */ + +DEFINE_func_80168328() /* dedup: shared engine-core @0x80168328 (src/shared) */ + +DEFINE_func_801683D8() /* dedup: shared engine-core @0x801683D8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80168430); + +DEFINE_func_801684B4() /* dedup: shared engine-core @0x801684B4 (src/shared) */ + +DEFINE_func_80168540() /* dedup: shared engine-core @0x80168540 (src/shared) */ + +DEFINE_func_801685EC() /* dedup: shared engine-core @0x801685EC (src/shared) */ + +DEFINE_func_80168640() /* dedup: shared engine-core @0x80168640 (src/shared) */ + +DEFINE_func_80168664() /* dedup: shared engine-core @0x80168664 (src/shared) */ + + +extern void (*D_801965C8[])(void); + +void func_80168744(void *a0) { + D_801965C8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80168780() /* dedup: shared engine-core @0x80168780 (src/shared) */ + +DEFINE_func_801687CC() /* dedup: shared engine-core @0x801687CC (src/shared) */ + +// @class: decl-conflict (reconcile) — MATCH (108 ins), real-TU verified via rtu_match +// @crack: The wave-2 "8-residual SCHEDULE" note was a STALE-OBJECT / isolation phantom (§42b): +// in the real TU the draft NOCOMPILEs — DEFINE_func_801687CC() (split line ~6757) expands +// `extern void func_80168828(void);` right before the def, so `void func_80168828(s32 param_1)` +// is a HARD `conflicting types` error (cc1 exit 33). RECONCILE-FIRST fix (sweep-safe, lives +// entirely in the def — no //@EDIT, no macro edit): declare the fn `(void)` and capture a0 via +// register s32 a0v __asm__("$4"); s32 param_1 = a0v; +// The register-var binds incoming $a0; copying it into a NORMAL pseudo (live across the calls) +// makes gcc allocate param_1 to a callee-saved reg, emitting the target's `addu $s1,$a0,$zero` +// at idx2. NOTE: a DIRECT `register s32 param_1 __asm__("$4")` FAILS (param_1 stays in the +// call-clobbered $a0 → 100-off). With this reconcile, gcc's natural schedule places the CSE'd +// `li $v1,0x40` at idx15 with ZERO extra levers — the §42a lever-4 consumer-block reorder was +// never needed. The $v1 pin (register c40 __asm__("$3")) is still load-bearing (else 0x40 folds +// to a $v0 immediate). 134-overlay family exemplar: only D_801965B8 differs -> banks x134. +#include "common.h" + +typedef struct { + u16 f00, f02, f04, f06; + s16 f08; + u16 f0a, f0c, f0e, f10, f12, f14, f16; + u8 f18, f19, f1a, f1b, f1c, f1d, f1e, f1f, f20, f21, f22, f23; + u32 f24; +} Thing_80168828_80168828; + + +void func_80168828() +{ + extern s32 func_80017DC4(void *a0, void *a1); + extern void func_80049CAC(s32 a0, s32 a1); + extern void func_800173BC(void *a0, void *a1); + extern u16 D_801965B8[]; + + + register s32 a0v __asm__("$4"); + s32 param_1 = a0v; + Thing_80168828_80168828 thing; + s16 matA[16]; + s16 matB[16]; + s16 svec[4]; + u16 *p; + short i; + register s32 c40 __asm__("$3"); /* $v1: hold the CSE'd 0x40 (else gcc folds to $v0 immediate) */ + + c40 = 0x40; + thing.f04 = 2; + thing.f0c = 0x24; + thing.f14 = 0x28; + thing.f08 = -3; + thing.f10 = 3; + thing.f02 = 0; + thing.f00 = 0; + thing.f12 = 0; + thing.f0a = 0; + thing.f18 = c40; + thing.f19 = c40; + thing.f22 = c40; + thing.f1e = c40; + thing.f1a = 0x10; + thing.f20 = 0xff; + thing.f1c = 0xff; + thing.f21 = 0xc0; + thing.f1d = 0xc0; + thing.f24 = 0x50000000; + + svec[0] = *(u16 *)(param_1 + 6); + svec[1] = *(u16 *)(param_1 + 0xA); + svec[2] = *(u16 *)(param_1 + 0xE); + func_80017E68(svec, matA); + + svec[0] = svec[1] = svec[2] = (*(s32 *)(param_1 + 0x1C) << 11) + 0x1000; + ((void (*)(void *, void *))func_80017DC4)(svec, matA); + + svec[0] = *(u16 *)(param_1 + 0x12); + svec[1] = *(u16 *)(param_1 + 0x16); + svec[2] = *(u16 *)(param_1 + 0x1A); + RotMatrixYXZ(svec, matB); + + func_80048EAC(matA, matB); + + svec[1] = 0; + p = D_801965B8; + for (i = 0; i < 4; i++) { + svec[0] = *p++; + svec[2] = *p++; + ((void (*)(void *, void *))func_80049CAC)(svec, matA); + func_80048EAC(matB, matA); + func_800173BC(&thing, matA); + } +} + + + + +extern void (*D_801965D0[])(void); + +void func_801689D8(void *a0) { + D_801965D0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80168A14() /* dedup: shared engine-core @0x80168A14 (src/shared) */ + +DEFINE_func_80168A88() /* dedup: shared engine-core @0x80168A88 (src/shared) */ + + +extern void (*D_801965D8[])(void); + +void func_80168AA8(void *a0) { + D_801965D8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80168AE4() /* dedup: shared engine-core @0x80168AE4 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80168B70); + +DEFINE_func_80168BDC() /* dedup: shared engine-core @0x80168BDC (src/shared) */ + + +extern void (*D_801965E0[])(void); + +void func_80168D58(void *a0) { + D_801965E0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80168D94() /* dedup: shared engine-core @0x80168D94 (src/shared) */ + +DEFINE_func_80168EC4() /* dedup: shared engine-core @0x80168EC4 (src/shared) */ + +DEFINE_func_80168F40() /* dedup: shared engine-core @0x80168F40 (src/shared) */ + + +extern void (*D_801965E8[])(void); + +void func_8016901C(void *a0) { + D_801965E8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80169058() /* dedup: shared engine-core @0x80169058 (src/shared) */ + +DEFINE_func_801691B8() /* dedup: shared engine-core @0x801691B8 (src/shared) */ + +INCLUDE_ASM("asm/ov_SC06_018/nonmatchings/ov_SC06_018_jr_8015C32C", func_80169228); + + +extern void (*D_801965F0[])(void); + +void func_801693CC(void *a0) { + D_801965F0[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_80169408() /* dedup: shared engine-core @0x80169408 (src/shared) */ + +DEFINE_func_8016951C() /* dedup: shared engine-core @0x8016951C (src/shared) */ + +DEFINE_func_80169584() /* dedup: shared engine-core @0x80169584 (src/shared) */ + +DEFINE_func_801696D8() /* dedup: shared engine-core @0x801696D8 (src/shared) */ + + +extern void (*D_801965F8[])(void); + +void func_80169830(void *a0) { + D_801965F8[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8016986C() /* dedup: shared engine-core @0x8016986C (src/shared) */ + +DEFINE_func_801699D0() /* dedup: shared engine-core @0x801699D0 (src/shared) */ + +DEFINE_func_80169A4C() /* dedup: shared engine-core @0x80169A4C (src/shared) */ + + +extern void (*D_801966AC[])(void); + +void func_80169B80(void *a0) { + D_801966AC[*(u16 *)((s32)a0 + 0x2)](); +} + + + + +extern void func_800D2318(void); +extern void RotMatrixYXZ(void *a0, void *a1); +extern void ApplyMatrixSV(void *a0, void *a1, void *a2); +extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern s32 func_800D222C(void *a0, void *a1, s32 a2); +extern void ApplyTransposeMatrixLV(void *a0, void *a1, void *a2); +extern s32 ratan2(s32 a0, s32 a1); +extern void func_80048D9C(void *a0, void *a1); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_80146C3C(void); + +void func_80169BBC(s32 arg0) { + + extern s32 D_801269A4; + extern s32 D_801269A8; + extern s32 D_801269AC; + extern u16 D_80196600[]; + extern u8 D_80196670[]; + extern u8 D_801966A0[]; + extern u8 D_801D5A58[]; + u16 rot[4]; + s16 vec[4]; + s32 pos[4]; + s16 mtx[16]; + s32 p1; + s32 s2; + + func_800D2318(); + rot[0] = *(u16 *)(arg0 + 0x12); + rot[1] = *(u16 *)(arg0 + 0x16); + rot[2] = 0; + RotMatrixYXZ(rot, mtx); + vec[0] = 0; + vec[1] = -2; + vec[2] = -0x14; + ApplyMatrixSV(mtx, vec, vec); + *(u16 *)(arg0 + 6) = *(u16 *)(arg0 + 6) + (u16)vec[0]; + *(u16 *)(arg0 + 0xA) = *(u16 *)(arg0 + 0xA) + (u16)vec[1]; + *(u16 *)(arg0 + 0xE) = *(u16 *)(arg0 + 0xE) + (u16)vec[2]; + p1 = func_80146A6C(9, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), + *(s16 *)(arg0 + 0xE), 0, 0); + if (p1 != 0) { + *(u16 *)(p1 + 0x12) = rot[0]; + *(u16 *)(p1 + 0x16) = rot[1]; + *(u16 *)(p1 + 0x1A) = rot[2]; + } + func_80146A6C(0xC, (void *)arg0, *(s16 *)(arg0 + 6), *(s16 *)(arg0 + 0xA), + *(s16 *)(arg0 + 0xE), 0, 0); + s2 = func_800D222C((void *)arg0, D_801966A0, 0x17); + if (s2 != 0) { + *(s32 *)(arg0 + 0x20) = s2; + rot[0] = rot[0] + D_80196600[*(s32 *)(arg0 + 0x30)]; + rot[1] = rot[1] - 0x400; + RotMatrixYXZ(rot, mtx); + pos[0] = D_801269A4 - *(s16 *)(arg0 + 6); + pos[1] = D_801269A8 - *(s16 *)(arg0 + 0xA); + pos[2] = D_801269AC - *(s16 *)(arg0 + 0xE); + ApplyTransposeMatrixLV(mtx, pos, pos); + rot[2] = -ratan2(pos[0], pos[1]); + vec[0] = 0x400; + vec[1] = -0x400; + vec[2] = 0; + RotMatrixYXZ(vec, mtx); + *(s32 *)(s2 + 0x34) = (s32)D_801D5A58; + RotMatrixYXZ(rot, D_801D5A58); + func_80048D9C(D_801D5A58, mtx); + *(u16 *)(s2 + 0x18) = 0x5000; + *(u16 *)(s2 + 0x1A) = 0x2000; + *(s32 *)(s2 + 4) = *(s32 *)(s2 + 4) | 0xC000140; + func_80128EA8(s2, arg0 + 0x24, (s32)D_80196670); + *(u16 *)(arg0 + 2) = *(u16 *)(arg0 + 2) + 1; + } else { + ((void (*)(s32))func_80146C3C)(arg0); + } +} + + +DEFINE_func_80169E44() /* dedup: shared engine-core @0x80169E44 (src/shared) */ + + +extern void (*D_801966B4[])(void); + +void func_80169F00(void *a0) { + D_801966B4[*(u16 *)((s32)a0 + 0x2)](); +} + + + +// @class: plumbing +// @stuck: none — MATCH (expected; simple straight-line + single branch, one call-crossing local in $s0) + +extern void func_800D1FC8(s32 a0, s32 a1); +extern s32 func_800D21C4(s32 a0, void *a1, s32 a2); +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); +extern void func_80146C3C(void); + +extern char D_80196664[]; +extern char D_80196624[]; + +void func_80169F3C(int param_1) +{ + int iVar1; + + ((int (*)(int, int))func_800D1FC8)(param_1, 6); + iVar1 = func_800D21C4(param_1, D_80196664, 0x16); + if (iVar1 != 0) { + *(int *)(param_1 + 0x20) = iVar1; + *(short *)(iVar1 + 0x1a) = 0x2000; + *(short *)(iVar1 + 0x18) = 0x2000; + *(char *)(iVar1 + 0x26) = 0x60; + *(char *)(iVar1 + 0x25) = 0x60; + *(char *)(iVar1 + 0x24) = 0x60; + *(unsigned int *)(iVar1 + 4) = *(unsigned int *)(iVar1 + 4) | 0x50000000; + ((void (*)(int, int, void *))func_80128EA8)(iVar1, param_1 + 0x24, D_80196624); + *(short *)(param_1 + 2) = *(short *)(param_1 + 2) + 1; + } else { + ((void (*)(int))func_80146C3C)(param_1); + } +} + + +DEFINE_func_80169FE0() /* dedup: shared engine-core @0x80169FE0 (src/shared) */ + + +extern void (*D_801966EC[])(void); + +void func_8016A020(void *a0) { + D_801966EC[*(u16 *)((s32)a0 + 0x2)](); +} + + +DEFINE_func_8016A05C() /* dedup: shared engine-core @0x8016A05C (src/shared) */ + +DEFINE_func_8016A08C() /* dedup: shared engine-core @0x8016A08C (src/shared) */ + +DEFINE_func_8016A1CC() /* dedup: shared engine-core @0x8016A1CC (src/shared) */ + +// @class: regalloc-order +// @stuck: none — MATCH (284 ins). Loop-counter biv update: pinned $v0 temp + $0-add opaque copy (i = t + zr) forces the target's 2-insn `addiu v0,s1,1; addu s1,v0,zero` and keeps CSE from rewriting the (s16)t test to read s1. + +#include "common.h" + + + +typedef struct { s16 x, y, z, pad; } SVEC_8016A290; + +struct Fr_8016A290 { + SVEC_8016A290 center; /* 0x00 -> sp+0x10 */ + SVEC_8016A290 diff; /* 0x08 -> sp+0x18 */ + s32 pos[3]; /* 0x10 -> sp+0x20 */ + s32 _pad1c; /* 0x1C -> sp+0x2C */ + s16 mtx[32]; /* 0x20 -> sp+0x30 */ + SVEC_8016A290 v[4]; /* 0x60 -> sp+0x70 */ + struct { u8 r, g, b, pad; } col[4]; /* 0x80 -> sp+0x90 */ + u32 code; /* 0x90 -> sp+0xA0 */ +}; + +void func_8016A290(s32 param_1, void *param_2, void *param_3) { + extern u8 D_801966BC; + extern u8 D_801966D0[]; + + struct Fr_8016A290 fr; + u8 *p; + s32 i; + register s32 t __asm__("$2"); + register s32 zr __asm__("$0"); + s32 flags; + s32 iVar3; + + iVar3 = *(s32 *)(param_1 + 0x34); + + fr.center.x = (*((s16 *)param_2) + *((s16 *)param_3)) >> 1; + fr.center.y = (((s16 *)param_2)[1] + ((s16 *)param_3)[1]) >> 1; + fr.center.z = (((s16 *)param_2)[2] + ((s16 *)param_3)[2]) >> 1; + ((void(*)(s32, void *, void *))func_80149350)(iVar3, &fr.center, &fr.center); + + *(u16 *)(param_1 + 0x6) = *(u16 *)&fr.center.x; + *(u16 *)(param_1 + 0xA) = *(u16 *)&fr.center.y; + *(u16 *)(param_1 + 0xE) = *(u16 *)&fr.center.z; + func_800D20C0(&fr.center, &fr.diff, 8); + func_80017E68(&fr.center, fr.mtx); + + fr.diff.x = *(u16 *)((s16 *)param_3) - *(u16 *)((s16 *)param_2); + fr.diff.y = *(u16 *)(((s16 *)param_3) + 1) - *(u16 *)(((s16 *)param_2) + 1); + fr.diff.z = *(u16 *)(((s16 *)param_3) + 2) - *(u16 *)(((s16 *)param_2) + 2); + ((void(*)(s32, void *, void *))ApplyMatrixSV)(*(s32 *)(iVar3 + 0x20) + 0x34, &fr.diff, &fr.diff); + func_800D23D0(&fr.diff); + RotMatrixYXZ(&fr.diff, fr.mtx); + + fr.pos[0] = D_801269A4 - fr.center.x; + fr.pos[1] = D_801269A8 - fr.center.y; + fr.pos[2] = D_801269AC - fr.center.z; + ApplyTransposeMatrixLV(fr.mtx, fr.pos, fr.pos); + fr.diff.z = -ratan2(fr.pos[0], fr.pos[1]); + RotMatrixYXZ(&fr.diff, fr.mtx); + + fr.v[3].z = 0; + fr.v[2].z = 0; + fr.v[0].z = 0; + fr.v[1].z = 0; + fr.v[1].y = 0; + fr.v[1].x = 0; + flags = D_800B99DA; + if (flags & 1) { + fr.col[1].r = *(s32 *)(param_1 + 0x30) + 0x20; + } else if (flags & 2) { + fr.col[1].r = *(s32 *)(param_1 + 0x30) + 0x40; + } else { + fr.col[1].r = *(s32 *)(param_1 + 0x30); + } + + p = ((u8 *)&D_801966BC); + fr.col[0].b = 0; + fr.col[0].g = 0; + fr.col[0].r = 0; + fr.col[2].b = 0; + fr.col[2].g = 0; + fr.col[2].r = 0; + fr.col[3].b = 0; + fr.col[3].g = 0; + fr.col[3].r = 0; + fr.code = 0x50000000; + fr.col[1].b = fr.col[1].r >> 3; + fr.col[1].g = fr.col[1].r >> 3; + i = 0; +L1: + fr.v[0].x = (s8)*p++; + fr.v[0].y = (s8)*p++; + fr.v[2].x = (s8)*p++; + fr.v[2].y = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].y = (s8)*p--; + func_80017758(fr.v, fr.mtx); + t = i + 1; + i = t + zr; + if ((s16)t < 4) goto L1; + + fr.v[3].y = 0; + fr.v[2].y = 0; + fr.v[0].y = 0; + fr.v[1].y = 0; + fr.v[1].x = 0; + fr.v[1].z = -0x20; + p = D_801966D0; + i = 0; +L2: + fr.v[0].x = (s8)*p++; + fr.v[0].z = (s8)*p++; + fr.v[2].x = (s8)*p++; + fr.v[2].z = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].z = (s8)*p--; + func_80017758(fr.v, fr.mtx); + if ((s16)i == 1) { + fr.v[1].z = 0x20; + p += 2; + } + t = i + 1; + i = t + zr; + if ((s16)t < 4) goto L2; + + p += 2; + fr.v[0].x = 0; + fr.v[0].z = -0x20; + fr.col[0].r = fr.col[1].r; + fr.col[0].b = fr.col[1].g; + fr.col[0].g = fr.col[1].g; + i = 0; +L3: + fr.v[2].x = (s8)*p++; + fr.v[2].z = (s8)*p++; + fr.v[3].x = (s8)*p++; + fr.v[3].z = (s8)*p++; + func_80017758(fr.v, fr.mtx); + t = i + 1; + i = t + zr; + if ((s16)t < 2) goto L3; +} + + + + +extern void (*D_801966F8[])(void); + +void func_8016A700(void *a0) { + D_801966F8[*(u16 *)((s32)a0 + 0x2)](); +} + + +// Seed for func_8016A73C (ov_SC01_077 exemplar). Overlay-local struct guessed. +typedef struct SubB_8016A73C { char pad[0x20]; int unk20; } SubB_8016A73C; +typedef struct SubA_8016A73C { char pad[0x34]; SubB_8016A73C *unk34; } SubA_8016A73C; + +typedef struct Mat_8016A73C { int w[8]; } Mat_8016A73C; + +typedef struct Obj_8016A73C { + short unk0; + short unk2; + short unk4; + short unk6; + short unk8; + short unkA; + short unkC; + short unkE; + char pad10[0x24]; /* 0x10 .. 0x33 */ + SubA_8016A73C *unk34; /* 0x34 */ + Mat_8016A73C mat; /* 0x38 .. 0x57 */ +} Obj_8016A73C; + + + +s32 func_8016A73C(s32 arg0) { + int sp10[8]; + short v[3]; /* sp30, sp32, sp34 */ + int r; + short tmp; + + r = ((int(*)())rand)(); + v[1] = ((r & 0x7F) << 4) + 0x400; + v[0] = ((unsigned)(r & 0x7F00) >> 5) - 0x300; + v[2] = 0; + ((void(*)(short *, void *))RotMatrixYXZ)(v, sp10); + ((void(*)(int, void *))func_80048EAC)(((Obj_8016A73C *)arg0)->unk34->unk34->unk20 + 0x34, sp10); + v[0] = 0; + v[1] = 0; + v[2] = -0x50; + ((int(*)(void *, short *, short *))ApplyMatrixSV)(sp10, v, v); + + ((Obj_8016A73C *)arg0)->mat = (*(Mat_8016A73C*)&D_800AE620); + + tmp = ((Obj_8016A73C *)arg0)->unk6 + v[0]; + ((Obj_8016A73C *)arg0)->unk6 = tmp; + ((Obj_8016A73C *)arg0)->mat.w[5] = tmp; + tmp = ((Obj_8016A73C *)arg0)->unkA + v[1]; + ((Obj_8016A73C *)arg0)->unkA = tmp; + ((Obj_8016A73C *)arg0)->mat.w[6] = tmp; + tmp = ((Obj_8016A73C *)arg0)->unkE + v[2]; + ((Obj_8016A73C *)arg0)->unkE = tmp; + ((Obj_8016A73C *)arg0)->unk2 = ((Obj_8016A73C *)arg0)->unk2 + 1; + ((Obj_8016A73C *)arg0)->mat.w[7] = tmp; +} + + + +DEFINE_func_8016A890() /* dedup: shared engine-core @0x8016A890 (src/shared) */ + + +// @class: struct +// @stuck: none — expect MATCH (single-call leaf, stack-struct prim build + averaging writeback) + +DEFINE_func_8016A8FC() /* dedup: shared engine-core @0x8016A8FC (src/shared) */ + + +DEFINE_func_8016AA50() /* dedup: shared engine-core @0x8016AA50 (src/shared) */ + + +extern void (*D_80196740[])(void); + +void func_8016AB30(void *a0) { + D_80196740[*(u16 *)((s32)a0 + 0x2)](); +} +