From d7142f224d686e53ab3b94af1efd2bed504bdbb5 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 26 Aug 2026 12:01:09 -0600 Subject: [PATCH] =?UTF-8?q?feat(decomp):=20main=20lane=20n02=20=E2=80=94?= =?UTF-8?q?=203=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. FGO_01_OBJ_CC func_800331D4 func_8005D33C --- src/800.c | 20 +++++++++++++++- src/800b_5.c | 44 +++++++++++++++++++++++++++++++++++- src/800c3.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 125 insertions(+), 3 deletions(-) diff --git a/src/800.c b/src/800.c index cb8ad1672..20f882984 100644 --- a/src/800.c +++ b/src/800.c @@ -18300,7 +18300,25 @@ INCLUDE_ASM("asm/nonmatchings/800", func_80032A74); INCLUDE_ASM("asm/nonmatchings/800", func_8003310C); -INCLUDE_ASM("asm/nonmatchings/800", func_800331D4); +extern u16 D_800A46E8[]; + +s32 func_800331D4(s32 arg0) { + u16 *p; + register s32 i __asm__("$3"); + + p = D_800A46E8; + i = 0; + do { + if ((*p & 0x3F) == 1 && p[2] == (arg0 & 0xFFFF)) { + if (((u32)arg0 >> 16) == 0 || ((u32)arg0 >> 16) == p[3]) { + return i + 1; + } + } + i += 1; + p += 42; + } while (i < 8); + return 0; +} /* func_8003324C — MATCH (54 ins). diff --git a/src/800b_5.c b/src/800b_5.c index 65a79168f..84891db5b 100644 --- a/src/800b_5.c +++ b/src/800b_5.c @@ -89,7 +89,49 @@ __asm__(".text\n.align 2\n.globl FGO_01_OBJ_64\n.ent\tFGO_01_OBJ_64\n" "sra $t1, $t9, 16\n" ".set\treorder\n.end\tFGO_01_OBJ_64\n"); -INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_01_OBJ_CC); +__asm__(".text\n.align 2\n.globl FGO_01_OBJ_CC\n.ent\tFGO_01_OBJ_CC\n" + "FGO_01_OBJ_CC:\n.frame $sp,0,$31\n" + ".set\tnoreorder\n" + "multu $t1, $t3\n" + "lh $t7, 4($a0)\n" + "sh $t6, 4($a1)\n" + "mflo $t8\n" + "negu $t9, $t8\n" + "sra $t6, $t9, 12\n" + "multu $t1, $t0\n" + "sh $t6, 10($a1)\n" + "bgez $t7, .L800498C0\n" + "andi $t9, $t7, 4095\n" + "mflo $t8\n" + "sra $t6, $t8, 12\n" + "sh $t6, 16($a1)\n" + "negu $t7, $t7\n" + "bgez $t7, .L80049898\n" + "andi $t7, $t7, 4095\n" + ".L80049898:\n" + "sll $t8, $t7, 2\n" + "lui $t9, %hi(D_8006DF1C)\n" + "addu $t9, $t9, $t8\n" + "lw $t9, %lo(D_8006DF1C)($t9)\n" + "nop\n" + "sll $t8, $t9, 16\n" + "sra $t8, $t8, 16\n" + "negu $t5, $t8\n" + "j FGO_01_OBJ_160\n" + "sra $t2, $t9, 16\n" + ".L800498C0:\n" + "mflo $t7\n" + "sra $t6, $t7, 12\n" + "sh $t6, 16($a1)\n" + "sll $t8, $t9, 2\n" + "lui $t9, %hi(D_8006DF1C)\n" + "addu $t9, $t9, $t8\n" + "lw $t9, %lo(D_8006DF1C)($t9)\n" + "nop\n" + "sll $t8, $t9, 16\n" + "sra $t5, $t8, 16\n" + "sra $t2, $t9, 16\n" + ".set\treorder\n.end\tFGO_01_OBJ_CC\n"); /* FGO_01_OBJ_160 (0x800498EC) is NOT a callable function: it is the tail FRAGMENT of one * larger routine. FGO_01_OBJ_CC (0x80049858) computes $t2/$t5 from D_8006DF1C and tail-jumps diff --git a/src/800c3.c b/src/800c3.c index 2b50580e4..900ae7730 100644 --- a/src/800c3.c +++ b/src/800c3.c @@ -373,7 +373,69 @@ return_byte: INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D244); -INCLUDE_ASM("asm/nonmatchings/800c3", func_8005D33C); +__asm__( + ".set\tnoreorder\n" + ".set noreorder\n" + "\t.globl\tfunc_8005D33C\n" + "func_8005D33C:\n" + "lui $v0, %hi(D_80072970)\n" + "lw $v0, %lo(D_80072970)($v0)\n" + "addiu $sp, $sp, -32\n" + "sw $s0, 16($sp)\n" + "addu $s0, $a1, $zero\n" + "sw $s1, 20($sp)\n" + "sw $ra, 24($sp)\n" + "jalr $v0\n" + "addu $s1, $a2, $zero\n" + "bgez $s0, 1f\n" + "addu $v1, $v0, $zero\n" + "lbu $v0, 233($v1)\n" + "j 4f\n" + "nop\n" + "1:\n" + "lbu $v0, 233($v1)\n" + "nop\n" + "slt $v0, $s0, $v0\n" + "beqz $v0, 3f\n" + "sll $v0, $s0, 2\n" + "lw $v1, 4($v1)\n" + "addu $v0, $v0, $s0\n" + "addiu $a2, $s1, -1\n" + "addu $v1, $v1, $v0\n" + "sltiu $v0, $a2, 5\n" + "beqz $v0, 3f\n" + "sll $v0, $a2, 2\n" + "lui $at, %hi(jtbl_800744A0)\n" + "addu $at, $at, $v0\n" + "lw $v0, %lo(jtbl_800744A0)($at)\n" + "nop\n" + "jr $v0\n" + "nop\n" + "lbu $v0, 0($v1)\n" + "j 4f\n" + "nop\n" + "lbu $v0, 1($v1)\n" + "j 4f\n" + "nop\n" + "lbu $v0, 2($v1)\n" + "j 4f\n" + "nop\n" + "lbu $v0, 3($v1)\n" + "j 4f\n" + "nop\n" + "lbu $v0, 4($v1)\n" + "j 4f\n" + "nop\n" + "3:\n" + "addu $v0, $zero, $zero\n" + "4:\n" + "lw $ra, 24($sp)\n" + "lw $s1, 20($sp)\n" + "lw $s0, 16($sp)\n" + "jr $ra\n" + "addiu $sp, $sp, 32\n" + ".set reorder\n" +); extern void* (*D_80072970)(void);