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:
Drew T
2026-08-25 02:08:23 -06:00
parent 2de4ef722a
commit bd45f1f232
4 changed files with 1033 additions and 76 deletions
+755 -73
View File
File diff suppressed because it is too large Load Diff
+116 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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__(