feat(decomp): main lane m74 — 39 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.

  GetGraphDebug
  GetGraphType
  SYS_OBJ_1964
  SYS_OBJ_1A30
  SYS_OBJ_1AF0
  SYS_OBJ_2F7C
  SetDQA
  SetDQB
  SetData32
  SetVertex1
  SetVertex2
  _96_remove
  _SsSndPlay
  func_8001096C
  func_80010B10
  func_80010D60
  func_80010DE0
  func_80010E14
  func_80010E48
  func_80011220
  func_800112A8
  func_80011320
  func_80011350
  func_80011DF4
  func_8001311C
  func_800191BC
  func_800388E8
  func_80039F14
  func_8003A098
  func_8003A404
  func_8003D424
  func_8005AB58
  func_8005AC24
  func_8005CF08
  func_8005CF18
  func_8005E194
  func_8005F384
  func_80062394
  func_800626C8
This commit is contained in:
Drew T
2026-08-26 08:26:19 -06:00
parent b82a070c49
commit 64c3f0e17a
9 changed files with 358 additions and 39 deletions
+46 -6
View File
@@ -651,7 +651,11 @@ s32 func_80013028(s32 x, s32 y, s16 n, s16 d, s16 *p) {
INCLUDE_ASM("asm/nonmatchings/800", func_800130D0);
INCLUDE_ASM("asm/nonmatchings/800", func_8001311C);
extern s32 func_80013154(s32 a0, s32 a1, s32 a2);
s16 func_8001311C(s16 a0, s16 a1, s16 a2) {
return func_80013154(a0, a1, a2);
}
INCLUDE_ASM("asm/nonmatchings/800", func_80013154);
@@ -5312,7 +5316,11 @@ void func_800191A8(void) {
D_80078E30 = -1;
}
INCLUDE_ASM("asm/nonmatchings/800", func_800191BC);
extern s32 D_80078E30;
void func_800191BC(s16 arg0) {
D_80078E30 = arg0;
}
s32 func_800191D4(s32 a0) {
extern s32 D_80078E30;
@@ -20057,7 +20065,9 @@ void func_80038838(void *arg0)
*(unsigned char *)((unsigned long)arg0 + 0x1F6) = 0;
}
INCLUDE_ASM("asm/nonmatchings/800", func_800388E8);
s32 func_800388E8(void *arg0, s16 arg1) {
return arg1 * *(s16 *)((u8 *)arg0 + 0x10) * 4 >> 16;
}
void func_80038908(unsigned char *arg0) {
extern short D_800A4EF8;
@@ -20185,11 +20195,36 @@ INCLUDE_ASM("asm/nonmatchings/800", func_80039C70);
INCLUDE_ASM("asm/nonmatchings/800", func_80039DEC);
INCLUDE_ASM("asm/nonmatchings/800", func_80039F14);
void func_80039F14(u8 *arg0, s16 arg1, u8 arg2) {
u8 b;
arg0 += arg1 * 26;
b = arg0[0x21];
arg0[0x20] = arg2;
arg0[0x22] = arg2 + 1;
arg0[0x21] = b | 2;
}
INCLUDE_ASM("asm/nonmatchings/800", func_80039F50);
INCLUDE_ASM("asm/nonmatchings/800", func_8003A098);
typedef struct {
u8 b0;
u8 pad[25];
} A098Rec;
typedef struct {
u8 *stream;
u8 pad04[0x16];
A098Rec rec[1];
} A098Ctx;
void func_8003A098(A098Ctx *arg0, s16 arg1) {
u8 *v1;
v1 = arg0->stream;
arg0->stream = v1 + 1;
arg0->rec[arg1].b0 = *v1;
}
void func_8003A0D0(s32 *arg0) {
(*arg0)++;
@@ -20300,7 +20335,12 @@ u32 func_8003A3D8(u32 a) {
return ((a & 0xFF) << 24) + (((a >> 8) & 0xFF) << 16) + (((a >> 16) & 0xFF) << 8) | (a >> 24);
}
INCLUDE_ASM("asm/nonmatchings/800", func_8003A404);
s32 func_8003A404(u32 arg)
{
u32 h = arg >> 8;
u32 l = (arg & 0xFF) << 8;
return (s16)((h & 0xFF) + l);
}
extern void _SpuInit(s32);
+150 -8
View File
@@ -318,9 +318,18 @@ s32 SetGraphQueue(s32 a0)
return s2;
}
INCLUDE_ASM("asm/nonmatchings/800c", GetGraphType);
extern u8 D_80072788;
INCLUDE_ASM("asm/nonmatchings/800c", GetGraphDebug);
s32 GetGraphType(void)
{
return D_80072788;
}
extern u8 D_8007278A;
s32 GetGraphDebug(void) {
return D_8007278A;
}
extern u8 D_8007278A;
extern u32 D_80072784;
@@ -1622,9 +1631,67 @@ s32 SYS_OBJ_191C(s32 a0, s32 a1, s32 a2, s32 a3) {
return v1 | v0;
}
INCLUDE_ASM("asm/nonmatchings/800c", func_8005AB58);
__asm__(
".text\n"
".align\t2\n"
".globl\tfunc_8005AB58\n"
".ent\tfunc_8005AB58\n"
"func_8005AB58:\n"
".frame\t$sp,16,$31\n"
".mask\t0x00000000,0\n"
".fmask\t0x00000000,0\n"
".set\tnoreorder\n"
"addu $a3, $a0, $zero\n"
"sll $a0, $a0, 16\n"
"sra $a0, $a0, 16\n"
"bltz $a0, .L8005AB94\n"
" addiu $sp, $sp, -16\n"
"lui $v0, %hi(D_8007278C)\n"
"lh $v0, %lo(D_8007278C)($v0)\n"
"nop\n"
"addu $a2, $v0, $zero\n"
"addiu $v0, $v0, -1\n"
"slt $v0, $v0, $a0\n"
"bnez $v0, SYS_OBJ_1964\n"
" addiu $v0, $a2, -1\n"
"j SYS_OBJ_1964\n"
" addu $v0, $a3, $zero\n"
".L8005AB94:\n"
"addu $v0, $zero, $zero\n"
".set\treorder\n"
".end\tfunc_8005AB58\n"
);
INCLUDE_ASM("asm/nonmatchings/800c", SYS_OBJ_1964);
__asm__(
".text\n"
".align\t2\n"
".globl\tSYS_OBJ_1964\n"
".ent\tSYS_OBJ_1964\n"
"SYS_OBJ_1964:\n"
".frame\t$sp,0,$31\n"
".mask\t0x00000000,0\n"
".fmask\t0x00000000,0\n"
".set\tnoreorder\n"
"addu $a3, $v0, $zero\n"
"sll $v0, $a1, 16\n"
"sra $a2, $v0, 16\n"
"bltz $a2, .L8005ABD4\n"
"nop\n"
"lui $v0, %hi(D_8007278E)\n"
"lh $v0, %lo(D_8007278E)($v0)\n"
"nop\n"
"addu $a0, $v0, $zero\n"
"addiu $v0, $v0, -0x1\n"
"slt $v0, $v0, $a2\n"
"beqz $v0, SYS_OBJ_19A4\n"
"nop\n"
"j SYS_OBJ_19A4\n"
"addiu $a1, $a0, -0x1\n"
".L8005ABD4:\n"
"addu $a1, $zero, $zero\n"
".set\treorder\n"
".end\tSYS_OBJ_1964\n"
);
__asm__(
".text\n"
@@ -1665,9 +1732,66 @@ s32 SYS_OBJ_19D8(s32 a0, s32 a1, s32 a2, s32 a3) {
return v0;
}
INCLUDE_ASM("asm/nonmatchings/800c", func_8005AC24);
__asm__(
".text\n"
".align\t2\n"
".globl\tfunc_8005AC24\n"
".ent\tfunc_8005AC24\n"
"func_8005AC24:\n"
".frame\t$sp,16,$31\n"
".mask\t0x00000000,0\n"
".fmask\t0x00000000,0\n"
".set\tnoreorder\n"
"addu $a3, $a0, $zero\n"
"sll $a0, $a0, 16\n"
"sra $a0, $a0, 16\n"
"bltz $a0, 1f\n"
" addiu $sp, $sp, -16\n"
"lui $v0, %hi(D_8007278C)\n"
"lh $v0, %lo(D_8007278C)($v0)\n"
"nop\n"
"addu $a2, $v0, $zero\n"
"addiu $v0, $v0, -1\n"
"slt $v0, $v0, $a0\n"
"bnez $v0, SYS_OBJ_1A30\n"
" addiu $v0, $a2, -1\n"
"j SYS_OBJ_1A30\n"
" addu $v0, $a3, $zero\n"
"1:\n"
"addu $v0, $zero, $zero\n"
".set\treorder\n"
".end\tfunc_8005AC24\n"
);
INCLUDE_ASM("asm/nonmatchings/800c", SYS_OBJ_1A30);
__asm__(
".text\n"
".align\t2\n"
".globl\tSYS_OBJ_1A30\n"
".ent\tSYS_OBJ_1A30\n"
"SYS_OBJ_1A30:\n"
".frame\t$sp,0,$31\n"
".mask\t0x00000000,0\n"
".fmask\t0x00000000,0\n"
".set\tnoreorder\n"
"addu $a3, $v0, $zero\n"
"sll $v0, $a1, 16\n"
"sra $a2, $v0, 16\n"
"bltz $a2, .L8005ACA0\n"
" nop\n"
"lui $v0, %hi(D_8007278E)\n"
"lh $v0, %lo(D_8007278E)($v0)\n"
"addu $a0, $v0, $zero\n"
"addiu $v0, $v0, -1\n"
"slt $v0, $v0, $a2\n"
"beqz $v0, SYS_OBJ_1A70\n"
" nop\n"
"j SYS_OBJ_1A70\n"
" addiu $a1, $a0, -1\n"
".L8005ACA0:\n"
"addu $a1, $zero, $zero\n"
".set\treorder\n"
".end\tSYS_OBJ_1A30\n"
);
__asm__(
".text\n"
@@ -1736,7 +1860,12 @@ __asm__(
".end\tfunc_8005ACF0\n"
);
INCLUDE_ASM("asm/nonmatchings/800c", SYS_OBJ_1AF0);
s32 SYS_OBJ_1AF0(void) {
register s32 r_v0 __asm__("v0");
register s32 r_v1 __asm__("v1");
r_v0 |= 0xE5000000;
return r_v1 | r_v0;
}
__asm__(
".text\n"
@@ -2983,7 +3112,20 @@ __asm__(
".end\tfunc_8005C054\n"
);
INCLUDE_ASM("asm/nonmatchings/800c", SYS_OBJ_2F7C);
__asm__(
".text\n"
".align\t2\n"
".globl\tSYS_OBJ_2F7C\n"
".ent\tSYS_OBJ_2F7C\n"
"SYS_OBJ_2F7C:\n"
".set\tnoreorder\n"
"lw $ra, 24($sp)\n"
"addiu $sp, $sp, 32\n"
"jr $ra\n"
"nop\n"
".set\treorder\n"
".end\tSYS_OBJ_2F7C\n"
);
/*
* func_8005C1C0 -- GPU-primitive dispatch sibling (same family as func_80059FC0/SYS_OBJ_E34,
+6 -1
View File
@@ -2,7 +2,12 @@
INCLUDE_ASM("asm/nonmatchings/800c2_2", func_80062388);
INCLUDE_ASM("asm/nonmatchings/800c2_2", func_80062394);
extern s32 D_80072A24;
s32 func_80062394(void)
{
return D_80072A24;
}
__asm__(
".text\n"
+18 -1
View File
@@ -1,6 +1,23 @@
#include "common.h"
INCLUDE_ASM("asm/nonmatchings/800c2_3", func_800626C8);
__asm__(
".text\n"
".align 2\n"
".globl func_800626C8\n"
".ent\tfunc_800626C8\n"
"func_800626C8:\n"
".frame $sp, 0, $31\n"
".mask 0x00000000, 0\n"
".fmask 0x00000000, 0\n"
".set\tnoreorder\n"
"lui $t1, %hi(jtbl_80078D20_main)\n"
"lw $t1, %lo(jtbl_80078D20_main)($t1)\n"
"nop\n"
"jr $t1\n"
"nop\n"
".set\treorder\n"
".end\tfunc_800626C8\n"
);
INCLUDE_ASM("asm/nonmatchings/800c2_3", func_800626DC);
+36 -5
View File
@@ -21,7 +21,16 @@ __asm__(".text\n.align 2\n.globl FlushCache\n.ent\tFlushCache\n"
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CE38);
INCLUDE_ASM("asm/nonmatchings/800c3", _96_remove);
__asm__(".text\n.align 2\n.globl _96_remove\n.ent\t_96_remove\n"
"_96_remove:\n.frame $sp,0,$31\n"
".set\tnoreorder\n"
"addiu $t2, $zero, 160\n"
"jr $t2\n"
"addiu $t1, $zero, 114\n"
"nop\n"
"nop\n"
"nop\n"
".set\treorder\n.end\t_96_remove\n");
INCLUDE_ASM("asm/nonmatchings/800c3", DeliverEvent);
@@ -94,9 +103,21 @@ INCLUDE_ASM("asm/nonmatchings/800c3", ResetEntryInt);
INCLUDE_ASM("asm/nonmatchings/800c3", HookEntryInt);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CF08);
void func_8005CF08(void) {
__asm__ volatile(
"addiu $a0, $zero, 0x1\n\t"
"syscall"
);
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005CF18);
void func_8005CF18() {
__asm__ __volatile__(
".set\tnoreorder\n"
"addiu $a0, $zero, 2\n"
"syscall 0\n"
".set\treorder\n"
);
}
INCLUDE_ASM("asm/nonmatchings/800c3", read);
@@ -704,7 +725,11 @@ INCLUDE_ASM("asm/nonmatchings/800c3", SysDeqIntRP);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E188);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005E194);
void func_8005E194(void *arg0, u8 arg1, u32 arg2, u8 arg3) {
*(u8 *)((u8 *)arg0 + 0x36) = arg1;
*(u32 *)((u8 *)arg0 + 0x2C) = arg2;
*(u8 *)((u8 *)arg0 + 0x35) = arg3;
}
extern void func_8005EA54();
extern void func_8005EA68(void *arg0, s32 arg1);
@@ -1157,7 +1182,13 @@ void func_8005F228(void *arg0) {
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F290);
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F384);
void func_8005F384(void *arg0) {
u8 temp;
temp = *(u8 *)((u8 *)arg0 + 0x36);
*(u8 *)((u8 *)arg0 + 0x36) = 0;
*(u8 *)((u8 *)arg0 + 0x37) = temp;
}
INCLUDE_ASM("asm/nonmatchings/800c3", func_8005F394);
+52 -11
View File
@@ -177,7 +177,10 @@ __asm__(".text\n"
INCLUDE_ASM("asm/nonmatchings/boot", main);
INCLUDE_ASM("asm/nonmatchings/boot", func_8001096C);
void func_8001096C(void) {
extern void func_8002CDD8(void);
func_8002CDD8();
}
extern s32 VSync(s32);
@@ -198,7 +201,10 @@ void func_80010AE0(s32 arg0) {
D_80074778 = arg0;
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80010B10);
s32 func_80010B10(void) {
extern s32 D_80074778;
return D_80074778;
}
/* (*gameModeHandlerTable[gameMode])() — 18 handlers @0x800629F4 (entry [7] =
* DebugMenuHandler). gameMode is a u16 at D_800AF630 + 0xA3AE (= 0x800B99DE) in the
@@ -277,7 +283,10 @@ void func_80010CEC(void) {
}
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80010D60);
void func_80010D60(void) {
func_80010AE0(0x3E0);
func_80011818(5);
}
extern u8 D_800AF630[];
extern void func_80011778(void);
@@ -287,11 +296,23 @@ void func_80010DA0(void) {
func_80011778();
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80010DE0);
extern void func_80011818(s32);
INCLUDE_ASM("asm/nonmatchings/boot", func_80010E14);
void func_80010DE0(void) {
func_80011818(5);
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80010E48);
extern void func_80011818(s32);
void func_80010E14(void) {
func_80011818(0xD);
}
extern void func_80011818(s32);
void func_80010E48(void) {
func_80011818(0xC);
}
extern u8 D_800AF630[];
extern void func_8002D4C8(s32, s32);
@@ -421,7 +442,13 @@ void func_800111BC(void) {
}
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80011220);
extern void func_80011778(void);
extern void func_80011B7C(s32);
void func_80011220(void) {
func_80011778();
func_80011B7C(0);
}
extern u8 D_800AF630[];
extern void func_800CEDFC(void);
@@ -433,13 +460,23 @@ void func_8001125C(void) {
func_800CEDFC();
}
INCLUDE_ASM("asm/nonmatchings/boot", func_800112A8);
void func_800112A8(void) {
}
INCLUDE_ASM("asm/nonmatchings/boot", func_800112C8);
INCLUDE_ASM("asm/nonmatchings/boot", func_80011320);
extern u8 D_800AF630[];
extern void func_800CEDFC(void);
INCLUDE_ASM("asm/nonmatchings/boot", func_80011350);
void func_80011320(void) {
func_800CEDFC();
}
extern s32 D_80074784;
s32 func_80011350(void) {
return D_80074784;
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80011380);
@@ -580,7 +617,11 @@ void func_80011DCC(void) {
D_80074780 = 0;
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80011DF4);
extern s32 D_80074780;
s32 func_80011DF4(void) {
return D_80074780;
}
INCLUDE_ASM("asm/nonmatchings/boot", func_80011E24);
+40 -5
View File
@@ -2,9 +2,23 @@
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetVertex0);
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetVertex1);
void SetVertex1(long *r0)
{
__asm__ volatile(
"lwc2 $2, 0( %0 );"
"lwc2 $3, 4( %0 )"
:
: "r"(r0));
}
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetVertex2);
void SetVertex2(long *r0)
{
__asm__ __volatile__(
"lwc2 $4, 0( %0 );"
"lwc2 $5, 4( %0 )"
:
: "r"(r0));
}
void SetVertexTri(long *r0, long *r1, long *r2)
{
@@ -102,11 +116,32 @@ void SetMAC123(long r0, long r1, long r2)
: "r"(r0), "r"(r1), "r"(r2));
}
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetData32);
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetDQA);
void SetData32(long r0)
{
__asm__ __volatile__(
"mtc2 %0, $30"
:
: "r"(r0));
}
INCLUDE_ASM("asm/nonmatchings/gsgap5", SetDQB);
void SetDQA()
{
__asm__ __volatile__(
".set\tnoreorder\n"
"ctc2 $4, $27\n"
".set\treorder\n"
);
}
void SetDQB()
{
__asm__ __volatile__(
".set\tnoreorder\n"
"ctc2 $4, $28\n"
".set\treorder\n"
);
}
void func_80053AD8()
{
+5 -1
View File
@@ -1,3 +1,7 @@
#include "common.h"
INCLUDE_ASM("asm/nonmatchings/sgap_2", func_8003D424);
extern s32 D_8006B0FC;
void func_8003D424(s32 *arg0) {
*arg0 = D_8006B0FC;
}
+5 -1
View File
@@ -1,3 +1,7 @@
#include "common.h"
INCLUDE_ASM("asm/nonmatchings/sgap_5", _SsSndPlay);
extern void _SsSeqPlay(s16 seq_no, s16 play_mode);
void _SsSndPlay(s16 vabid, s16 prog) {
_SsSeqPlay(vabid, prog);
}