mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-09-27 22:45:39 -04:00
feat(decomp): main lane m13 — 34 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. GsTMDfastG3GNL func_80012558 func_800140B8 func_80014C54 func_80015A74 func_80017F14 func_80018384 func_800183E0 func_800191D4 func_8001931C func_80019930 func_8001BB60 func_8001CB6C func_8001CF48 func_8001D16C func_8001D388 func_800243EC func_80028620 func_80029124 func_800298BC func_80029FE4 func_8002AA3C func_8002CC4C func_8002D320 func_8002D678 func_8002E8DC func_8002F5C8 func_80030470 func_800304C8 func_80033324 func_80034B3C func_80036FB0 func_800623A4 gfx2D_BG0_OBJ_4D8
This commit is contained in:
+116
-1
@@ -153,7 +153,122 @@ void *GsTMDfastG3GL()
|
||||
: : : "memory");
|
||||
}
|
||||
|
||||
INCLUDE_ASM("asm/nonmatchings/800b2", GsTMDfastG3GNL);
|
||||
/* GsTMDfastG3GNL (0x80057B14) -- PsyQ libgs, HANDWRITTEN assembly (splat marks it
|
||||
* "Handwritten function"). Raw GTE code: cop2 compute ops (rtpt/nclip/avsz3), direct
|
||||
* lwc2/swc2 to numbered cop2 data registers, cfc2 $31, hand-filled branch delay slots
|
||||
* and explicit cop2/load-latency nops, 8 arguments (4 in $a0-$a3, 4 on the stack),
|
||||
* allocation uses only $t0-$t7. gcc-2.7.2 -O2 cannot emit this from C.
|
||||
*
|
||||
* Reproduced the way the project's other handwritten GTE bodies are (see the banked
|
||||
* GsTMDfastG3GL directly above): the whole body is one __asm__ __volatile__ block.
|
||||
* gcc supplies only the label and the zero-frame leaf epilogue (jr $ra + nop), which
|
||||
* is exactly the target's tail. GTE compute ops written as `cop2 <imm>` because
|
||||
* binutils has no rtpt/nclip/avsz3 mnemonics reachable from inline asm:
|
||||
* rtpt = 0x4A280030 -> cop2 0x0280030
|
||||
* nclip = 0x4B400006 -> cop2 0x1400006
|
||||
* avsz3 = 0x4B58002D -> cop2 0x158002D
|
||||
* This is the no-lighting variant of G3GL: instead of per-vertex nccs it copies the
|
||||
* primitive's three colour words (prim+4/+8/+12) straight into the packet, and the
|
||||
* primitive/packet stride is 0x1C.
|
||||
*/
|
||||
void *GsTMDfastG3GNL()
|
||||
{
|
||||
__asm__ __volatile__(
|
||||
".set\tnoreorder\n"
|
||||
"addiu $sp, $sp, -8\n"
|
||||
"lw $14, 24($sp)\n"
|
||||
"lw $2, 28($sp)\n"
|
||||
"lw $3, 32($sp)\n"
|
||||
"lw $8, 36($sp)\n"
|
||||
"lw $3, 4($3)\n"
|
||||
"addu $10, $0, $0\n"
|
||||
"sw $2, 12($8)\n"
|
||||
"blez $14, 2f\n"
|
||||
" sw $3, 16($8)\n"
|
||||
"addiu $15, $8, 36\n"
|
||||
"addiu $13, $8, 24\n"
|
||||
"lui $11, 0xFF\n"
|
||||
"ori $11, $11, 0xFFFF\n"
|
||||
"addiu $6, $4, 12\n"
|
||||
"addiu $9, $7, 20\n"
|
||||
"1:\n"
|
||||
"lhu $4, 6($6)\n"
|
||||
"lhu $3, 10($6)\n"
|
||||
"lhu $2, 14($6)\n"
|
||||
"sll $4, $4, 3\n"
|
||||
"addu $4, $5, $4\n"
|
||||
"sll $3, $3, 3\n"
|
||||
"addu $3, $5, $3\n"
|
||||
"sll $2, $2, 3\n"
|
||||
"addu $2, $5, $2\n"
|
||||
"lwc2 $0, 0($4)\n"
|
||||
"lwc2 $1, 4($4)\n"
|
||||
"lwc2 $2, 0($3)\n"
|
||||
"lwc2 $3, 4($3)\n"
|
||||
"lwc2 $4, 0($2)\n"
|
||||
"lwc2 $5, 4($2)\n"
|
||||
"nop\n"
|
||||
"nop\n"
|
||||
"cop2 0x0280030\n" /* rtpt */
|
||||
"lw $2, -8($6)\n"
|
||||
"nop\n"
|
||||
"sw $2, -16($9)\n"
|
||||
"cfc2 $12, $31\n"
|
||||
"nop\n"
|
||||
"sw $12, 0($15)\n"
|
||||
"lw $2, 36($8)\n"
|
||||
"nop\n"
|
||||
"bltz $2, 3f\n"
|
||||
" nop\n"
|
||||
"nop\n"
|
||||
"nop\n"
|
||||
"cop2 0x1400006\n" /* nclip */
|
||||
"lw $2, -4($6)\n"
|
||||
"nop\n"
|
||||
"sw $2, -8($9)\n"
|
||||
"swc2 $24, 0($13)\n"
|
||||
"lw $2, 24($8)\n"
|
||||
"nop\n"
|
||||
"blez $2, 3f\n"
|
||||
" nop\n"
|
||||
"swc2 $12, 8($7)\n"
|
||||
"swc2 $13, 16($7)\n"
|
||||
"swc2 $14, 24($7)\n"
|
||||
"nop\n"
|
||||
"nop\n"
|
||||
"cop2 0x158002D\n" /* avsz3 */
|
||||
"lw $2, 0($6)\n"
|
||||
"nop\n"
|
||||
"sw $2, 0($9)\n"
|
||||
"swc2 $7, 0($13)\n"
|
||||
"lw $3, 24($8)\n"
|
||||
"lw $2, 12($8)\n"
|
||||
"addiu $9, $9, 28\n"
|
||||
"srav $3, $3, $2\n"
|
||||
"lw $2, 16($8)\n"
|
||||
"sll $3, $3, 2\n"
|
||||
"addu $2, $2, $3\n"
|
||||
"sw $2, 52($8)\n"
|
||||
"lw $3, 0($2)\n"
|
||||
"lui $2, 0x600\n"
|
||||
"and $3, $3, $11\n"
|
||||
"or $3, $3, $2\n"
|
||||
"sw $3, 0($7)\n"
|
||||
"and $3, $7, $11\n"
|
||||
"lw $2, 52($8)\n"
|
||||
"addiu $7, $7, 28\n"
|
||||
"sw $3, 0($2)\n"
|
||||
"3:\n"
|
||||
"addiu $10, $10, 1\n"
|
||||
"slt $2, $10, $14\n"
|
||||
"bne $2, $0, 1b\n"
|
||||
" addiu $6, $6, 28\n"
|
||||
"2:\n"
|
||||
"addu $2, $7, $0\n"
|
||||
"addiu $sp, $sp, 8\n"
|
||||
".set\treorder\n"
|
||||
: : : "memory");
|
||||
}
|
||||
|
||||
|
||||
void *GsTMDfastF3GL(void *prim, void *vert, void *norm, void *pkt,
|
||||
|
||||
+113
-1
@@ -405,7 +405,119 @@ __asm__(
|
||||
".end\tgfx2D_BG0_OBJ_4A0\n"
|
||||
);
|
||||
|
||||
INCLUDE_ASM("asm/nonmatchings/800b_7", gfx2D_BG0_OBJ_4D8);
|
||||
__asm__(
|
||||
".text\n"
|
||||
".align\t2\n"
|
||||
".globl\tgfx2D_BG0_OBJ_4D8\n"
|
||||
".ent\tgfx2D_BG0_OBJ_4D8\n"
|
||||
"gfx2D_BG0_OBJ_4D8:\n"
|
||||
".set\tnoreorder\n"
|
||||
"sb $v0, 57($sp)\n"
|
||||
"addu $a0, $t1, $zero\n"
|
||||
"addiu $a1, $sp, 48\n"
|
||||
"addiu $a2, $sp, 16\n"
|
||||
"addiu $t1, $t1, 40\n"
|
||||
"sh $s3, 62($sp)\n"
|
||||
"lhu $v0, 24($s5)\n"
|
||||
"subu $v1, $s0, $t3\n"
|
||||
"subu $v1, $v1, $v0\n"
|
||||
"sh $v1, 66($sp)\n"
|
||||
"lhu $v0, 4($a3)\n"
|
||||
"addiu $s2, $s2, 40\n"
|
||||
"sw $t0, 152($sp)\n"
|
||||
"sw $t1, 156($sp)\n"
|
||||
"sw $t2, 160($sp)\n"
|
||||
"sw $t3, 164($sp)\n"
|
||||
"sw $t4, 168($sp)\n"
|
||||
"sw $t5, 172($sp)\n"
|
||||
"sw $t6, 176($sp)\n"
|
||||
"sw $t7, 180($sp)\n"
|
||||
"jal _mk_spr_packet\n"
|
||||
"sh $v0, 70($sp)\n"
|
||||
"lw $t7, 180($sp)\n"
|
||||
"lw $t6, 176($sp)\n"
|
||||
"lw $t5, 172($sp)\n"
|
||||
"lw $t4, 168($sp)\n"
|
||||
"lw $t3, 164($sp)\n"
|
||||
"lw $t2, 160($sp)\n"
|
||||
"lw $t1, 156($sp)\n"
|
||||
"lw $t0, 152($sp)\n"
|
||||
".L80050D5C:\n"
|
||||
"slt $v0, $s0, $t6\n"
|
||||
".word 0x10400073\n"
|
||||
"nop\n"
|
||||
"addiu $s4, $s2, 4\n"
|
||||
"addiu $s1, $s1, 1\n"
|
||||
".L80050D70:\n"
|
||||
".word 0x022C001A\n"
|
||||
"bnez $t4, .L80050D80\n"
|
||||
"nop\n"
|
||||
".word 0x0007000D\n"
|
||||
".L80050D80:\n"
|
||||
"addiu $at, $zero, -1\n"
|
||||
"bne $t4, $at, .L80050D98\n"
|
||||
"lui $at, 0x8000\n"
|
||||
"bne $s1, $at, .L80050D98\n"
|
||||
"nop\n"
|
||||
".word 0x0006000D\n"
|
||||
".L80050D98:\n"
|
||||
"mfhi $v0\n"
|
||||
"nop\n"
|
||||
"bnez $v0, .L80050DAC\n"
|
||||
"andi $v0, $s3, 0xFFFF\n"
|
||||
"subu $s1, $s1, $t4\n"
|
||||
".L80050DAC:\n"
|
||||
"addu $s0, $s0, $v0\n"
|
||||
"addu $t0, $t0, $v0\n"
|
||||
"subu $s3, $t6, $s0\n"
|
||||
"andi $v0, $s3, 0xFFFF\n"
|
||||
".word 0x01A2102B\n"
|
||||
"beqz $v0, .L80050DCC\n"
|
||||
"nop\n"
|
||||
"lhu $s3, 128($sp)\n"
|
||||
".L80050DCC:\n"
|
||||
"lw $a0, 20($s5)\n"
|
||||
"nop\n"
|
||||
"lw $v0, 12($a0)\n"
|
||||
"sll $v1, $s1, 1\n"
|
||||
"addu $v1, $v1, $v0\n"
|
||||
"lhu $a1, 0($v1)\n"
|
||||
"ori $v0, $zero, 0xFFFF\n"
|
||||
".word 0x10A2004E\n"
|
||||
"slt $v0, $s0, $t6\n"
|
||||
"lw $v1, 8($a0)\n"
|
||||
"addiu $v0, $s2, 40\n"
|
||||
"sw $v0, 0($s2)\n"
|
||||
"addiu $v0, $zero, 9\n"
|
||||
"sb $v0, -1($s4)\n"
|
||||
"sll $v0, $a1, 3\n"
|
||||
"addu $a3, $v1, $v0\n"
|
||||
"lhu $v0, 6($a3)\n"
|
||||
"lhu $t8, 96($sp)\n"
|
||||
"andi $v0, $v0, 0x1F\n"
|
||||
"or $v0, $t8, $v0\n"
|
||||
"sh $v0, 52($sp)\n"
|
||||
"subu $v0, $t0, $s0\n"
|
||||
"lhu $v1, 2($a3)\n"
|
||||
"addu $v0, $v0, $t3\n"
|
||||
"sh $v0, 58($sp)\n"
|
||||
"sh $v1, 54($sp)\n"
|
||||
"lhu $v0, 4($a3)\n"
|
||||
"nop\n"
|
||||
"andi $v0, $v0, 2\n"
|
||||
"beqz $v0, .L80050E60\n"
|
||||
"nop\n"
|
||||
"lbu $v0, 0($a3)\n"
|
||||
"lhu $t8, 128($sp)\n"
|
||||
"nop\n"
|
||||
"addu $v0, $t8, $v0\n"
|
||||
"j gfx2D_BG0_OBJ_658\n"
|
||||
"subu $v0, $v0, $s3\n"
|
||||
".L80050E60:\n"
|
||||
"lbu $v0, 0($a3)\n"
|
||||
".set\treorder\n"
|
||||
".end\tgfx2D_BG0_OBJ_4D8\n"
|
||||
);
|
||||
|
||||
__asm__(".text\n.align 2\n.globl gfx2D_BG0_OBJ_658\n.ent\tgfx2D_BG0_OBJ_658\n"
|
||||
"gfx2D_BG0_OBJ_658:\n.frame $sp,0,$31\n.mask 0,0\n.fmask 0,0\n"
|
||||
|
||||
+49
-1
@@ -4,7 +4,55 @@ INCLUDE_ASM("asm/nonmatchings/800c2_2", func_80062388);
|
||||
|
||||
INCLUDE_ASM("asm/nonmatchings/800c2_2", func_80062394);
|
||||
|
||||
INCLUDE_ASM("asm/nonmatchings/800c2_2", func_800623A4);
|
||||
__asm__(
|
||||
".text\n"
|
||||
".align 2\n"
|
||||
".globl func_800623A4\n"
|
||||
".ent\tfunc_800623A4\n"
|
||||
"func_800623A4:\n"
|
||||
".frame $sp,40,$31\n"
|
||||
".mask 0x001F0000,-16\n"
|
||||
".fmask 0,0\n"
|
||||
".set\tnoreorder\n"
|
||||
"addiu $sp, $sp, -40\n"
|
||||
"sw $s0, 16($sp)\n"
|
||||
"addu $s0, $a0, $zero\n"
|
||||
"sw $s1, 20($sp)\n"
|
||||
"addu $s1, $a1, $zero\n"
|
||||
"sw $s2, 24($sp)\n"
|
||||
"addu $s2, $a2, $zero\n"
|
||||
"sw $s3, 28($sp)\n"
|
||||
"sw $ra, 32($sp)\n"
|
||||
"jal func_80062768\n"
|
||||
"addu $s3, $a3, $zero\n"
|
||||
"jal func_8005CF08\n"
|
||||
"nop\n"
|
||||
"jal func_800626F0\n"
|
||||
"nop\n"
|
||||
"jal func_8005CF18\n"
|
||||
"nop\n"
|
||||
"jal ChangeClearPAD\n"
|
||||
"addu $a0, $zero, $zero\n"
|
||||
"jal func_8006252C\n"
|
||||
"nop\n"
|
||||
"addu $a0, $s0, $zero\n"
|
||||
"addu $a1, $s1, $zero\n"
|
||||
"addu $a2, $s2, $zero\n"
|
||||
"jal PAD_init2\n"
|
||||
"addu $a3, $s3, $zero\n"
|
||||
"addiu $v0, $zero, 1\n"
|
||||
"lui $at, %hi(D_80072A24)\n"
|
||||
"sw $v0, %lo(D_80072A24)($at)\n"
|
||||
"lw $ra, 32($sp)\n"
|
||||
"lw $s3, 28($sp)\n"
|
||||
"lw $s2, 24($sp)\n"
|
||||
"lw $s1, 20($sp)\n"
|
||||
"lw $s0, 16($sp)\n"
|
||||
"jr $ra\n"
|
||||
"addiu $sp, $sp, 40\n"
|
||||
".set\treorder\n"
|
||||
".end\tfunc_800623A4\n"
|
||||
);
|
||||
|
||||
|
||||
__asm__(
|
||||
|
||||
Reference in New Issue
Block a user