diff options
| author | MegaMech <MegaMech@users.noreply.github.com> | 2022-07-11 01:02:41 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-07-11 00:02:41 -0700 |
| commit | fd7941e84162c26b3f3f879bf4aaa6120f5b17db (patch) | |
| tree | f2f4c65c6ff664af7fe1eef9c829236dc148f1ed /src | |
| parent | a8e984d2fd99150f5c9fe08af67f17edc6d8a0d3 (diff) | |
Split out some unused asm and documented main.c (#242)
* Splitting out unused asm
* Documented main.c
Diffstat (limited to 'src')
| -rw-r--r-- | src/actors.c | 4 | ||||
| -rw-r--r-- | src/audio/external.c | 70 | ||||
| -rw-r--r-- | src/audio/heap.c | 59 | ||||
| -rw-r--r-- | src/audio/load.c | 161 | ||||
| -rw-r--r-- | src/code_800029B0.c | 12 | ||||
| -rw-r--r-- | src/code_80005FD0.c | 45 | ||||
| -rw-r--r-- | src/code_8001F980.c | 14 | ||||
| -rw-r--r-- | src/code_80027D00.c | 117 | ||||
| -rw-r--r-- | src/code_800431B0.c | 658 | ||||
| -rw-r--r-- | src/code_80057C60.c | 331 | ||||
| -rw-r--r-- | src/code_80071F00.c | 141 | ||||
| -rw-r--r-- | src/code_80086E70.c | 225 | ||||
| -rw-r--r-- | src/code_80091750.c | 24 | ||||
| -rw-r--r-- | src/main.c | 415 | ||||
| -rw-r--r-- | src/main.h | 34 | ||||
| -rw-r--r-- | src/race_logic.c | 42 |
16 files changed, 2041 insertions, 311 deletions
diff --git a/src/actors.c b/src/actors.c index 8700faec1..75bfa69d1 100644 --- a/src/actors.c +++ b/src/actors.c @@ -1709,6 +1709,10 @@ void func_8029AC18(Camera *camera, Mat4 arg1, struct Actor *arg2) { GLOBAL_ASM("asm/non_matchings/actors/func_8029AC18.s") #endif +UNUSED void func_8029AE14() { + +} + void func_8029AE1C(Camera *arg0, struct PaddleWheelBoat *boat, Mat4 arg2, u16 arg3) { s32 pad[3]; Vec3f sp120; diff --git a/src/audio/external.c b/src/audio/external.c index 08cad046c..b52182a29 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -1784,6 +1784,32 @@ GLOBAL_ASM("asm/non_matchings/audio/external/func_800C400C.s") #endif #ifdef MIPS_TO_C +UNUSED void func_800C4084(s32 arg0) { + s32 temp_at; + s32 temp_t1; + s32 var_a0; + s32 var_v0; + + unksp-10.unk10 = arg0; + var_a0 = arg0 & 0xFFFF; + var_v0 = 0; + do { + if ((var_a0 & 1) != 0) { + *(&D_80192C3C + var_v0) = 1; + } else { + *(&D_80192C3C + var_v0) = 0; + } + temp_t1 = (var_v0 + 1) & 0xFF; + temp_at = temp_t1 < 6; + var_v0 = temp_t1; + var_a0 = (var_a0 >> 1) & 0xFFFF; + } while (temp_at != 0); +} +#else +GLOBAL_ASM("asm/non_matchings/audio/external/func_800C4084.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern u16 D_800EA1C4; extern ? D_801930D0; @@ -2731,6 +2757,20 @@ GLOBAL_ASM("asm/non_matchings/audio/external/func_800C5384.s") #endif #ifdef MIPS_TO_C +UNUSED void func_800C54B8(u8 arg0, s32 arg1) { + s32 sp54; + s32 sp30; + + func_800C5384(arg0); + sp54 = arg0 << 0x1C; + sp30 = arg1; + func_800C41CC(1, &sp30); +} +#else +GLOBAL_ASM("asm/non_matchings/audio/external/func_800C54B8.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800C41CC(?, s32 *); // extern ? func_800C5384(s32, s32); // extern @@ -3115,16 +3155,17 @@ GLOBAL_ASM("asm/non_matchings/audio/external/func_800C5C40.s") #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_800C2474(); // extern -? func_800C284C(?, ?, ?, ?); // extern -? func_800C3F70(); // extern -? func_800C5A3C(); // extern +void func_800C2474(); // extern +void func_800C284C(u8, u8, u8, s32); // extern +void func_800C3F70(); // extern +void func_800C5A3C(); // extern +// game_audio_init? void func_800C5CB8(void) { func_800C2474(); func_800C3F70(); func_800C5A3C(); - func_800C284C(2, 0, 0xFF, 1); + func_800C284C(2, 0, 255, 1); } #else GLOBAL_ASM("asm/non_matchings/audio/external/func_800C5CB8.s") @@ -6328,15 +6369,16 @@ GLOBAL_ASM("asm/non_matchings/audio/external/func_800CB14C.s") #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_800C1F8C(); // extern -? func_800C2274(?); // extern -? func_800C3478(); // extern -? func_800C3724(); // extern -? func_800C5848(); // extern -? func_800C59C4(); // extern -? func_800C8CCC(); // extern -? func_800CBC24(); // extern - +//? func_800C1F8C(); // extern +//? func_800C2274(?); // extern +//? func_800C3478(); // extern +//? func_800C3724(); // extern +//? func_800C5848(); // extern +//? func_800C59C4(); // extern +//? func_800C8CCC(); // extern +//? func_800CBC24(); // extern + +// run audio? void func_800CB2C4(void) { func_800C1F8C(); func_800C3724(); diff --git a/src/audio/heap.c b/src/audio/heap.c index 6e05f6b69..a4eed127d 100644 --- a/src/audio/heap.c +++ b/src/audio/heap.c @@ -202,6 +202,17 @@ void func_800B90B0(void *arg0) { #else GLOBAL_ASM("asm/non_matchings/audio/heap/func_800B90B0.s") #endif +struct struct_800B90E0 { + s32 unk0; + s32 unk4; + s32 unk8; + s32 unkC; +}; + +UNUSED void func_800B90E0(struct struct_800B90E0 *arg0) { + arg0->unkC = 0; + arg0->unk4 = arg0->unk0; +} #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 @@ -826,6 +837,54 @@ GLOBAL_ASM("asm/non_matchings/audio/heap/func_800B9AD8.s") #endif #ifdef MIPS_TO_C +UNUSED void func_800B9BE4(f32 arg0, f32 arg1, void *arg2) { + ? sp4C; + f32 sp30; + f32 sp2C; + ? sp14; + f32 sp10; + f32 spC; + ? *var_a0; + f32 *var_a0_2; + f32 temp_f0; + f32 temp_f10; + f32 temp_f6; + f32 temp_f8; + s16 *var_v1; + void *var_v1_2; + + temp_f0 = D_800F2E80; + var_a0 = &sp14; + var_v1 = arg2 + 4; + spC = arg1 * temp_f0; + sp2C = arg0 * temp_f0; + sp10 = arg1 * arg0 * temp_f0; + sp30 = ((arg0 * arg0) + arg1) * temp_f0; + do { + *var_v1 = (s16) (u32) ((var_a0->unk-4 * arg0) + (arg1 * var_a0->unk-8)); + temp_f8 = var_a0->unk18; + temp_f10 = var_a0->unk1C * arg0; + var_a0 += 4; + var_v1 += 2; + var_v1->unkE = (s16) (u32) (temp_f10 + (arg1 * temp_f8)); + } while ((u32) var_a0 < (u32) &sp2C); + var_v1_2 = arg2; + var_a0_2 = &spC; + do { + var_v1_2->unk0 = (s16) (u32) var_a0_2->unk0; + var_v1_2->unk2 = (s16) (u32) var_a0_2->unk4; + var_v1_2->unk4 = (s16) (u32) var_a0_2->unk8; + temp_f6 = var_a0_2->unkC; + var_a0_2 += 0x10; + var_v1_2->unk6 = (s16) (u32) temp_f6; + var_v1_2 += 8; + } while (var_a0_2 != &sp4C); +} +#else +GLOBAL_ASM("asm/non_matchings/audio/heap/func_800B9BE4.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern ? D_803AF790; extern s8 D_803AFBC3; diff --git a/src/audio/load.c b/src/audio/load.c index c0f39c0a4..22031fbda 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -1150,14 +1150,161 @@ block_16: GLOBAL_ASM("asm/non_matchings/audio/load/func_800BBF44.s") #endif +// L800BC170 is in a delay slot +// m2c may be inaccurate. #ifdef MIPS_TO_C -//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -/* -Failed to decompile function audio_init: - -Last instruction is missing a delay slot: -jr $ra -*/ +void audio_init(void) { + s32 sp8C; + s32 sp60; + s32 **sp3C; + ? *var_v0; + ? *var_v0_2; + ? *var_v0_3; + s16 temp_s3; + s16 temp_t1; + s32 **var_a2; + s32 *temp_v0_2; + s32 *temp_v0_3; + s32 *temp_v0_4; + s32 *temp_v0_5; + s32 temp_a1; + s32 temp_a1_2; + s32 temp_a1_3; + s32 temp_s0; + s32 temp_s0_2; + s32 temp_t7; + s32 temp_v0; + s32 var_s0_2; + s32 var_s1; + s32 var_v1; + s32 var_v1_2; + u32 var_s0; + void *temp_t3; + void *temp_t7_2; + + D_800EA5DC = 0; + temp_t7 = (s32) D_800EA5D0 / 8; + if (temp_t7 > 0) { + var_v0 = &D_803B71B0; + do { + var_v0 += 8; + var_v0->unk-4 = 0; + var_v0->unk-8 = 0; + } while ((u32) var_v0 < (u32) ((temp_t7 * 8) + &D_803B71B0)); + } + var_v0_2 = &gGfxSPTaskOutputBufferSize; + var_s0 = (u32) (&D_803B71A0 - &gGfxSPTaskOutputBufferSize) >> 3; + if ((s32) var_s0 >= 0) { + do { + var_s0 -= 1; + var_v0_2->unk4 = 0; + var_v0_2->unk0 = 0; + var_v0_2 += 8; + } while ((s32) var_s0 >= 0); + } + temp_v0 = osTvType; + switch (temp_v0) { /* irregular */ + case 0: + D_803B7178 = D_800F2EA0; + D_803B717C = 0x32; + break; + case 2: + D_803B7178 = D_800F2EA4; + D_803B717C = 0x3C; + break; + default: + case 1: + D_803B7178 = D_800F2EA8; + D_803B717C = 0x3C; + break; + } + func_800CBF48(&gGfxSPTaskOutputBufferSize); + var_v0_3 = &D_803B718C; + do { + var_v0_3 += 2; + var_v0_3->unk-2 = 0xA0; + } while ((u32) var_v0_3 < (u32) &D_803B7192); + D_803B70B8 = 0; + D_803B70C0 = 0; + D_803B70C4 = 0; + D_803B70B6 = 0; + D_803B70D4 = 0; + D_803B70D8.unk34 = 0; + D_803B70D8.unk84 = 0; + osCreateMesgQueue(&D_803B6720, &D_803B6738, 1); + osCreateMesgQueue(&gCurrAudioFrameDmaQueue, &gCurrAudioFrameDmaMesgBufs, 0x40); + gCurrAudioFrameDmaCount = 0; + gSampleDmaNumListItems = 0; + func_800B90F0(D_800EA5D4); + var_a2 = &D_803B7180; + do { + sp3C = var_a2; + var_v1 = 0; + *var_a2 = soundAlloc(&D_803AFBD8, 0xA00, var_a2); +loop_16: + *(*var_a2 + var_v1) = 0; + (*var_a2 + var_v1)->unk2 = 0; + (*var_a2 + var_v1)->unk4 = 0; + temp_t7_2 = *var_a2 + var_v1; + var_v1 += 8; + temp_t7_2->unk6 = 0; + if (var_v1 != 0xA00) { + goto loop_16; + } + var_a2 += 4; + } while ((u32) var_a2 < (u32) &D_803B718C); + D_803B0501 = 0; + D_803B0500 = 1; + func_800BA00C(); + D_803B706C = &sp60; + audio_dma_copy_immediate(&_sequencesSegmentRomStart, &sp60, 0x10); + temp_t1 = D_803B706C->unk2; + temp_a1 = (((temp_t1 & 0xFFFF) * 8) + 0x13) & ~0xF; + D_803B707C = temp_t1; + temp_v0_2 = soundAlloc(&D_803AFBD8, temp_a1); + D_803B706C = temp_v0_2; + audio_dma_copy_immediate(&_sequencesSegmentRomStart, temp_v0_2, temp_a1); + func_800BB43C(D_803B706C, &_sequencesSegmentRomStart); + D_803B7070 = &sp60; + audio_dma_copy_immediate(&_audio_banksSegmentRomStart, &sp60, 0x10); + temp_s3 = D_803B7070->unk2; + temp_a1_2 = ((temp_s3 * 8) + 0x13) & ~0xF; + temp_s0 = temp_a1_2; + temp_v0_3 = soundAlloc(&D_803AFBD8, temp_a1_2); + D_803B7070 = temp_v0_3; + audio_dma_copy_immediate(&_audio_banksSegmentRomStart, temp_v0_3, temp_s0); + func_800BB43C(D_803B7070, &_audio_banksSegmentRomStart); + D_803B7080 = soundAlloc(&D_803AFBD8, temp_s3 * 0xC); + var_v1_2 = 0; + if (temp_s3 > 0) { + var_s1 = 0; + var_s0_2 = 0; + do { + sp8C = var_v1_2; + audio_dma_copy_immediate((D_803B7070 + var_s1)->unk4, &sp60, 0x10, &D_803B7080); + (D_803B7080 + var_s0_2)->unk1 = (s8) sp60; + var_v1_2 = sp8C + 1; + temp_t3 = D_803B7080 + var_s0_2; + var_s0_2 += 0xC; + var_s1 += 8; + temp_t3->unk2 = (s8) sp64; + } while (var_v1_2 != temp_s3); + } + D_803B7074 = &sp60; + audio_dma_copy_immediate(&_audio_tablesSegmentRomStart, &sp60, 0x10, &D_803B7080); + temp_a1_3 = ((D_803B7074->unk2 * 8) + 0x13) & ~0xF; + temp_s0_2 = temp_a1_3; + temp_v0_4 = soundAlloc(&D_803AFBD8, temp_a1_3); + D_803B7074 = temp_v0_4; + audio_dma_copy_immediate(&_audio_tablesSegmentRomStart, temp_v0_4, temp_s0_2); + func_800BB43C(D_803B7074, &_audio_tablesSegmentRomStart); + temp_v0_5 = soundAlloc(&D_803AFBD8, 0x100); + D_803B7078 = temp_v0_5; + audio_dma_copy_immediate(&_instrument_setsSegmentRomStart, temp_v0_5, 0x100); + func_800B907C(&D_803B01B8, soundAlloc(&D_803AFBD8, D_800EA5D8), D_800EA5D8); + func_800C125C(); + D_800EA5DC = 0x76557364; +} #else GLOBAL_ASM("asm/non_matchings/audio/load/audio_init.s") #endif diff --git a/src/code_800029B0.c b/src/code_800029B0.c index 45b49f6b7..7a097396a 100644 --- a/src/code_800029B0.c +++ b/src/code_800029B0.c @@ -86,7 +86,7 @@ struct UnkStruct_800DC5EC *D_800DC5F0 = &D_8015F480[1]; struct UnkStruct_800DC5EC *D_800DC5F4 = &D_8015F480[2]; struct UnkStruct_800DC5EC *D_800DC5F8 = &D_8015F480[3]; u16 D_800DC5FC = 0; -u8 *D_800DC600 = &osAppNmiBuffer[0]; +uintptr_t *pAppNmiBuffer = &osAppNmiBuffer; s32 gIsMirrorMode = 0; f32 D_800DC608 = 1.0f; Lights1 D_800DC610[] = { @@ -221,11 +221,13 @@ void func_80002DAC(void) { } } -void func_80003010(void) { - int i; - +/** + * The nmi buffer allows developers to save 64 bytes of data through a soft reset. + */ +void clear_nmi_buffer(void) { + s32 i; for (i = 0; i < 16; i++) { - ((u32 *)osAppNmiBuffer)[i] = 0; + osAppNmiBuffer[i] = 0; } } diff --git a/src/code_80005FD0.c b/src/code_80005FD0.c index 946aca668..bbad6f004 100644 --- a/src/code_80005FD0.c +++ b/src/code_80005FD0.c @@ -8346,6 +8346,10 @@ void func_800151A4(void *arg0, s32 arg1) { GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_800151A4.s") #endif +UNUSED void func_8001530C(void) { + +} + #ifdef MIPS_TO_C //generated by m2c commit 3b40ab93768f52ac241c5ae84ef58ef6bc4cb1de //? func_80015390(Camera *, Player *, ?, s32); /* extern */ @@ -11749,7 +11753,7 @@ GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_8001BE78.s") #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_800010CC(); // extern +? init_seg_8028DF00(); // extern ? func_80014DE4(?); // extern ? func_8001BE78(); // extern extern f32 D_800ED4B4; @@ -11772,7 +11776,7 @@ extern s32 D_80163484; void func_8001C05C(void) { f32 temp_f0; - func_800010CC(); + init_seg_8028DF00(); gCurrentCourseId = 0x14; D_8016347C = 0; D_8016347E = 0; @@ -11873,24 +11877,37 @@ loop_8: GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_8001C14C.s") #endif -#ifdef MIPS_TO_C -//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_80057114(?); // extern extern u16 D_80163E2A; void func_8001C3C4(void) { if (gCurrentCourseId == COURSE_AWARD_CEREMONY) { - if (D_80163E2A >= 0x10) { + if (D_80163E2A >= 16) { func_80057114(3); - return; } - // Duplicate return node #5. Try simplifying control flow for better match - return; + } else { + if (gModeSelection == VERSUS) { + func_80057114(); + } } - if (gModeSelection == VERSUS) { - func_80057114(); +} + +extern Gfx D_0D0076F8[]; + +extern struct Controller *gControllerThree; +extern Gfx *gDisplayListHead; +extern s32 D_800DDB20; + +UNUSED void func_8001C42C(void) { + if (D_800DDB20 == 0) { + if ((gControllerThree->buttonPressed & 0x20) != 0) { + D_800DDB20 = 1; + } + } else { + if ((gControllerThree->buttonPressed & 0x20) != 0) { + D_800DDB20 = 0; + } + func_80057C60(); + gSPDisplayList(gDisplayListHead++, D_0D0076F8); + func_80057CE4(&gDisplayListHead); } } -#else -GLOBAL_ASM("asm/non_matchings/code_80005FD0/func_8001C3C4.s") -#endif diff --git a/src/code_8001F980.c b/src/code_8001F980.c index d111b58a6..c4329997f 100644 --- a/src/code_8001F980.c +++ b/src/code_8001F980.c @@ -911,6 +911,12 @@ void func_80021E10(Mat4 arg0, f32 *arg1, s16 *arg2) { GLOBAL_ASM("asm/non_matchings/code_8001F980/func_80021E10.s") #endif +UNUSED void func_80021F50(Mat4 arg0, Vec3f arg1) { + arg0[3][0] += arg1[0]; + arg0[3][1] += arg1[1]; + arg0[3][2] += arg1[2]; +} + void func_80021F84(Mat4 arg0, f32 arg1) { arg0[0][0] *= arg1; arg0[1][0] *= arg1; @@ -3230,3 +3236,11 @@ void func_80026B4C(void *arg0, s8 arg1, s8 arg2, s8 arg3) { #else GLOBAL_ASM("asm/non_matchings/code_8001F980/func_80026B4C.s") #endif + +UNUSED void func_8002701C(void) { + +} + +UNUSED void func_80027024(s32 arg0, s32 arg1, s32 arg2) { + +} diff --git a/src/code_80027D00.c b/src/code_80027D00.c index 0b490da9e..36c662f5e 100644 --- a/src/code_80027D00.c +++ b/src/code_80027D00.c @@ -757,6 +757,10 @@ void func_80028E70(void *arg0, s32 arg1, s8 arg2, s8 arg3) { GLOBAL_ASM("asm/non_matchings/code_80027D00/func_80028E70.s") #endif +UNUSED void func_80028F5C(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + +} + void func_80028F70(void) { D_80164AF0 = 0; func_80028E70(gPlayerOneCopy, camera1, 0, 0); @@ -1770,6 +1774,47 @@ GLOBAL_ASM("asm/non_matchings/code_80027D00/func_8002AE38.s") #endif #ifdef MIPS_TO_C +UNUSED void func_8002B218(void *arg0) { + s32 temp_t0; + s32 var_v0; + u16 temp_a1; + + sp38[0].unk0 = (s32) D_800E3C70.unk0; + sp38[0].unk4 = (s32) D_800E3C70.unk4; + var_v0 = 0; + sp38[0].unk8 = (s32) D_800E3C70.unk8; + sp38[0].unkC = (s32) D_800E3C70.unkC; + sp38[0].unk10 = (s32) D_800E3C70.unk10; + sp24[0].unk0 = (s32) D_800E3C84.unk0; + sp24[0].unk4 = (s32) D_800E3C84.unk4; + sp24[0].unk8 = (s32) D_800E3C84.unk8; + sp24[0].unkC = (s32) D_800E3C84.unkC; + sp24[0].unk10 = (s32) D_800E3C84.unk10; + temp_a1 = arg0->unk6; +loop_1: + temp_t0 = (var_v0 + 1) & 0xFFFF; + if (temp_a1 == (&sp38[0])[var_v0]) { + arg0->unkBC = (s32) (arg0->unkBC | 0x10); + func_8002AA50(temp_a1, (u16 (*)[]) &sp38[0], (u16 (*)[]) &sp24[0]); + arg0->unk204 = 0; + return; + } + if (temp_a1 == (&sp24[0])[var_v0]) { + arg0->unkBC = (s32) (arg0->unkBC & ~0x10); + return; + } + var_v0 = temp_t0; + if (temp_t0 >= 0xA) { + return; + } + goto loop_1; +} +#else +GLOBAL_ASM("asm/non_matchings/code_80027D00/func_8002B218.s") +#endif + + +#ifdef MIPS_TO_C //generated by mips_to_c commit 90e635335cb052c4324a3aa7478e4761db19dfaf ? func_8002A704(Player *, s8); /* extern */ @@ -5569,6 +5614,78 @@ void func_80033884(void *arg0, s32 *arg1, s32 *arg2, s32 arg3, s32 arg4, s32 arg GLOBAL_ASM("asm/non_matchings/code_80027D00/func_80033884.s") #endif +#if MIPS_TO_C +UNUSED void func_80033940(void *arg0, s32 *arg1, s32 arg2, s32 arg3, f32 arg4) { + s32 temp_at; + s32 temp_v0_2; + u32 temp_t6; + u32 temp_v0; + u32 temp_v1; + u32 var_v1; + + temp_v1 = arg0->unk200; + temp_t6 = temp_v1 - 0x800; + temp_at = temp_t6 < 0xF0000000U; + temp_v0 = temp_v1; + arg0->unk200 = temp_t6; + var_v1 = temp_t6; + if (temp_at == 0) { + arg0->unk200 = temp_v0; + var_v1 = temp_v0; + } + if (arg3 >= (s32) var_v1) { + arg0->unk200 = (u32) arg3; + var_v1 = (u32) arg3; + } + temp_v0_2 = *arg1; + if (arg2 < temp_v0_2) { + *arg1 = temp_v0_2 - var_v1; + } else { + *arg1 = temp_v0_2 + var_v1; + } + if (arg0->unk90 < arg4) { + arg0->unk90 = (f32) -arg4; + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_80027D00/func_80033940.s") +#endif + +#ifdef MIPS_TO_C +UNUSED void func_800339C4(void *arg0, s32 *arg1, s32 arg2, s32 arg3, s32 arg4) { + s32 temp_at; + s32 temp_v1_2; + u32 temp_t6; + u32 temp_v0; + u32 temp_v1; + u32 var_v0; + + temp_v0 = arg0->unk200; + temp_t6 = temp_v0 - 0x800; + temp_at = temp_t6 < 0xF0000000U; + temp_v1 = temp_v0; + arg0->unk200 = temp_t6; + var_v0 = temp_t6; + if (temp_at == 0) { + arg0->unk200 = temp_v1; + var_v0 = temp_v1; + } + if (arg3 >= (s32) var_v0) { + arg0->unk200 = (u32) arg3; + var_v0 = (u32) arg3; + } + temp_v1_2 = *arg1; + if (arg2 < temp_v1_2) { + *arg1 = temp_v1_2 - var_v0; + } else { + *arg1 = temp_v1_2 + var_v0; + } + func_80033850(arg4); +} +#else +GLOBAL_ASM("asm/non_matchings/code_80027D00/func_800339C4.s") +#endif + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80033850(s32); // extern diff --git a/src/code_800431B0.c b/src/code_800431B0.c index 941a83041..6687d3ccc 100644 --- a/src/code_800431B0.c +++ b/src/code_800431B0.c @@ -3,6 +3,7 @@ #include <defines.h> #include <common_structs.h> #include <actor_types.h> +#include <config.h> void func_80042330(s32 arg0, s32 arg1, u16 arg2, f32 arg3); // math_util extern @@ -1057,6 +1058,65 @@ GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004544C.s") #endif #ifdef MIPS_TO_C +UNUSED void func_80045614(s32 arg0, s32 arg1, s32 arg2) { + void *sp14; + void *sp10; + void *spC; + s32 sp0; + s32 temp_t0; + s32 temp_t2; + s32 temp_t5; + s32 temp_t7; + void *temp_v0; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + + temp_v0 = gDisplayListHead; + temp_t0 = arg1 - 1; + gDisplayListHead = temp_v0 + 8; + temp_v0->unk0 = (s32) ((temp_t0 & 0xFFF) | 0xFD480000); + temp_v0->unk4 = arg0; + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_t2 = ((((s32) (arg1 + 7) >> 3) & 0x1FF) << 9) | 0xF5480000; + temp_v0_2->unk4 = 0x07080200; + temp_v0_2->unk0 = temp_t2; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = 0; + temp_v0_3->unk0 = 0xE6000000; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk0 = 0xF4000000; + temp_t5 = ((temp_t0 * 4) & 0xFFF) << 0xC; + temp_t7 = ((arg2 - 1) * 4) & 0xFFF; + sp0 = temp_t7; + temp_v0_4->unk4 = (s32) (temp_t5 | 0x07000000 | temp_t7); + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + sp14 = temp_v0_5; + temp_v0_5->unk4 = 0; + temp_v0_5->unk0 = 0xE7000000; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + sp10 = temp_v0_6; + temp_v0_6->unk4 = 0x80200; + temp_v0_6->unk0 = temp_t2; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + spC = temp_v0_7; + temp_v0_7->unk0 = 0xF2000000; + temp_v0_7->unk4 = (s32) (temp_t5 | sp0); +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_80045614.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern s32 *gDisplayListHead; @@ -2179,7 +2239,98 @@ void func_800485C4(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s gDPSetAlphaCompare(gDisplayListHead++, G_AC_NONE); } -GLOBAL_ASM("asm/non_matchings/code_800431B0/func_800486B0.s") +UNUSED void func_800486B0(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_8004788C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 24, 48, 24, 48); +} + +UNUSED void func_80048718(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_8004788C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 32, 32, 32, 32); +} + +UNUSED void func_80048780(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80048540(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 48, 48, 48, 40); +} + +UNUSED void func_800487DC(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_8004788C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 48, 48, 48, 48); +} + +UNUSED void func_80048844(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_8004788C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 32, 64, 32); +} + +UNUSED void func_800488AC(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_8004788C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048914(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047910(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_8004897C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047994(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_800489E4(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047A18(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048A4C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047A9C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048AB4(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7) { + func_80047B9C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, 64, 64, 64, 32); +} + +UNUSED void func_80048B24(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7) { + func_80047CB4(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, 64, 64, 64, 32); +} + +UNUSED void func_80048B94(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5) { + func_80047E48(arg0, arg1, arg2, arg3, arg4, arg5, 64, 64, 64, 32); +} + +UNUSED void func_80048BE8(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5) { + func_80047F40(arg0, arg1, arg2, arg3, arg4, arg5, 64, 64, 64, 32); +} + +UNUSED void func_80048C3C(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5) { + func_800480B4(arg0, arg1, arg2, arg3, arg4, arg5, 64, 64, 64, 32); +} + +UNUSED void func_80048C90(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_800482AC(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048CEC(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_800483B4(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048D48(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_800484BC(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048DA4(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80048540(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 64, 64, 64, 32); +} + +UNUSED void func_80048E00(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047910(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 72, 48, 72, 24); +} + +UNUSED void func_80048E68(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047A18(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 72, 48, 72, 24); +} + +UNUSED void func_80048ED0(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6) { + func_80047A9C(arg0, arg1, arg2, arg3, arg4, arg5, arg6, 72, 48, 72, 24); +} + +UNUSED void func_80048F38(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5) { + func_800480B4(arg0, arg1, arg2, arg3, arg4, arg5, 72, 48, 72, 24); +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800441E0(s32, s32, s32); // extern @@ -3014,13 +3165,86 @@ extern Vec3f D_80183E50; extern Vec3f D_80183E70; void func_80043050(Vec3f, Vec3f, f32); + void func_8004A9B8(f32 arg0) { func_80043050(D_80183E50, D_80183E70, arg0); gSPDisplayList(gDisplayListHead++, D_0D007C10); } -// unused -GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004A9B8.s") +extern s32 D_80165860; +extern s32 D_8016586C; +extern s32 D_80165878; +void func_8004B6C4(s32 arg0, s32 arg1, s32 arg2); +UNUSED void func_8004AA10(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8) { + func_80042E00(arg0, arg1, arg2); + gSPDisplayList(gDisplayListHead++, D_0D007AE0); + func_8004B6C4(D_80165860, D_8016586C, D_80165878); + func_800497CC(arg3, arg4, arg5, arg6, arg7, arg8); +} + +UNUSED void func_8004AAA0(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049B20(arg0, arg1, arg2, arg3, arg4, arg5, 16, 16, 16, 16); +} + +UNUSED void func_8004AB00(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C18(arg0, arg1, arg2, arg3, arg4, arg5, 16, 16, 16, 16); +} + +UNUSED void func_8004AB60(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_8004A0B0(arg0, arg1, arg2, arg3, arg4, arg5, 16, 16, 16, 16); +} + +UNUSED void func_8004ABC0(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049B20(arg0, arg1, arg2, arg3, arg4, arg5, 32, 32, 32, 32); +} + +UNUSED void func_8004AC20(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C18(arg0, arg1, arg2, arg3, arg4, arg5, 32, 32, 32, 32); +} + +UNUSED void func_8004AC80(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_8004A0B0(arg0, arg1, arg2, arg3, arg4, arg5, 32, 32, 32, 32); +} + +UNUSED void func_8004ACE0(s32 arg0, s32 arg1, f32 arg2, s32 arg3, s32 arg4) { + func_8004A414(arg0, arg1, arg2, arg3, arg4, 32, 32, 32, 32); +} + +UNUSED void func_8004AD2C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049B20(arg0, arg1, arg2, arg3, arg4, arg5, 64, 32, 64, 32); +} + +UNUSED void func_8004AD8C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C18(arg0, arg1, arg2, arg3, arg4, arg5, 64, 32, 64, 32); +} + +UNUSED void func_8004ADEC(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C94(arg0, arg1, arg2, arg3, arg4, arg5, 64, 32, 64, 32); +} + +UNUSED void func_8004AE4C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049D10(arg0, arg1, arg2, arg3, arg4, arg5, 64, 32, 64, 32); +} + +UNUSED void func_8004AEAC(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049D8C(arg0, arg1, arg2, arg3, arg4, arg5, 64, 32, 64, 32); +} + +UNUSED void func_8004AF0C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C18(arg0, arg1, arg2, arg3, arg4, arg5, 64, 64, 64, 64); +} + +UNUSED void func_8004AF6C(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049B20(arg0, arg1, arg2, arg3, arg4, arg5, 64, 64, 64, 32); +} + +UNUSED void func_8004AFCC(s32 arg0, s32 arg1, u16 arg2, f32 arg3, s32 arg4, s32 arg5) { + func_80049C18(arg0, arg1, arg2, arg3, arg4, arg5, 64, 96, 64, 48); +} + +UNUSED void func_8004B02C(void) { + gDPSetRenderMode(gDisplayListHead++, AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA), AA_EN | Z_CMP | Z_UPD | IM_RD | CVG_DST_WRAP | ZMODE_XLU | CVG_X_ALPHA | FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)); +} void func_8004B05C(u8 *texture) { gDPLoadTLUT_pal256(gDisplayListHead++, texture); @@ -3274,10 +3498,13 @@ void func_8004BA98(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004BA98.s") #endif +UNUSED void func_8004BB34(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 - void func_8004BB3C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, f32 arg4) { s32 temp_f18; s32 temp_f18_2; @@ -3336,6 +3563,141 @@ void func_8004BB3C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, f32 arg4) { GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004BB3C.s") #endif +#ifdef MIPS_TO_C +UNUSED void func_8004BD14(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5, s32 arg6) { + void *sp70; + s32 sp3C; + s32 sp38; + s32 sp34; + s32 sp28; + s32 sp24; + s32 temp_ra; + s32 temp_t2; + s32 temp_t3; + s32 temp_t5; + s32 temp_t6; + s32 temp_t7; + s32 temp_t9; + void *temp_v0; + void *temp_v0_10; + void *temp_v0_11; + void *temp_v0_12; + void *temp_v0_13; + void *temp_v0_14; + void *temp_v0_15; + void *temp_v0_16; + void *temp_v0_17; + void *temp_v0_18; + void *temp_v0_19; + void *temp_v0_20; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + temp_v0 = gDisplayListHead; + gDisplayListHead = temp_v0 + 8; + temp_v0->unk0 = 0x06000000; + temp_v0->unk4 = &D_0D007F38; + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk0 = 0x06000000; + temp_v0_2->unk4 = &D_0D008138; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = 0; + temp_v0_3->unk0 = 0xBA001001; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk0 = 0xFA000000; + temp_v0_4->unk4 = (s32) (arg4 & 0xFF); + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk4 = 0x1FFC9238; + temp_v0_5->unk0 = 0xFC2527FF; + temp_v0_6 = gDisplayListHead; + temp_t7 = arg2 - 1; + gDisplayListHead = temp_v0_6 + 8; + temp_t9 = (temp_t7 & 0xFFF) | 0xFD100000; + sp38 = temp_t9; + sp3C = temp_t7; + temp_v0_6->unk0 = temp_t9; + temp_v0_6->unk4 = arg5; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_t6 = ((((u32) ((sp3C * 2) + 9) >> 3) & 0x1FF) << 9) | 0xF5100000; + sp34 = temp_t6; + temp_v0_7->unk4 = 0x07080200; + temp_v0_7->unk0 = temp_t6; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + sp70 = temp_v0_8; + temp_v0_8->unk4 = 0; + temp_v0_8->unk0 = 0xE6000000; + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + temp_v0_9->unk0 = 0xF4000000; + temp_t3 = sp34 | 0x100; + temp_t5 = ((sp3C * 4) & 0xFFF) << 0xC; + temp_ra = ((arg3 - 1) * 4) & 0xFFF; + temp_t2 = temp_t5 | 0x07000000 | temp_ra; + temp_v0_9->unk4 = temp_t2; + temp_v0_10 = gDisplayListHead; + gDisplayListHead = temp_v0_10 + 8; + temp_v0_10->unk4 = 0; + temp_v0_10->unk0 = 0xE7000000; + temp_v0_11 = gDisplayListHead; + gDisplayListHead = temp_v0_11 + 8; + temp_v0_11->unk4 = 0x80200; + temp_v0_11->unk0 = sp34; + temp_v0_12 = gDisplayListHead; + gDisplayListHead = temp_v0_12 + 8; + temp_v0_12->unk4 = (s32) (temp_t5 | temp_ra); + temp_v0_12->unk0 = 0xF2000000; + temp_v0_13 = gDisplayListHead; + gDisplayListHead = temp_v0_13 + 8; + temp_v0_13->unk0 = sp38; + temp_v0_13->unk4 = arg6; + temp_v0_14 = gDisplayListHead; + gDisplayListHead = temp_v0_14 + 8; + temp_v0_14->unk4 = 0x07080200; + temp_v0_14->unk0 = temp_t3; + temp_v0_15 = gDisplayListHead; + sp24 = temp_t3; + sp28 = temp_t2; + gDisplayListHead = temp_v0_15 + 8; + temp_v0_15->unk4 = 0; + temp_v0_15->unk0 = 0xE6000000; + temp_v0_16 = gDisplayListHead; + gDisplayListHead = temp_v0_16 + 8; + temp_v0_16->unk0 = 0xF4000000; + temp_v0_16->unk4 = sp28; + temp_v0_17 = gDisplayListHead; + gDisplayListHead = temp_v0_17 + 8; + temp_v0_17->unk4 = 0; + temp_v0_17->unk0 = 0xE7000000; + temp_v0_18 = gDisplayListHead; + gDisplayListHead = temp_v0_18 + 8; + temp_v0_18->unk4 = 0x01080200; + temp_v0_18->unk0 = sp24; + temp_v0_19 = gDisplayListHead; + gDisplayListHead = temp_v0_19 + 8; + temp_v0_19->unk0 = 0xF2000000; + temp_v0_19->unk4 = (s32) (temp_t5 | 0x01000000 | temp_ra); + func_8004B950(arg0, arg1, arg2, arg3, 2); + temp_v0_20 = gDisplayListHead; + gDisplayListHead = temp_v0_20 + 8; + temp_v0_20->unk0 = 0x06000000; + temp_v0_20->unk4 = &D_0D008120; +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004BD14.s") +#endif + extern Gfx *gDisplayListHead; void func_8004C024(s16 arg0, s16 arg1, s16 arg2, u16 arg3, u16 arg4, u16 arg5, u16 arg6) { @@ -3390,12 +3752,17 @@ void func_8004C268(s32 arg0, s32 arg1, s32 arg2, u32 arg3, u32 arg4, u32 arg5, s GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004C268.s") #endif +UNUSED void func_8004C354() { +} + +UNUSED void func_8004C35C() { +} + extern Gfx D_0D007EF8[]; extern Gfx D_0D007EB8[]; extern Gfx D_0D008108[]; void func_8004C364(s32 arg0, s32 arg1, u32 arg2, u32 arg3, s32 arg4) { - gSPDisplayList(gDisplayListHead++, D_0D008108); gSPDisplayList(gDisplayListHead++, D_0D007EF8); gDPSetAlphaCompare(gDisplayListHead++, G_AC_THRESHOLD); @@ -3520,7 +3887,6 @@ extern Gfx D_0D007EB8[]; extern Gfx D_0D007EF8[]; extern Gfx D_0D008108[]; - void func_8004C268(s32 arg0, s32 arg1, s32 arg2, u32 arg3, u32 arg4, u32 arg5, s32 arg6); void func_8004C91C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4, s32 arg5) { gSPDisplayList(gDisplayListHead++, D_0D008108); @@ -3741,6 +4107,38 @@ GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004D0D4.s") #endif #ifdef MIPS_TO_C +UNUSED void func_8004D210(s32 arg0, s32 arg1, s32 arg2, ? arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg7, s32 arg8, s32 argA) { + s32 temp_lo; + s32 var_s0; + s32 var_s3; + s32 var_s4; + void *temp_v1; + + temp_v1 = gDisplayListHead; + gDisplayListHead = temp_v1 + 8; + temp_v1->unk0 = 0x06000000; + temp_v1->unk4 = &D_0D007FE0; + var_s3 = arg1 - (arg8 / 2); + var_s4 = arg2; + func_8004B35C(arg3, arg4, arg5, arg6); + var_s0 = 0; + temp_lo = arg8 / argA; + if (temp_lo > 0) { + do { + func_80044924(var_s4, arg7, argA); + func_8004B97C(arg0 - (arg7 / 2), var_s3, arg7, argA, 1); + var_s0 += 1; + var_s4 += (s32) (arg7 * argA) / 2; + var_s3 += argA; + } while (var_s0 != temp_lo); + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004D210.s") +#endif + + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80044F34(s32, s32, s32); // extern ? func_8004B414(?, s32, s32, s32); // extern @@ -3821,6 +4219,34 @@ GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004D4E8.s") #endif #ifdef MIPS_TO_C +UNUSED void func_8004D654(s32 arg0, s32 arg1, s32 arg2, f32 arg3, s32 arg4, s32 arg5, s32 arg6, s32 arg8, s32 arg9, s32 argB) { + s32 temp_lo; + s32 var_s0; + s32 var_s2; + void *temp_v1; + + temp_v1 = gDisplayListHead; + gDisplayListHead = temp_v1 + 8; + temp_v1->unk0 = 0x06000000; + temp_v1->unk4 = &D_0D008000; + var_s2 = arg2; + func_8004B480(arg4, arg5, arg6, arg2); + var_s0 = 0; + temp_lo = arg9 / argB; + if (temp_lo > 0) { + do { + func_80044F34(var_s2, arg8, argB); + func_8004BB3C(arg0, arg1, arg8, arg9, arg3); + var_s0 += 1; + var_s2 += (s32) (arg8 * argB) / 2; + } while (var_s0 != temp_lo); + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004D654.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800441E0(s32, s32, ?); // extern ? func_8004B97C(s32, s32, s32, ?, s32); // extern @@ -3984,6 +4410,70 @@ void func_8004DAB8(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) { GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004DAB8.s") #endif +UNUSED void func_8004DC34(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 8, 160, 8, 160); +} + +UNUSED void func_8004DC6C(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 12, 160, 12, 160); +} + +UNUSED void func_8004DCA4(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 12, 192, 12, 192); +} + +UNUSED void func_8004DCDC(s32 arg0, s32 arg1, s32 arg2) { + func_8004CD48(arg0, arg1, arg2, 16, 16, 16); +} + +UNUSED void func_8004DD0C(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 16, 160, 16, 160); +} + +UNUSED void func_8004DD44(s32 arg0, s32 arg1, s32 arg2) { + func_8004CD48(arg0, arg1, arg2, 32, 32, 32); +} + +UNUSED void func_8004DD74(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 32, 32, 32, 32); +} + +UNUSED void func_8004DDAC(s32 arg0, s32 arg1, s32 arg2) { + func_8004D0D4(arg0, arg1, arg2, 32, 32, 32); +} + +UNUSED void func_8004DDDC(s32 arg0, s32 arg1, s32 arg2) { + func_8004D7B4(arg0, arg1, arg2, 32, 32); +} + +UNUSED void func_8004DE04(s32 arg0, s32 arg1, s32 arg2) { + func_8004D93C(arg0, arg1, arg2, 32, 32); +} + +UNUSED void func_8004DE2C(s32 arg0, s32 arg1, s32 arg2) { + func_8004DAB8(arg0, arg1, arg2, 32, 32); +} + +UNUSED void func_8004DE54(s32 arg0, s32 arg1, s32 arg2) { + func_8004CD48(arg0, arg1, arg2, 64, 32, 32); +} + +UNUSED void func_8004DE84(s32 arg0, s32 arg1, s32 arg2) { + func_8004CD48(arg0, arg1, arg2, 64, 64, 32); +} + +UNUSED void func_8004DEB4(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 64, 96, 64, 48); +} + +UNUSED void func_8004DEEC(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 112, 32, 112, 32); +} + +UNUSED void func_8004DF24(s32 arg0, s32 arg1, s32 arg2) { + func_8004CF9C(arg0, arg1, arg2, 128, 32, 128, 32); +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800452A4(s32, s32, s32); // extern @@ -4062,6 +4552,9 @@ void func_8004E06C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) { GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004E06C.s") #endif +UNUSED void func_8004E238(void) { + +} extern Gfx D_0D007CB8[]; @@ -4115,7 +4608,29 @@ void func_8004E4CC(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { func_8004E240(arg0, arg1, arg2, arg3, 40, 32, 32); } -GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8004E4CC.s") +UNUSED void func_8004E500(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + func_8004E240(arg0, arg1, arg2, arg3, 48, 48, 24); +} + +UNUSED void func_8004E534(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + func_8004E240(arg0, arg1, arg2, arg3, 64, 32, 32); +} + +UNUSED void func_8004E568(s32 arg0, s32 arg1, s32 arg2, s32 arg3) { + func_8004E240(arg0, arg1, arg2, arg3, 64, 64, 32); +} + +UNUSED void func_8004E59C(s32 arg0, s32 arg1, s32 arg2, s32 arg3, s32 arg4) { + func_8004E2B8(arg0, arg1, arg2, arg3, arg4, 64, 64, 32); +} + +UNUSED void func_8004E5D8(s32 arg0, s32 arg1, u8 *tlut, s32 arg3) { + func_8004E338(arg0, arg1, tlut, arg3, 64, 64); +} + +UNUSED void func_8004E604(s32 arg0, s32 arg1, u8 *tlut, s32 arg3) { + func_8004E240(arg0, arg1, tlut, arg3, SCREEN_WIDTH, SCREEN_HEIGHT, 6); +} #ifdef MIPS_TO_C //generated by mips_to_c commit 792017ad9d422c2467bd42686f383a5c41f41c75 @@ -5291,6 +5806,73 @@ GLOBAL_ASM("asm/non_matchings/code_800431B0/func_800508C0.s") #endif #ifdef MIPS_TO_C +UNUSED void func_80050C68(void) { + s32 sp88; + s32 sp84; + ? *var_s2; + f32 temp_f20; + s32 var_s1; + u16 temp_v0; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + temp_f20 = D_800EE064; + var_s2 = &D_80163DE8; + var_s1 = 0; + do { + temp_v0 = var_s2->unk44; + if ((temp_v0 != 4) && (temp_v0 != 0)) { + func_800507D8(var_s1 & 0xFFFF, &sp88, &sp84); + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk4 = &D_0D007DB8; + temp_v0_2->unk0 = 0x06000000; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = &D_0D01B4D8; + temp_v0_3->unk0 = 0xFD100000; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk4 = 0; + temp_v0_4->unk0 = 0xE8000000; + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk4 = 0x07000000; + temp_v0_5->unk0 = 0xF5000100; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + temp_v0_6->unk4 = 0; + temp_v0_6->unk0 = 0xE6000000; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_v0_7->unk4 = 0x073FC000; + temp_v0_7->unk0 = 0xF0000000; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + temp_v0_8->unk4 = 0; + temp_v0_8->unk0 = 0xE7000000; + func_800452A4(&D_0D01D6D8, 0x20, 0x20); + func_80042330(sp88 + 0x20, sp84 + 0x12, 0, temp_f20); + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + temp_v0_9->unk4 = &D_0D0069E0; + temp_v0_9->unk0 = 0x06000000; + } + var_s1 += 1; + var_s2 += 0x54; + } while (var_s1 != 7); +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_80050C68.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80042330(s32, s32, ?, ?); // extern ? func_80042E00(void *, void *, s32); // extern @@ -8230,6 +8812,10 @@ void func_8005568C(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_800431B0/func_8005568C.s") #endif +UNUSED void func_800557AC() { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80004DFC(s32, s32, u8, s8); // extern @@ -8921,6 +9507,53 @@ GLOBAL_ASM("asm/non_matchings/code_800431B0/func_80056AC0.s") #endif #ifdef MIPS_TO_C +UNUSED void func_80056BF0(s32 arg0) { + f32 sp40; + f32 *var_t6; + s32 *var_t9; + s32 temp_at; + s32 temp_s0; + s32 temp_v0; + s32 temp_v0_2; + void *temp_t3; + void *temp_v1; + + var_t9 = (arg0 * 0x54) + &D_80163DE8; + temp_t3 = var_t9 + 0x54; + var_t6 = &sp40; + do { + temp_at = *var_t9; + var_t9 += 0xC; + var_t6 += 0xC; + var_t6->unk-C = temp_at; + var_t6->unk-8 = (s32) var_t9->unk-8; + var_t6->unk-4 = (s32) var_t9->unk-4; + } while (var_t9 != temp_t3); + D_80183E40.unk0 = sp40; + D_80183E40.unk4 = (f32) ((f64) sp44 + 1.0); + D_80183E40.unk8 = sp48; + func_800480B4(&D_80183E40, &D_80183E80, 0x3E800000, &D_0D02A858, (*(&D_800E471C + ((u32) D_801655CC % 6U)) << 0xA) + &D_0D029858, &D_0D005AE0, 0x20, 0x20, 0x20, 0x20); + temp_v1 = gDisplayListHead; + temp_s0 = D_8018D400; + gDisplayListHead = temp_v1 + 8; + temp_v1->unk0 = 0x06000000; + temp_v1->unk4 = &D_0D007B00; + func_8004B414(0, 0, 0, 0xFF); + D_80183E44 = (f32) ((f64) sp44 + 5.0); + D_80183E84 = 0; + func_800562E4(temp_s0 % 3, temp_s0 % 4, 0xFF); + temp_v0 = temp_s0 + 1; + D_80183E84 = 0x6000; + func_800562E4(temp_v0 % 3, temp_v0 % 4, 0xFF); + temp_v0_2 = temp_s0 + 2; + D_80183E84 = 0xA000; + func_800562E4(temp_v0_2 % 3, temp_v0_2 % 4, 0xFF); +} +#else +GLOBAL_ASM("asm/non_matchings/code_800431B0/func_80056BF0.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 s16 func_800418AC(f32, f32, s32); // extern ? func_800431B0(f32 *, ? *, ?, ? *); // extern @@ -9102,6 +9735,17 @@ void func_80057114(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_800431B0/func_80057114.s") #endif +UNUSED void func_80057330(void) { + +} + +UNUSED void func_80057338(void) { + + gSPDisplayList(gDisplayListHead++, D_0D0079C8); + gSPClearGeometryMode(gDisplayListHead++, G_CULL_BOTH); + gSPDisplayList(gDisplayListHead++, D_0D007AE0); + gSPTexture(gDisplayListHead++, 1, 1, 0, G_TX_RENDERTILE, G_OFF); +} UNUSED void func_800573BC(void) { diff --git a/src/code_80057C60.c b/src/code_80057C60.c index a5835be8e..ed225306a 100644 --- a/src/code_80057C60.c +++ b/src/code_80057C60.c @@ -3273,6 +3273,10 @@ void func_8005DA30(s32 arg0, s16 arg1, s32 arg2, s8 arg3, s8 arg4) { GLOBAL_ASM("asm/non_matchings/code_80057C60/func_8005DA30.s") #endif +UNUSED void func_8005DAD0(void) { + +} + void func_8005DAD8(UnkPlayerStruct258* arg0, s16 arg1, s16 arg2, s16 arg3) { arg0->unk_038 = arg1; arg0->unk_03E = arg3; @@ -7035,6 +7039,105 @@ GLOBAL_ASM("asm/non_matchings/code_80057C60/func_800664E0.s") #endif #ifdef MIPS_TO_C +UNUSED void func_80066714(void *arg0, ? arg1, s16 arg2, s8 arg3) { + f32 sp64; + f32 sp60; + f32 sp5C; + s16 sp58; + s16 sp56; + s16 sp54; + s16 sp52; + s16 sp50; + s16 sp4E; + s16 sp4C; + void *sp2C; + void *sp28; + void *temp_v0; + void *temp_v0_10; + void *temp_v0_11; + void *temp_v0_12; + void *temp_v0_13; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + temp_v0 = arg0 + (arg2 * 0x48); + if (temp_v0->unk544 == 1) { + sp52 = temp_v0->unk560; + sp50 = temp_v0->unk562; + sp4E = temp_v0->unk564; + sp4C = temp_v0->unk566; + sp5C = temp_v0->unk528; + sp60 = temp_v0->unk52C; + sp54 = 0; + sp64 = temp_v0->unk530; + sp58 = 0; + sp56 = (arg0 + (arg3 * 2))->unk48; + func_800652D4(&sp5C, &sp54, temp_v0->unk534 * arg0->unk224, arg3); + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk0 = 0x06000000; + temp_v0_2->unk4 = &D_0D008C90; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = 0; + temp_v0_3->unk0 = 0xBA000E02; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk0 = 0xFD100000; + temp_v0_4->unk4 = &D_0D000200; + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk0 = 0xF5100000; + temp_v0_5->unk4 = 0x07080200; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + temp_v0_6->unk4 = 0; + temp_v0_6->unk0 = 0xE6000000; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_v0_7->unk4 = 0x077FF100; + temp_v0_7->unk0 = 0xF3000000; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + temp_v0_8->unk4 = 0; + temp_v0_8->unk0 = 0xE7000000; + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + sp2C = temp_v0_9; + temp_v0_9->unk0 = 0xF5101000; + temp_v0_9->unk4 = 0x80200; + temp_v0_10 = gDisplayListHead; + gDisplayListHead = temp_v0_10 + 8; + sp28 = temp_v0_10; + temp_v0_10->unk0 = 0xF2000000; + temp_v0_10->unk4 = 0x7C0FC; + func_8004B35C(sp52, sp50, sp4E, sp4C); + temp_v0_11 = gDisplayListHead; + gDisplayListHead = temp_v0_11 + 8; + temp_v0_11->unk0 = 0xB900031D; + temp_v0_11->unk4 = 0x504A50; + temp_v0_12 = gDisplayListHead; + gDisplayListHead = temp_v0_12 + 8; + temp_v0_12->unk4 = &D_800E8B00; + temp_v0_12->unk0 = 0x0400103F; + temp_v0_13 = gDisplayListHead; + gDisplayListHead = temp_v0_13 + 8; + temp_v0_13->unk0 = 0x06000000; + temp_v0_13->unk4 = &D_0D008DA0; + D_80164AF0 += 1; + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_80057C60/func_80066714.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_8004B35C(s16, s16, s16, s16); // extern ? func_800652D4(f32 *, s16 *, f32, s8); // extern @@ -10444,6 +10547,234 @@ GLOBAL_ASM("asm/non_matchings/code_80057C60/func_8006BB34.s") #endif #ifdef MIPS_TO_C +UNUSED void func_8006C0C8(void *arg0, ? arg1, s32 arg2, s16 arg3) { + f32 sp54; + f32 sp50; + f32 sp4C; + s16 sp48; + s16 sp46; + s16 sp44; + void *sp1C; + void *temp_v0; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + sp4C = arg0->unk0; + sp50 = arg0->unk4; + sp44 = 0; + sp54 = arg0->unk8; + sp48 = 0; + sp46 = camera1->unk26; + func_800652D4(arg1, &sp4C, &sp44, arg1); + temp_v0 = gDisplayListHead; + gDisplayListHead = temp_v0 + 8; + temp_v0->unk0 = 0x06000000; + temp_v0->unk4 = &D_0D008DB8; + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk0 = 0xFD700000; + temp_v0_2->unk4 = (s32) D_8018D48C; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = 0x07000000; + temp_v0_3->unk0 = 0xF5700000; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk4 = 0; + temp_v0_4->unk0 = 0xE6000000; + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk4 = 0x071FF200; + temp_v0_5->unk0 = 0xF3000000; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + temp_v0_6->unk4 = 0; + temp_v0_6->unk0 = 0xE7000000; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_v0_7->unk4 = 0; + temp_v0_7->unk0 = 0xF5680800; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + sp1C = temp_v0_8; + temp_v0_8->unk4 = 0x7C07C; + temp_v0_8->unk0 = 0xF2000000; + func_8004B35C((s16) ((arg2 >> 0x10) & 0xFF), (s16) ((arg2 >> 8) & 0xFF), (s16) (arg2 & 0xFF), arg3); + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + temp_v0_9->unk0 = 0x06000000; + temp_v0_9->unk4 = &D_0D008E48; + D_80164AF0 += 1; +} +#else +GLOBAL_ASM("asm/non_matchings/code_80057C60/func_8006C0C8.s") +#endif + +#ifdef MIPS_TO_C +UNUSED void func_8006C294(void *arg0, ? arg1, s32 arg2, s16 arg3) { + f32 sp64; + f32 sp60; + f32 sp5C; + s16 sp58; + s16 sp56; + s16 sp54; + void *sp2C; + void *sp28; + void *temp_v0; + void *temp_v0_10; + void *temp_v0_11; + void *temp_v0_12; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + sp5C = arg0->unk0; + sp60 = arg0->unk4; + sp54 = 0; + sp64 = arg0->unk8; + sp58 = 0; + sp56 = camera1->unk26; + func_800652D4(arg1, &sp5C, &sp54, arg1); + temp_v0 = gDisplayListHead; + gDisplayListHead = temp_v0 + 8; + temp_v0->unk0 = 0x06000000; + temp_v0->unk4 = &D_0D008D58; + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk4 = 0; + temp_v0_2->unk0 = 0xBA000E02; + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk0 = 0xFD700000; + temp_v0_3->unk4 = (s32) D_8018D488; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk4 = 0x07080200; + temp_v0_4->unk0 = 0xF5700000; + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk4 = 0; + temp_v0_5->unk0 = 0xE6000000; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + temp_v0_6->unk4 = 0x071FF200; + temp_v0_6->unk0 = 0xF3000000; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_v0_7->unk4 = 0; + temp_v0_7->unk0 = 0xE7000000; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + sp2C = temp_v0_8; + temp_v0_8->unk0 = 0xF5680800; + temp_v0_8->unk4 = 0x80200; + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + sp28 = temp_v0_9; + temp_v0_9->unk0 = 0xF2000000; + temp_v0_9->unk4 = 0x7C07C; + func_8004B35C((s16) ((arg2 >> 0x10) & 0xFF), (s16) ((arg2 >> 8) & 0xFF), (s16) (arg2 & 0xFF), arg3); + temp_v0_10 = gDisplayListHead; + gDisplayListHead = temp_v0_10 + 8; + temp_v0_10->unk0 = 0xB900031D; + temp_v0_10->unk4 = 0x504B50; + temp_v0_11 = gDisplayListHead; + gDisplayListHead = temp_v0_11 + 8; + temp_v0_11->unk4 = &D_800E87C0; + temp_v0_11->unk0 = 0x0400103F; + temp_v0_12 = gDisplayListHead; + gDisplayListHead = temp_v0_12 + 8; + temp_v0_12->unk0 = 0x06000000; + temp_v0_12->unk4 = &D_0D008DA0; + D_80164AF0 += 1; +} +#else +GLOBAL_ASM("asm/non_matchings/code_80057C60/func_8006C294.s") +#endif + +#ifdef MIPS_TO_C +UNUSED void func_8006C4D4(void *arg0, ? arg1, s32 arg2, s16 arg3, s16 arg4) { + f32 sp54; + f32 sp50; + f32 sp4C; + s16 sp48; + s16 sp46; + s16 sp44; + void *sp1C; + void *temp_v0; + void *temp_v0_2; + void *temp_v0_3; + void *temp_v0_4; + void *temp_v0_5; + void *temp_v0_6; + void *temp_v0_7; + void *temp_v0_8; + void *temp_v0_9; + + sp4C = arg0->unk0; + sp50 = arg0->unk4; + sp44 = 0; + sp54 = arg0->unk8; + sp48 = 0; + sp46 = camera1->unk26; + func_800652D4(arg1, &sp4C, &sp44, arg1); + temp_v0 = gDisplayListHead; + gDisplayListHead = temp_v0 + 8; + temp_v0->unk0 = 0x06000000; + temp_v0->unk4 = &D_0D008DB8; + temp_v0_2 = gDisplayListHead; + gDisplayListHead = temp_v0_2 + 8; + temp_v0_2->unk0 = 0xFD900000; + temp_v0_2->unk4 = (void *) ((arg4 << 0xA) + &D_0D02AC58); + temp_v0_3 = gDisplayListHead; + gDisplayListHead = temp_v0_3 + 8; + temp_v0_3->unk4 = 0x07000000; + temp_v0_3->unk0 = 0xF5900000; + temp_v0_4 = gDisplayListHead; + gDisplayListHead = temp_v0_4 + 8; + temp_v0_4->unk4 = 0; + temp_v0_4->unk0 = 0xE6000000; + temp_v0_5 = gDisplayListHead; + gDisplayListHead = temp_v0_5 + 8; + temp_v0_5->unk4 = 0x071FF200; + temp_v0_5->unk0 = 0xF3000000; + temp_v0_6 = gDisplayListHead; + gDisplayListHead = temp_v0_6 + 8; + temp_v0_6->unk4 = 0; + temp_v0_6->unk0 = 0xE7000000; + temp_v0_7 = gDisplayListHead; + gDisplayListHead = temp_v0_7 + 8; + temp_v0_7->unk4 = 0; + temp_v0_7->unk0 = 0xF5880800; + temp_v0_8 = gDisplayListHead; + gDisplayListHead = temp_v0_8 + 8; + sp1C = temp_v0_8; + temp_v0_8->unk4 = 0x7C07C; + temp_v0_8->unk0 = 0xF2000000; + func_8004B414((s16) ((arg2 >> 0x10) & 0xFF), (s16) ((arg2 >> 8) & 0xFF), (s16) (arg2 & 0xFF), arg3); + temp_v0_9 = gDisplayListHead; + gDisplayListHead = temp_v0_9 + 8; + temp_v0_9->unk0 = 0x06000000; + temp_v0_9->unk4 = &D_0D008E48; + D_80164AF0 += 1; +} +#else +GLOBAL_ASM("asm/non_matchings/code_80057C60/func_8006C4D4.s") +#endif + + +#ifdef MIPS_TO_C //generated by mips_to_c commit bd0364fa19633bd6201f8007e2d0a7ed87825909 ? func_8005DA30(s16, s32, s8, s32); /* extern */ ? func_8005DAF4(s16, s32, s8, s32); /* extern */ diff --git a/src/code_80071F00.c b/src/code_80071F00.c index 210314349..56d9eab0f 100644 --- a/src/code_80071F00.c +++ b/src/code_80071F00.c @@ -465,6 +465,11 @@ void func_800729EC(s32 arg0) { #else GLOBAL_ASM("asm/non_matchings/code_80071F00/func_800729EC.s") #endif +extern struct struct_E0 D_80165CEA[]; +UNUSED void func_80072A78(s32 arg0, s32 arg1) { + D_80165CEA[arg0].unk00.s8 = arg1; + func_80072488(arg0); +} s32 func_80072AAC(s32 arg0, s32 arg1, s32 arg2) { s32 phi_v1; @@ -2579,6 +2584,41 @@ s32 func_80076828(s32 arg0, s32 arg1) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80076828.s") #endif + +#ifdef MIPS_TO_C +UNUSED void func_80076884(s32 arg0) { + s32 temp_v0; + s32 var_s0; + void *var_s2; + + temp_v0 = random_int(0xF); + switch (arg0) { /* irregular */ + default: + var_s2 = sp28; + break; + case 0: + var_s2 = (temp_v0 * 6) + &D_800E5740; + break; + case 1: + var_s2 = (temp_v0 * 6) + &D_800E579C; + break; + case 2: + var_s2 = (temp_v0 * 6) + &D_800E57F8; + break; + } + var_s0 = 0; +loop_8: + var_s0 += 1; + if (func_80076828(var_s2, var_s0) != -1) { + if (var_s0 != 1) { + goto loop_8; + } + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80076884.s") +#endif + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80072488(s32); // extern @@ -2687,6 +2727,10 @@ void func_80076AEC(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80076AEC.s") #endif +void func_80076B7C(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_80072100(s32 *); // extern @@ -4018,6 +4062,10 @@ void func_80078A44(s32 arg0, s32 arg1, s32 arg2) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80078A44.s") #endif +UNUSED void func_80078C68() { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit bd0364fa19633bd6201f8007e2d0a7ed87825909 ? func_80078170(s32, s32, s32); /* extern */ @@ -5179,6 +5227,10 @@ void func_8007A778(s32 arg0, void *arg1, void *arg2) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_8007A778.s") #endif +UNUSED void func_8007A884(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800790E4(); // extern @@ -6364,6 +6416,10 @@ void func_8007C420(s32 arg0, void *arg1, s32 arg2) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_8007C420.s") #endif +UNUSED void func_8007C49C(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800721C0(?, s32); // extern @@ -6869,6 +6925,87 @@ GLOBAL_ASM("asm/non_matchings/code_80071F00/func_8007CEDC.s") #endif #ifdef MIPS_TO_C +void func_8007D070(void) { + f32 sp44; + ? *var_s2; + f32 temp_f2; + f32 temp_f4; + f32 temp_f6; + s16 temp_s2; + s16 temp_v1; + s32 temp_s1; + s32 temp_s1_2; + s32 temp_s1_3; + s32 temp_s3; + s32 temp_t2; + s32 temp_t5; + s32 var_v0; + void *temp_a1; + void *temp_s0; + void *temp_s0_2; + + var_v0 = 0; + if ((D_8016559C == 0) && (D_8018D2A4 != 0)) { + temp_v1 = D_8018CF68; + if ((temp_v1 < 0x1D) && (*(&D_800E5DB4 + temp_v1) == 1)) { + if ((&D_80165C18 + (D_8018C1D8 * 0xE0))->unkA6 != 0) { +loop_5: + var_v0 += 1; + if (var_v0 != 0x1E) { + if ((&D_80165C18 + ((&D_8018C1B0 + (var_v0 * 4))->unk28 * 0xE0))->unkA6 != 0) { + goto loop_5; + } + } + } + temp_s1 = (&D_8018C1B0 + (var_v0 * 4))->unk28; + if (var_v0 != 0x1E) { + temp_s0 = &D_80165C18 + (temp_s1 * 0xE0); + if (temp_s0->unkA6 == 0) { + func_800723A4(temp_s1, 1); + temp_s2 = random_int(0x12C); + temp_s3 = (random_int(0x1000) - 0x800) & 0xFFFF; + temp_t5 = (random_int(0xF) - 5) << 0x10; + temp_s0->unkC0 = (s16) (D_8018CF1C->unk2E + 0x8000); + temp_t2 = (D_8018CF14->unk26 + temp_s3) & 0xFFFF; + temp_s1_2 = temp_t2; + temp_f2 = (f32) temp_s2; + temp_f6 = sins(temp_t2 & 0xFFFF) * temp_f2; + sp44 = temp_f2; + temp_s0->unk14 = (f32) (temp_t5 >> 0x10); + temp_s0->unk10 = (f32) (temp_f6 + D_8018CF1C->unk14); + temp_f4 = coss(temp_s1_2 & 0xFFFF) * temp_f2; + temp_s0->unk80 = &D_800E5D54; + temp_s0->unk18 = (f32) (temp_f4 + D_8018CF1C->unk1C); + } + } + } + } + var_s2 = &D_8018C1B0; + do { + temp_s1_3 = var_s2->unk28; + temp_s0_2 = &D_80165C18 + (temp_s1_3 * 0xE0); + if (temp_s0_2->unkA6 != 0) { + func_8007CEDC(temp_s1_3); + func_8008B724(temp_s1_3); + temp_a1 = D_8018CF1C; + temp_s0_2->unk4 = (f32) (temp_s0_2->unk28 + temp_s0_2->unk10); + temp_s0_2->unk8 = (f32) (temp_s0_2->unk2C + (temp_a1->unk74 + temp_s0_2->unk14)); + temp_s0_2->unkC = (f32) (temp_s0_2->unk30 + temp_s0_2->unk18); + func_8007C420(temp_s1_3, temp_a1, D_8018CF14); + if (func_8007223C(temp_s1_3, 0x80) != 0) { + temp_s0_2->unk74 = &D_800E44B0; + } else { + temp_s0_2->unk74 = &D_800E4470; + } + } + var_s2 += 4; + } while (var_s2 != &D_8018C228); +} +#else +GLOBAL_ASM("asm/non_matchings/code_80071F00/func_8007D070.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 s16 func_80041770(f32, f32, f32, f32); // extern ? func_8008B80C(s32, ?, ?, ?); // extern @@ -11923,6 +12060,10 @@ void func_80084D2C(s32 arg0, s32 arg1) { GLOBAL_ASM("asm/non_matchings/code_80071F00/func_80084D2C.s") #endif +void func_80085024(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800873F4(s32); // extern diff --git a/src/code_80086E70.c b/src/code_80086E70.c index 7ff30fd0b..bb261d2d5 100644 --- a/src/code_80086E70.c +++ b/src/code_80086E70.c @@ -1668,6 +1668,29 @@ GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008A1D0.s") #endif #ifdef MIPS_TO_C +void func_8008A2CC(s32 arg0, s32 arg1, u16 arg2) { + Camera sp1C; + u16 var_a2; + // camera1[arg1]? m2c said this, but makes no sense. camera1->unk000 = arg1? would make sense. + sp1C = cameras[arg1]; + func_800721E8(0x40000); + if (sp18 < 0x2711U) { + var_a2 = 0x5555; + } else { + var_a2 = arg2; + if (sp18 < 0x9C41U) { + var_a2 = 0x4000; + } + } + if (func_8008A140(arg0, sp1C, var_a2) != 0) { + func_800721C0(arg0, 0x40000); + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008A2CC.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800721C0(s32, ?); // extern ? func_800721E8(?); // extern @@ -1775,6 +1798,28 @@ GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008A4CC.s") #endif #ifdef MIPS_TO_C +void func_8008A610(s32 arg0) { + s32 var_s0; + s32 var_s1; + + func_800721E8(0x40000); + var_s0 = camera1; + var_s1 = 0; + if (gPlayerCountSelection1 > 0) { + do { + if ((((arg0 * 0xE0) + &D_80165C18)->unkA6 != 0) && (func_8008A140(arg0, var_s0, 0x2AAB) != 0)) { + func_800721C0(arg0, 0x40000); + } + var_s1 += 1; + var_s0 += 0xB8; + } while (var_s1 < gPlayerCountSelection1); + } +} +#else +GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008A610.s") +#endif + +#ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800721C0(s32, ?); // extern ? func_800721E8(?); // extern @@ -1815,6 +1860,27 @@ void func_8008A6DC(s32 arg0, f32 arg1) { #else GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008A6DC.s") #endif +void func_8008A6DC(s32, f32); +UNUSED void func_8008A810(s32 arg0) { + func_8008A6DC(arg0, 500.0f); +} + +UNUSED void func_8008A830(s32 arg0) { + func_8008A6DC(arg0, 1000.0f); +} + +UNUSED void func_8008A850(s32 arg0) { + func_8008A6DC(arg0, 2000.0f); +} + +struct struct_8008A870 { + s8 unk0[0x119]; + u16 unk11A; +}; + +UNUSED s32 func_8008A870(struct struct_8008A870 *arg0) { + return func_802ABD40(arg0->unk11A); +} s32 func_8008A890(struct UnkStruct8008A890 *arg0) { return func_802ABD40(arg0->value); @@ -1949,6 +2015,55 @@ void func_8008AB10(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008AB10.s") #endif +extern struct struct_E0 D_80165CC6[]; +UNUSED void func_8008ABC0(s32 arg0) { + switch (D_80165CC6[arg0].unk00.s16) { + case 1: + func_8008AA3C(); + break; + case 2: + func_8008AB10(); + break; + case 3: + func_80086F60(arg0); + /* fallthrough */ + case 0: + break; + } +} + +UNUSED void func_8008AC40(s32 arg0) { + switch (D_80165CC6[arg0].unk00.s16) { + case 1: + func_8008AA3C(); + break; + case 2: + func_8008AB10(); + break; + case 3: + func_8008701C(arg0, 1); + /* fallthrough */ + case 0: + break; + } +} + +UNUSED void func_8008ACC0(void) { + +} + +UNUSED void func_8008ACC8(void) { + +} + +UNUSED void func_8008ACD0(void) { + +} + +UNUSED void func_8008ACD8(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern f64 D_800EF4F8; @@ -1975,6 +2090,14 @@ void func_8008ACE0(void *arg0, f32 arg1) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008ACE0.s") #endif +UNUSED void func_8008ADC0(void) { + +} + +UNUSED void func_8008ADC8(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 void func_8008ADD0(void *arg0, f32 arg1) { @@ -1996,6 +2119,14 @@ void func_8008ADD0(void *arg0, f32 arg1) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008ADD0.s") #endif +UNUSED void func_8008AE8C(void) { + +} + +UNUSED void func_8008AE94(void) { + +} + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern ? D_80165760; @@ -2024,19 +2155,28 @@ void func_8008AE9C(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008AE9C.s") #endif -#ifdef MIPS_TO_C -//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_8008ADD0(?, ? *, ?); // extern -? func_8008AE9C(s32); // extern -extern ? D_80183DC8; - -void func_8008AFE0(s32 arg0, ? arg1) { - func_8008ADD0(arg1, &D_80183DC8, arg1); +extern s32 D_80183DC8; +void func_8008ADD0(s32, f32); +void func_8008AFE0(s32 arg0, f32 arg1) { + func_8008ADD0(&D_80183DC8, arg1); func_8008AE9C(arg0); } -#else -GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008AFE0.s") -#endif + +UNUSED void func_8008B018(void) { + +} + +UNUSED void func_8008B020(void) { + +} + +UNUSED void func_8008B028(void) { + +} + +UNUSED void func_8008B030(void) { + +} #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 @@ -2066,19 +2206,28 @@ void func_8008B038(s32 arg0) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008B038.s") #endif -#ifdef MIPS_TO_C -//generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 -? func_8008ACE0(?, ? *, ?); // extern -? func_8008B038(s32); // extern -extern ? D_80183DA8; - -void func_8008B17C(s32 arg0, ? arg1) { - func_8008ACE0(arg1, &D_80183DA8, arg1); +extern s32 D_80183DA8; +void func_8008ACE0(s32,f32); +void func_8008B17C(s32 arg0, f32 arg1) { + func_8008ACE0(&D_80183DA8, arg1); func_8008B038(arg0); } -#else -GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008B17C.s") -#endif + +UNUSED void func_8008B1B4(void) { + +} + +UNUSED void func_8008B1BC(void) { + +} + +UNUSED void func_8008B1C4(void) { + +} + +UNUSED void func_8008B1CC(void) { + +} #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 @@ -2454,6 +2603,38 @@ void func_8008BAB4(s32 arg0, s16 arg1, u16 arg2) { GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008BAB4.s") #endif +/* +UNUSED void func_8008BB28(s32 arg0, s16 arg1, u16 arg2) { + *(&D_80165C30 + (arg0 * 0xE0)) = (f32) (arg1 + (s16) (random_int(arg2) - ((s32) arg2 / 2))); +} + +UNUSED void func_8008BB9C(s32 arg0, s16 arg1, s16 arg2, u16 arg3, u16 arg4) { + s16 sp1E; + s32 temp_v0; + void *temp_v1; + + sp1E = random_int(arg3) - ((s32) arg3 / 2); + temp_v0 = random_int(arg4); + temp_v1 = (arg0 * 0xE0) + &D_80165C18; + temp_v1->unk10 = (f32) (arg1 + sp1E); + temp_v1->unk14 = (f32) (arg2 + (s16) (temp_v0 - ((s32) arg4 / 2))); +} + +UNUSED void func_8008BC58(s32 arg0, s16 arg1, s16 arg2, u16 arg3, u16 arg4) { + s16 sp1E; + s32 temp_v0; + void *temp_v1; + + sp1E = random_int(arg3) - ((s32) arg3 / 2); + temp_v0 = random_int(arg4); + temp_v1 = (arg0 * 0xE0) + &D_80165C18; + temp_v1->unk10 = (f32) (arg1 + sp1E); + temp_v1->unk18 = (f32) (arg2 + (s16) (temp_v0 - ((s32) arg4 / 2))); +} +*/ +GLOBAL_ASM("asm/non_matchings/code_80086E70/func_8008BB28.s") + + #ifdef MIPS_TO_C //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 extern ? D_80165C18; diff --git a/src/code_80091750.c b/src/code_80091750.c index db02a30c2..ccfad1d77 100644 --- a/src/code_80091750.c +++ b/src/code_80091750.c @@ -11575,8 +11575,8 @@ extern ? D_800E7380; extern ? D_800E7720; extern ? D_800F0C7C; extern f32 D_800F1F24; -extern s32 D_8015F8B8; -extern s32 D_8015F8C4; +extern s32 gNmiUnknown1; +extern s32 gNmiUnknown4; extern s32 gGlobalTimer; void func_800A69C8(s32 arg0) { @@ -11610,13 +11610,13 @@ void func_800A69C8(s32 arg0) { if (phi_s0 != gPlayerWinningIndex) { phi_v1 = 1; } - phi_s4 = D_8015F8C4 + phi_s0; + phi_s4 = gNmiUnknown4 + phi_s0; } } else { if (gPlayerPositions[phi_s0] != 0) { phi_v1 = 1; } - phi_s4 = D_8015F8B8 + phi_s0; + phi_s4 = gNmiUnknown1 + phi_s0; } temp_s3 = *(&D_800E7720 + (phi_v1 * 4)); if (phi_v1 != 0) { @@ -11645,8 +11645,8 @@ GLOBAL_ASM("asm/non_matchings/code_80091750/func_800A69C8.s") //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800A6D94(s32, s32, s32); // extern ? func_800A6E94(s32, s32, s32); // extern -extern s32 D_8015F8BC; -extern s32 D_8015F8C8; +extern s32 gNmiUnknown2; +extern s32 gNmiUnknown5; void func_800A6BEC(s32 arg0) { s32 temp_s0; @@ -11665,11 +11665,11 @@ void func_800A6BEC(s32 arg0) { if (temp_v0 != BATTLE) { } else { - func_800A6D94(3, phi_s0, D_8015F8C8); + func_800A6D94(3, phi_s0, gNmiUnknown5); goto block_7; } } else { - func_800A6E94(3, phi_s0, D_8015F8BC); + func_800A6E94(3, phi_s0, gNmiUnknown2); block_7: phi_v1 = D_8018EDF3; } @@ -11686,8 +11686,8 @@ GLOBAL_ASM("asm/non_matchings/code_80091750/func_800A6BEC.s") //generated by mips_to_c commit 3c3b0cede1a99430bfd3edf8d385802b94f91307 ? func_800A6D94(?, s32, s32); // extern ? func_800A6E94(?, s32, s32); // extern -extern s32 D_8015F8C0; -extern s32 D_8015F8CC; +extern s32 gNmiUnknown3; +extern s32 gNmiUnknown6; void func_800A6CC0(s32 arg0) { s32 temp_s0; @@ -11706,11 +11706,11 @@ void func_800A6CC0(s32 arg0) { if (temp_v0 != BATTLE) { } else { - func_800A6D94(4, phi_s0, D_8015F8CC); + func_800A6D94(4, phi_s0, gNmiUnknown6); goto block_7; } } else { - func_800A6E94(4, phi_s0, D_8015F8C0); + func_800A6E94(4, phi_s0, gNmiUnknown3); block_7: phi_v1 = D_8018EDF3; } diff --git a/src/main.c b/src/main.c index abf1f7729..697cca724 100644 --- a/src/main.c +++ b/src/main.c @@ -38,7 +38,7 @@ struct VblankHandler *gVblankHandler2 = NULL; struct SPTask *gActiveSPTask = NULL; struct SPTask *sCurrentAudioSPTask = NULL; struct SPTask* sCurrentDisplaySPTask = NULL; -struct SPTask* D_800DC4B4 = NULL; +struct SPTask* sNextAudioSPTask = NULL; struct SPTask* sNextDisplaySPTask = NULL; @@ -72,15 +72,15 @@ struct GfxPool gGfxPools[2]; struct GfxPool *gGfxPool; s32 gfxPool_padding; // is this necessary? -struct VblankHandler D_8014EF48; +struct VblankHandler gGameVblankHandler; struct VblankHandler sSoundVblankHandler; -OSMesgQueue gDmaMesgQueue, D_8014EF70, D_8014EF88, unused_gMsgQueue, gIntrMesgQueue, D_8014EFD0; +OSMesgQueue gDmaMesgQueue, gGameVblankQueue, gGfxVblankQueue, unused_gMsgQueue, gIntrMesgQueue, gSPTaskMesgQueue; OSMesgQueue sSoundMesgQueue; -OSMesg sSoundMesgBuf; -OSMesg D_8014F004, D_8014F008; -OSMesg D_8014F00C[1]; +OSMesg sSoundMesgBuf[1]; +OSMesg gDmaMesgBuf[1], gGameMesgBuf; +OSMesg gGfxMesgBuf[1]; UNUSED OSMesg D_8014F010, D_8014F014; -OSMesg D_8014F018[16], D_8014F058[16]; +OSMesg gIntrMesgBuf[16], gSPTaskMesgBuf[16]; OSMesg gMainReceivedMesg; OSIoMesg gDmaIoMesg; OSMesgQueue gSIEventMesgQueue; @@ -96,7 +96,7 @@ u16 gNumActors; u16 D_80150112; s32 D_80150114; f32 D_80150118; -u16 D_8015011C; +u16 wasSoftReset; u16 D_8015011E; s32 D_80150120; @@ -138,19 +138,19 @@ OSThread gVideoThread; ALIGNED8 u8 gVideoThreadStack[0x2000]; OSThread D_80156820; ALIGNED8 u8 D_8015680_Stack[0x2000]; -OSThread D_801589D0; -ALIGNED8 u8 D_801589D0_Stack[0x2000]; -OSThread D_8015AB80; -ALIGNED8 u8 D_8015AB80_Stack[0x2000]; +OSThread gGameLoopThread; +ALIGNED8 u8 gGameLoopThreadStack[0x2000]; +OSThread gAudioThread; +ALIGNED8 u8 gAudioThreadStack[0x2000]; OSThread D_8015CD30; ALIGNED8 u8 D_8015CD30_Stack[0x1000]; u8 gGfxSPTaskYieldBuffer[4352]; u32 gGfxSPTaskStack[256]; -OSMesg D_8015F3E0[32]; -OSMesgQueue D_8015F460; +OSMesg gPIMesgBuf[32]; +OSMesgQueue gPIMesgQueue; -s32 D_800DC50C = 0xffff; +s32 D_800DC50C = 0xFFFF; u16 D_800DC510 = 0; u16 D_800DC514 = 0; u16 D_800DC518 = 0; @@ -239,12 +239,14 @@ void create_thread(OSThread *thread, OSId id, void (*entry)(void *), void *arg, void main_func(void) { osInitialize(); - //! Why is this using the gVideoThread as idle stack? - create_thread(&gIdleThread, 1, thread1_idle, NULL, &gVideoThread, 100); + create_thread(&gIdleThread, 1, &thread1_idle, NULL, gIdleThreadStack + ARRAY_COUNT(gIdleThreadStack), 100); osStartThread(&gIdleThread); } -void thread1_idle(void *arg0) { +/** + * Initialize hardware, start main thread, then idle. + */ +void thread1_idle(void *arg) { osCreateViManager(OS_PRIORITY_VIMGR); if (osTvType == TV_TYPE_NTSC) { osViSetMode(&osViModeTable[OS_VI_NTSC_LAN1]); @@ -253,25 +255,25 @@ void thread1_idle(void *arg0) { } osViBlack(TRUE); osViSetSpecialFeatures(OS_VI_GAMMA_OFF); - osCreatePiManager(OS_PRIORITY_PIMGR, &D_8015F460, &D_8015F3E0, 0x20); - D_8015011C = (s16) osResetType; + osCreatePiManager(OS_PRIORITY_PIMGR, &gPIMesgQueue, gPIMesgBuf, ARRAY_COUNT(gPIMesgBuf)); + wasSoftReset = (s16) osResetType; create_debug_thread(); start_debug_thread(); - create_thread(&gVideoThread, 3, &thread3_video, arg0, &D_80156820, 100); + create_thread(&gVideoThread, 3, &thread3_video, arg, gVideoThreadStack + ARRAY_COUNT(gVideoThreadStack), 100); osStartThread(&gVideoThread); osSetThreadPri(NULL, 0); // halt - while (1); + while (TRUE); } void setup_mesg_queues(void) { - osCreateMesgQueue(&gDmaMesgQueue, &D_8014F004, 1); - osCreateMesgQueue(&D_8014EFD0, &D_8014F058, 0x10); - osCreateMesgQueue(&gIntrMesgQueue, &D_8014F018, 0x10); - osViSetEvent(&gIntrMesgQueue, (OSMesg) 0x66, 1); - osSetEventMesg(4, &gIntrMesgQueue, (OSMesg) 0x64); - osSetEventMesg(9, &gIntrMesgQueue, (OSMesg) 0x65); + osCreateMesgQueue(&gDmaMesgQueue, gDmaMesgBuf, ARRAY_COUNT(gDmaMesgBuf)); + osCreateMesgQueue(&gSPTaskMesgQueue, gSPTaskMesgBuf, ARRAY_COUNT(gSPTaskMesgBuf)); + osCreateMesgQueue(&gIntrMesgQueue, gIntrMesgBuf, ARRAY_COUNT(gIntrMesgBuf)); + osViSetEvent(&gIntrMesgQueue, (OSMesg) MESG_VI_VBLANK, 1); + osSetEventMesg(OS_EVENT_SP, &gIntrMesgQueue, (OSMesg) MESG_SP_COMPLETE); + osSetEventMesg(OS_EVENT_DP, &gIntrMesgQueue, (OSMesg) MESG_DP_COMPLETE); } void start_sptask(s32 taskType) { @@ -285,10 +287,12 @@ void start_sptask(s32 taskType) { gActiveSPTask->state = SPTASK_STATE_RUNNING; } -// Most similar to create_task_structure from SM64, with additional provisions -// to load both F3DEX and F3DLX, depending on the number of players -void func_800006E8(void) { - gGfxSPTask->msgqueue = &D_8014EF88; +/** + * Initializes the Fast3D OSTask structure. + * Loads F3DEX or F3DLX based on the number of players + **/ +void create_gfx_task_structure(void) { + gGfxSPTask->msgqueue = &gGfxVblankQueue; gGfxSPTask->msg = (OSMesg) 2; gGfxSPTask->task.t.type = M_GFXTASK; gGfxSPTask->task.t.flags = (1 << 1); @@ -321,58 +325,58 @@ void init_controllers(void) { osSetEventMesg(OS_EVENT_SI, &gSIEventMesgQueue, (OSMesg) 0x33333333); osContInit(&gSIEventMesgQueue, &gControllerBits, &gControllerStatuses); if ((gControllerBits & 1) == 0) { - sController1Unplugged = TRUE; - return; + sIsController1Unplugged = TRUE; + } else { + sIsController1Unplugged = FALSE; } - sController1Unplugged = FALSE; } -void func_80000934(s32 arg0) { - struct Controller *controller = &gControllers[arg0]; - u16 phi_a0; +void update_controller(s32 index) { + struct Controller *controller = &gControllers[index]; + u16 stick; - if (sController1Unplugged != 0) { + if (sIsController1Unplugged) { return; } - controller->rawStickX = gControllerPads[arg0].stick_x; - controller->rawStickY = gControllerPads[arg0].stick_y; + controller->rawStickX = gControllerPads[index].stick_x; + controller->rawStickY = gControllerPads[index].stick_y; - if ((gControllerPads[arg0].button & 4) != 0) { - gControllerPads[arg0].button |= Z_TRIG; + if ((gControllerPads[index].button & 4) != 0) { + gControllerPads[index].button |= Z_TRIG; } - controller->buttonPressed = gControllerPads[arg0].button & (gControllerPads[arg0].button ^ controller->button); - controller->buttonDepressed = controller->button & (gControllerPads[arg0].button ^ controller->button); - controller->button = gControllerPads[arg0].button; + controller->buttonPressed = gControllerPads[index].button & (gControllerPads[index].button ^ controller->button); + controller->buttonDepressed = controller->button & (gControllerPads[index].button ^ controller->button); + controller->button = gControllerPads[index].button; - phi_a0 = 0; + stick = 0; if (controller->rawStickX < -50) { - phi_a0 |= L_JPAD; + stick |= L_JPAD; } if (controller->rawStickX > 50) { - phi_a0 |= R_JPAD; + stick |= R_JPAD; } if (controller->rawStickY < -50) { - phi_a0 |= D_JPAD; + stick |= D_JPAD; } if (controller->rawStickY > 50) { - phi_a0 |= U_JPAD; + stick |= U_JPAD; } - controller->stickPressed = phi_a0 & (phi_a0 ^ controller->stickDirection); - controller->stickDepressed = controller->stickDirection & (phi_a0 ^ controller->stickDirection); - controller->stickDirection = phi_a0; + controller->stickPressed = stick & (stick ^ controller->stickDirection); + controller->stickDepressed = controller->stickDirection & (stick ^ controller->stickDirection); + controller->stickDirection = stick; } void read_controllers(void) { - OSMesg sp1C; + OSMesg msg; osContStartReadData(&gSIEventMesgQueue); - osRecvMesg(&gSIEventMesgQueue, &sp1C, 1); + osRecvMesg(&gSIEventMesgQueue, &msg, OS_MESG_BLOCK); osContGetReadData(&gControllerPads); - func_80000934(0); - func_80000934(1); - func_80000934(2); - func_80000934(3); + update_controller(0); + update_controller(1); + update_controller(2); + update_controller(3); gControllerFive->button = (s16) (((gControllerOne->button | gControllerTwo->button) | gControllerThree->button) | gControllerFour->button); gControllerFive->buttonPressed = (s16) (((gControllerOne->buttonPressed | gControllerTwo->buttonPressed) | gControllerThree->buttonPressed) | gControllerFour->buttonPressed); gControllerFive->buttonDepressed = (s16) (((gControllerOne->buttonDepressed | gControllerTwo->buttonDepressed) | gControllerThree->buttonDepressed) | gControllerFour->buttonDepressed); @@ -385,14 +389,12 @@ void func_80000BEC(void) { D_801502B4 = VIRTUAL_TO_PHYSICAL(&gZBuffer); } -// send_sp_task_message from SM64 -void func_80000C0C(OSMesg arg0) { +void dispatch_audio_sptask(struct SPTask *spTask) { osWritebackDCacheAll(); - osSendMesg(&D_8014EFD0, arg0, OS_MESG_NOBLOCK); + osSendMesg(&gSPTaskMesgQueue, spTask, OS_MESG_NOBLOCK); } -// similar to send_display_list from SM64 -void send_display_list(struct SPTask *spTask) { +void exec_display_list(struct SPTask *spTask) { osWritebackDCacheAll(); spTask->state = SPTASK_STATE_NOT_STARTED; if (sCurrentDisplaySPTask == NULL) { @@ -413,12 +415,13 @@ void func_80000CA8(void) { func_802A3CB0(); } -// Similar to end_master_display_list in SM64 -void func_80000CE8(void) { +/** + * End the master display list and initialize the graphics task structure for the next frame to be rendered. + */ +void end_master_display_list(void) { gDPFullSync(gDisplayListHead++); gSPEndDisplayList(gDisplayListHead++); - - func_800006E8(); + create_gfx_task_structure(); } // clear_frame_buffer from SM64, with a few edits @@ -445,8 +448,8 @@ void rendering_init(void) { gDisplayListHead = gGfxPool->gfxPool; func_80000CA8(); clear_framebuffer(0); - func_80000CE8(); - send_display_list(&gGfxPool->spTask); + end_master_display_list(); + exec_display_list(&gGfxPool->spTask); sRenderingFramebuffer++; gGlobalTimer++; } @@ -458,15 +461,21 @@ void config_gfx_pool(void) { gGfxSPTask = &gGfxPool->spTask; } +/** + * Send current master display list for rendering. + * Tell the VI which colour framebuffer to display. + * Yields to the VI framerate twice, locking the game at 30 FPS. + * Selects the next framebuffer to be rendered and displayed. + */ void display_and_vsync(void) { - profiler_log_thread5_time(2); - osRecvMesg(&D_8014EF88, &gMainReceivedMesg, 1); - send_display_list(&gGfxPool->spTask); - profiler_log_thread5_time(3); - osRecvMesg(&D_8014EF70, &gMainReceivedMesg, 1); + profiler_log_thread5_time(BEFORE_DISPLAY_LISTS); + osRecvMesg(&gGfxVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); + exec_display_list(&gGfxPool->spTask); + profiler_log_thread5_time(AFTER_DISPLAY_LISTS); + osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); osViSwapBuffer((void *) PHYSICAL_TO_VIRTUAL(gPhysicalFramebuffers[sRenderedFramebuffer])); - profiler_log_thread5_time(4); - osRecvMesg(&D_8014EF70, &gMainReceivedMesg, 1); + profiler_log_thread5_time(THREAD5_END); + osRecvMesg(&gGameVblankQueue, &gMainReceivedMesg, OS_MESG_BLOCK); crash_screen_set_framebuffer(gPhysicalFramebuffers[sRenderedFramebuffer]); if (++sRenderedFramebuffer == 3) { sRenderedFramebuffer = 0; @@ -477,7 +486,7 @@ void display_and_vsync(void) { gGlobalTimer++; } -void func_8000105C(void) { +void init_seg_80280000(void) { bzero(SEG_80280000, 0xDF00); osWritebackDCacheAll(); dma_copy(SEG_80280000, &_code_80280000SegmentRomStart, ALIGN16((u32)&_code_80280000SegmentRomEnd - (u32)&_code_80280000SegmentRomStart)); @@ -485,7 +494,7 @@ void func_8000105C(void) { osInvalDCache(SEG_80280000, 0xDF00); } -void func_800010CC(void) { +void init_seg_8028DF00(void) { bzero(SEG_8028DF00, 0x2C470); osWritebackDCacheAll(); dma_copy(SEG_8028DF00, &_code_8028DF00SegmentRomStart, ALIGN16((u32)&_code_8028DF00SegmentRomEnd - (u32)&_code_8028DF00SegmentRomStart)); @@ -518,20 +527,20 @@ void init_game(void) { s32 sp38; UNUSED s32 unknown_padding; - func_800010CC(); + init_seg_8028DF00(); gHeapEndPtr = SEG_8028DF00; set_segment_base_addr(0, 0x80000000); func_802A7CF0(&D_801978D0, 0x80242F00); func_80000BEC(); osInvalDCache(SEG_802BA370, 0x5810); osPiStartDma(&gDmaIoMesg, 0, 0, &_data_802BA370SegmentRomStart, SEG_802BA370, 0x5810, &gDmaMesgQueue); - osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1); + osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK); set_segment_base_addr(2, func_802A7D70(&_data_segment2SegmentRomStart, &_data_segment2SegmentRomEnd)); sp2C = (u32)&_common_texturesSegmentRomEnd - (u32)&_common_texturesSegmentRomStart; sp2C = ALIGN16(sp2C); texture_seg = SEG_8028DF00-sp2C; osPiStartDma(&gDmaIoMesg, 0, 0, &_common_texturesSegmentRomStart, texture_seg, sp2C, &gDmaMesgQueue); - osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, 1); + osRecvMesg(&gDmaMesgQueue, &gMainReceivedMesg, OS_MESG_BLOCK); sp40 = *(u32 *)(texture_seg + 4); sp40 = ALIGN16(sp40); @@ -597,7 +606,7 @@ void func_8000142C(void) { } func_8005A070(); sNumVBlanks = 0; - profiler_log_thread5_time(1); + profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); D_8015F788 = 0; func_802A59A4(); if (gEnableDebugMode == 0) { @@ -662,7 +671,7 @@ void func_8000142C(void) { func_80022744(); } func_8005A070(); - profiler_log_thread5_time(1); + profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); sNumVBlanks = 0; move_segment_table_to_dmem(); func_802A3E3C(); @@ -707,7 +716,7 @@ void func_8000142C(void) { } func_80022744(); } - profiler_log_thread5_time(1); + profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); sNumVBlanks = (u16)0; func_8005A070(); move_segment_table_to_dmem(); @@ -780,7 +789,7 @@ void func_8000142C(void) { } func_8005A070(); sNumVBlanks = 0; - profiler_log_thread5_time(1); + profiler_log_thread5_time(LEVEL_SCRIPT_EXECUTE); move_segment_table_to_dmem(); func_802A3E3C(); if (D_800DC5B0 != 0) { @@ -870,42 +879,41 @@ void interrupt_gfx_sptask(void) { } } -void func_80001FAC(void) { +void receive_new_tasks(void) { s32 pad; - struct SPTask *sp40; + struct SPTask *spTask; - while(osRecvMesg(&D_8014EFD0, &sp40, 0) != -1) { - sp40->state = 0; - switch(sp40->task.t.type) { + while(osRecvMesg(&gSPTaskMesgQueue, (OSMesg *) &spTask, OS_MESG_NOBLOCK) != -1) { + spTask->state = SPTASK_STATE_NOT_STARTED; + switch(spTask->task.t.type) { case 2: - D_800DC4B4 = sp40; + sNextAudioSPTask = spTask; break; case 1: - sNextDisplaySPTask = sp40; + sNextDisplaySPTask = spTask; break; } } - if (sCurrentAudioSPTask == 0 && D_800DC4B4 != 0) { - sCurrentAudioSPTask = D_800DC4B4; - D_800DC4B4 = 0; + if (sCurrentAudioSPTask == NULL && sNextAudioSPTask != NULL) { + sCurrentAudioSPTask = sNextAudioSPTask; + sNextAudioSPTask = NULL; } - if (sCurrentDisplaySPTask == 0 && sNextDisplaySPTask != 0) { + if (sCurrentDisplaySPTask == NULL && sNextDisplaySPTask != NULL) { sCurrentDisplaySPTask = sNextDisplaySPTask; - sNextDisplaySPTask = 0; + sNextDisplaySPTask = NULL; } } -// likely set_vblank_handler from SM64 -void func_800020D8(s32 arg0, struct VblankHandler *arg1, OSMesgQueue *arg2, OSMesg *arg3) { - arg1->queue = arg2; - arg1->msg = arg3; - switch (arg0) { +void set_vblank_handler(s32 index, struct VblankHandler *handler, OSMesgQueue *queue, OSMesg *msg) { + handler->queue = queue; + handler->msg = msg; + switch (index) { case 1: - gVblankHandler1 = arg1; + gVblankHandler1 = handler; break; case 2: - gVblankHandler2 = arg1; + gVblankHandler2 = handler; break; } } @@ -918,13 +926,17 @@ void start_gfx_sptask(void) { } } -// Similar to handle_vblank from SM64 -void func_80002168(void) { +void handle_vblank(void) { D_800DC594 += 0.01666666; sNumVBlanks++; - func_80001FAC(); + receive_new_tasks(); + // First try to kick off an audio task. If the gfx task is currently + // running, we need to asynchronously interrupt it -- handle_sp_complete + // will pick up on what we're doing and start the audio task for us. + // If there is already an audio task running, there is nothing to do. + // If there is no audio task available, try a gfx task instead. if (sCurrentAudioSPTask != NULL) { if (gActiveSPTask != NULL) { interrupt_gfx_sptask(); @@ -934,22 +946,28 @@ void func_80002168(void) { } } else { if (gActiveSPTask == NULL && sCurrentDisplaySPTask != NULL - && sCurrentDisplaySPTask->state != 3) { - profiler_log_gfx_time(0); - start_sptask(M_GFXTASK); - } - } + && sCurrentDisplaySPTask->state != SPTASK_STATE_FINISHED) { + profiler_log_gfx_time(TASKS_QUEUED); + start_sptask(M_GFXTASK); + } + } + + /* This is where I would put my rumble code... If I had any. */ + #if ENABLE_RUMBLE + rumble_thread_update_vi(); + #endif + if (gVblankHandler1 != NULL) { - osSendMesg(gVblankHandler1->queue, gVblankHandler1->msg, 0); + osSendMesg(gVblankHandler1->queue, gVblankHandler1->msg, OS_MESG_NOBLOCK); } if (gVblankHandler2 != NULL) { - osSendMesg(gVblankHandler2->queue, gVblankHandler2->msg, 0); + osSendMesg(gVblankHandler2->queue, gVblankHandler2->msg, OS_MESG_NOBLOCK); } } -// likely handle_dp_complete from SM64 -void func_80002284(void) { - if (sCurrentDisplaySPTask->msgqueue != 0) { +void handle_dp_complete(void) { + // Gfx SP task is completely done. + if (sCurrentDisplaySPTask->msgqueue != NULL) { osSendMesg(sCurrentDisplaySPTask->msgqueue, sCurrentDisplaySPTask->msg, OS_MESG_NOBLOCK); } profiler_log_gfx_time(RDP_COMPLETE); @@ -957,76 +975,83 @@ void func_80002284(void) { sCurrentDisplaySPTask = NULL; } -void *func_800022DC(void) { - struct SPTask *temp_a3 = gActiveSPTask; +void handle_sp_complete(void) { + struct SPTask *curSPTask = gActiveSPTask; gActiveSPTask = NULL; - if (temp_a3->state == 2) { - - if (osSpTaskYielded(temp_a3) == 0) { - temp_a3->state = 3; - profiler_log_gfx_time(1); + + if (curSPTask->state == SPTASK_STATE_INTERRUPTED) { + // handle_vblank tried to start an audio task while there was already a + // gfx task running, so it had to interrupt the gfx task. That interruption + // just finished. + if (osSpTaskYielded(curSPTask) == 0) { + // The gfx task completed before we had time to interrupt it. + // Mark it finished, just like below. + curSPTask->state = SPTASK_STATE_FINISHED; + profiler_log_gfx_time(RSP_COMPLETE); } + // Start the audio task, as expected by handle_vblank. profiler_log_vblank_time(); - start_sptask(2); + start_sptask(M_AUDTASK); } else { - temp_a3->state = 3; - if (temp_a3->task.t.type == 2) { - + curSPTask->state = SPTASK_STATE_FINISHED; + if (curSPTask->task.t.type == M_AUDTASK) { + // After audio tasks come gfx tasks. profiler_log_vblank_time(); - - if (sCurrentDisplaySPTask != 0) { - if (sCurrentDisplaySPTask->state != 3) { - if (sCurrentDisplaySPTask->state != 2) { - profiler_log_gfx_time(0); + if (sCurrentDisplaySPTask != NULL) { + if (sCurrentDisplaySPTask->state != SPTASK_STATE_FINISHED) { + if (sCurrentDisplaySPTask->state != SPTASK_STATE_INTERRUPTED) { + profiler_log_gfx_time(TASKS_QUEUED); } - start_sptask(1); + start_sptask(M_GFXTASK); } } - sCurrentAudioSPTask = 0; - if (temp_a3->msgqueue != 0) { - osSendMesg(temp_a3->msgqueue, temp_a3->msg, 0); + sCurrentAudioSPTask = NULL; + if (curSPTask->msgqueue != NULL) { + osSendMesg(curSPTask->msgqueue, curSPTask->msg, OS_MESG_NOBLOCK); } } else { - profiler_log_gfx_time(1); + // The SP process is done, but there is still a Display Processor notification + // that needs to arrive before we can consider the task completely finished and + // null out sCurrentDisplaySPTask. That happens in handle_dp_complete. + profiler_log_gfx_time(RSP_COMPLETE); } }; } void thread3_video(UNUSED void *arg0) { - s32 pad[2]; - OSMesg msg; - u64 *temp_v0; s32 i; - s32 pad2[2]; + u64 *framebuffer1; + OSMesg msg; + s32 pad[4]; gPhysicalFramebuffers[0] = (uintptr_t *) &gFramebuffer0; gPhysicalFramebuffers[1] = (uintptr_t *) &gFramebuffer1; gPhysicalFramebuffers[2] = (uintptr_t *) &gFramebuffer2; - temp_v0 = &gFramebuffer1; + framebuffer1 = &gFramebuffer1; for (i = 0; i < 19200; i++) { - temp_v0[i] = 0; + framebuffer1[i] = 0; } setup_mesg_queues(); init_game(); - create_thread(&D_8015AB80, 4, &thread4_audio, 0, &D_8015AB80_Stack[8192], 0x14); - osStartThread(&D_8015AB80); - create_thread(&D_801589D0, 5, &thread5_game_logic, 0, &D_801589D0_Stack[8192], 0xA); - osStartThread(&D_801589D0); + create_thread(&gAudioThread, 4, &thread4_audio, 0, gAudioThreadStack + ARRAY_COUNT(gAudioThreadStack), 20); + osStartThread(&gAudioThread); + create_thread(&gGameLoopThread, 5, &thread5_game_loop, 0, gGameLoopThreadStack + ARRAY_COUNT(gGameLoopThreadStack), 10); + osStartThread(&gGameLoopThread); - while (1) { + while (TRUE) { osRecvMesg(&gIntrMesgQueue, &msg, OS_MESG_BLOCK); switch ((u32) msg) { case MESG_VI_VBLANK: - func_80002168(); + handle_vblank(); break; case MESG_SP_COMPLETE: - func_800022DC(); + handle_sp_complete(); break; case MESG_DP_COMPLETE: - func_80002284(); + handle_dp_complete(); break; case MESG_START_GFX_SPTASK: start_gfx_sptask(); @@ -1061,88 +1086,94 @@ void func_80002658(void) { void func_80002684(void) { switch (D_800DC50C) { - case 0: + case START_MENU_FROM_QUIT: func_80002658(); - gCurrentlyLoadedCourseId = 255; + gCurrentlyLoadedCourseId = COURSE_NULL; break; - case 1: + case MAIN_MENU_FROM_QUIT: func_800025D4(); - gCurrentlyLoadedCourseId = 255; + gCurrentlyLoadedCourseId = COURSE_NULL; break; - case 2: + case PLAYER_SELECT_MENU_FROM_QUIT: func_80002600(); - gCurrentlyLoadedCourseId = 255; + gCurrentlyLoadedCourseId = COURSE_NULL; break; - case 3: + case COURSE_SELECT_MENU_FROM_QUIT: func_8000262C(); - gCurrentlyLoadedCourseId = 255; + gCurrentlyLoadedCourseId = COURSE_NULL; break; - case 4: - func_800010CC(); + case RACING: + init_seg_8028DF00(); func_80002A18(); break; - case 5: - gCurrentlyLoadedCourseId = 255; - func_8000105C(); + case ENDING_SEQUENCE: + gCurrentlyLoadedCourseId = COURSE_NULL; + init_seg_80280000(); load_ending_sequence_royalraceway(); break; - case 9: - gCurrentlyLoadedCourseId = 255; - func_800010CC(); - func_8000105C(); + case CREDITS_SEQUENCE: + gCurrentlyLoadedCourseId = COURSE_NULL; + init_seg_8028DF00(); + init_seg_80280000(); func_80280420(); break; } } -//extern u8 _networkSegmentRomStart; -void thread5_game_logic(s32 arg0) { - osCreateMesgQueue(&D_8014EF88, &D_8014F00C, 1); - osCreateMesgQueue(&D_8014EF70, &D_8014F008, 1); +void thread5_game_loop(UNUSED void *arg) { + osCreateMesgQueue(&gGfxVblankQueue, &gGfxMesgBuf, 1); + osCreateMesgQueue(&gGameVblankQueue, &gGameMesgBuf, 1); init_controllers(); - if (D_8015011C == 0) { - func_80003010(); + if (!wasSoftReset) { + clear_nmi_buffer(); } - func_800020D8(2, &D_8014EF48, &D_8014EF70, (OSMesg) 1); - D_8015F8B8 = (s32) D_800DC600; - D_8015F8BC = (s32) (D_800DC600 + 2); - D_8015F8C0 = (s32) (D_800DC600 + 0xB); - D_8015F8C4 = (s32) (D_800DC600 + 0x17); - D_8015F8C8 = (s32) (D_800DC600 + 0x19); - D_8015F8CC = (s32) (D_800DC600 + 0x1C); + set_vblank_handler(2, &gGameVblankHandler, &gGameVblankQueue, (OSMesg) OS_EVENT_SW2); + // Potentially unused? + gNmiUnknown1 = (s32) pAppNmiBuffer; + gNmiUnknown2 = (s32) pAppNmiBuffer + 2; + gNmiUnknown3 = (s32) pAppNmiBuffer + 11; + gNmiUnknown4 = (s32) pAppNmiBuffer + 23; + gNmiUnknown5 = (s32) pAppNmiBuffer + 25; + gNmiUnknown6 = (s32) pAppNmiBuffer + 28; rendering_init(); read_controllers(); func_800C5CB8(); - while(1) { + while(TRUE) { func_800CB2C4(); if (D_800DC524 != D_800DC50C) { D_800DC50C = (s32) D_800DC524; func_80002684(); } - profiler_log_thread5_time(0); + profiler_log_thread5_time(THREAD5_START); config_gfx_pool(); read_controllers(); func_80001ECC(); - func_80000CE8(); + end_master_display_list(); display_and_vsync(); } } -void thread4_audio(UNUSED s32 arg0) { +/** + * Sound processing thread. Runs at 50 or 60 FPS according to osTvType. + */ +void thread4_audio(UNUSED void *arg) { UNUSED u32 unused[3]; audio_init(); - osCreateMesgQueue(&sSoundMesgQueue, &sSoundMesgBuf, 1); - func_800020D8(1, &sSoundVblankHandler, &sSoundMesgQueue, (OSMesg) 0x200); + osCreateMesgQueue(&sSoundMesgQueue, &sSoundMesgBuf, ARRAY_COUNT(sSoundMesgBuf)); + set_vblank_handler(1, &sSoundVblankHandler, &sSoundMesgQueue, (OSMesg) 512); + while (TRUE) { OSMesg msg; struct SPTask *spTask; - osRecvMesg(&sSoundMesgQueue, &msg, 1); + osRecvMesg(&sSoundMesgQueue, &msg, OS_MESG_BLOCK); + profiler_log_thread4_time(); + spTask = create_next_audio_frame_task(); if (spTask != NULL) { - func_80000C0C(spTask); + dispatch_audio_sptask(spTask); } profiler_log_thread4_time(); } diff --git a/src/main.h b/src/main.h index 883756a83..0b04ba4a5 100644 --- a/src/main.h +++ b/src/main.h @@ -23,39 +23,39 @@ void main_func(); void thread1_idle(void*); void setup_mesg_queues(); void start_sptask(s32); -void func_800006E8(); +void create_gfx_task_structure(); void init_controllers(); -void func_80000934(s32); +void update_controller(s32); void read_controllers(); void func_80000BEC(); -void func_80000C0C(OSMesg); -void send_display_list(struct SPTask*); +void dispatch_audio_sptask(struct SPTask*); +void exec_display_list(struct SPTask*); void func_80000CA8(); -void func_80000CE8(); +void end_master_display_list(); void *clear_framebuffer(s32); void rendering_init(); void config_gfx_pool(); void display_and_vsync(); -void func_8000105C(); -void func_800010CC(); +void init_seg_80280000(); +void init_seg_8028DF00(); void dma_copy(u8*, u8*, u32); void init_game(); void func_80001ECC(); void interrupt_gfx_sptask(); -void func_80001FAC(); -void func_800020D8(s32, struct VblankHandler*, OSMesgQueue*, OSMesg*); +void receive_new_tasks(); +void set_vblank_handler(s32, struct VblankHandler*, OSMesgQueue*, OSMesg*); void start_gfx_sptask(); -void func_80002168(); -void func_80002284(); -void *func_800022DC(); +void handle_vblank(); +void handle_dp_complete(); +void handle_sp_complete(); void thread3_video(void*); void func_800025D4(); void func_80002600(); void func_8000262C(); void func_80002658(); void func_80002684(); -void thread5_game_logic(s32); -void thread4_audio(s32); +void thread5_game_loop(void*); +void thread4_audio(void*); extern struct GfxPool *gGfxPool; extern Gfx *gDisplayListHead; @@ -67,10 +67,10 @@ extern OSMesgQueue gDmaMesgQueue; extern s32 D_800DC524; extern s32 gActiveScreenMode; extern f32 D_800DC594; -extern s32 D_800DC600; -extern s32 D_8015F8B8, D_8015F8BC, D_8015F8C0, D_8015F8C4, D_8015F8C8, D_8015F8CC; +extern uintptr_t pAppNmiBuffer; +extern s32 gNmiUnknown1, gNmiUnknown2, gNmiUnknown3, gNmiUnknown4, gNmiUnknown5, gNmiUnknown6; extern s32 gScreenModeSelection; -extern s16 sController1Unplugged; +extern s16 sIsController1Unplugged; #endif diff --git a/src/race_logic.c b/src/race_logic.c index 0619a1023..65957d134 100644 --- a/src/race_logic.c +++ b/src/race_logic.c @@ -27,12 +27,12 @@ extern struct UnkStruct_800DC5EC *D_800DC5F0; extern struct UnkStruct_800DC5EC *D_800DC5F4; extern struct UnkStruct_800DC5EC *D_800DC5F8; -extern u8 *D_8015F8BC; -extern u8 *D_8015F8B8; -extern u8 *D_8015F8C0; -extern u8 *D_8015F8C4; -extern u8 *D_8015F8C8; -extern u8 *D_8015F8CC; +extern u8 *gNmiUnknown2; +extern u8 *gNmiUnknown1; +extern u8 *gNmiUnknown3; +extern u8 *gNmiUnknown4; +extern u8 *gNmiUnknown5; +extern u8 *gNmiUnknown6; extern s16 gPlayerBalloonCount[]; extern s16 D_8016348C; @@ -149,13 +149,13 @@ void func_8028E028(void) { switch(gPlayerCountSelection1) { case 2: - *(D_8015F8C4 + gPlayerWinningIndex) += 1; + *(gNmiUnknown4 + gPlayerWinningIndex) += 1; break; case 3: - *(D_8015F8C8 + gPlayerWinningIndex) += 1; + *(gNmiUnknown5 + gPlayerWinningIndex) += 1; break; case 4: - *(D_8015F8CC + gPlayerWinningIndex) += 1; + *(gNmiUnknown6 + gPlayerWinningIndex) += 1; break; } func_800CA118((u8) gPlayerWinningIndex); @@ -648,10 +648,10 @@ void func_8028EF28(void) { switch(gPlayerCountSelection1) { case 2: if (currentPosition == 0) { - *(D_8015F8B8 + i) += 1; + *(gNmiUnknown1 + i) += 1; } - if (*(D_8015F8B8 + i) > 99) { - *(D_8015F8B8 + i) = 99; + if (*(gNmiUnknown1 + i) > 99) { + *(gNmiUnknown1 + i) = 99; } D_800DC510 = 5; i = D_8015F8F2[0]; @@ -661,17 +661,17 @@ void func_8028EF28(void) { break; case 3: if (currentPosition < 3) { - *(D_8015F8BC + i * 3 + currentPosition) += 1; + *(gNmiUnknown2 + i * 3 + currentPosition) += 1; } - if (*(D_8015F8BC + i * 3 + currentPosition) > 99) { - *(D_8015F8BC + i * 3 + currentPosition) = 99; + if (*(gNmiUnknown2 + i * 3 + currentPosition) > 99) { + *(gNmiUnknown2 + i * 3 + currentPosition) = 99; } if (currentPosition == 1) { D_800DC510 = 5; i = D_8015F8F2[1]; - *(D_8015F8BC + i * 3 + 2) += 1; - if (*(D_8015F8BC + i * 3 + 2) > 99) { - *(D_8015F8BC + i * 3 + 2) = 99; + *(gNmiUnknown2 + i * 3 + 2) += 1; + if (*(gNmiUnknown2 + i * 3 + 2) > 99) { + *(gNmiUnknown2 + i * 3 + 2) = 99; } gPlayers[i].unk_00C |= 0x200000; gPlayers[i].unk_000 |= PLAYER_CPU; @@ -680,10 +680,10 @@ void func_8028EF28(void) { break; case 4: if (currentPosition < 3) { - *(D_8015F8C0 + i * 3 + currentPosition) += 1; + *(gNmiUnknown3 + i * 3 + currentPosition) += 1; } - if (*(D_8015F8C0 + i * 3 + currentPosition) > 99) { - *(D_8015F8C0 + i * 3 + currentPosition) = 99; + if (*(gNmiUnknown3 + i * 3 + currentPosition) > 99) { + *(gNmiUnknown3 + i * 3 + currentPosition) = 99; } if (currentPosition == 2) { D_800DC510 = 5; |
