From 317d31d18a160b8387672a9cc5813db299c8a401 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:04:19 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20ox=20wave=20dw=20overlays=20?= =?UTF-8?q?=E2=80=94=2033=20banked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Committed before the main batch: gate_main reverts on failure and would take these with it. --- config/overlays.mk | 2 +- config/splat.ov_SC03_001.yaml | 2 +- src/md_MAIN_013/md_MAIN_013.c | 5 +- src/md_MAIN_015/md_MAIN_015.c | 33 +++++- src/md_MAIN_043/md_MAIN_043.c | 6 +- src/md_MAIN_046/md_MAIN_046.c | 5 +- src/md_SC05_029/md_SC05_029.c | 7 +- src/md_SC07_003/md_SC07_003.c | 18 ++- src/ov_SC01_008/ov_SC01_008_jr_8017BE9C.c | 22 +++- src/ov_SC01_084/ov_SC01_084_jr_8017F690.c | 5 +- src/ov_SC02_005/ov_SC02_005_jr_80181D30.c | 22 +++- src/ov_SC02_027/ov_SC02_027_jr_8017D898.c | 9 +- src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.c | 81 +++++++++++++- src/ov_SC03_001/ov_SC03_001_jr_80189030.c | 64 ++++++++++- src/ov_SC03_002/ov_SC03_002_jr_8017D604.c | 11 +- src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c | 73 ++++++++++++- src/ov_SC03_011/ov_SC03_011_jr_8017C730.c | 10 +- src/ov_SC03_024/ov_SC03_024_jr_8017DF84.c | 46 +++++++- src/ov_SC03_091/ov_SC03_091_jr_80182268.c | 64 ++++++++++- src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c | 43 +++++++- src/ov_SC03_098/ov_SC03_098_jr_8017D898.c | 7 +- src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c | 14 ++- src/ov_SC03_124/ov_SC03_124_jr_80181B44.c | 17 ++- src/ov_SC03_125/ov_SC03_125_jr_8017D604.c | 23 +++- src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c | 8 +- src/ov_SC04_011/ov_SC04_011_jr_8017D494.c | 121 +-------------------- src/ov_SC05_017/ov_SC05_017_jr_80182A74.c | 66 ++++++++++- src/ov_SC05_018/ov_SC05_018_jr_80185754.c | 30 ++++- src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c | 25 ++++- src/ov_SC06_033/ov_SC06_033_jr_80186574.c | 127 +++++++++++++++++++++- src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c | 5 +- 31 files changed, 816 insertions(+), 155 deletions(-) diff --git a/config/overlays.mk b/config/overlays.mk index dca1b814c0..057381564d 100644 --- a/config/overlays.mk +++ b/config/overlays.mk @@ -147,7 +147,7 @@ build/src/ov_SC03_001/ov_SC03_001_jr_80159C84.o: JTBL_PADS := 0,4 # §8e pads ( build/src/ov_SC03_001/ov_SC03_001_jr_8015AE2C.o: JTBL_PADS := 0,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_001/ov_SC03_001_jr_8016AB6C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x20 build/src/ov_SC03_001/ov_SC03_001_jr_80178D40.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x178 -build/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 +build/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.o: JTBL_PADS := 0,0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14,+0x34 build/src/ov_SC03_001/ov_SC03_001_jr_80184F64.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x14 build/src/ov_SC03_001/ov_SC03_001_jr_8018A3A8.o: JTBL_PADS := 0,0 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38 build/src/ov_SC03_001/ov_SC03_001_o0c.o: JTBL_PADS := 0,4,4,4 # §8e pads (jtbl_carve.py) tables=+0x0,+0x38,+0xa8,+0x118 diff --git a/config/splat.ov_SC03_001.yaml b/config/splat.ov_SC03_001.yaml index 1fd0e2ac63..cd1a45687b 100644 --- a/config/splat.ov_SC03_001.yaml +++ b/config/splat.ov_SC03_001.yaml @@ -168,7 +168,7 @@ segments: - [0xc4bac, .rodata, ov_SC03_001_jr_8017A4AC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc4c38, data, tail17] - [0xc4c3c, .rodata, ov_SC03_001_jr_8017AE2C] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - - [0xc4c70, data, tail18] + - [0xc4c84, data, tail18] - [0xc4c9c, .rodata, ov_SC03_001_jr_80184DDC] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) - [0xc4cb0, data, tail19] - [0xc4cb4, .rodata, ov_SC03_001_jr_80184F64] # Phase-26 §8 jtbl-rodata carve (jtbl_carve.py) diff --git a/src/md_MAIN_013/md_MAIN_013.c b/src/md_MAIN_013/md_MAIN_013.c index 9048e013e1..73e778faab 100644 --- a/src/md_MAIN_013/md_MAIN_013.c +++ b/src/md_MAIN_013/md_MAIN_013.c @@ -59,7 +59,10 @@ void func_800CB018(s32 a0) { } -INCLUDE_ASM("asm/md_MAIN_013/nonmatchings/md_MAIN_013", func_800CB054); +void func_800CB054(void *a0) { + *(s32 *)((s32)a0 + 0xC0) = 0; +} + INCLUDE_ASM("asm/md_MAIN_013/nonmatchings/md_MAIN_013", func_800CB05C); diff --git a/src/md_MAIN_015/md_MAIN_015.c b/src/md_MAIN_015/md_MAIN_015.c index 505e6e7fed..cda1489c2f 100644 --- a/src/md_MAIN_015/md_MAIN_015.c +++ b/src/md_MAIN_015/md_MAIN_015.c @@ -90,7 +90,38 @@ void func_800CB1C0(void *arg0) { } -INCLUDE_ASM("asm/md_MAIN_015/nonmatchings/md_MAIN_015", func_800CB21C); +extern void func_8014659C(void); + +void func_800CB21C(s32 a0) { + typedef void (*Fn)(s32); + s32 iVar1; + s32 iVar2; + + extern void func_8001C2C4(s32 a0); + extern void func_80149374(s32 a0, s32 a1); + extern void func_80146DE8(s32 *a0, s32 a1, s32 a2, s32 a3); + extern void func_80146E90(s32 *a0, s32 a1); + extern void func_80146CA0(void *a0); + extern void func_80162CCC(void); + + iVar1 = *(s32 *)(a0 + 0x4C); + iVar2 = ((s32 (*)(void))func_8014659C)(); + *(s32 *)(a0 + 0x20) = iVar2; + if (iVar2 != 0) { + func_8001C2C4(iVar2); + *(u32 *)(iVar2 + 4) |= 0x80000000; + func_80149374(iVar1, a0 + 4); + *(u16 *)(iVar2 + 0x10) = *(u16 *)(iVar1 + 0x100); + *(u16 *)(iVar2 + 0x14) = *(u16 *)(iVar1 + 0x104); + *(u16 *)(iVar2 + 0x12) = *(u16 *)(*(s32 *)(iVar1 + 0x20) + 0x12); + func_80146DE8((s32 *)a0, 0, 0, (s32)0xFFC00000); + func_80146E90((s32 *)a0, 0x10); + func_80146CA0((void *)a0); + } else { + ((Fn)func_80162CCC)(a0); + } +} + void func_800CB2E0(void *arg0) { extern s32 func_80146E98(s32 a0); diff --git a/src/md_MAIN_043/md_MAIN_043.c b/src/md_MAIN_043/md_MAIN_043.c index 8cc427e8e0..40bea37962 100644 --- a/src/md_MAIN_043/md_MAIN_043.c +++ b/src/md_MAIN_043/md_MAIN_043.c @@ -129,7 +129,11 @@ void func_800CCE24(void *a0) { } -INCLUDE_ASM("asm/md_MAIN_043/nonmatchings/md_MAIN_043", func_800CCEA0); +s32 func_800CCEA0(void *a0) { + *(s32 *)((s32)a0 + 0x234) = 150; + return 150; +} + INCLUDE_ASM("asm/md_MAIN_043/nonmatchings/md_MAIN_043", func_800CCEAC); diff --git a/src/md_MAIN_046/md_MAIN_046.c b/src/md_MAIN_046/md_MAIN_046.c index 7a8a4bda29..9540dc386e 100644 --- a/src/md_MAIN_046/md_MAIN_046.c +++ b/src/md_MAIN_046/md_MAIN_046.c @@ -465,7 +465,10 @@ void func_800CDA14(s32 a0) { } -INCLUDE_ASM("asm/md_MAIN_046/nonmatchings/md_MAIN_046", func_800CDA44); +void func_800CDA44(s32 *a0) { + *(s16 *)((s32)a0 + 0x1C8) = 0; +} + extern s32 func_80161A30(s32 a0); extern void (*D_800CE0AC[])(void); diff --git a/src/md_SC05_029/md_SC05_029.c b/src/md_SC05_029/md_SC05_029.c index a5e876f63e..631bbb6fd1 100644 --- a/src/md_SC05_029/md_SC05_029.c +++ b/src/md_SC05_029/md_SC05_029.c @@ -371,7 +371,12 @@ void func_801EE278(void *a0) { } -INCLUDE_ASM("asm/md_SC05_029/nonmatchings/md_SC05_029", func_801EE2B4); +void func_801EE2B4(void) { + + extern s32 D_801F7368; + D_801F7368 = 0; +} + diff --git a/src/md_SC07_003/md_SC07_003.c b/src/md_SC07_003/md_SC07_003.c index d7c42c09b8..45ec82aa12 100644 --- a/src/md_SC07_003/md_SC07_003.c +++ b/src/md_SC07_003/md_SC07_003.c @@ -2601,7 +2601,23 @@ void func_801A4A78(s32 arg0) { } -INCLUDE_ASM("asm/md_SC07_003/nonmatchings/md_SC07_003", func_801A4CF4); +extern void func_8012C218(void *a0); +extern void func_8012B260(u8 *a0); + +void func_801A4CF4(s32 a0) { + s32 a1 = *(s32 *)(a0 + 0x64); + + if (*(s16 *)(a1 + 0x36) != *(s16 *)(a0 + 0x10A)) { + func_8012C218((void *)a0); + return; + } + + *(s32 *)(a0 + 0x4) = *(s32 *)(a1 + 0x38); + *(s32 *)(a0 + 0x8) = *(s32 *)(a1 + 0x3C); + *(s32 *)(a0 + 0xC) = *(s32 *)(a1 + 0x40); + func_8012B260((u8 *)a0); +} + typedef struct { s16 m[3][3]; s32 t[3]; } Mtx32_801A4D58; diff --git a/src/ov_SC01_008/ov_SC01_008_jr_8017BE9C.c b/src/ov_SC01_008/ov_SC01_008_jr_8017BE9C.c index 0c7ed98e43..88b9f85632 100644 --- a/src/ov_SC01_008/ov_SC01_008_jr_8017BE9C.c +++ b/src/ov_SC01_008/ov_SC01_008_jr_8017BE9C.c @@ -3433,7 +3433,27 @@ void func_8017D440(s32 a0, s32 a1) { } -INCLUDE_ASM("asm/ov_SC01_008/nonmatchings/ov_SC01_008_jr_8017BE9C", func_8017D494); +void func_8017D494(s32 a0) { + extern u8 D_800B9A15; + extern unsigned char D_800B9A13; + extern u16 D_80115110; + extern u16 D_80115112; + extern s16 D_80115126; + extern s16 D_801A3328; + extern void *D_8011DB24; + extern void func_8013E5E8(void); + void *func_ptr; + + D_800B9A15 = 1; + D_80115112 = 7; + D_800B9A13 = 1; + func_ptr = func_8013E5E8; + D_80115110 = 0; + D_80115126 = (s16)a0; + D_801A3328 = 0; + D_8011DB24 = func_ptr; +} + extern void func_80029444(void); diff --git a/src/ov_SC01_084/ov_SC01_084_jr_8017F690.c b/src/ov_SC01_084/ov_SC01_084_jr_8017F690.c index 87f8d90ce4..141d8f4d4b 100644 --- a/src/ov_SC01_084/ov_SC01_084_jr_8017F690.c +++ b/src/ov_SC01_084/ov_SC01_084_jr_8017F690.c @@ -3282,7 +3282,10 @@ void func_80180650(s32 a0, s32 out) { } -INCLUDE_ASM("asm/ov_SC01_084/nonmatchings/ov_SC01_084_jr_8017F690", func_80180720); +s32 func_80180720(s32 a0) { + return -a0 & 0xFFF; +} + extern s32 func_80047948(s32 a0); extern s32 func_8004787C(s32 a0); diff --git a/src/ov_SC02_005/ov_SC02_005_jr_80181D30.c b/src/ov_SC02_005/ov_SC02_005_jr_80181D30.c index c5b730d6f6..fa9f159e54 100644 --- a/src/ov_SC02_005/ov_SC02_005_jr_80181D30.c +++ b/src/ov_SC02_005/ov_SC02_005_jr_80181D30.c @@ -8266,7 +8266,27 @@ s32 func_8018AD20(s32 a0) { } -INCLUDE_ASM("asm/ov_SC02_005/nonmatchings/ov_SC02_005_jr_80181D30", func_8018AD8C); +#include "common.h" + +extern void func_8012AD44(s32 *a0, s16 a1); +extern void func_8018A4C4(s32 a0); +extern s32 D_801E4A58[]; + +void func_8018AD8C(s32 arg0, s32 arg1) +{ + s32 s0 = D_801E4A58[arg0]; + + if (s0 != 0) { + *(s16 *)(s0 + 0xFE) = arg1; + *(s32 *)(s0 + 0xC) = 0; + *(s32 *)(s0 + 8) = 0; + *(s32 *)(s0 + 4) = 0; + *(s16 *)(s0 + 0xFC) = 1; + func_8012AD44((s32 *)s0, 2); + func_8018A4C4(s0); + } +} + #include "common.h" diff --git a/src/ov_SC02_027/ov_SC02_027_jr_8017D898.c b/src/ov_SC02_027/ov_SC02_027_jr_8017D898.c index 97bf8a1101..5e00b4bfc1 100644 --- a/src/ov_SC02_027/ov_SC02_027_jr_8017D898.c +++ b/src/ov_SC02_027/ov_SC02_027_jr_8017D898.c @@ -5860,7 +5860,14 @@ void func_801839C8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8017D898", func_80183A40); +void func_80183A40(s32 arg0) { + void **fp = *(void ***)(*(s32 *)((s32)arg0 + 0x64) + 0xDC); + + if (fp != NULL && *fp != NULL) { + (*(void (*)(void)) * fp)(); + } +} + INCLUDE_ASM("asm/ov_SC02_027/nonmatchings/ov_SC02_027_jr_8017D898", func_80183A88); diff --git a/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.c b/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.c index 2a6dd3e0c4..0516bd9ba7 100644 --- a/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.c +++ b/src/ov_SC03_001/ov_SC03_001_jr_8017AE2C.c @@ -6704,7 +6704,19 @@ void func_80180ECC(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8017AE2C", func_80180FA0); +extern void func_80188A14(void *a0, s32 a1, s32 a2); +extern s32 func_801886A0(s32 arg0); +extern s32 func_80187A64(s32 a0); + +void func_80180FA0(void *arg0) { + func_80188A14(arg0, 0xC, 1); + if (func_801886A0(0xC)) { + if (func_80187A64((s32)arg0)) { + func_80180B1C((s32)arg0); + } + } +} + #include "common.h" @@ -7613,9 +7625,72 @@ extern void func_80187778(s32*, s32); } -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8017AE2C", func_801826B8); +extern void func_8012E88C(s32); +extern void func_8012A828(s32, s32); +extern void func_80187750(s32); + +void func_801826B8(void *arg0) { + extern s16 D_801C36E8; + *(short *)((char *)arg0 + 0x2) = 0xA; + func_8012E88C((s32)arg0); + func_8012A828((s32 *)arg0, (s32)&D_801C36E8); + func_80187750((s32)arg0); + *(short *)((char *)arg0 + 0x34) = 0; +} + + +extern s32 func_80187A64(s32 a0); +extern s32 func_801886A0(s32 a0); +extern short D_80191D6C; +extern u8 D_801B9360[]; +extern u8 D_801B93A4[]; +extern u8 D_801B93F4[]; +extern void func_80187778(s32*, s32); +extern void func_80187994(s32, s32, s32, s32); + +void func_80182704(void *a0) +{ + switch (*(u16 *)((s32)a0 + 0x34)) { + case 0: + if (func_801886A0(0xD) == 0) { + return; + } + *(u16 *)((s32)a0 + 0x34) = 1; + func_80187994((s32)a0, (s32)D_801B93F4, 1, 0x80); + return; + case 1: + func_801886A0(0xD); + if (((s32 (*)(s32))func_80187A64)((s32)a0) == 0) { + return; + } + *(u16 *)((s32)a0 + 0x34) = 2; + func_80187994((s32)a0, (s32)D_801B93A4, 1, 0x80); + return; + case 2: + if (((s32 (*)(s32))func_80187A64)((s32)a0) == 0) { + return; + } + *(u16 *)((s32)a0 + 0x34) = 3; + *(s32 *)((s32)a0 + 0x1C) = 0x20; + return; + case 3: + if (func_801886A0(3) == 0) { + return; + } + *(u16 *)((s32)a0 + 0x34) = 4; + func_80187994((s32)a0, (s32)D_801B9360, 1, 0x80); + return; + case 4: + func_801886A0(3); + if (((s32 (*)(s32))func_80187A64)((s32)a0) == 0) { + return; + } + *(u16 *)((s32)a0 + 0x2) = 1; + func_80187778((s32 *)a0, (s32)&D_80191D6C); + return; + } +} -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_8017AE2C", func_80182704); extern void (*D_80191E0C[])(void); diff --git a/src/ov_SC03_001/ov_SC03_001_jr_80189030.c b/src/ov_SC03_001/ov_SC03_001_jr_80189030.c index 80e751abf3..a5cefb89da 100644 --- a/src/ov_SC03_001/ov_SC03_001_jr_80189030.c +++ b/src/ov_SC03_001/ov_SC03_001_jr_80189030.c @@ -3732,4 +3732,66 @@ void func_801898E4(void) } -INCLUDE_ASM("asm/ov_SC03_001/nonmatchings/ov_SC03_001_jr_80189030", func_8018A270); +void func_8018A270(void) { + + extern s32 D_801151D0; + extern s32 D_801151C8[]; + extern u16 xf02 __asm__("D_800B9A02"); + extern s16 xa __asm__("D_8011511A"); + extern u16 xb __asm__("D_8011511A"); + extern s32 func_8014168C(s32 a0); + extern u8 D_80115138[]; + extern s32 D_801EF1E0; + extern s32 D_80115130; + extern void func_80139954(void); + extern s32 func_801376E8(s32 a0, s32 a1); + extern s32 D_801C17F0; + extern s32 D_801EF1E4; + extern void func_80137B80(void); + extern s32 func_8018AEE8(void); + extern void func_8018B238(void); + extern s32 func_8018B8DC(s32 a0, s32 a1); + extern u8 D_800B9A15; + extern s16 D_801EEB10; + extern u16 D_80115112; + + s32 pad[2]; + s32 v; + s32 r2; + s32 ret; + s16 rn; + s32 b; + s32 *p30; + u16 *p12; + + D_801151D0 = ((s32 *)D_801151C8)[xf02]; + ret = func_8018AEE8(); + func_8018B238(); + r2 = func_8014168C(xa); + b = D_80115138[xb]; + if (D_801EF1E0 == 0) { + v = func_8018B8DC(b, (s16)r2); + } else { + v = D_801EF1E0; + } + if (v != 0) { + p30 = &D_80115130; + if (v != *p30) { + *p30 = v; + func_80139954(); + D_801EF1E4 = func_801376E8(v, &D_801C17F0); + } + } + func_80137B80(); + rn = ret; + if (rn < 0) { + func_80139954(); + D_800B9A15 = 0; + if (D_801EEB10 == 0) { + func_8002D4C8(0x474, 0); + } + p12 = &D_80115112; + *p12 += 2; + } +} + diff --git a/src/ov_SC03_002/ov_SC03_002_jr_8017D604.c b/src/ov_SC03_002/ov_SC03_002_jr_8017D604.c index 57181a6939..5a2fcff5ee 100644 --- a/src/ov_SC03_002/ov_SC03_002_jr_8017D604.c +++ b/src/ov_SC03_002/ov_SC03_002_jr_8017D604.c @@ -4961,7 +4961,16 @@ s32 aF80181990(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_002/nonmatchings/ov_SC03_002_jr_8017D604", func_80181A10); +void func_80181A10(void *a0) +{ + s32 v0; + *(s32 *)(*(s32 *)((s32)a0 + 0xCC) + 0xB0) = 2; + v0 = func_8018317C(5, 0, 5, 0x1E); + if (v0 != 0) { + func_80181548(a0); + } +} + extern s32 func_80029504(void); extern int func_80178970(void); 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 35419d6e90..789964b798 100644 --- a/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c +++ b/src/ov_SC03_007/ov_SC03_007_jr_8017AE2C.c @@ -7502,7 +7502,30 @@ extern s32 func_8012BEE8(s32 arg); } -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8017AE2C", func_80182AFC); +extern s32 func_8012BEE8(s32 a0); +extern s32 func_8012BCCC(s32 a0); +extern void func_8012A828(s32 a0, void *a1); +extern u8 D_801CAF38[]; + +void func_80182AFC(s32 param_1) { + s32 ret; + s32 cnt; + + if (func_8012BEE8(param_1) == 1) { + ret = func_8012BCCC(param_1); + if (ret < 0x9001) { + func_801824FC(param_1); + } else { + cnt = *(u16 *)(param_1 + 0xDC) + 1; + *(u16 *)(param_1 + 0xDC) = cnt; + if (((s16)cnt >= 0x79) && (ret > 0x24000)) { + *(u16 *)(param_1 + 2) = 1; + func_8012A828(param_1, D_801CAF38); + } + } + } +} + // @class: plumbing @@ -7602,7 +7625,53 @@ void func_80182D04(int param_1) } -INCLUDE_ASM("asm/ov_SC03_007/nonmatchings/ov_SC03_007_jr_8017AE2C", func_80182D88); +extern void func_8012ADE4(u8 *a0); +extern s32 func_8012BC60(void *a0, void *a1); +extern s32 func_8012B6D4(s16 *a0, s16 *a1); +extern void func_8012B0B4(unsigned int *param_1, int param_2, int param_3); +extern s32 func_8012CEB0(s32 a0, s32 a1, s32 a2); + +void func_80182D88(s32 arg0) { + extern u8 D_801202A0[]; + u8 *p; + s32 i; + s16 *self4; + unsigned int *sc; + s16 v10[4]; /* sp+0x10 */ + s16 v18[4]; /* sp+0x18 */ + s32 sp20[2]; /* sp+0x20 */ + + p = D_801202A0; + i = 0; + self4 = (s16 *)(arg0 + 4); + sc = (unsigned int *)sp20; + do { + if (*(u16 *)p != 0 && *(s32 *)(p + 0x58) != 0 && (u8 *)arg0 != p) { + if (func_8012BC60((void *)self4, (void *)(p + 4)) < 0x1000) { + func_8012B0B4(sc, func_8012B6D4(self4, (s16 *)(p + 4)), 0x41); + v18[0] = *(u16 *)(p + 6); + v18[1] = *(u16 *)(p + 0xA); + v18[2] = *(u16 *)(p + 0xE); + v18[0] += sp20[0]; + v18[2] += sp20[0] >> 16; + v10[0] = *(u16 *)(arg0 + 0x3A); + v10[1] = *(u16 *)(arg0 + 0x3E); + v10[2] = *(u16 *)(arg0 + 0x42); + if ((func_8012CEB0((s32)v10, (s32)v18, 0) & 0x2000) == 0) { + func_8012ADE4((u8 *)arg0); + return; + } + *(u16 *)(arg0 + 6) = v18[0]; + *(u16 *)(arg0 + 0xA) = v18[1]; + *(u16 *)(arg0 + 0xE) = v18[2]; + return; + } + } + i++; + p += 0x10C; + } while (i < 0x60); +} + extern void func_8002D4C8(s32 arg0, s32 arg1); void func_80182F00(void) { diff --git a/src/ov_SC03_011/ov_SC03_011_jr_8017C730.c b/src/ov_SC03_011/ov_SC03_011_jr_8017C730.c index d0726dc0de..86e3bf0ce9 100644 --- a/src/ov_SC03_011/ov_SC03_011_jr_8017C730.c +++ b/src/ov_SC03_011/ov_SC03_011_jr_8017C730.c @@ -4789,7 +4789,15 @@ void func_80180228(void *a0) { void func_80180324(void) { } -INCLUDE_ASM("asm/ov_SC03_011/nonmatchings/ov_SC03_011_jr_8017C730", func_8018032C); +extern s32 func_8012E544(s32 a0); +extern s32 func_80178BF8(); + +void func_8018032C(void) { + s32 v0 = func_8012E544(0x106); + *(s16 *) (v0 + 2) = 2; + func_80178BF8(); +} + void func_80180358(void *a0) { *(short *)((char *)a0 + 0x2) = 0x4; diff --git a/src/ov_SC03_024/ov_SC03_024_jr_8017DF84.c b/src/ov_SC03_024/ov_SC03_024_jr_8017DF84.c index 78fa085b30..d17e47625e 100644 --- a/src/ov_SC03_024/ov_SC03_024_jr_8017DF84.c +++ b/src/ov_SC03_024/ov_SC03_024_jr_8017DF84.c @@ -5342,7 +5342,51 @@ void func_80181F7C(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_8017DF84", func_80182108); +extern s32 func_80132EF4(s32 a0, s32 a1); + +void func_80182108(s32 arg0) +{ + s32 s0; + for (s0 = 0; s0 < 0x49; s0 += 0x18) { + s32 a1 = func_80132EF4(arg0, 0x22); + if (a1 == 0) + continue; + { + register s32 v0 __asm__("v0"); + register s32 v1 __asm__("v1"); + register s32 a0 __asm__("a0"); + v0 = *(u16 *)(arg0 + 0x84); + a0 = *(u16 *)(a1 + 0xE); + v0 &= 0x4; + v1 = v0 * 2; + __asm__("":"=r"(v1):"0"(v1)); + v1 = v1 + v0; + v1 = s0 + v1; + v1 = v1 - 0x2A; + v0 = *(u16 *)(a1 + 0x6); + a0 += 0x28; + *(u16 *)(a1 + 0xE) = a0; + v0 -= v1; + *(u16 *)(a1 + 0x6) = v0; + v0 = *(u16 *)(a1 + 0xA); + v1 = v1 << 16; + v0 -= 0x20; + *(u16 *)(a1 + 0xA) = v0; + v0 = v1 >> 16; + if (v0 >= 0) { + v0 = v0 << 7; + } else { + v0 = v0 << 7; + v0 = -v0; + } + v0 += 0x1000; + *(u16 *)(a1 + 0x34) = v0; + *(s32 *)(a1 + 0x14) = 0xFFFE0000; + *(s32 *)(a1 + 0x18) = 0x30000; + } + } +} + #include "common.h" diff --git a/src/ov_SC03_091/ov_SC03_091_jr_80182268.c b/src/ov_SC03_091/ov_SC03_091_jr_80182268.c index e0459b52f0..33a4bb282f 100644 --- a/src/ov_SC03_091/ov_SC03_091_jr_80182268.c +++ b/src/ov_SC03_091/ov_SC03_091_jr_80182268.c @@ -2914,7 +2914,69 @@ void func_801828B8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_091/nonmatchings/ov_SC03_091_jr_80182268", func_80182968); + + +/* 8 bytes, align 2 -> lwl/lwr/swl/swr copy (cookbook §48-C2) */ + +extern u16 func_80148800(s32 *a0); +extern void func_80182B48(s32 param_1, s16 *param_2); +extern s32 func_80012F74(s32 a0, s32 a1, s32 a2, s32 a3); + +void func_80182968(s32 a0) { + + extern s32 D_80126B58; + extern s16 D_8019071C[]; + extern Blk8_80126940_8017D6D0_80182A98 D_80126940; + Blk8_80126940_8017D6D0_80182A98 sp10; + u8 t; + s16 v1; + register s16 c __asm__("$4"); /* clamp store value — target stores every bound from $a0 */ + + if (func_80148800(&D_80126B58) & 3) { + t = (*(u8 *)(a0 + 5) + 1) & 1; + *(u8 *)(a0 + 5) = t; + *(s32 *)(a0 + 0x14) = D_8019071C[t]; + } + sp10 = D_80126940; + + v1 = sp10.v[0]; + if (v1 >= 0x440) { + if (v1 < 0x500) { + *(s16 *)(a0 + 0x2E) = 0x500 - v1; + } else { + *(s16 *)(a0 + 0x2E) = 0; + } + } else { + *(s16 *)(a0 + 0x2E) = 0; + } + + *(s16 *)(a0 + 0x28) = (s16)func_80012F74(*(s16 *)(a0 + 0x28), *(s16 *)(a0 + 0x2E), 4, 1); + + { + s16 lo = 0x380; + if (sp10.v[0] < lo) { + c = lo; + sp10.v[0] = c; + } + } + { + s16 lim = 0x580; + if (lim < sp10.v[0]) { + c = lim; + sp10.v[0] = c; + } + } + { + s16 lo2 = 0xC0; + if (sp10.v[2] < lo2) { + c = lo2; + sp10.v[2] = c; + } + } + + func_80182B48(a0, sp10.v); +} + /* 8 bytes, align 2 -> lwl/lwr/swl/swr copy (cookbook §48-C2) */ diff --git a/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c b/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c index 74f5902372..2341550eef 100644 --- a/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c +++ b/src/ov_SC03_094/ov_SC03_094_jr_8017BEBC.c @@ -3488,7 +3488,48 @@ void func_8017D3B8(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8017BEBC", func_8017D458); +typedef struct { s16 v[4]; } Blk8_80126940_8017D458; + +void func_8017D458(s32 a0) { + + extern s32 D_80126B58; + extern s16 D_8018B48C[]; + extern Blk8_80126940_8017D458 D_80126940; + Blk8_80126940_8017D458 sp10; + u8 t; + s16 v0, v1, lim; + + if (func_80148800(&D_80126B58) & 3) { + t = (*(u8 *)(a0 + 5) + 1) & 1; + *(u8 *)(a0 + 5) = t; + *(s32 *)(a0 + 0x14) = D_8018B48C[t]; + } + sp10 = D_80126940; + + /* Clamp sp10.v[0] */ + lim = -0x5C0; + v0 = sp10.v[0]; + if (v0 < lim) { + sp10.v[0] = lim; + } + + /* Clamp sp10.v[0] */ + v1 = sp10.v[0]; + lim = -0x5C0; + if (lim < v1) { + sp10.v[0] = lim; + } + + /* Clamp sp10.v[2] */ + v1 = sp10.v[2]; + lim = 0x1340; + if (lim < v1) { + sp10.v[2] = lim; + } + + func_8017D6D0(a0, sp10.v); +} + INCLUDE_ASM("asm/ov_SC03_094/nonmatchings/ov_SC03_094_jr_8017BEBC", func_8017D544); diff --git a/src/ov_SC03_098/ov_SC03_098_jr_8017D898.c b/src/ov_SC03_098/ov_SC03_098_jr_8017D898.c index 048835ac45..bd78a5eda9 100644 --- a/src/ov_SC03_098/ov_SC03_098_jr_8017D898.c +++ b/src/ov_SC03_098/ov_SC03_098_jr_8017D898.c @@ -5154,7 +5154,12 @@ void func_80181778(s32 a0) { } -INCLUDE_ASM("asm/ov_SC03_098/nonmatchings/ov_SC03_098_jr_8017D898", func_801819DC); +void func_801819DC(s32 a0) +{ + *(u16 *)(a0 + 0x2) = 1; + *(u16 *)(a0 + 0x5C) = 0xA810; +} + extern s32 rand(void); diff --git a/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c b/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c index b3c09d45ca..ed8742aa7a 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_8017AE2C.c @@ -6030,7 +6030,19 @@ extern void func_80178CBC(s32 *a0, s32 a1); } -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_8017AE2C", func_80180BB0); +extern int func_80178970(void); +extern void func_80178D18(void); + +void func_80180BB0(void *a0) { + extern u32 D_8018FE2C; + if (func_80178970() != 0) { + ((void (*)(s32))func_80178D18)((s32)a0); + *(short *)((char *)a0 + 0x2) = 1; + *(s32 *)((char *)a0 + 0x58) = (s32)&D_8018FE2C | 0x40000000; + *(short *)((char *)a0 + 0x5C) = 0x800; + } +} + extern s32 func_80029504(void); extern void func_8012C1B8(void); diff --git a/src/ov_SC03_124/ov_SC03_124_jr_80181B44.c b/src/ov_SC03_124/ov_SC03_124_jr_80181B44.c index a763edfb20..f373ee1417 100644 --- a/src/ov_SC03_124/ov_SC03_124_jr_80181B44.c +++ b/src/ov_SC03_124/ov_SC03_124_jr_80181B44.c @@ -3010,7 +3010,22 @@ void func_80181EC4(void *a0) { } -INCLUDE_ASM("asm/ov_SC03_124/nonmatchings/ov_SC03_124_jr_80181B44", func_80181F2C); +extern s32 func_801842D4(s32 arg0, s32 arg1); +extern u8 D_80078EBA; + +void func_80181F2C(void *a0) { + s32 v0; + *(s32 *)(*(s32 *)((s32)a0 + 0xcc) + 0xb0) = 2; + if (D_80078EBA == 3) { + v0 = 0; + } else { + v0 = func_801842D4(7, 0x13) != 0; + } + if (v0 != 0) { + *(s16 *)((s32)a0 + 2) = 1; + } +} + extern s32 func_8012E57C(s32 a0, s32 a1); extern s32 func_801842D4(s32 arg0, s32 arg1); diff --git a/src/ov_SC03_125/ov_SC03_125_jr_8017D604.c b/src/ov_SC03_125/ov_SC03_125_jr_8017D604.c index e777d48042..7fc0078b95 100644 --- a/src/ov_SC03_125/ov_SC03_125_jr_8017D604.c +++ b/src/ov_SC03_125/ov_SC03_125_jr_8017D604.c @@ -3904,7 +3904,28 @@ extern s32 func_8012AD50(void *a0); } -INCLUDE_ASM("asm/ov_SC03_125/nonmatchings/ov_SC03_125_jr_8017D604", func_8017FD98); +extern void func_8017FE60(); + +void func_8017FD98(void *a0) { + typedef struct { short vx, vy, vz, pad; } SVFD98; + extern SVFD98 D_801C2D6C; + extern SVFD98 D_801C2D74; + extern void func_80015978(s32 a0, s32 *a1); + SVFD98 buf10; + SVFD98 buf18; + SVFD98 buf20; + + buf10 = D_801C2D6C; + buf18 = D_801C2D74; + if (*(s16 *)((s32)a0 + 0xFC) == 0) { + func_8017FE60(&buf10, &buf18); + } else { + func_80015978((s32)a0 + 4, (s32 *)&buf20); + func_8017FE60(&buf10, &buf20); + func_8017FE60(&buf20, &buf18); + } +} + /* identical layout to SVECTOR_8016E7C8 (src/shared/engine_types.h) */ diff --git a/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c b/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c index f757f142f1..d2bf015d1e 100644 --- a/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c +++ b/src/ov_SC04_002/ov_SC04_002_jr_8017BEBC.c @@ -4941,7 +4941,13 @@ void func_8017F470(s32 param_1) { INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_8017F4EC); -INCLUDE_ASM("asm/ov_SC04_002/nonmatchings/ov_SC04_002_jr_8017BEBC", func_8017F534); +extern void func_8017F55C(s32 a0, s32 a1); +extern u8 D_8018C054[]; + +void func_8017F534(s32 arg0) { + func_8017F55C(arg0, D_8018C054); +} + typedef struct { s16 m[3][3]; s32 t[3]; } MTX_8017F55C; /* 0x20 bytes, align 4 */ diff --git a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c index ff3fe0b07b..96180ccf8c 100644 --- a/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c +++ b/src/ov_SC04_011/ov_SC04_011_jr_8017D494.c @@ -5488,126 +5488,7 @@ void func_801826E4(s32 param_1) } -void func_801827DC(s32 param_1) -{ - extern void func_80186C1C(void); - extern void func_80183F10(void); - extern void func_8018BA9C(void); - extern void func_80183EA8(void); - extern void func_8018BAC4(void); - extern void func_80182D34(s32 a0); - extern void func_8018AC00(void *a0); - extern void func_8012BEE8(u8 *a0); - extern void func_8013C9C4(void *a0); - extern void func_8018637C(s32 arg0, s32 arg1); - extern void func_8002D4C8(s32 a0, s32 a1); - extern void func_8018B9D4(); - extern void func_80182AF8(); - extern void *D_80194500[][3]; - extern s32 aFC4C[] __asm__("D_801EFC4C"); - extern s32 D_801EFC54; - extern s32 D_801EFC5C; - extern s32 D_801EFC60; - extern s32 D_801EFC64[]; - extern s32 D_801EFC68; - extern s32 D_801EFD28; - extern u16 D_801EFD40; - extern u8 D_80190B88[]; - s32 r; - s32 obj; - u16 t; - u16 f; - - switch (*(u16 *)(param_1 + 0x34)) { - case 0: - case 1: - if (*(s16 *)(param_1 + 0x98) == 0) { - func_8018637C(param_1, (s32)D_80194500[*(s16 *)(param_1 + 0xE2)][*(u16 *)(param_1 + 0x34) + 1]); - goto incr; - } - goto draw; - case 2: - if (*(s32 *)(param_1 + 0x94) != 0xB) { - goto draw; - } - func_80186C1C(); - *(s16 *)(param_1 + 0x76) = 0x64; - *(s32 *)(param_1 + 0x1C) = 0x80; - *(s16 *)(param_1 + 0xF2) = 1; - *(s16 *)(param_1 + 0xE2) = (s16)*(u16 *)(param_1 + 0xE2) >> 1; - func_8013C9C4(D_80190B88); - func_8018AC00((void *)aFC4C[0]); - func_8018AC00((void *)D_801EFC54); - func_8018AC00((void *)D_801EFC5C); - func_8018AC00((void *)D_801EFC60); - func_8018AC00((void *)D_801EFC64[0]); - func_8018AC00((void *)D_801EFC68); - func_8002D4C8(0x907, 0); -incr: - *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; -draw: - func_8018B9D4(D_801EFC54, *(s32 *)(param_1 + 0xD0)); - return; - case 3: - if (*(s16 *)(param_1 + 0x76) == 0) { - t = *(u16 *)(param_1 + 0xF6) - 1; - *(u16 *)(param_1 + 0xF6) = t; - *(s16 *)&D_801EFD28 = (s16)t * 100; - func_80183F10(); - obj = *(s32 *)(param_1 + 0xD0); - if (obj != 0) { - *(u16 *)(obj + 0x1A) = 0x800; - *(u16 *)(obj + 0x18) = 0x800; - } - func_8018BA9C(); - *(u16 *)(param_1 + 0x34) = *(u16 *)(param_1 + 0x34) + 1; - if (*(s16 *)(param_1 + 0xF6) == 0) { - f = D_801EFD40; - *(s32 *)(param_1 + 0x1C) = 8; - D_801EFD40 = f | 0x100; - return; - } - *(s32 *)(param_1 + 0x1C) = 0x10; - return; - } - r = ((s32 (*)(s32))func_8012BEE8)((s32)param_1); - if (r == 0) { - if (((*(s32 *)(param_1 + 0x1C) & 0xF) == 0) && (*(s16 *)(param_1 + 0xF2) != 0)) { - *(s16 *)(param_1 + 0xF2) = *(s16 *)(param_1 + 0xF2) - 1; - func_8013C9C4(D_80190B88); - } - func_8018B9D4(D_801EFC54, *(s32 *)(param_1 + 0xD0)); - if ((*(s32 *)(param_1 + 0x1C) & 1) != 0) { - return; - } - func_80183EA8(); - return; - } - goto L_af8; - case 4: - r = ((s32 (*)(s32))func_8012BEE8)((s32)param_1); - if (r != 0) { - if (*(s16 *)(param_1 + 0xF6) == 0) { - func_80182D34(param_1); - return; - } -L_af8: - func_80182AF8(param_1); - return; - } - obj = *(s32 *)(param_1 + 0xD0); - if (obj != 0) { - t = *(u16 *)(obj + 0x18) + 0x600; - *(u16 *)(obj + 0x18) = t; - *(u16 *)(obj + 0x1A) = t; - } - func_8018BAC4(); - return; - default: - return; - } -} - +INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_801827DC); INCLUDE_ASM("asm/ov_SC04_011/nonmatchings/ov_SC04_011_jr_8017D494", func_80182AF8); 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 1e30f72374..a199954392 100644 --- a/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c +++ b/src/ov_SC05_017/ov_SC05_017_jr_80182A74.c @@ -3399,7 +3399,27 @@ void func_801835FC(void *a0) { } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_80182A74", func_801836A4); +extern s32 func_801848D0(u8 a0, u8 a1, u8 a2, u8 a3); +extern void func_8012E88C(s32); +extern void func_8012A828(s32, s32); +extern void func_80184990(s32); +extern void func_80184BD4(s32, s32, s32, s32); +extern u8 D_801B680C[]; + +void func_801836A4(void *arg0) { + + extern short D_801B9964; + if (func_801848D0(0xB, 0, 0xE, 0xF) != 0) { + return; + } + *(short *)((char *)arg0 + 0x2) = 0xB; + *(short *)((char *)arg0 + 0x34) = 0; + func_8012E88C((s32)arg0); + ((void (*)(s32 *, s32))func_8012A828)((s32 *)arg0, (s32)&D_801B9964); + func_80184990((s32)arg0); + func_80184BD4((s32)arg0, (s32)D_801B680C, 1, 0x60); +} + extern int func_80178970(void); @@ -3478,7 +3498,49 @@ void func_80183830(void *a0) { } -INCLUDE_ASM("asm/ov_SC05_017/nonmatchings/ov_SC05_017_jr_80182A74", func_801838A0); +extern s32 func_801831C8(void *a0); + +void func_801838A0(void *a0) { + s32 v0; + void *v1; + + extern s32 func_801844BC(void *a0, void *a1); + extern s32 func_801848D0(u8 a0, u8 a1, u8 a2, u8 a3); + extern void func_8012E8E0(s32 a0, s32 a1); + extern void func_8012E88C(s32 a0); + extern void func_8012A828(s32, s32); + extern void func_80184990(s32 a0); + extern void func_801849B8(s32 *a0, s32 a1); + extern s32 func_801788B8(s32 arg0, s32 arg1); + extern u16 D_80191ED0; + extern s16 D_80191EC0; + extern s16 D_80191EC8; + extern s16 D_801B990C; + + if (func_801844BC(a0, &D_80191ED0) != 0) { + v0 = func_801848D0(0xB, 0, 0xE, 0xF); + if (v0 != 0) { + *(s16 *)((char *)a0 + 0x2) = 8; + func_8012E8E0((s32)a0, (s32)&D_80191EC8); + func_8012E88C((s32)a0); + func_8012A828((s32)a0, (s32)&D_801B990C); + func_80184990((s32)a0); + } else { + v0 = func_801848D0(0xE, 0xF, 0x17, 0); + if (v0 != 0) { + v0 = 2; + } else { + v0 = 1; + } + *(s16 *)((char *)a0 + 0x2) = v0; + func_801849B8((s32 *)a0, (s32)&D_80191EC0); + } + v1 = *(void **)((char *)a0 + 0x68); + *(s16 *)((char *)v1 + 0xC) = 0x7FFF; + *(s32 *)((char *)a0 + 0xD4) = func_801788B8((s32)a0, (s32)&func_801831C8); + } +} + extern void func_801849B8(s32*, s32); diff --git a/src/ov_SC05_018/ov_SC05_018_jr_80185754.c b/src/ov_SC05_018/ov_SC05_018_jr_80185754.c index 8928b3c8ac..43ce3cb9f2 100644 --- a/src/ov_SC05_018/ov_SC05_018_jr_80185754.c +++ b/src/ov_SC05_018/ov_SC05_018_jr_80185754.c @@ -3546,7 +3546,35 @@ void func_801862B0(u8 *a0) { } -INCLUDE_ASM("asm/ov_SC05_018/nonmatchings/ov_SC05_018_jr_80185754", func_801862F8); +void func_801862F8(s32 arg0) { + extern s32 func_80029504(void); + extern s32 func_8012C658(s32 arg0, s32 arg1, s32 arg2); + extern void func_8012C218(void *a0); + s32 flag; + s32 r; + + r = func_80029504(); + flag = 0; + switch (*(s16 *)((s32)arg0 + 0x70)) { + case 0: + if ((u32)(r - 0x64) < 0x1E) { + flag = 1; + } + break; + case 1: + if ((u32)(r - 0x3B6) < 0x32) { + flag = 1; + } + break; + } + if (flag != 0) { + func_8012C658(0x21, 1 - *(u16 *)((s32)arg0 + 2), arg0); + func_8012C218((void *)arg0); + } else if (*(u16 *)((s32)arg0 + 2) == 0) { + *(u16 *)((s32)arg0 + 2) = *(u16 *)((s32)arg0 + 2) + 1; + } +} + diff --git a/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c b/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c index 1cfc0a68e4..2754686e67 100644 --- a/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c +++ b/src/ov_SC06_033/ov_SC06_033_jr_8017C24C.c @@ -3504,7 +3504,30 @@ void func_8017DC18(void) { INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8017C24C", func_8017DC30); -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_8017C24C", func_8017DCC4); +extern s16 D_80126CB0; +extern s16 D_80126CAC; + +int func_8017DCC4(s16 *a0) { + int data[3]; + data[0] = D_80126CAC - a0[3]; + data[1] = 0; + data[2] = D_80126CB0 - a0[7]; + __asm__ __volatile__( + "lwc2 $9, 0($sp)\n" + "lwc2 $10, 4($sp)\n" + "lwc2 $11, 8($sp)\n" + "nop\n" + "nop\n" + "sqr 0\n" + : : : "$9", "$10", "$11", "memory"); + __asm__ __volatile__( + "swc2 $25, 0($sp)\n" + "swc2 $26, 4($sp)\n" + "swc2 $27, 8($sp)\n" + : : : "memory"); + return 0xC3FFF < data[0] + data[1] + data[2]; +} + void func_8017DD48(void) { extern u8 D_801202A0[]; diff --git a/src/ov_SC06_033/ov_SC06_033_jr_80186574.c b/src/ov_SC06_033/ov_SC06_033_jr_80186574.c index 14af45332f..3eed918a1d 100644 --- a/src/ov_SC06_033/ov_SC06_033_jr_80186574.c +++ b/src/ov_SC06_033/ov_SC06_033_jr_80186574.c @@ -3558,7 +3558,93 @@ void func_80187588(s32 p) { } -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_80186574", func_80187624); + + + +#define gte_SetRotMatrix(r0) __asm__ volatile ( \ + "lw $12, 0( %0 );" \ + "lw $13, 4( %0 );" \ + "ctc2 $12, $0;" \ + "ctc2 $13, $1;" \ + "lw $12, 8( %0 );" \ + "lw $13, 12( %0 );" \ + "lw $14, 16( %0 );" \ + "ctc2 $12, $2;" \ + "ctc2 $13, $3;" \ + "ctc2 $14, $4" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) +#define gte_SetTransMatrix(r0) __asm__ volatile ( \ + "lw $12, 20( %0 );" \ + "lw $13, 24( %0 );" \ + "ctc2 $12, $5;" \ + "lw $14, 28( %0 );" \ + "ctc2 $13, $6;" \ + "ctc2 $14, $7" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14" ) + +void func_80187624(s32 param_1) +{ + extern s32 *D_80126B78; + extern s32 *D_80126B90; + extern u8 D_801152A8[]; + extern u8 D_801AFCF8[]; + extern void func_80049CAC(s32 a0, s32 a1); + extern void RotTransSV(void *a0, void *a1, void *a2); + extern s32 func_80135888(s32 a0, s32 a1, s32 a2, s32 a3); + extern void func_8012F568(s32 a0, s32 a1, s32 a2, s32 a3, s32 a4, s32 a5); + extern s32 func_8012CBF4(s32 a0); + extern s32 func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); + extern s32 func_80132EF4(s32 a0, s32 a1); + extern s32 func_8012BEE8(s32 a0); + extern void func_8012C218(void *a0); + MATRIX mat; + SVECTOR sv; + SVECTOR b; + SVECTOR c; + SVECTOR flag; + s32 iVar; + + sv.vx = *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x10); + sv.vy = *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x12); + sv.vz = 0; + func_80049CAC((s32)&sv, (s32)&mat); + + gte_SetRotMatrix(&mat); + gte_SetTransMatrix(*(s32 *)(param_1 + 0x20) + 0x34); + + RotTransSV(&D_801AFCF8[0], &b, &flag); + RotTransSV(&D_801AFCF8[8], &c, &flag); + + if (func_80135888((s32)D_80126B78, (s32)D_80126B90, (s32)&b, (s32)&c) != 0) { + s16 sVar1 = *(s16 *)(param_1 + 0xFE); + func_8012F568(1, 1, sVar1, 0x50, (s32)&c, (s32)D_801152A8); + } else { + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) = + *(u16 *)(*(s32 *)(param_1 + 0x20) + 0x14) - 0x100; + iVar = func_8012CBF4(param_1); + if (iVar != 0) { + s16 sVar1 = *(s16 *)(param_1 + 6); + s16 sVar2 = *(s16 *)(param_1 + 0xA); + s16 sVar3 = *(s16 *)(param_1 + 0xE); + func_80146A6C(6, (void *)param_1, sVar1, sVar2, sVar3, 0, 0); + iVar = func_80132EF4(param_1, 0x22); + if (iVar != 0) { + *(u16 *)(iVar + 0x34) = 0x2000; + } + } else { + iVar = func_8012BEE8(param_1); + if (iVar == 0) { + return; + } + } + } + func_8012C218((void *)param_1); +} + @@ -3821,7 +3907,44 @@ void func_80187A88(s32 a0, s32 a1) { INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_80186574", func_80187D0C); -INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_80186574", func_80187DA4); +extern s32 func_8012C51C(void *a0, s32 a1); + +typedef struct { + u16 f10; /* 0x10 */ + u16 f12; /* 0x12 */ + u16 f14; /* 0x14 */ + s16 f16; /* 0x16 */ + s16 f18; /* 0x18 */ + s16 f1a; /* 0x1A */ + s16 f1c; /* 0x1C */ + u16 f1e; /* 0x1E */ + s32 f20; /* 0x20 */ +} buf_80187DA4; + +void func_80187DA4(a0, a1, a2, a3, a4, a5) +s32 a0; +void *a1; +s32 a2; +s32 a3; +u16 a4; +s32 a5; +{ + buf_80187DA4 sp; + u16 t; + + sp.f10 = *(u16 *)a1; + sp.f12 = *(u16 *)(2 + (char *)a1); + t = *(u16 *)(4 + (char *)a1); + sp.f16 = a2; + sp.f18 = a3; + sp.f1a = 0; + sp.f1e = a4; + sp.f20 = a5; + sp.f1c = 0x7FFF; + sp.f14 = t; + func_8012C51C(&sp, a0); +} + INCLUDE_ASM("asm/ov_SC06_033/nonmatchings/ov_SC06_033_jr_80186574", func_80187E08); diff --git a/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c b/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c index 5aa393d305..f6b8680f83 100644 --- a/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c +++ b/src/ov_SC07_002/ov_SC07_002_jr_8017C8D0.c @@ -5043,7 +5043,10 @@ void func_801817E0(s32 arg0) } -INCLUDE_ASM("asm/ov_SC07_002/nonmatchings/ov_SC07_002_jr_8017C8D0", func_80181834); +s32 func_80181834(s32 arg0) { + return -(arg0 < 0x640) & 0x98; +} + void func_80181844(void) { }