From 2cdbda9268a0be93843225df977f888bb9f2cabe Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 26 Aug 2026 08:09:49 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20main=20lane=20m74a=20=E2=80=94?= =?UTF-8?q?=209=20banked?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit One clean whole-EXE rebuild verified the batch (gate_main), and main re-checked BYTE-IDENTICAL against config/check.us.sha before anything was credited. CloseEvent WaitEvent func_80010ED4 func_80011778 func_80011A3C func_80011ADC func_80012D0C func_80013028 func_80041448 --- src/800.c | 35 +++++++++++++++++++++++-- src/800c3.c | 27 +++++++++++++++++-- src/boot.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++--- src/sgap_8.c | 18 ++++++++++++- 4 files changed, 145 insertions(+), 9 deletions(-) diff --git a/src/800.c b/src/800.c index e8403afaf..b19435221 100644 --- a/src/800.c +++ b/src/800.c @@ -604,7 +604,22 @@ INCLUDE_ASM("asm/nonmatchings/800", func_80012C6C); INCLUDE_ASM("asm/nonmatchings/800", func_80012CB8); -INCLUDE_ASM("asm/nonmatchings/800", func_80012D0C); +s16 func_80012D0C(s32 x0, s32 x1, s32 d, s16 *ctr) +{ + s32 diff; + s32 q; + + diff = x1 - x0; + if (*ctr == 0 || (s16)d == 0) + return (s16)diff; + q = (s16)((s16)diff / (s16)d); + if (q != 0) + return q; + *ctr = *ctr - 1; + return func_80012D0C((s16)x0, (s16)x1, + ((s16)d + (s32)(((u32)d << 16) >> 31)) >> 1, + ctr); +} INCLUDE_ASM("asm/nonmatchings/800", func_80012DBC); @@ -616,7 +631,23 @@ INCLUDE_ASM("asm/nonmatchings/800", func_80012F74); INCLUDE_ASM("asm/nonmatchings/800", func_80012FC8); -INCLUDE_ASM("asm/nonmatchings/800", func_80013028); +s32 func_80013028(s32 x, s32 y, s16 n, s16 d, s16 *p) { + s32 r; + + y -= x; + if (*p == 0 || n == 0) { + r = (s16)y; + } else { + r = (s16)((s16)y * d / n); + if (r == 0) { + r = -1; + if ((s16)y > 0) { + r = 1; + } + } + } + return r; +} INCLUDE_ASM("asm/nonmatchings/800", func_800130D0); diff --git a/src/800c3.c b/src/800c3.c index 33cd67f81..21402fa6a 100644 --- a/src/800c3.c +++ b/src/800c3.c @@ -27,9 +27,32 @@ INCLUDE_ASM("asm/nonmatchings/800c3", DeliverEvent); INCLUDE_ASM("asm/nonmatchings/800c3", OpenEvent); -INCLUDE_ASM("asm/nonmatchings/800c3", CloseEvent); +__asm__(".text\n.align 2\n.globl CloseEvent\n.ent\tCloseEvent\n" + "CloseEvent:\n.frame $sp,0,$31\n" + ".set\tnoreorder\n" + "addiu $t2, $zero, 0xB0\n" + "jr $t2\n" + "addiu $t1, $zero, 0x9\n" + "nop\n" + ".set\treorder\n.end\tCloseEvent\n"); -INCLUDE_ASM("asm/nonmatchings/800c3", WaitEvent); +__asm__( + ".text\n" + ".align 2\n" + ".globl WaitEvent\n" + ".ent\tWaitEvent\n" + "WaitEvent:\n" + ".frame $sp, 0, $31\n" + ".mask 0x00000000, 0\n" + ".fmask 0x00000000, 0\n" + ".set\tnoreorder\n" + "addiu $t2, $0, 176\n" + "jr $t2\n" + "addiu $t1, $0, 10\n" + ".set\treorder\n" + ".end\tWaitEvent\n" + "nop\n" +); INCLUDE_ASM("asm/nonmatchings/800c3", TestEvent); diff --git a/src/boot.c b/src/boot.c index 339c88fd5..9f9d9ae2d 100644 --- a/src/boot.c +++ b/src/boot.c @@ -303,7 +303,31 @@ void func_80010E7C(void) { *(u16 *)(p + 0xA3D4) = 1; } -INCLUDE_ASM("asm/nonmatchings/boot", func_80010ED4); +extern s32 D_800C7C60; +extern void *D_800C7C64; +extern u8 D_800A2E20[]; +extern u8 D_800AE848[]; +extern void *loadDestPtrTable; +extern int CdReadRequest(void *dst, void *src, int arg2, int arg3); +extern void func_8002D4C8(s32, s32); +extern void func_80010AE0(int); +extern void func_80014338(void); +extern void func_800116E0(void); +extern void func_80011778(void); +extern s16 D_800B99DA; + +void func_80010ED4(void) { + D_800C7C60 = 0x57; + D_800C7C64 = D_800A2E20; + if (CdReadRequest(D_800AE848, loadDestPtrTable, 0, &D_800C7C60) != 0) { + func_8002D4C8(2, 0); + func_80010AE0(0x3E0); + func_80014338(); + func_800116E0(); + D_800B99DA = 0; + func_80011778(); + } +} extern void func_800CEEC8(void); @@ -433,7 +457,20 @@ void func_80011680(void) { INCLUDE_ASM("asm/nonmatchings/boot", func_800116E0); -INCLUDE_ASM("asm/nonmatchings/boot", func_80011778); +extern u8 D_800AF630[]; + +void func_80011778(void) { + register u8 *p = D_800AF630; + + (*(u16 *)(p + 0xA3AE))++; + *(u16 *)(p + 0xA3B4) = 0; + *(u16 *)(p + 0xA3BA) = 0; + *(u16 *)(p + 0xA3B8) = 0; + *(u16 *)(p + 0xA3BE) = 0; + *(u16 *)(p + 0xA3B0) = 0; + *(u16 *)(p + 0xA3B6) = 0; + *(u16 *)(p + 0xA3BC) = 0; +} INCLUDE_ASM("asm/nonmatchings/boot", func_80011818); @@ -465,9 +502,38 @@ INCLUDE_ASM("asm/nonmatchings/boot", func_80011998); INCLUDE_ASM("asm/nonmatchings/boot", func_800119F0); -INCLUDE_ASM("asm/nonmatchings/boot", func_80011A3C); +extern u8 D_800AF630[]; -INCLUDE_ASM("asm/nonmatchings/boot", func_80011ADC); +void func_80011A3C(void) { + register u8 *p = D_800AF630; + register u16 x; + + x = *(u16 *)(p + 0xA3C0); + x = x + 1; + *(u16 *)(p + 0xA3C0) = x; + *(u16 *)(p + 0xA3C6) = 0; + *(u16 *)(p + 0xA3CC) = 0; + *(u16 *)(p + 0xA3CA) = 0; + *(u16 *)(p + 0xA3D0) = 0; + *(u16 *)(p + 0xA3C2) = 0; + *(u16 *)(p + 0xA3C8) = 0; + *(u16 *)(p + 0xA3CE) = 0; +} + +extern u8 D_800AF630[]; + +void func_80011ADC(void) { + register u8 *p = D_800AF630; + + --*(u16 *)(p + 0xA3C0); + *(u16 *)(p + 0xA3C6) = 0; + *(u16 *)(p + 0xA3CC) = 0; + *(u16 *)(p + 0xA3CA) = 0; + *(u16 *)(p + 0xA3D0) = 0; + *(u16 *)(p + 0xA3C2) = 0; + *(u16 *)(p + 0xA3C8) = 0; + *(u16 *)(p + 0xA3CE) = 0; +} INCLUDE_ASM("asm/nonmatchings/boot", func_80011B7C); diff --git a/src/sgap_8.c b/src/sgap_8.c index 14ea81f4a..ad54a9098 100644 --- a/src/sgap_8.c +++ b/src/sgap_8.c @@ -349,4 +349,20 @@ s32 func_80041400(s32 param_1) return *(s16 *)(base + 0x5A); } -INCLUDE_ASM("asm/nonmatchings/sgap_8", func_80041448); + +extern u8 D_800AE614; +extern s16 D_80079596[][26]; +extern u16 D_800B9B3A; +extern void func_80040868(s32); + +void func_80041448(s16 param_1) +{ + u8 i; + + for (i = 0; i < D_800AE614; i++) { + if (D_80079596[i][0] == param_1) { + D_800B9B3A = i; + func_80040868(0); + } + } +}