From 6a601a0fcee3e0425aea550e2291d6164ea66f83 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Thu, 27 Aug 2026 15:59:13 -0600 Subject: [PATCH] =?UTF-8?q?feat(t5):=20Claude=20wave=20t5o=20=E2=80=94=203?= =?UTF-8?q?6=20banked=20(sonnet=2029/31,=20opus=206/8,=20+recovery);=20fle?= =?UTF-8?q?et=20213=20passed,=200=20failed=20of=20213=20(P31=20S62=20T5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/md_MAIN_044/md_MAIN_044.c | 37 +++++++++- src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c | 14 +++- src/ov_SC01_008/ov_SC01_008_jr_8017E6F0.c | 66 ++++++++++++++++- src/ov_SC02_011/ov_SC02_011_jr_8017AE2C.c | 16 ++++- src/ov_SC02_028/ov_SC02_028_jr_8017D898.c | 41 ++++++++++- src/ov_SC03_003/ov_SC03_003_jr_8017D5C0.c | 32 ++++++++- src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c | 28 +++++++- src/ov_SC03_007/ov_SC03_007_jr_80181F94.c | 22 +++++- src/ov_SC03_010/ov_SC03_010_jr_8017C730.c | 25 ++++++- src/ov_SC03_012/ov_SC03_012_jr_8017AE2C.c | 32 ++++++++- src/ov_SC03_013/ov_SC03_013_jr_8017C730.c | 26 ++++++- src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c | 29 +++++++- src/ov_SC03_014/ov_SC03_014_jr_801848E4.c | 40 ++++++++++- src/ov_SC03_028/ov_SC03_028_jr_80185C14.c | 43 +++++++++++- src/ov_SC03_031/ov_SC03_031_jr_8017DB5C.c | 62 +++++++++++++++- src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c | 86 +++++++++++++++++++++-- src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c | 18 ++++- src/ov_SC03_097/ov_SC03_097_jr_8017D898.c | 28 +++++++- src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c | 46 +++++++++++- src/ov_SC04_019/ov_SC04_019_jr_80181804.c | 81 ++++++++++++++++++++- src/ov_SC05_017/ov_SC05_017_jr_80182A74.c | 40 ++++++++++- src/ov_SC06_029/ov_SC06_029_jr_8017C954.c | 21 +++++- src/ov_SC06_030/ov_SC06_030_jr_8017F65C.c | 63 ++++++++++++++++- 23 files changed, 859 insertions(+), 37 deletions(-) diff --git a/src/md_MAIN_044/md_MAIN_044.c b/src/md_MAIN_044/md_MAIN_044.c index 47d604a67f..8102f3253e 100644 --- a/src/md_MAIN_044/md_MAIN_044.c +++ b/src/md_MAIN_044/md_MAIN_044.c @@ -15,7 +15,19 @@ void func_800CCB28(s32 param_1) { } -INCLUDE_ASM("asm/md_MAIN_044/nonmatchings/md_MAIN_044", func_800CCB78); +extern void func_8014B5C4(s32 *a0, s32 a1, s32 a2); +extern void func_801466F0(s32 a0, s32 a1, s32 a2, s32 a3, s32 sp5, s32 sp6, s32 sp7, s32 sp8); +extern void func_801599A4(void *a0); +extern void func_80159B3C(void *a0); + +void func_800CCB78(void *a0) { + func_8014B5C4((s32 *)a0, 3, 0); + func_801466F0(7, (s32)a0, 0, 0, 0, 0, 0, 0); + *(s16 *)((s32)a0 + 0x1C8) = 0xFF; + func_801599A4(a0); + func_80159B3C(a0); +} + extern void (*D_800CE1F4[])(s32); extern void func_800CCE68(void); @@ -65,7 +77,28 @@ void func_800CCCA0(s32 param_1) { } -INCLUDE_ASM("asm/md_MAIN_044/nonmatchings/md_MAIN_044", func_800CCD2C); +extern s32 func_800CCF30(void *a0); + +void func_800CCD2C(s32 param_1) { + register s32 p1 __asm__("$17"); + register s32 s0 __asm__("$16"); + s16 v0; + + p1 = param_1; + s0 = *(s32 *)(p1 + 0x20); + if (func_800CCF30((void *)param_1) == 0) { + v0 = *(u16 *)(s0 + 0x18) + 0x100; + *(s16 *)(s0 + 0x18) = v0; + if (v0 >= 0x1001) { + v0 = 0x1000; + *(s16 *)(s0 + 0x18) = v0; + func_80146CA0((void *)p1); + } + func_800CCF58(s0, *(s16 *)(s0 + 0x18)); + func_800CCE88(p1); + } +} + INCLUDE_ASM("asm/md_MAIN_044/nonmatchings/md_MAIN_044", func_800CCDB0); diff --git a/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c b/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c index 94eae426b2..6c1c12e605 100644 --- a/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c +++ b/src/ov_SC01_005/ov_SC01_005_jr_8017ED5C.c @@ -3484,7 +3484,19 @@ s32 func_80180734(s32 a0) { } -INCLUDE_ASM("asm/ov_SC01_005/nonmatchings/ov_SC01_005_jr_8017ED5C", func_8018078C); +extern s16 func_8017DA9C(void); + +s32 func_8018078C(s32 a0) { + s16 v1; + + v1 = func_8017DA9C(); + if (v1 != 0) { + *(s16 *)(*(s32 *)(a0 + 0xD4) + 0x108) = v1 - 1; + return 0; + } + return 1; +} + extern s32 *D_80126B78; diff --git a/src/ov_SC01_008/ov_SC01_008_jr_8017E6F0.c b/src/ov_SC01_008/ov_SC01_008_jr_8017E6F0.c index a705bb9202..52fdae5260 100644 --- a/src/ov_SC01_008/ov_SC01_008_jr_8017E6F0.c +++ b/src/ov_SC01_008/ov_SC01_008_jr_8017E6F0.c @@ -3272,7 +3272,71 @@ void func_8017F404(s32 a0) { } -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8017E6F0", func_8017F470); +extern s32 func_801789AC(s32 arg0); +extern void func_80178CBC(s32 arg0, s32 arg1); +extern s32 func_800291B4(s32 arg); +extern void func_800291A0(s32, s32); +extern u8 D_8019F234[]; +extern u8 D_8019F264[]; +extern u8 D_8019F284[]; + +void func_8017F470(s32 a0) +{ + /* RC-12 (cookbook §136d-1): the `$0`-add opaque copy. Without it cse.c's + * make_regs_eqv promotes the longer-lived copy `mode` to canonical and + * canon_reg rewrites the compare, giving `slti $v0,$a1,0xD` where the + * target reads the source register: `slti $v0,$v0,0xD`. */ + register s32 zr __asm__("$0"); + s16 sVar1; + s32 result; + s32 cnt; + s32 mode; + + sVar1 = (s16)func_801789AC(a0); + if (sVar1 == 1) { + goto case1; + } + if (sVar1 < 2) { + goto end; + } + if (sVar1 == 2) { + goto case2; + } + if (sVar1 == 3) { + goto case3; + } + goto end; + +case1: + func_80178CBC(a0, (s32)D_8019F234); + result = *(u16 *)(a0 + 2) + 1; + goto store; + +case2: + if (*(s16 *)(a0 + 0x108) == 0) { + mode = func_800291B4(0xDF) & 0xFF; + cnt = mode + 1; + *(s16 *)(a0 + 0x108) = cnt; + mode = cnt + zr; + if (cnt >= 0xD) { + mode = 0; + } + func_800291A0(0xDF, mode & 0xFF); + } + func_80178CBC(a0, (s32)D_8019F264); + result = 4; + goto store; + +case3: + func_80178CBC(a0, (s32)D_8019F284); + result = 5; + +store: + *(u16 *)(a0 + 2) = result; +end: + return; +} + extern s32 func_801789AC(s32 arg0); extern void func_80178CBC(s32 arg0, s32 arg1); diff --git a/src/ov_SC02_011/ov_SC02_011_jr_8017AE2C.c b/src/ov_SC02_011/ov_SC02_011_jr_8017AE2C.c index f3deeb2648..a6ce6c4c40 100644 --- a/src/ov_SC02_011/ov_SC02_011_jr_8017AE2C.c +++ b/src/ov_SC02_011/ov_SC02_011_jr_8017AE2C.c @@ -11386,7 +11386,21 @@ s32 func_80188114(void) } -INCLUDE_ASM("asm/ov_SC02_011/nonmatchings/ov_SC02_011_jr_8017AE2C", func_80188168); +extern int D_800C7C60; +extern int *D_800C7C64; +extern int D_800A2E20; +extern int D_800AEFA8; + +extern void func_8001ABBC(s32 a0, s32 a1, void *a2, s32 a3, s32 sp10); + +s32 func_80188168(void) +{ + int *p = &D_800C7C60; + *p = 0x18; + D_800C7C64 = &D_800A2E20; + ((void (*)(int, int, int *, int, int *))func_8001ABBC)(0, 0, &D_800AEFA8, 0, p); +} + // @class: remat diff --git a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c index 7f45f2026c..48fb48ebcd 100644 --- a/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c +++ b/src/ov_SC02_028/ov_SC02_028_jr_8017D898.c @@ -3720,7 +3720,34 @@ void func_8017F220(void) { } -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_8017F2B4); +extern void func_8012A018(s32 a, s32 b); +extern void func_8012A094(s32 a0); +extern void func_8017F3E4(void *a0); + +void func_8017F2B4(void) { + + extern u8 D_80126948[]; + extern s32 D_80126954; + extern s32 D_8012695C; + extern s16 D_80126968; + extern s16 D_8012696A; + extern s16 D_8012696C; + extern s16 D_80126976; + extern s16 D_80126978; + extern s16 D_8012697A; + D_80126954 = 0x190; + D_8012695C = 0x3E8; + D_80126968 = 0xA6; + D_8012696A = 0; + D_8012696C = 0; + D_80126976 = 0; + D_80126978 = -0x50; + D_8012697A = 0; + func_8012A018((s32)func_8017F3E4, 4); + func_8012A094((s32)D_80126948); + func_8017F3E4(D_80126948); +} + extern void func_8012A018(s32 a, s32 b); extern void func_8012A094(s32 a0); @@ -6134,7 +6161,17 @@ void func_80182794(void *a0) { } -INCLUDE_ASM("asm/ov_SC02_028/nonmatchings/ov_SC02_028_jr_8017D898", func_801828A0); +extern int func_80178970(void); +extern void func_80178D18(void); +extern void func_801822D0(void *arg0); + +void func_801828A0(void *a0) { + if (((s32 (*)(s32))func_80178970)((s32)a0) != 0) { + ((void (*)(s32))func_80178D18)((s32)a0); + func_801822D0(a0); + } +} + extern void func_8018248C(s32 a0, s32 a1); diff --git a/src/ov_SC03_003/ov_SC03_003_jr_8017D5C0.c b/src/ov_SC03_003/ov_SC03_003_jr_8017D5C0.c index 07bbe24224..f4ca68b818 100644 --- a/src/ov_SC03_003/ov_SC03_003_jr_8017D5C0.c +++ b/src/ov_SC03_003/ov_SC03_003_jr_8017D5C0.c @@ -3336,7 +3336,16 @@ void func_8017E844(u8 *a0) { } -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8017D5C0", func_8017E8E8); +extern s32 func_80171990(u8 *a0); + +void func_8017E8E8(s32 *a0) { + *(s16 *)((u8 *)a0 + 0x74) = 0x1000; + *(s16 *)((u8 *)a0 + 0x72) = 0x1000; + *(s16 *)((u8 *)a0 + 0x70) = 0x1000; + *(s32 *)((u8 *)a0 + 0x200) = 0x10; + func_80171990((u8 *)a0); +} + extern void func_80171928(void *a0); void func_8017E91C(void *a0) { @@ -3392,7 +3401,26 @@ register void *s0 __asm__("$16"); INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8017D5C0", func_8017E9CC); -INCLUDE_ASM("asm/ov_SC03_003/nonmatchings/ov_SC03_003_jr_8017D5C0", func_8017EA10); +extern s32 D_8018FB78; +extern u8 D_801830B0; +extern u8 D_80182D58; +extern s32 func_8017EC64(); +extern s32 func_8013767C(s32 a0); +extern void func_80154274(s32 *a0, s32 a1); +extern void func_80147324(s32 a0); +extern s32 func_80171990(u8 *a0); + +void func_8017EA10(void *a0) { + if (D_8018FB78 == 0) { + if (func_8017EC64(a0) < 0x190) { + *(s32 *)((s32)a0 + 0x198) = func_8013767C(&D_801830B0); + func_80154274((s32 *)a0, &D_80182D58); + func_80147324(0x7E7); + func_80171990((u8 *)a0); + } + } +} + extern s32 func_8017EC64(); diff --git a/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c b/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c index f599f25f4b..7cd0f7e082 100644 --- a/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c +++ b/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c @@ -5533,7 +5533,33 @@ s32 param_1; } -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8017AE2C", func_8017F794); +extern s32 func_8018033C(s32 a0, s32 a1); +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8017FC6C(s32 a0); +extern s32 func_8012BEE8(s32 a0); + +void func_8017F794(s32 a0) { + register s32 s0 __asm__("$16"); + s32 v0; + s32 v1; + + s0 = a0; + __asm__ __volatile__(""); + if (*(s32 *)(s0 + 0x1C) > 0x15) { + v0 = func_8018033C(s0, 8); + v1 = *(s32 *)(s0 + 0x20); + *(u16 *)(v1 + 0x12) = *(u16 *)(v1 + 0x12) + v0; + } + v0 = *(s32 *)(s0 + 0x1C); + if ((v0 == 0x15 && (func_8002D4C8(0x522, 0), *(s32 *)(s0 + 0x1C) == v0)) || + *(s32 *)(s0 + 0x1C) == 0xB || *(s32 *)(s0 + 0x1C) == 1) { + func_8017FC6C(s0); + } + if (func_8012BEE8(s0) != 0) { + *(u16 *)(s0 + 2) = 2; + } +} + extern void func_8012B2CC(s32 a0); extern void func_8012B23C(s32 a0); diff --git a/src/ov_SC03_007/ov_SC03_007_jr_80181F94.c b/src/ov_SC03_007/ov_SC03_007_jr_80181F94.c index 22a4efc18e..75750d88d3 100644 --- a/src/ov_SC03_007/ov_SC03_007_jr_80181F94.c +++ b/src/ov_SC03_007/ov_SC03_007_jr_80181F94.c @@ -3189,7 +3189,27 @@ void func_80182374(s32 arg0) } -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_80181F94", func_801823BC); +#include "common.h" + +extern void func_8002D4C8(s32 a0, s32 a1); +extern void func_8002AC00(s32 a0); + +void func_801823BC(s32 a0) +{ + s32 arg0; + + arg0 = 0x43F; + if (*(u16 *)(a0 + 0x5E) == 0x1D) { + arg0 = 0x440; + } + func_8002D4C8(arg0, 0); + + *(s32 *)(a0 + 0x1C) = 0x5A; + *(u16 *)(a0 + 0xDE) = 0; + *(s32 *)(a0 + 0xB4) = *(s32 *)(a0 + 0xB4) & ~0x2000; + func_8002AC00(2); +} + extern void func_8002A04C(s32 a0); extern void func_8012C098(void); diff --git a/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c b/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c index 6d637026f5..a46812c073 100644 --- a/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c +++ b/src/ov_SC03_010/ov_SC03_010_jr_8017C730.c @@ -3598,7 +3598,17 @@ void func_8017DD14(s32 *a0) { } -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8017C730", func_8017DD44); +extern void func_8017EE30(void); +extern void func_800D1724(s32 a0); +extern void func_80171928(void *a0); +extern u8 D_80183A5C; + +s32 func_8017DD44(s32 a0) { + func_8017EE30(); + func_800D1724((s32)&D_80183A5C); + func_80171928((void *)a0); +} + extern void func_8017DE84(s32 arg0); void func_8017DD84(void) { @@ -4116,7 +4126,18 @@ void func_8017EE30(void) { } -INCLUDE_ASM("asm/ov_SC03_010/nonmatchings/ov_SC03_010_jr_8017C730", func_8017EE98); +void func_8017EE98(s32 arg0) { + extern s32 func_8017F01C(s32 a0); + extern void func_8012C098(void *a0); + extern void (*D_80183D40[])(s32); + + if (func_8017F01C(arg0) != 0) { + func_8012C098((void *)arg0); + return; + } + D_80183D40[*(u16 *)(arg0 + 2)](arg0); +} + extern s32 func_8012C194(void); extern void func_8001CEC0(s32 a0, void *a1); diff --git a/src/ov_SC03_012/ov_SC03_012_jr_8017AE2C.c b/src/ov_SC03_012/ov_SC03_012_jr_8017AE2C.c index 28fbf20eed..3282fe48ee 100644 --- a/src/ov_SC03_012/ov_SC03_012_jr_8017AE2C.c +++ b/src/ov_SC03_012/ov_SC03_012_jr_8017AE2C.c @@ -4262,7 +4262,15 @@ void func_8017DE90(s32 *a0) { } -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8017AE2C", func_8017DEB0); +void func_8017DEB0(void *a0) { + if (*(s16 *)(*(s32 *)((char *)a0 + 0x64) + 0xE0) != 0) { + *(u16 *)((char *)a0 + 0xE0) = 0x2A; + *(u16 *)((char *)a0 + 0xE2) = 0x18; + *(u16 *)((char *)a0 + 0x2) = *(u16 *)((char *)a0 + 0x2) + 1; + *(u16 *)((char *)a0 + 0xE4) = 0x26; + } +} + extern void func_8017D6B4(void); @@ -4307,7 +4315,27 @@ void func_8017DFCC(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_012/nonmatchings/ov_SC03_012_jr_8017AE2C", func_8017E008); +extern u8 D_800D387C[]; +extern u8 D_800D3888[]; +extern void func_80128EA8(s32 a0, s32 a1, s32 a2); + +void func_8017E008(s32 param_1) +{ + *(u32 *)(*(s32 *)(param_1 + 0x20) + 0x20) = (u32)&D_800D387C; + + *(u32 *)(*(s32 *)(param_1 + 0x20) + 4) |= 0x50000000; + + *(u8 *)(*(s32 *)(param_1 + 0x20) + 0x27) = 0x9c; + + func_80128EA8(*(s32 *)(param_1 + 0x20), param_1 + 0x24, (s32)&D_800D3888); + + *(s32 *)(param_1 + 0x10) = 0; + *(s32 *)(param_1 + 0x14) = 0xffa40000; + *(s32 *)(param_1 + 0x18) = 0; + + *(u16 *)(param_1 + 2) = *(u16 *)(param_1 + 2) + 1; +} + extern s32 func_80128ED8(s32 param_1, s32 *param_2); extern void func_801292C8(u8 *a0); diff --git a/src/ov_SC03_013/ov_SC03_013_jr_8017C730.c b/src/ov_SC03_013/ov_SC03_013_jr_8017C730.c index c96a871d1d..24d4597358 100644 --- a/src/ov_SC03_013/ov_SC03_013_jr_8017C730.c +++ b/src/ov_SC03_013/ov_SC03_013_jr_8017C730.c @@ -4040,7 +4040,18 @@ void func_8017F0A0(void *a0) } -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8017C730", func_8017F140); +void func_8017F140(void *a0) { + extern void func_8017ED9C(s32); + extern void func_8017ECD0(s32); + + if (((s32 (*)(void *))func_8017ED9C)(a0) != 0) { + func_8017ECD0((s32)a0); + } else { + s32 v1 = *(s32 *)((s8 *)a0 + 0x20); + *(u16 *)(v1 + 0x10) = *(u16 *)(v1 + 0x10) + 0x80; + } +} + void func_8017F198(s32 a0) { extern s32 *D_80126B78; @@ -4210,7 +4221,18 @@ void func_8017F5FC() { } -INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8017C730", func_8017F664); +extern s32 func_8017F7E8(void); +extern void func_8012C098(void *param_1); +extern void (*D_80184F18[])(void *); + +void func_8017F664(void *a0) { + if (func_8017F7E8() != 0) { + func_8012C098(a0); + } else { + D_80184F18[*(u16 *)((s32)a0 + 2)](a0); + } +} + INCLUDE_ASM("asm/ov_SC03_013/nonmatchings/ov_SC03_013_jr_8017C730", func_8017F6C8); diff --git a/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c b/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c index e1fcdb9c5d..b97f774a0f 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_8017AE2C.c @@ -3338,7 +3338,20 @@ void func_8017BF20(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017AE2C", func_8017BF58); +extern s32 func_80184794(void); +extern void func_80171A1C(u8 *a0); +extern s32 func_80174650(s32); + +void func_8017BF58(void *a0) { + s32 v0; + + v0 = func_80184794(); + if (v0 != 0) { + func_80171A1C((u8 *)a0); + func_80174650((s32)a0); + } +} + DEFINE_func_8017BF98() /* dedup: shared engine-core @0x8017BF98 (src/shared) */ @@ -3362,7 +3375,19 @@ void func_8017C004(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_8017AE2C", func_8017C03C); +extern s32 func_8018473C(void); +extern void func_80171A1C(u8 *a0); +extern s32 func_80174650(s32 a0); + +void func_8017C03C(void *a0) { + s32 s0 = (s32)a0; + if (func_8018473C() == 0) { + return; + } + func_80171A1C((u8 *)s0); + func_80174650(s0); +} + DEFINE_func_8017C07C() /* dedup: shared engine-core @0x8017C07C (src/shared) */ diff --git a/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c b/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c index bea4479cd8..dbca1e6e4a 100644 --- a/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c +++ b/src/ov_SC03_014/ov_SC03_014_jr_801848E4.c @@ -5044,7 +5044,45 @@ s32 func_80188CA0(s32 arg0) { } -INCLUDE_ASM("asm/ov_SC03_014/nonmatchings/ov_SC03_014_jr_801848E4", func_80188CB4); +void func_80188CB4(s32 a0) { + extern void func_801439C0(u8 *a0); + extern void func_8012B200(u8 *a0); + extern void func_8012AD44(s32 *a0, s16 a1); + extern void func_801292C8(u8 *a0); + extern void func_8002D4C8(s32 a0, s32 a1); + extern u16 D_80126B5E; + extern u16 D_80126B66; + register s32 self __asm__("$16") = a0; /* $s0 */ + u8 *ptr; + s32 val1; + s32 val2; + s32 t2; + + func_801439C0(*(u8 **)(self + 0xCC)); + func_8012B200((u8 *)self); + + *(s32 *)(self + 0x14) = 0x80000; + *(u16 *)(self + 6) = D_80126B5E; + *(u16 *)(self + 0xE) = D_80126B66; + + ptr = *(u8 **)(self + 0x20); + val1 = *(u16 *)(ptr + 0x18); + *(s16 *)(self + 0xDC) = (val1 << 16) >> 19; + + ptr = *(u8 **)(self + 0x20); + val2 = *(u16 *)(ptr + 0x1A); + *(s16 *)(self + 0xDE) = (val2 << 16) >> 19; + + func_8012AD44((s32 *)self, 7); + + t2 = *(s32 *)(self + 0xD0); + if (t2 != 0) { + func_801292C8((u8 *)t2); + } + + func_8002D4C8(0x87D, 0); +} + extern void func_8012AD44(s32 *a0, s16 a1); void func_80188D64(void *arg0) { diff --git a/src/ov_SC03_028/ov_SC03_028_jr_80185C14.c b/src/ov_SC03_028/ov_SC03_028_jr_80185C14.c index 4079a53bf7..049e7c5446 100644 --- a/src/ov_SC03_028/ov_SC03_028_jr_80185C14.c +++ b/src/ov_SC03_028/ov_SC03_028_jr_80185C14.c @@ -4632,9 +4632,48 @@ void func_801880AC(s32 a0) } -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_80185C14", func_80188164); +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_80180B44(s32); +extern void func_80183E04(void *a0); + +void func_80188164(s32 a0) +{ + s32 v0; + + v0 = *(s32 *)(a0 + 0x1C) - 1; + *(s32 *)(a0 + 0x1C) = v0; + if (v0 == 0) { + *(s16 *)(a0 + 2) = 2; + } + v0 = func_8012C658(0xFE, 2, a0); + if (v0 != 0) { + ((void (*)(s32, s32))func_80180B44)(v0, 6); + } + func_80183E04((void *)a0); +} + + +extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); +extern void func_80180B44(s32); +extern void func_80183E04(void *a0); + +void func_801881CC(s32 a0) +{ + u16 v0; + s32 v1; + + v0 = *(u16 *)(a0 + 0xA) - 0x18; + *(u16 *)(a0 + 0xA) = v0; + if ((s16)v0 <= 0) { + *(s16 *)(a0 + 2) = 3; + } + v1 = func_8012C658(0xFE, 2, a0); + if (v1 != 0) { + ((void (*)(s32, s32))func_80180B44)(v1, 6); + } + func_80183E04((void *)a0); +} -INCLUDE_ASM("asm/ov_SC03_028/nonmatchings/ov_SC03_028_jr_80185C14", func_801881CC); extern void func_8012C218(void *a0); extern void func_80183E04(void *a0); diff --git a/src/ov_SC03_031/ov_SC03_031_jr_8017DB5C.c b/src/ov_SC03_031/ov_SC03_031_jr_8017DB5C.c index 2331d01faf..0be818f2ff 100644 --- a/src/ov_SC03_031/ov_SC03_031_jr_8017DB5C.c +++ b/src/ov_SC03_031/ov_SC03_031_jr_8017DB5C.c @@ -3679,7 +3679,24 @@ void func_8017FAB8(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8017DB5C", func_8017FB84); +extern void func_8012931C(struct vec *a0); +extern void func_801292C8(u8 *a0); + +void func_8017FB84(void *a0) { + s32 v0; + + v0 = *(s32 *)((s32)a0 + 0x1C); + if (v0 == 0) { + func_8012931C((struct vec *)a0); + v0 = func_80128ED8(*(s32 *)((s32)a0 + 0x20), (s32 *)((s32)a0 + 0x24)); + if (v0 != 0) { + func_801292C8((u8 *)a0); + } + } else { + *(s32 *)((s32)a0 + 0x1C) = v0 - 1; + } +} + extern void (*D_80186298[])(void); @@ -3910,7 +3927,20 @@ void func_8018011C(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8017DB5C", func_801801C0); +extern u16 D_80126B66; +extern u8 D_8018634C; +extern s32 func_80178B18(s32 param_1, s32 param_2); +extern void func_801746DC(void); + +void func_801801C0(s32 param_1) +{ + if ((*(s16 *)&D_80126B66) >= 0x800) { + *(s16 *)(param_1 + 2) = 3; + func_80178B18(param_1, (s32)&D_8018634C); + func_801746DC(); + } +} + extern s32 func_801789AC(s32 arg0); extern void func_80178D18(void); @@ -4034,7 +4064,33 @@ void func_8018043C(void *a0) } -INCLUDE_ASM("asm/ov_SC03_031/nonmatchings/ov_SC03_031_jr_8017DB5C", func_801804EC); +#include "common.h" + +extern void func_800183E0(s32 a0); +extern void (*D_80186478[])(void *); +extern s32 func_8004787C(s32 a0); +extern void func_8017FF20(void *a0); +extern void func_8002D4C8(s32 a0, s32 a1); + +void func_801804EC(void *a0) +{ + u16 h; + + func_800183E0(*(s32 *)((u8 *)D_80186478 + ((*(u16 *)((u8 *)a0 + 0xFC) << 1) & 0x1C))); + h = *(u16 *)((u8 *)a0 + 0xFE) + 0x40; + *(u16 *)((u8 *)a0 + 0xFE) = h; + if ((s16)h >= 0x201 || (s16)h < 0x600) { + *(u16 *)((u8 *)a0 + 0xFC) = 8; + } + *(u16 *)((u8 *)a0 + 6) = *(u16 *)((u8 *)a0 + 6) - 2; + *(s16 *)((u8 *)a0 + 0xA) = -0x32B - ((func_8004787C(*(s16 *)((u8 *)a0 + 0xFE)) << 6) >> 12); + if (*(s16 *)((u8 *)a0 + 0xFE) == 0x800) { + *(u16 *)((u8 *)a0 + 2) = 2; + func_8017FF20((void *)0); + func_8002D4C8(0x63F, 0); + } +} + extern void func_8012C1B8(void); extern void func_8012CAE4(void *a0); diff --git a/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c b/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c index 1b255c223d..8d3ad2f373 100644 --- a/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c +++ b/src/ov_SC03_089/ov_SC03_089_jr_8017CA80.c @@ -4320,7 +4320,33 @@ void func_8018166C(void) { } -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_80181708); +extern void func_8012A018(s32 a0, s32 a1); +extern void func_8012A094(s32 a0); +extern void func_801817A4(void *a0); +extern u8 D_80126948[]; +extern s32 D_80126954; +extern s32 D_8012695C; +extern s16 D_80126968; +extern s16 D_8012696A; +extern s16 D_8012696C; +extern s16 D_80126976; +extern s16 D_80126978; +extern s16 D_8012697A; + +void func_80181708(void) { + D_80126954 = 0x190; + D_8012695C = 0x4B0; + D_80126968 = 0xE3; + D_8012696A = 0x800; + D_8012696C = 0; + D_80126976 = 0; + D_80126978 = -0x80; + D_8012697A = 0; + func_8012A018(func_801817A4, 3); + func_8012A094(D_80126948); + func_801817A4(D_80126948); +} + extern void (*D_8018D348[])(void); @@ -4330,7 +4356,29 @@ void func_801817A4(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_801817E0); +extern s32 D_80126B58; +extern u16 func_80148800(s32 *a0); +extern void func_80181BCC(s32 param_1, s16 *param_2); + +typedef struct { s16 w[4]; } V4_801817E0; + +void func_801817E0(s32 param_1) { + extern s16 D_8018D358[]; + extern s16 D_80126940; + V4_801817E0 sp10; + s16 *s1; + + if (func_80148800(&D_80126B58) & 3) { + *(u8 *)(param_1 + 5) = (*(u8 *)(param_1 + 5) + 1) & 1; + *(s32 *)(param_1 + 0x14) = D_8018D358[*(u8 *)(param_1 + 5)]; + } + sp10 = *(V4_801817E0 *)&D_80126940; + s1 = &sp10.w[0]; + sp10.w[0] = 0; + sp10.w[2] = -0x920; + func_80181BCC(param_1, s1); +} + typedef struct { s16 w[4]; } V4_88; @@ -4399,7 +4447,29 @@ void func_8018188C(s32 param_1) { } -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_80181A68); +extern s32 D_80126B58; +extern u16 func_80148800(s32 *a0); +extern void func_80181BCC(s32 param_1, s16 *param_2); + +typedef struct { s16 w[4]; } V4_80181A68; + +void func_80181A68(s32 param_1) { + extern s16 D_8018D360[]; + extern s16 D_80126940; + V4_80181A68 sp10; + s16 *s1; + + if (func_80148800(&D_80126B58) & 3) { + *(u8 *)(param_1 + 5) = (*(u8 *)(param_1 + 5) + 1) & 1; + *(s32 *)(param_1 + 0x14) = D_8018D360[*(u8 *)(param_1 + 5)]; + } + sp10 = *(V4_80181A68 *)&D_80126940; + s1 = &sp10.w[0]; + sp10.w[0] = 0; + sp10.w[2] = 0x3A0; + func_80181BCC(param_1, s1); +} + typedef struct { s16 w[4]; } V4_80181B14; extern s32 D_80126B58; @@ -4581,7 +4651,15 @@ void func_801820A8(s32 param_1) { } -INCLUDE_ASM("asm/ov_SC03_089/nonmatchings/ov_SC03_089_jr_8017CA80", func_8018210C); +void func_8018210C(int param_1) +{ + if (*(short *)(param_1 + 0xFC) != 0) { + *(short *)(param_1 + 0xFC) = *(short *)(param_1 + 0xFC) - 1; + *(short *)(param_1 + 6) = *(u16 *)(param_1 + 6) + *(u16 *)(param_1 + 0x12); + *(short *)(param_1 + 0xA) = *(u16 *)(param_1 + 0xA) - 4; + } +} + void func_80182150(s32 a0) { extern s32 func_8012C354(s32, s32); diff --git a/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c b/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c index 97ab1e59ef..62f1137a48 100644 --- a/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c +++ b/src/ov_SC03_092/ov_SC03_092_jr_8017AE2C.c @@ -5928,7 +5928,23 @@ void func_801803F4(void *a0) } -INCLUDE_ASM("asm/ov_SC03_092/nonmatchings/ov_SC03_092_jr_8017AE2C", func_801804C0); +void func_801804C0(s32 param) +{ + extern void func_8012E8E0(s32 a0, s32 a1); + extern void func_8012A828(s32 a0, void *a1); + extern void func_8002D4C8(s32 a0, s32 a1); + extern u8 D_80189458; + extern u8 D_801AFBA0[]; + + *(s16 *)(param + 2) = 2; + func_8012E8E0(param, (s32)&D_80189458); + if (*(s16 *)(param + 0x70) != 0) { + func_8012A828(param, D_801AFBA0); + } + *(s32 *)(param + 0x1C) = 0x20; + func_8002D4C8(0x5BF, 0); +} + s32 func_8018052C(void *param) { diff --git a/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c b/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c index dfccf862fb..1986559d35 100644 --- a/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c +++ b/src/ov_SC03_097/ov_SC03_097_jr_8017D898.c @@ -3642,7 +3642,33 @@ void func_8017F0FC(void) { } -INCLUDE_ASM("asm/ov_SC03_097/nonmatchings/ov_SC03_097_jr_8017D898", func_8017F194); +void func_8017F194(void) { + extern s32 D_80126954; + extern s32 D_8012695C; + extern s16 D_80126968; + extern s16 D_8012696A; + extern s16 D_8012696C; + extern s16 D_80126976; + extern s16 D_80126978; + extern s16 D_8012697A; + extern u8 D_80126948[]; + extern void func_8012A018(s32 a, s32 b); + extern void func_8012A094(s32 a0); + extern void func_8017F2C8(void *a0); + + D_80126954 = 0x190; + D_8012695C = 0x3E8; + D_80126968 = 0x35; + D_8012696A = 0x400; + D_8012696C = 0; + D_80126976 = 0; + D_80126978 = -0x73; + D_8012697A = 0; + func_8012A018((s32)func_8017F2C8, 1); + func_8012A094((s32)D_80126948); + func_8017F2C8(D_80126948); +} + extern void func_8012A018(s32 a, s32 b); diff --git a/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c b/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c index 7154bc5003..d1aac7624f 100644 --- a/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c +++ b/src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c @@ -4789,7 +4789,51 @@ extern void func_80181864(void); } -INCLUDE_ASM("asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C", func_80181864); +/* func_80181864 — ov_SC03_116_jr_8017AE2C, 21 ins. + * + * COOKBOOK ESCAPE 4 (matching-cookbook L23505, indexed at cookbook-index.md:15): + * "(void)-PARAMETERISED DEFINITION + register __asm__("$4") CAPTURE". + * + * DO NOT 'fix' this signature back to (void *a0, void *a1). The destination TU + * src/ov_SC03_116/ov_SC03_116_jr_8017AE2C.c:4785 carries a FILE-SCOPE + * extern void func_80181864(void); + * immediately above the splice point, serving the already-banked func_80181844 + * (:4788), which calls it with no arguments so the $a0/$a1 pass-through emits no + * `move` (§263). A two-argument definition dies at + * cc1: 4795: conflicting types for `func_80181864' + * 4785: previous declaration of `func_80181864' + * which is precisely why the previous MATCHing draft was refused by the + * whole-binary gate (bucket=integration, closeness 0). + * + * Verified this session with the pinned triple (cpp -> cc1 -O2 -> maspsx 2.56 -> as) + * on the REAL spliced TU: cc1 rc=0, and all 21 emitted words are byte-identical to + * asm/ov_SC03_116/nonmatchings/ov_SC03_116_jr_8017AE2C/func_80181864.s. + * The pins are safe under §74: this is a leaf (no jal), so no caller-saved pin + * spans a call, and neither $4 nor $5 is written after entry. + */ + +extern u16 D_800B99DA; + +void func_80181864(void) +{ + register void *a0 __asm__("$4"); + register void *a1 __asm__("$5"); + s32 v1; + + v1 = *(s16 *)((s32)a0 + 0xFC); + if (D_800B99DA & 1) { + v1 -= 4; + } + if (v1 < 0) { + v1 = 0; + } else if (v1 >= 0x100) { + v1 = 0xFF; + } + *(s32 *)((s32)a1 + 0) = v1; + *(s32 *)((s32)a1 + 4) = 0; + *(u16 *)((s32)a0 + 0xFC) = *(u16 *)((s32)a0 + 0xFC) + 4; +} + extern s32 func_801818DC(); void func_801818B8(void *a0) { diff --git a/src/ov_SC04_019/ov_SC04_019_jr_80181804.c b/src/ov_SC04_019/ov_SC04_019_jr_80181804.c index c29b448d19..6946cf8eb7 100644 --- a/src/ov_SC04_019/ov_SC04_019_jr_80181804.c +++ b/src/ov_SC04_019/ov_SC04_019_jr_80181804.c @@ -3436,7 +3436,86 @@ extern void func_80184CB8(s32*, s32); } -INCLUDE_ASM("asm/ov_SC04_019/nonmatchings/ov_SC04_019_jr_80181804", func_801821D4); +extern s32 func_801847BC(void *a0, void *a1); +extern s32 func_80184DD0(s32 a0); +extern s32 func_80029504(void); +extern s32 func_80184BAC(s32 a0, s32 a1); +extern void func_8012E8E0(s32 a0, s32 a1); +extern void func_8012E88C(s32 a0); +extern void func_8012A828(s32 *a0, s32 a1); +extern void func_80184C90(s32 a0); +extern void func_80184CB8(s32 *a0, s32 a1); +extern s32 func_801788B8(s32 a0, s32 a1); +extern s32 func_80182544(void *a0); +extern s32 func_801825BC(void *a0); + +extern s16 D_80191C18; +extern s16 D_80191C10; +extern s16 D_80191C08; +extern s16 D_801B9B50; + +void func_801821D4(void *a0) +{ + s32 state; + s32 hp; + s32 v0; + s32 v1; + register s32 arg0 __asm__("$4"); + void *ptr; + + if (func_801847BC(a0, (void *)&D_80191C18) != 0) { + /* func_80184DD0 takes no argument at this call site; the TU's file-scope + * prototype declares one, so call through a no-parameter pointer type + * (the TU's own idiom, cf. ((void (*)(s32, s32))func_80184CB8)(...)). */ + state = ((s32 (*)(void))func_80184DD0)(); + hp = func_80029504(); + + arg0 = 0xA; + if (state == 2 && hp < 0x276) { + goto call15; + } + v0 = func_80184BAC(arg0, 0x10); + if (v0 != 0) { + v1 = 0; + goto dispatch; + } + arg0 = 0x10; + call15: + v0 = func_80184BAC(arg0, 0x15); + if (v0 != 0) { + v1 = 1; + } else { + v1 = 2; + } + + dispatch: + switch (v1) { + case 0: + *(s16 *)((char *)a0 + 2) = 3; + func_8012E8E0((s32)a0, (s32)&D_80191C10); + func_8012E88C((s32)a0); + func_8012A828((s32 *)a0, (s32)&D_801B9B50); + func_80184C90((s32)a0); + break; + case 1: + v0 = 5; + goto store; + case 2: + v0 = 1; + store: + *(s16 *)((char *)a0 + 2) = v0; + func_80184CB8((s32 *)a0, (s32)&D_80191C08); + break; + } + + ptr = *(void **)((char *)a0 + 0x68); + *(s16 *)((char *)ptr + 0xC) = 0x7FFF; + *(s32 *)((char *)a0 + 0xD4) = func_801788B8((s32)a0, (s32)&func_80182544); + func_8012E8E0(*(s32 *)((char *)a0 + 0xD4), (s32)&D_80191C08); + *(s32 *)((char *)a0 + 0xD8) = func_801788B8((s32)a0, (s32)&func_801825BC); + } +} + DEFINE_func_8018233C() /* dedup: shared engine-core @0x8018233C (src/shared) */ diff --git a/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c b/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c index bb530bbba3..28c54a6aae 100644 --- a/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c +++ b/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c @@ -3152,7 +3152,7 @@ void *arg0; extern s32 func_801844BC(void *a0, void *a1); -extern void func_80183100(); +extern s32 func_80183100(); extern short D_80191C54; extern short D_80191C44; extern s32 func_801848AC(s32 arg0, s32 arg1); @@ -3190,7 +3190,43 @@ void func_8018305C(void *arg0) { } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_80182A74", func_80183100); +#include "common.h" + +extern s32 func_8012BD14(s32 a0); +extern s32 func_80178BF8(); +extern void func_80172710(void); +extern s32 func_801845DC(void); + +s32 func_80183100(void *a0) +{ + s32 ok; + + switch (*(u16 *)(*(s32 *)((s32)a0 + 0x64) + 2)) { + case 6: + case 0xC: + ok = ((s32 (*)(void *))func_801845DC)(a0); + break; + case 2: + case 9: + if (*(u16 *)(*(s32 *)((s32)a0 + 0x64) + 0x34) != 2) { + return 0; + } + ok = func_8012BD14(*(s32 *)((s32)a0 + 0x64)) < 0x4001; + break; + default: + return 0; + } + if (ok == 0) { + return 0; + } + { + s32 p2 = *(s32 *)((s32)a0 + 0x64); + *(u16 *)(p2 + 2) = *(u16 *)(p2 + 2) + 1; + } + func_80178BF8(); + return (s32)func_80172710; +} + #include "common.h" diff --git a/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c b/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c index 429d5e7f3d..8121c725fb 100644 --- a/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c +++ b/src/ov_SC06_029/ov_SC06_029_jr_8017C954.c @@ -7317,7 +7317,26 @@ void func_801862C0(s32 param_1) { } -INCLUDE_ASM("asm/ov_SC06_029/nonmatchings/ov_SC06_029_jr_8017C954", func_80186334); +extern u32 D_801DFF68; +extern void func_801863C8(s32); + +void func_80186334(s32 param_1) +{ + if (D_801DFF68 != 0) { + *(u8 *)(*(s32 *)(param_1 + 0xCC) + 0x27) = 0xA5; + *(u8 *)(*(s32 *)(param_1 + 0xD0) + 0x27) = 0xA6; + *(u16 *)(param_1 + 2) = 3; + return; + } + if (func_8018656C((s32 *)param_1) == 1) { + func_801863C8(param_1); + func_8018641C(param_1); + } else { + *(u8 *)(*(s32 *)(param_1 + 0xCC) + 0x27) = 0xA5; + func_8018641C(param_1); + } +} + void func_801863C0(void) { } diff --git a/src/ov_SC06_030/ov_SC06_030_jr_8017F65C.c b/src/ov_SC06_030/ov_SC06_030_jr_8017F65C.c index 5b1d551640..025ddf60c7 100644 --- a/src/ov_SC06_030/ov_SC06_030_jr_8017F65C.c +++ b/src/ov_SC06_030/ov_SC06_030_jr_8017F65C.c @@ -3668,7 +3668,68 @@ void func_80180D90(void *a0) { } -INCLUDE_ASM("asm/ov_SC06_030/nonmatchings/ov_SC06_030_jr_8017F65C", func_80180DCC); +#include "common.h" + +extern s32 func_80012A60(s32 a0, s32 a1); +extern s32 func_80171990(u8 *a0); +extern void *D_801B9F10; + +void func_80180DCC(void *a0) +{ + register void *s3 __asm__("$19") = a0; + void *s2; + register void *p __asm__("$3"); + register s32 v1 __asm__("$3"); + register s32 v0 __asm__("$2"); + s32 bits; + register s32 s0 __asm__("$16"); + s32 s1; + + s2 = *(void **)((s32)s3 + 0x20); + func_80180FF4(s3); + p = D_801B9F10; + if (p == 0) { + goto END; + } + v0 = *(u16 *)((s32)s2 + 0x12) + 0x800; + p = *(void **)((s32)p + 0x20); + bits = *(u16 *)((s32)p + 0x12) & 0x400; + s0 = v0 & 0xFFF; + if (bits == 0) { + goto ELSE; + } + s1 = func_80012A60(s0, 0x400); + v0 = func_80012A60(s0, 0xC00); + v1 = (s16)s1; + v0 = (s16)v0; + v0 = (v0 < v1); + if (v0 != 0) { + goto TRUE1; + } + v0 = 0x400; + goto STORE; +TRUE1: + v0 = 0xC00; + goto STORE; +ELSE: + s1 = func_80012A60(s0, 0); + v0 = func_80012A60(s0, 0x800); + v1 = (s16)s1; + v0 = (s16)v0; + v0 = (v0 < v1); + if (v0 != 0) { + goto TRUE2; + } + *(u16 *)((s32)s2 + 0x12) = 0; + goto END; +TRUE2: + v0 = 0x800; +STORE: + *(u16 *)((s32)s2 + 0x12) = v0; +END: + func_80171990((u8 *)s3); +} + extern s32 func_801810D0();