diff --git a/src/800.c b/src/800.c index cc567838c8..5112473861 100644 --- a/src/800.c +++ b/src/800.c @@ -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); diff --git a/src/800c.c b/src/800c.c index 3d98606ac1..9fcada6fab 100644 --- a/src/800c.c +++ b/src/800c.c @@ -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, diff --git a/src/800c2_2.c b/src/800c2_2.c index 27dacb1180..13049083f2 100644 --- a/src/800c2_2.c +++ b/src/800c2_2.c @@ -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" diff --git a/src/800c2_3.c b/src/800c2_3.c index 89b22dd15a..bb95082de2 100644 --- a/src/800c2_3.c +++ b/src/800c2_3.c @@ -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); diff --git a/src/800c3.c b/src/800c3.c index cd4a460793..4807f204e3 100644 --- a/src/800c3.c +++ b/src/800c3.c @@ -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); diff --git a/src/boot.c b/src/boot.c index 4e1e4fd014..c040066216 100644 --- a/src/boot.c +++ b/src/boot.c @@ -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); diff --git a/src/gsgap5.c b/src/gsgap5.c index a27b88679e..28fae30b83 100644 --- a/src/gsgap5.c +++ b/src/gsgap5.c @@ -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() { diff --git a/src/sgap_2.c b/src/sgap_2.c index 38534dcb09..c9d55afd6e 100644 --- a/src/sgap_2.c +++ b/src/sgap_2.c @@ -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; +} diff --git a/src/sgap_5.c b/src/sgap_5.c index 1c46e0ffea..ac605c5dab 100644 --- a/src/sgap_5.c +++ b/src/sgap_5.c @@ -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); +}