From 9d6a7483878bc2cbb3fdc64c37e391efb8ea27ee Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:23:00 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20ox=20wave=20du=20overlays=20?= =?UTF-8?q?=E2=80=94=203=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. --- src/md_MAIN_037/md_MAIN_037.c | 66 ++++++++++++++++- src/ov_SC01_000/ov_SC01_000_jr_8017BEBC.c | 59 ++++++++++++++- src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c | 87 ++++++++++++++++++++++- 3 files changed, 209 insertions(+), 3 deletions(-) diff --git a/src/md_MAIN_037/md_MAIN_037.c b/src/md_MAIN_037/md_MAIN_037.c index 1c5fd6540..cb3775bc6 100644 --- a/src/md_MAIN_037/md_MAIN_037.c +++ b/src/md_MAIN_037/md_MAIN_037.c @@ -124,7 +124,71 @@ void func_800CB09C(s32 a0) { } -INCLUDE_ASM("asm/md_MAIN_037/nonmatchings/md_MAIN_037", func_800CB150); +extern void func_80162FF4(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80162FC0(void *a0); +extern s32 func_80146E98(s32 a0); +extern s32 func_80163950(s32 a0); +extern s32 func_8016380C(void *a0, s32 a1); +extern void func_80016714(s8 *a0, s32 a1); +extern void func_80146578(void); +extern void func_8001CB6C(u8 *a0, s32 a1, s32 a2, s32 a3); +extern void func_80146E90(s32 *a0, s32 a1); +extern void func_80146A6C(s32 a0, void *a1, s32 a2, s32 a3, s32 a4, s32 a5, s32 a6); +extern void func_80147324(s32 a0); +extern void func_80146CA0(void *a0); +extern s32 func_80163408(s32 a0, s32 a1, s32 a2, s32 a3); +extern void func_80163328(void *a0); +extern void func_800CB358(void); +extern u8 D_800CB628[]; + +void func_800CB150(void *a0) { + s32 sp20; + s32 flags; + s32 sh; + s32 t; + + func_80162FF4((s32)a0, 0, 0x40000, 0); + func_80162FC0(a0); + if (func_80146E98((s32)a0) != 0) { + func_80146CA0(a0); + return; + } + flags = func_80163950((s32)a0) != 0; + sh = flags << 13; + t = sh | func_8016380C(a0, (s32)&sp20); + if (t == 0) { + goto tail; + } + if (t != 0x8000) { + goto alloc; + } + *(s32 *)((s32)a0 + 0x2C) = 0; + *(s32 *)((s32)a0 + 0x24) = 0; + goto tail; +alloc: + func_80016714(*(s8 **)((s32)a0 + 0x20), 0x84); + *(s32 *)((s32)a0 + 0x20) = 0; + t = ((s32 (*)(void))func_80146578)(); + *(s32 *)((s32)a0 + 0x20) = t; + if (t != 0) { + func_8001CB6C((u8 *)t, (s32)D_800CB628, 0x1A0, 0x100); + *(u8 *)((s32)t + 0x27) = 0x1B; + *(u16 *)((s32)t + 0x10) = 0x400; + func_80146E90((s32 *)a0, 0x20); + for (t = 0; t < 4; t++) { + func_80146A6C(0x45, a0, *(s16 *)((s32)a0 + 6), *(s16 *)((s32)a0 + 0xA), + *(s16 *)((s32)a0 + 0xE), t, 0); + } + func_80147324(0x913); + func_80146CA0(a0); + return; + } + ((void (*)(s32))func_800CB358)(a0); +tail: + func_80163408((s32)a0, 0x27, 0, 0x80); + ((void (*)(s32))func_80163328)(a0); +} + INCLUDE_ASM("asm/md_MAIN_037/nonmatchings/md_MAIN_037", func_800CB2A8); diff --git a/src/ov_SC01_000/ov_SC01_000_jr_8017BEBC.c b/src/ov_SC01_000/ov_SC01_000_jr_8017BEBC.c index 1c8eadfcb..4f89feef5 100644 --- a/src/ov_SC01_000/ov_SC01_000_jr_8017BEBC.c +++ b/src/ov_SC01_000/ov_SC01_000_jr_8017BEBC.c @@ -3444,7 +3444,64 @@ INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E21 INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E3A0); -INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E4A0); +void func_8017E4A0(void) +{ + register u8 *p __asm__("$3"); + register u32 u __asm__("$2"); + register u32 w __asm__("$4"); + register u32 mlo __asm__("$5"); + register u32 mhi __asm__("$6"); + register u32 ent __asm__("$4"); + register u32 c64 __asm__("$2"); + s32 frame_pad[2]; + extern u8 *D_800A5E60; + extern s16 D_800B9A02; + extern u8 D_800A6614[]; + + (void)&frame_pad; + w = 0xE100001E; + mlo = 0xFFFFFF; + __asm__ __volatile__("":::"memory"); + + p = D_800A5E60; + mhi = 0xFF000000; + *(s8 *)(p + 3) = 5; + __asm__ __volatile__(""); + __asm__ __volatile__("li\t%0,0x64\n\tsw\t%1,4(%2)" + : "=&r"(c64) + : "r"(w), "r"(p) + : "memory"); + *(s8 *)(p + 0xB) = c64; + w = 0x80; + *(s16 *)(p + 0xC) = -0x40; + *(s16 *)(p + 0xE) = 0x50; + *(s16 *)(p + 0x12) = 0x40D7; + *(s16 *)(p + 0x14) = 0xA0; + *(s16 *)(p + 0x16) = 0x20; + *(s16 *)(p + 0x14) = 0x80; + *(s8 *)(p + 0xA) = w; + *(s8 *)(p + 0x9) = w; + *(s8 *)(p + 0x8) = w; + *(s8 *)(p + 0x10) = 0; + *(s8 *)(p + 0x11) = w; + *(s16 *)(p + 0x16) = 0x10; + + u = D_800B9A02 & 0xFFFF; + w = *(u32 *)p; + u = *(u32 *)(D_800A6614 + (u << 14)); + w = (w & mhi) | (u & mlo); + *(u32 *)p = w; + + u = (u32)D_800A6614; + ent = (u32 *)(u + ((D_800B9A02 & 0xFFFF) << 14)); + mlo = (u32)p & mlo; + u = *(u32 *)ent; + p += 0x18; + D_800A5E60 = p; + u = (u & mhi) | mlo; + *(u32 *)ent = u; +} + INCLUDE_ASM("asm/ov_SC01_000/nonmatchings/ov_SC01_000_jr_8017BEBC", func_8017E594); diff --git a/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c b/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c index 941fca78b..60719e2c2 100644 --- a/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c +++ b/src/ov_SC03_024/ov_SC03_024_jr_80183BF8.c @@ -3499,7 +3499,92 @@ void func_80184B80(s32 param_1, s32 param_2) } -INCLUDE_ASM("asm/ov_SC03_024/nonmatchings/ov_SC03_024_jr_80183BF8", func_80184CB0); +typedef struct { u8 b[0x6C]; } Blk6C_80184CB0; + +extern s32 func_8012C354(s32 a0, s32 a1); +extern void func_8001C810(s32 a0, s32 a1); +extern void func_8012A828(s32 a0, void *a1); +extern void func_8012B2CC(s32 a0); +extern void func_8001D074(s32 a0, s32 a1); +extern void func_8001CD50(s32 a0, s32 a1); +extern void func_800233CC(void *a0, unsigned short a1); +extern void func_800D20C0(void *a0, void *a1, s32 a2); +extern void func_800D23D0(void *a0); +extern void RotMatrixYXZ(void *a0, void *a1); + +extern u8 D_8018B7A4[]; +extern u8 D_801BBF94[]; +extern u8 D_8018B7D8[]; +extern u8 D_801C13A8[]; +extern u8 D_80126B5C; +extern s32 D_80126B60; +extern s32 D_80126B64; +extern u8 D_801C1458[]; +extern u8 D_801C1418; +extern u8 D_801C1419; +extern u8 D_801C141A; +extern u8 D_801C141C; +extern u8 D_801C141D; +extern u8 D_801C141E; +extern s32 D_801C14D8[]; + +void func_80184CB0(s32 a0) { + extern u8 D_801BBFBC[]; + u8 *p; + s16 sp[8]; + s32 s3; + + if (*(s32 *)(a0 + 0x20) == 0) { + if (func_8012C354(a0, (s32)&D_8018B7A4) == 0) { + return; + } + func_8001C810(*(s32 *)(a0 + 0x20), (s32)&D_801BBF94); + func_8012A828(a0, (void *)&D_8018B7D8); + *(u16 *)(*(s32 *)(a0 + 0x20) + 0x2C) |= 0x20; + *(s32 *)(*(s32 *)(a0 + 0x20) + 0x80) = (s32)&D_801C13A8; + *(s32 *)(*(s32 *)(a0 + 0x20) + 4) |= 0x40000000; + *(s16 *)(a0 + 0xAE) = -3; + *(s32 *)(*(s32 *)(a0 + 0x20) + 4) |= 0x80000000; + } + *(s32 *)(a0 + 4) = *(s32 *)&D_80126B5C; + *(s32 *)(a0 + 8) = D_80126B60; + *(s32 *)(a0 + 0xC) = D_80126B64; + func_8012B2CC(a0); + *(Blk6C_80184CB0 *)D_801C1458 = *(Blk6C_80184CB0 *)D_801BBFBC; + *(s32 *)(a0 + 0xD8) = (s32)&D_801C1458; + + s3 = ((s32 (*)(s32, s32))func_8001D074)(0x7E, 0x100); + if (s3 == 0) { + return; + } + p = &D_801C1418; + *(s32 *)(a0 + 0xD0) = s3; + func_8001CD50(s3, (s32)p); + D_801C1419 = 0xFF; + D_801C141A = 0xFF; + *p = 0xFF; + D_801C141E = 0; + D_801C141D = 0; + D_801C141C = 0; + func_800233CC(p, 0x100); + + sp[0] = *(u16 *)(a0 + 6); + sp[1] = (u16)(*(u16 *)(a0 + 0xA) - 0x38); + sp[2] = *(u16 *)(a0 + 0xE); + func_800D20C0(&sp[0], &sp[4], 5); + + D_801C14D8[0] = sp[0]; + D_801C14D8[1] = sp[1]; + D_801C14D8[2] = sp[2]; + func_800D23D0(&sp[4]); + RotMatrixYXZ(&sp[4], &D_801C14D8[-5]); + *(s32 *)(s3 + 0x34) = (s32)&D_801C14D8[-5]; + *(s16 *)(s3 + 0x1A) = 0; + *(s16 *)(s3 + 0x18) = 0; + *(s32 *)(s3 + 4) |= 0x50000000; + *(u16 *)(a0 + 2) = 0xB; +} + #include "common.h"