mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-01 15:43:06 -04:00
eb6048a536
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
538 lines
13 KiB
C
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");
|