Files
BFM-decomp/src/800b_5.c
T
Drew T eb6048a536 feat(decomp): main lane m21 — 6 banked
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.

  ApplyMatrix
  FGO_01_OBJ_160
  SetMAC123
  func_80010CEC
  func_80028E44
  func_80052430
2026-08-25 05:58:48 -06:00

538 lines
13 KiB
C

#include "common.h"
INCLUDE_ASM("asm/nonmatchings/800b_5", func_8004978C);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_01_OBJ_64);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_01_OBJ_CC);
/* 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
* straight into it (`j FGO_01_OBJ_160`, no jal anywhere in asm/); the live inputs arrive in
* $t0-$t5 with the destination pointer in $a1 -- none of which any C calling convention
* expresses. Banked as a file-scope inline asm blob per the SYS_OBJ_1DC0 idiom (src/800c.c):
* the literal ".ent\t"/".end\t" pair (tab-separated) makes maspsx emit a fresh
* ".set\tnoreorder", keeping every hand-placed delay-slot nop in place; store offsets are
* DECIMAL because maspsx int()-parses them and a hex "0x0($a1)" crashes it
* ("invalid literal for int() with base 10") -- the exact defect that made the previous
* attempt's whole-binary gate reject a COMPILE error, not a byte mismatch. Body transcribed
* 1:1 from asm/nonmatchings/800b_5/FGO_01_OBJ_160.s (oracle MATCH 76/76; the region contains
* ZERO relocations -- no jal/j/lui -- so relocation masking hides nothing). The trailing
* __asm__(".word 0") reproduces the padding nop at 0x80049A18 before RotMatrixYXZ
* (0x80049A1C), matching the banked FGO_02/03_OBJ_160 siblings whose own .s tails carry the
* same post-endlabel pad (0x80049CA8 / 0x80049F38) and whose blobs use this identical form,
* gate-proven twice in this very TU.
*/
__asm__(".text\n.align 2\n.globl FGO_01_OBJ_160\n.ent\tFGO_01_OBJ_160\n"
"FGO_01_OBJ_160:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"multu $t2, $t1\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"sh $t6, 0($a1)\n"
"multu $t5, $t1\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"negu $t6, $t7\n"
"sra $t7, $t6, 12\n"
"multu $t2, $t4\n"
"sh $t7, 2($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t3\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t5, $t0\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"subu $t7, $t9, $t6\n"
"multu $t8, $t0\n"
"sh $t7, 6($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t7, $t6, 12\n"
"nop\n"
"multu $t5, $t3\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"addu $t6, $t9, $t7\n"
"multu $t5, $t4\n"
"sh $t6, 12($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t3\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t2, $t0\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"addu $t7, $t9, $t6\n"
"multu $t8, $t0\n"
"sh $t7, 8($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t7, $t6, 12\n"
"nop\n"
"multu $t2, $t3\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"subu $t6, $t9, $t7\n"
"sh $t6, 14($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_01_OBJ_160\n");
__asm__(".word 0");
INCLUDE_ASM("asm/nonmatchings/800b_5", RotMatrixYXZ);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_02_OBJ_68);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_02_OBJ_CC);
__asm__(".text\n.align 2\n.globl FGO_02_OBJ_160\n.ent\tFGO_02_OBJ_160\n"
"FGO_02_OBJ_160:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"multu $t5, $t0\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"sh $t6, 6($a1)\n"
"multu $t2, $t0\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t4, $t3\n"
"sh $t6, 8($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t5\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t1, $t2\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"addu $t7, $t9, $t6\n"
"multu $t1, $t5\n"
"sh $t7, 0($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"negu $t7, $t9\n"
"multu $t8, $t2\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"addu $t6, $t7, $t9\n"
"multu $t1, $t3\n"
"sh $t6, 2($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t2\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t4, $t5\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"addu $t7, $t9, $t6\n"
"multu $t4, $t2\n"
"sh $t7, 14($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"negu $t7, $t9\n"
"multu $t8, $t5\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"addu $t6, $t7, $t9\n"
"sh $t6, 12($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_02_OBJ_160\n");
__asm__(".word 0");
INCLUDE_ASM("asm/nonmatchings/800b_5", func_80049CAC);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_03_OBJ_64);
INCLUDE_ASM("asm/nonmatchings/800b_5", FGO_03_OBJ_CC);
__asm__(".text\n.align 2\n.globl FGO_03_OBJ_160\n.ent\tFGO_03_OBJ_160\n"
"FGO_03_OBJ_160:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"multu $t1, $t2\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"sh $t6, 0($a1)\n"
"multu $t5, $t1\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t3, $t4\n"
"sh $t6, 6($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t2\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t5, $t0\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"subu $t7, $t6, $t9\n"
"multu $t0, $t2\n"
"sh $t7, 2($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t7, $t6, 12\n"
"nop\n"
"multu $t8, $t5\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"addu $t6, $t9, $t7\n"
"multu $t4, $t0\n"
"sh $t6, 8($a1)\n"
"nop\n"
"mflo $t7\n"
"sra $t8, $t7, 12\n"
"nop\n"
"multu $t8, $t2\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t6, $t7, 12\n"
"nop\n"
"multu $t3, $t5\n"
"nop\n"
"nop\n"
"mflo $t7\n"
"sra $t9, $t7, 12\n"
"addu $t7, $t6, $t9\n"
"multu $t3, $t2\n"
"sh $t7, 4($a1)\n"
"nop\n"
"mflo $t6\n"
"sra $t7, $t6, 12\n"
"nop\n"
"multu $t8, $t5\n"
"nop\n"
"nop\n"
"mflo $t6\n"
"sra $t9, $t6, 12\n"
"subu $t6, $t9, $t7\n"
"sh $t6, 10($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_03_OBJ_160\n");
__asm__(".word 0");
INCLUDE_ASM("asm/nonmatchings/800b_5", RotMatrixX);
__asm__(".text\n.align 2\n.globl FGO_04_OBJ_64\n.ent\tFGO_04_OBJ_64\n"
"FGO_04_OBJ_64:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"lh $t2, 6($a1)\n"
"lh $t5, 12($a1)\n"
"multu $t0, $t2\n"
"lh $t3, 8($a1)\n"
"lh $t6, 14($a1)\n"
"mflo $t8\n"
"lh $t4, 10($a1)\n"
"lh $t7, 16($a1)\n"
"multu $t1, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t3\n"
"sh $t8, 6($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t4\n"
"sh $t8, 8($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t2\n"
"sh $t8, 10($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t3\n"
"sh $t8, 12($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t4\n"
"sh $t8, 14($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"sh $t8, 16($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_04_OBJ_64\n");
__asm__(".word 0");
__asm__(".word 0");
INCLUDE_ASM("asm/nonmatchings/800b_5", RotMatrixY);
__asm__(".text\n.align 2\n.globl FGO_05_OBJ_64\n.ent\tFGO_05_OBJ_64\n"
"FGO_05_OBJ_64:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"lh $t2, 0($a1)\n"
"lh $t5, 12($a1)\n"
"multu $t0, $t2\n"
"lh $t3, 2($a1)\n"
"lh $t6, 14($a1)\n"
"mflo $t8\n"
"lh $t4, 4($a1)\n"
"lh $t7, 16($a1)\n"
"multu $t1, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t3\n"
"sh $t8, 0($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t4\n"
"sh $t8, 2($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t2\n"
"sh $t8, 4($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t3\n"
"sh $t8, 12($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t4\n"
"sh $t8, 14($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"sh $t8, 16($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_05_OBJ_64\n");
__asm__(".word 0");
__asm__(".word 0");
INCLUDE_ASM("asm/nonmatchings/800b_5", RotMatrixZ);
__asm__(".text\n.align 2\n.globl FGO_06_OBJ_64\n.ent\tFGO_06_OBJ_64\n"
"FGO_06_OBJ_64:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"lh $t2, 0($a1)\n"
"lh $t5, 6($a1)\n"
"multu $t0, $t2\n"
"lh $t3, 2($a1)\n"
"lh $t6, 8($a1)\n"
"mflo $t8\n"
"lh $t4, 4($a1)\n"
"lh $t7, 10($a1)\n"
"multu $t1, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t3\n"
"sh $t8, 0($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t0, $t4\n"
"sh $t8, 2($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t1, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"subu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t2\n"
"sh $t8, 4($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t5\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t3\n"
"sh $t8, 6($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t6\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"multu $t1, $t4\n"
"sh $t8, 8($a1)\n"
"nop\n"
"mflo $t8\n"
"nop\n"
"nop\n"
"multu $t0, $t7\n"
"nop\n"
"nop\n"
"mflo $t9\n"
"addu $t9, $t8, $t9\n"
"sra $t8, $t9, 12\n"
"sh $t8, 10($a1)\n"
"jr $ra\n"
"nop\n"
".set\treorder\n.end\tFGO_06_OBJ_64\n");
__asm__(".word 0");
__asm__(".word 0");