From 7de26d058fb15f6f1d046c1308bbc41f9b08c1f8 Mon Sep 17 00:00:00 2001 From: David Benepe Date: Tue, 13 Jul 2021 12:41:50 -0500 Subject: [PATCH] Documented and renamed unknown_0C7F50 as thread30 --- asm/non_matchings/menu/func_800890AC.s | 2 +- asm/non_matchings/menu/func_800904E8.s | 6 +- asm/non_matchings/menu/func_80090918.s | 2 +- asm/non_matchings/menu/menu_23_loop.s | 2 +- asm/non_matchings/menu/menu_5_init.s | 2 +- .../menu/menu_character_select_loop.s | 2 +- asm/non_matchings/menu/menu_credits_loop.s | 10 +- .../menu/menu_game_select_loop.s | 4 +- asm/non_matchings/menu/menu_results_loop.s | 2 +- .../menu/menu_title_screen_init.s | 2 +- .../menu/menu_title_screen_loop.s | 6 +- .../menu/menu_track_select_init.s | 2 +- .../menu/menu_track_select_loop.s | 6 +- .../menu/menu_trophy_race_round_init.s | 2 +- .../unknown_06B2B0/func_8006C3E0.s | 2 +- .../unknown_06B2B0/thread3_main.s | 2 +- .../unknown_0CCF90/osInitialize.s | 4 +- lib/src/os/osViMgr.c | 2 +- src/menu.c | 16 +-- src/thread30.c | 110 ++++++++++++++++++ src/unknown_06B2B0.c | 14 +-- src/unknown_0C7F50.c | 83 ------------- 22 files changed, 155 insertions(+), 128 deletions(-) create mode 100644 src/thread30.c delete mode 100644 src/unknown_0C7F50.c diff --git a/asm/non_matchings/menu/func_800890AC.s b/asm/non_matchings/menu/func_800890AC.s index f9187011..4bf36434 100644 --- a/asm/non_matchings/menu/func_800890AC.s +++ b/asm/non_matchings/menu/func_800890AC.s @@ -342,7 +342,7 @@ glabel func_800890AC /* 08A180 80089580 24040001 */ li $a0, 1 /* 08A184 80089584 24040015 */ li $a0, 21 /* 08A188 80089588 2405FFFF */ li $a1, -1 -/* 08A18C 8008958C 0C01B8BA */ jal func_8006E2E8 +/* 08A18C 8008958C 0C01B8BA */ jal load_level_for_menu /* 08A190 80089590 00003025 */ move $a2, $zero .L80089594: /* 08A194 80089594 8FBF0014 */ lw $ra, 0x14($sp) diff --git a/asm/non_matchings/menu/func_800904E8.s b/asm/non_matchings/menu/func_800904E8.s index bf102123..72ccfc38 100644 --- a/asm/non_matchings/menu/func_800904E8.s +++ b/asm/non_matchings/menu/func_800904E8.s @@ -8,7 +8,7 @@ glabel D_800E84E8 glabel func_800904E8 /* 0910E8 800904E8 27BDFFB8 */ addiu $sp, $sp, -0x48 /* 0910EC 800904EC AFBF001C */ sw $ra, 0x1c($sp) -/* 0910F0 800904F0 0C031CFC */ jal func_800C73F0 +/* 0910F0 800904F0 0C031CFC */ jal tick_thread30 /* 0910F4 800904F4 AFA40048 */ sw $a0, 0x48($sp) /* 0910F8 800904F8 8FA50048 */ lw $a1, 0x48($sp) /* 0910FC 800904FC 00001025 */ move $v0, $zero @@ -154,7 +154,7 @@ glabel func_800904E8 /* 091318 80090718 250869E4 */ addiu $t0, %lo(D_801269E4) # addiu $t0, $t0, 0x69e4 /* 09131C 8009071C 15C10034 */ bne $t6, $at, .L800907F0 /* 091320 80090720 246369DC */ addiu $v1, %lo(D_801269DC) # addiu $v1, $v1, 0x69dc -/* 091324 80090724 0C031CF8 */ jal func_800C73E0 +/* 091324 80090724 0C031CF8 */ jal get_thread30_level_id_to_load /* 091328 80090728 00000000 */ nop /* 09132C 8009072C 3C038012 */ lui $v1, %hi(D_801269DC) # $v1, 0x8012 /* 091330 80090730 3C088012 */ lui $t0, %hi(D_801269E4) # $t0, 0x8012 @@ -180,7 +180,7 @@ glabel func_800904E8 /* 09137C 8009077C 2401FFFF */ li $at, -1 /* 091380 80090780 1081001B */ beq $a0, $at, .L800907F0 /* 091384 80090784 00000000 */ nop -/* 091388 80090788 0C031D16 */ jal func_800C7458 +/* 091388 80090788 0C031D16 */ jal set_level_to_load_in_background /* 09138C 8009078C 24050001 */ li $a1, 1 /* 091390 80090790 3C038012 */ lui $v1, %hi(D_801269DC) # $v1, 0x8012 /* 091394 80090794 3C088012 */ lui $t0, %hi(D_801269E4) # $t0, 0x8012 diff --git a/asm/non_matchings/menu/func_80090918.s b/asm/non_matchings/menu/func_80090918.s index 92474c78..cc9aaac1 100644 --- a/asm/non_matchings/menu/func_80090918.s +++ b/asm/non_matchings/menu/func_80090918.s @@ -150,7 +150,7 @@ glabel func_80090918 /* 09174C 80090B4C 00002025 */ move $a0, $zero /* 091750 80090B50 0C019A06 */ jal func_80066818 /* 091754 80090B54 00002825 */ move $a1, $zero -/* 091758 80090B58 0C031CF8 */ jal func_800C73E0 +/* 091758 80090B58 0C031CF8 */ jal get_thread30_level_id_to_load /* 09175C 80090B5C 00000000 */ nop /* 091760 80090B60 14400051 */ bnez $v0, .L80090CA8 /* 091764 80090B64 3C03800E */ lui $v1, %hi(gMenuDelay) # $v1, 0x800e diff --git a/asm/non_matchings/menu/menu_23_loop.s b/asm/non_matchings/menu/menu_23_loop.s index 35b22fbf..0f7565b7 100644 --- a/asm/non_matchings/menu/menu_23_loop.s +++ b/asm/non_matchings/menu/menu_23_loop.s @@ -43,7 +43,7 @@ glabel menu_23_loop /* 09B998 8009AD98 00000000 */ nop /* 09B99C 8009AD9C 81050001 */ lb $a1, 1($t0) /* 09B9A0 8009ADA0 81060002 */ lb $a2, 2($t0) -/* 09B9A4 8009ADA4 0C01B8BA */ jal func_8006E2E8 +/* 09B9A4 8009ADA4 0C01B8BA */ jal load_level_for_menu /* 09B9A8 8009ADA8 00000000 */ nop /* 09B9AC 8009ADAC 1000000D */ b .L8009ADE4 /* 09B9B0 8009ADB0 00000000 */ nop diff --git a/asm/non_matchings/menu/menu_5_init.s b/asm/non_matchings/menu/menu_5_init.s index d4410016..281378af 100644 --- a/asm/non_matchings/menu/menu_5_init.s +++ b/asm/non_matchings/menu/menu_5_init.s @@ -118,7 +118,7 @@ glabel menu_5_init /* 093A44 80092E44 24040002 */ li $a0, 2 /* 093A48 80092E48 02002025 */ move $a0, $s0 /* 093A4C 80092E4C 2405FFFF */ li $a1, -1 -/* 093A50 80092E50 0C01B8BA */ jal func_8006E2E8 +/* 093A50 80092E50 0C01B8BA */ jal load_level_for_menu /* 093A54 80092E54 24060001 */ li $a2, 1 .L80092E58: /* 093A58 80092E58 0C031525 */ jal func_800C5494 diff --git a/asm/non_matchings/menu/menu_character_select_loop.s b/asm/non_matchings/menu/menu_character_select_loop.s index 1f0e01d5..c2ea4a7a 100644 --- a/asm/non_matchings/menu/menu_character_select_loop.s +++ b/asm/non_matchings/menu/menu_character_select_loop.s @@ -132,7 +132,7 @@ glabel menu_character_select_loop /* 08CB10 8008BF10 00000000 */ nop /* 08CB14 8008BF14 24040027 */ li $a0, 39 /* 08CB18 8008BF18 2405FFFF */ li $a1, -1 -/* 08CB1C 8008BF1C 0C01B8BA */ jal func_8006E2E8 +/* 08CB1C 8008BF1C 0C01B8BA */ jal load_level_for_menu /* 08CB20 8008BF20 00003025 */ move $a2, $zero /* 08CB24 8008BF24 3C18800E */ lui $t8, %hi(gNumberOfActivePlayers) # $t8, 0x800e /* 08CB28 8008BF28 8F18F4BC */ lw $t8, %lo(gNumberOfActivePlayers)($t8) diff --git a/asm/non_matchings/menu/menu_credits_loop.s b/asm/non_matchings/menu/menu_credits_loop.s index a68db2c2..5e0fb133 100644 --- a/asm/non_matchings/menu/menu_credits_loop.s +++ b/asm/non_matchings/menu/menu_credits_loop.s @@ -24,7 +24,7 @@ glabel menu_credits_loop /* 09BF70 8009B370 AFA2005C */ sw $v0, 0x5c($sp) /* 09BF74 8009B374 0C0078A7 */ jal get_misc_asset /* 09BF78 8009B378 24040045 */ li $a0, 69 -/* 09BF7C 8009B37C 0C031CFC */ jal func_800C73F0 +/* 09BF7C 8009B37C 0C031CFC */ jal tick_thread30 /* 09BF80 8009B380 AFA20060 */ sw $v0, 0x60($sp) /* 09BF84 8009B384 3C0E800E */ lui $t6, %hi(gMenuDelay) # $t6, 0x800e /* 09BF88 8009B388 8DCEF47C */ lw $t6, %lo(gMenuDelay)($t6) @@ -529,7 +529,7 @@ glabel L8009BA98 /* 09C6AC 8009BAAC 016D1021 */ addu $v0, $t3, $t5 /* 09C6B0 8009BAB0 80440000 */ lb $a0, ($v0) /* 09C6B4 8009BAB4 80450002 */ lb $a1, 2($v0) -/* 09C6B8 8009BAB8 0C031D16 */ jal func_800C7458 +/* 09C6B8 8009BAB8 0C031D16 */ jal set_level_to_load_in_background /* 09C6BC 8009BABC 00000000 */ nop /* 09C6C0 8009BAC0 240E0001 */ li $t6, 1 /* 09C6C4 8009BAC4 AE0E0000 */ sw $t6, ($s0) @@ -538,7 +538,7 @@ glabel L8009BA98 /* 09C6D0 8009BAD0 1000004C */ b .L8009BC04 /* 09C6D4 8009BAD4 AC2F63D8 */ sw $t7, %lo(D_801263D8)($at) glabel L8009BAD8 -/* 09C6D8 8009BAD8 0C031CF8 */ jal func_800C73E0 +/* 09C6D8 8009BAD8 0C031CF8 */ jal get_thread30_level_id_to_load /* 09C6DC 8009BADC 00000000 */ nop /* 09C6E0 8009BAE0 14400048 */ bnez $v0, .L8009BC04 /* 09C6E4 8009BAE4 3C038012 */ lui $v1, %hi(D_801263BC) # $v1, 0x8012 @@ -648,7 +648,7 @@ glabel L8009BB9C /* 09C85C 8009BC5C 18400015 */ blez $v0, .L8009BCB4 /* 09C860 8009BC60 004FC021 */ addu $t8, $v0, $t7 /* 09C864 8009BC64 3C01800E */ lui $at, %hi(gMenuDelay) # $at, 0x800e -/* 09C868 8009BC68 0C031CF8 */ jal func_800C73E0 +/* 09C868 8009BC68 0C031CF8 */ jal get_thread30_level_id_to_load /* 09C86C 8009BC6C AC38F47C */ sw $t8, %lo(gMenuDelay)($at) /* 09C870 8009BC70 14400010 */ bnez $v0, .L8009BCB4 /* 09C874 8009BC74 3C19800E */ lui $t9, %hi(gMenuDelay) # $t9, 0x800e @@ -663,7 +663,7 @@ glabel L8009BB9C /* 09C898 8009BC98 00000000 */ nop /* 09C89C 8009BC9C 24040015 */ li $a0, 21 /* 09C8A0 8009BCA0 2405FFFF */ li $a1, -1 -/* 09C8A4 8009BCA4 0C01B8BA */ jal func_8006E2E8 +/* 09C8A4 8009BCA4 0C01B8BA */ jal load_level_for_menu /* 09C8A8 8009BCA8 00003025 */ move $a2, $zero /* 09C8AC 8009BCAC 0C0204F4 */ jal menu_init /* 09C8B0 8009BCB0 24040001 */ li $a0, 1 diff --git a/asm/non_matchings/menu/menu_game_select_loop.s b/asm/non_matchings/menu/menu_game_select_loop.s index ccec5ac8..79fc59bf 100644 --- a/asm/non_matchings/menu/menu_game_select_loop.s +++ b/asm/non_matchings/menu/menu_game_select_loop.s @@ -62,7 +62,7 @@ glabel menu_game_select_loop /* 08D49C 8008C89C AC2CF4B8 */ sw $t4, %lo(gIsInTracksMode)($at) /* 08D4A0 8008C8A0 2404FFFF */ li $a0, -1 /* 08D4A4 8008C8A4 2405FFFF */ li $a1, -1 -/* 08D4A8 8008C8A8 0C01B8BA */ jal func_8006E2E8 +/* 08D4A8 8008C8A8 0C01B8BA */ jal load_level_for_menu /* 08D4AC 8008C8AC 00003025 */ move $a2, $zero /* 08D4B0 8008C8B0 0C0204F4 */ jal menu_init /* 08D4B4 8008C8B4 2404000F */ li $a0, 15 @@ -100,7 +100,7 @@ glabel menu_game_select_loop /* 08D528 8008C928 38CD0003 */ xori $t5, $a2, 3 /* 08D52C 8008C92C 01A03025 */ move $a2, $t5 .L8008C930: -/* 08D530 8008C930 0C01B8BA */ jal func_8006E2E8 +/* 08D530 8008C930 0C01B8BA */ jal load_level_for_menu /* 08D534 8008C934 2405FFFF */ li $a1, -1 /* 08D538 8008C938 00002025 */ move $a0, $zero /* 08D53C 8008C93C 0C022BAD */ jal func_8008AEB4 diff --git a/asm/non_matchings/menu/menu_results_loop.s b/asm/non_matchings/menu/menu_results_loop.s index 81cc13a8..4feb2725 100644 --- a/asm/non_matchings/menu/menu_results_loop.s +++ b/asm/non_matchings/menu/menu_results_loop.s @@ -270,7 +270,7 @@ glabel menu_results_loop /* 098284 80097684 2404FFFF */ li $a0, -1 /* 098288 80097688 144E0007 */ bne $v0, $t6, .L800976A8 /* 09828C 8009768C 2405FFFF */ li $a1, -1 -/* 098290 80097690 0C01B8BA */ jal func_8006E2E8 +/* 098290 80097690 0C01B8BA */ jal load_level_for_menu /* 098294 80097694 00003025 */ move $a2, $zero /* 098298 80097698 0C0204F4 */ jal menu_init /* 09829C 8009769C 2404000F */ li $a0, 15 diff --git a/asm/non_matchings/menu/menu_title_screen_init.s b/asm/non_matchings/menu/menu_title_screen_init.s index 09aa43df..e1440dab 100644 --- a/asm/non_matchings/menu/menu_title_screen_init.s +++ b/asm/non_matchings/menu/menu_title_screen_init.s @@ -129,7 +129,7 @@ glabel menu_title_screen_init .L8008372C: /* 08432C 8008372C 80640000 */ lb $a0, ($v1) /* 084330 80083730 80660002 */ lb $a2, 2($v1) -/* 084334 80083734 0C01B8BA */ jal func_8006E2E8 +/* 084334 80083734 0C01B8BA */ jal load_level_for_menu /* 084338 80083738 00000000 */ nop /* 08433C 8008373C 44803000 */ mtc1 $zero, $f6 /* 084340 80083740 3C018012 */ lui $at, %hi(D_801268D8) # $at, 0x8012 diff --git a/asm/non_matchings/menu/menu_title_screen_loop.s b/asm/non_matchings/menu/menu_title_screen_loop.s index 84d7f10c..e42df968 100644 --- a/asm/non_matchings/menu/menu_title_screen_loop.s +++ b/asm/non_matchings/menu/menu_title_screen_loop.s @@ -160,7 +160,7 @@ glabel menu_title_screen_loop .L80083C14: /* 084814 80083C14 80640000 */ lb $a0, ($v1) /* 084818 80083C18 80660002 */ lb $a2, 2($v1) -/* 08481C 80083C1C 0C01B8BA */ jal func_8006E2E8 +/* 08481C 80083C1C 0C01B8BA */ jal load_level_for_menu /* 084820 80083C20 00000000 */ nop /* 084824 80083C24 3C088012 */ lui $t0, %hi(D_80126864) # $t0, 0x8012 /* 084828 80083C28 25086864 */ addiu $t0, %lo(D_80126864) # addiu $t0, $t0, 0x6864 @@ -474,7 +474,7 @@ glabel menu_title_screen_loop /* 084CB4 800840B4 38C90003 */ xori $t1, $a2, 3 /* 084CB8 800840B8 01203025 */ move $a2, $t1 .L800840BC: -/* 084CBC 800840BC 0C01B8BA */ jal func_8006E2E8 +/* 084CBC 800840BC 0C01B8BA */ jal load_level_for_menu /* 084CC0 800840C0 2405FFFF */ li $a1, -1 /* 084CC4 800840C4 00002025 */ move $a0, $zero /* 084CC8 800840C8 0C022BAD */ jal func_8008AEB4 @@ -486,7 +486,7 @@ glabel menu_title_screen_loop .L800840E0: /* 084CE0 800840E0 AC20F460 */ sw $zero, %lo(D_800DF460)($at) /* 084CE4 800840E4 2405FFFF */ li $a1, -1 -/* 084CE8 800840E8 0C01B8BA */ jal func_8006E2E8 +/* 084CE8 800840E8 0C01B8BA */ jal load_level_for_menu /* 084CEC 800840EC 00003025 */ move $a2, $zero /* 084CF0 800840F0 0C0204F4 */ jal menu_init /* 084CF4 800840F4 2404000C */ li $a0, 12 diff --git a/asm/non_matchings/menu/menu_track_select_init.s b/asm/non_matchings/menu/menu_track_select_init.s index 92bb8eab..945af59d 100644 --- a/asm/non_matchings/menu/menu_track_select_init.s +++ b/asm/non_matchings/menu/menu_track_select_init.s @@ -505,7 +505,7 @@ glabel menu_track_select_init /* 08FB30 8008EF30 244263D0 */ addiu $v0, %lo(D_801263D0) # addiu $v0, $v0, 0x63d0 /* 08FB34 8008EF34 2405FFFF */ li $a1, -1 /* 08FB38 8008EF38 24060001 */ li $a2, 1 -/* 08FB3C 8008EF3C 0C01B8BA */ jal func_8006E2E8 +/* 08FB3C 8008EF3C 0C01B8BA */ jal load_level_for_menu /* 08FB40 8008EF40 AC440000 */ sw $a0, ($v0) /* 08FB44 8008EF44 240A0001 */ li $t2, 1 /* 08FB48 8008EF48 AE0A0000 */ sw $t2, ($s0) diff --git a/asm/non_matchings/menu/menu_track_select_loop.s b/asm/non_matchings/menu/menu_track_select_loop.s index 4f38c94e..cd17591f 100644 --- a/asm/non_matchings/menu/menu_track_select_loop.s +++ b/asm/non_matchings/menu/menu_track_select_loop.s @@ -10,7 +10,7 @@ glabel menu_track_select_loop /* 08FE54 8008F254 AFA20018 */ sw $v0, 0x18($sp) /* 08FE58 8008F258 01CFC021 */ addu $t8, $t6, $t7 /* 08FE5C 8008F25C 3319003F */ andi $t9, $t8, 0x3f -/* 08FE60 8008F260 0C031CF8 */ jal func_800C73E0 +/* 08FE60 8008F260 0C031CF8 */ jal get_thread30_level_id_to_load /* 08FE64 8008F264 AC790000 */ sw $t9, ($v1) /* 08FE68 8008F268 14400011 */ bnez $v0, .L8008F2B0 /* 08FE6C 8008F26C 3C03800E */ lui $v1, %hi(gMenuDelay) # $v1, 0x800e @@ -134,7 +134,7 @@ glabel menu_track_select_loop /* 09001C 8008F41C 38CB0003 */ xori $t3, $a2, 3 /* 090020 8008F420 01603025 */ move $a2, $t3 .L8008F424: -/* 090024 8008F424 0C01B8BA */ jal func_8006E2E8 +/* 090024 8008F424 0C01B8BA */ jal load_level_for_menu /* 090028 8008F428 2405FFFF */ li $a1, -1 /* 09002C 8008F42C 00002025 */ move $a0, $zero /* 090030 8008F430 0C022BAD */ jal func_8008AEB4 @@ -147,7 +147,7 @@ glabel menu_track_select_loop /* 090048 8008F448 24040027 */ li $a0, 39 .L8008F44C: /* 09004C 8008F44C 2405FFFF */ li $a1, -1 -/* 090050 8008F450 0C01B8BA */ jal func_8006E2E8 +/* 090050 8008F450 0C01B8BA */ jal load_level_for_menu /* 090054 8008F454 00003025 */ move $a2, $zero /* 090058 8008F458 0C0204F4 */ jal menu_init /* 09005C 8008F45C 24040013 */ li $a0, 19 diff --git a/asm/non_matchings/menu/menu_trophy_race_round_init.s b/asm/non_matchings/menu/menu_trophy_race_round_init.s index 9533cfac..6e638eec 100644 --- a/asm/non_matchings/menu/menu_trophy_race_round_init.s +++ b/asm/non_matchings/menu/menu_trophy_race_round_init.s @@ -68,7 +68,7 @@ glabel menu_trophy_race_round_init /* 098F5C 8009835C 00402025 */ move $a0, $v0 /* 098F60 80098360 02002025 */ move $a0, $s0 /* 098F64 80098364 2405FFFF */ li $a1, -1 -/* 098F68 80098368 0C01B8BA */ jal func_8006E2E8 +/* 098F68 80098368 0C01B8BA */ jal load_level_for_menu /* 098F6C 8009836C 24060001 */ li $a2, 1 /* 098F70 80098370 3C01800E */ lui $at, %hi(gMenuDelay) # $at, 0x800e /* 098F74 80098374 AC20F47C */ sw $zero, %lo(gMenuDelay)($at) diff --git a/asm/non_matchings/unknown_06B2B0/func_8006C3E0.s b/asm/non_matchings/unknown_06B2B0/func_8006C3E0.s index 98008df9..8026abd9 100644 --- a/asm/non_matchings/unknown_06B2B0/func_8006C3E0.s +++ b/asm/non_matchings/unknown_06B2B0/func_8006C3E0.s @@ -93,7 +93,7 @@ glabel func_8006C3E0 /* 06D138 8006C538 00000000 */ nop /* 06D13C 8006C53C 0C020486 */ jal func_80081218 /* 06D140 8006C540 00000000 */ nop -/* 06D144 8006C544 0C031CD4 */ jal func_800C7350 +/* 06D144 8006C544 0C031CD4 */ jal create_and_start_thread30 /* 06D148 8006C548 00000000 */ nop /* 06D14C 8006C54C 3C048012 */ lui $a0, %hi(D_80123548) # $a0, 0x8012 /* 06D150 8006C550 3C058012 */ lui $a1, %hi(D_80123544) # $a1, 0x8012 diff --git a/asm/non_matchings/unknown_06B2B0/thread3_main.s b/asm/non_matchings/unknown_06B2B0/thread3_main.s index 9ec5bbde..0571cb97 100644 --- a/asm/non_matchings/unknown_06B2B0/thread3_main.s +++ b/asm/non_matchings/unknown_06B2B0/thread3_main.s @@ -23,7 +23,7 @@ glabel thread3_main /* 06CF80 8006C380 00000000 */ nop /* 06CF84 8006C384 0C000A9D */ jal audioStopThread /* 06CF88 8006C388 00000000 */ nop -/* 06CF8C 8006C38C 0C031CEF */ jal func_800C73BC +/* 06CF8C 8006C38C 0C031CEF */ jal stop_thread30 /* 06CF90 8006C390 00000000 */ nop /* 06CF94 8006C394 3C0400AA */ lui $a0, (0x00AAAA82 >> 16) # lui $a0, 0xaa /* 06CF98 8006C398 0C033490 */ jal __osSpSetStatus diff --git a/lib/asm/non_matchings/unknown_0CCF90/osInitialize.s b/lib/asm/non_matchings/unknown_0CCF90/osInitialize.s index d420ed81..61dbb97c 100644 --- a/lib/asm/non_matchings/unknown_0CCF90/osInitialize.s +++ b/lib/asm/non_matchings/unknown_0CCF90/osInitialize.s @@ -2,11 +2,11 @@ glabel osInitialize /* 0CD1A0 800CC5A0 27BDFFC0 */ addiu $sp, $sp, -0x40 /* 0CD1A4 800CC5A4 AFBF001C */ sw $ra, 0x1c($sp) /* 0CD1A8 800CC5A8 240E0001 */ li $t6, 1 -/* 0CD1AC 800CC5AC 3C018013 */ lui $at, %hi(D_8012CCC0) # $at, 0x8013 +/* 0CD1AC 800CC5AC 3C018013 */ lui $at, %hi(gThread30Stack) # $at, 0x8013 /* 0CD1B0 800CC5B0 AFB00018 */ sw $s0, 0x18($sp) /* 0CD1B4 800CC5B4 AFA00038 */ sw $zero, 0x38($sp) /* 0CD1B8 800CC5B8 0C03515C */ jal __osGetSR -/* 0CD1BC 800CC5BC AC2ECCC0 */ sw $t6, %lo(D_8012CCC0)($at) +/* 0CD1BC 800CC5BC AC2ECCC0 */ sw $t6, %lo(gThread30Stack)($at) /* 0CD1C0 800CC5C0 00408025 */ move $s0, $v0 /* 0CD1C4 800CC5C4 3C012000 */ lui $at, 0x2000 /* 0CD1C8 800CC5C8 0C035158 */ jal __osSetSR diff --git a/lib/src/os/osViMgr.c b/lib/src/os/osViMgr.c index ae2185dc..f64bb24d 100644 --- a/lib/src/os/osViMgr.c +++ b/lib/src/os/osViMgr.c @@ -15,7 +15,7 @@ OSDevMgr __osViDevMgr = {0}; #define OS_VIM_STACKSIZE 4096 u8 viThreadStack[2960]; // viThreadStack[OS_VIM_STACKSIZE]; -s32 D_8012CCC0; +s32 gThread30Stack; extern OSThread viThread; extern OSMesgQueue viEventQueue; diff --git a/src/menu.c b/src/menu.c index 94bd7e93..ec97e085 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2947,7 +2947,7 @@ s32 menu_character_select_loop(s32 arg0) { gIsInTracksMode = 1; if (phi_t3 >= gNumberOfActivePlayers) { func_80000B18(); - func_8006E2E8(0x27, -1, 0); + load_level_for_menu(0x27, -1, 0); if (gNumberOfActivePlayers == 1 && !gPlayerHasSeenCautionMenu) { menu_init(MENU_CAUTION); } else { @@ -3314,7 +3314,7 @@ void func_80090ED8(s32 arg0); void func_80090F30(s32 arg0); void func_80092188(s32 arg0); void func_8008E4EC(void); -s32 func_800C73E0(void); +s32 get_thread30_level_id_to_load(void); void set_relative_volume_for_music(u8 arg0); s32 menu_track_select_loop(s32 arg0) { @@ -3324,7 +3324,7 @@ s32 menu_track_select_loop(s32 arg0) { settings = get_settings(); D_801263BC = (D_801263BC + arg0) & 0x3F; - if (func_800C73E0() == 0 && gMenuDelay != 0) { + if (get_thread30_level_id_to_load() == 0 && gMenuDelay != 0) { if (gMenuDelay < 0) { gMenuDelay -= arg0; } else { @@ -3368,12 +3368,12 @@ s32 menu_track_select_loop(s32 arg0) { if (is_tt_unlocked()) { phi_a2 ^= 3; } - func_8006E2E8(0x16, -1, phi_a2); + load_level_for_menu(0x16, -1, phi_a2); func_8008AEB4(0, NULL); menu_init(MENU_CHARACTER_SELECT); return 0; } - func_8006E2E8(0x27, -1, 0); + load_level_for_menu(0x27, -1, 0); menu_init(MENU_GAME_SELECT); return 0; } @@ -3525,7 +3525,7 @@ block_7: gMenuDelay = 0; D_800E0980 = 0x1E; func_800C4170(2); - func_8006E2E8(temp_s0, -1, 1); + load_level_for_menu(temp_s0, -1, 1); } } else { goto block_7; @@ -3836,7 +3836,7 @@ void menu_trophy_race_round_init(void) { } func_8006DB14(func_8006B0AC(temp)); - func_8006E2E8(temp, -1, 1); + load_level_for_menu(temp, -1, 1); gMenuDelay = 0; D_800E0980 = 10; @@ -3969,7 +3969,7 @@ void menu_23_init(void) { func_8009C674(D_800E1768); func_80094604(); } - func_8006E2E8(D_801267EC[0], D_801267EC[1], D_801267EC[2]); + load_level_for_menu(D_801267EC[0], D_801267EC[1], D_801267EC[2]); gMenuDelay = 0; D_801263E0 = 0; } diff --git a/src/thread30.c b/src/thread30.c new file mode 100644 index 00000000..759a1c85 --- /dev/null +++ b/src/thread30.c @@ -0,0 +1,110 @@ +/* The comment below is needed for this file to be picked up by generate_ld */ +/* RAM_POS: 0x800C7350 */ + +#include "types.h" +#include "macros.h" +#include "libultra_internal.h" + +/************ .data ************/ + +s32 gThread30NeedToLoadLevel = FALSE; +s32 gThread30LevelIdToLoad = -1; +s32 gThread30CutsceneIdToLoad = -1; +s32 gThread30LoadDelay = 0; + +/*******************************/ + +/************ .bss ************/ + +// Used for __osException, but .bss file order is weird. Need to fix later. +s32 D_8012AAE0[4]; + +OSThread gThread30; +OSMesgQueue gThread30MesgQueue; +OSMesg gThread30Messages[2]; + +s32 D_8012ACC0[1305]; // Unused? Might be another stack. + +// Currently defined in osViMgr.c +// There are a few stacks defined next to each other. Maybe they are in their own separate file? +extern void *gThread30Stack; + +/*****************************/ + +void thread30(void *arg); + +/** + * Initalizes and starts thread30() + */ +void create_and_start_thread30(void) { + osCreateMesgQueue(&gThread30MesgQueue, &gThread30Messages, 2); + osCreateThread(&gThread30, 30, &thread30, NULL, &gThread30Stack, 8); + osStartThread(&gThread30); +} + +/** + * Stop thread30() + */ +void stop_thread30(void) { + osStopThread(&gThread30); +} + +/** + * Returns the value in gThread30NeedToLoadLevel. + */ +s32 get_thread30_level_id_to_load(void) { + return gThread30NeedToLoadLevel; +} + +/** + * If gThread30NeedToLoadLevel is set, then decrement gThread30LoadDelay. If gThread30LoadDelay is 0, + * then signal thread30 to load a level. + * Unused. + */ +void tick_thread30(void) { + if (gThread30NeedToLoadLevel && gThread30LoadDelay > 0) { + gThread30LoadDelay--; + if (gThread30LoadDelay == 0) { + // Signal thread30 that the level needs to load. + osSendMesg(&gThread30MesgQueue, OS_MESG_TYPE_LOOPBACK, 0); + } + } +} + +/** + * Returns the value in gThread30LoadDelay. + * Unused. + */ +s32 get_thread30_load_delay(void) { + return gThread30LoadDelay; +} + +/** + * Sets a level id and cutscene id to be loaded. Used in the tracks menu & credits menu. + * Returns 1 if successful, or 0 if gThread30NeedToLoadLevel was already set. + */ +s32 set_level_to_load_in_background(s32 levelId, s32 cutsceneId) { + if (!gThread30NeedToLoadLevel) { + gThread30LoadDelay = 4; + gThread30LevelIdToLoad = levelId; + gThread30CutsceneIdToLoad = cutsceneId; + gThread30NeedToLoadLevel = TRUE; + return TRUE; + } + return FALSE; +} + +/** + * Waits for a signal from the main thread to load a level asynchronously. + */ +void thread30(void *arg) { + OSMesg mesg = 0; + while(TRUE){ + // Wait for a signal from the main thread + do { + osRecvMesg(&gThread30MesgQueue, &mesg, 1); + } while(mesg != (OSMesg)OS_MESG_TYPE_LOOPBACK); + load_level_for_menu(gThread30LevelIdToLoad, -1, gThread30CutsceneIdToLoad); // -1 means there won't be any racers loaded. + gThread30NeedToLoadLevel = FALSE; + } +} diff --git a/src/unknown_06B2B0.c b/src/unknown_06B2B0.c index 0ca0c8ae..5bb76194 100644 --- a/src/unknown_06B2B0.c +++ b/src/unknown_06B2B0.c @@ -701,7 +701,7 @@ void thread3_main(s32 arg0) { if (func_8006EAC0() != 0) { func_80072708(); audioStopThread(); - func_800C73BC(); + stop_thread30(); __osSpSetStatus(0xAAAA82); func_800CD250(0x1D6); while(1); // Infinite loop @@ -767,7 +767,7 @@ void func_8006C3E0(void) { func_800C3C00(); func_80075B18(); func_80081218(); - func_800C7350(); + create_and_start_thread30(); osCreateMesgQueue(&D_80123548, &D_80123544, 1); osScAddClient(&D_80121260, &D_80123538, &D_80123548, 3); D_80123560[0] = 0; @@ -1072,7 +1072,7 @@ void func_8006DBE4(void) { } void func_8006DC58(s32 arg0) { - if (func_800C73E0() == 0) { + if (get_thread30_level_id_to_load() == 0) { func_80010994(arg0); gParticlePtrList_flush(); func_8001BF20(); @@ -1087,17 +1087,17 @@ void func_8006DC58(s32 arg0) { // Has a jump table GLOBAL_ASM("asm/non_matchings/unknown_06B2B0/func_8006DCF8.s") -void func_8006E2E8(s32 arg0, s32 arg1, s32 arg2) { +void load_level_for_menu(s32 levelId, s32 numberOfPlayers, s32 cutsceneId) { if (D_80123514 == 0) { func_8006DBE4(); - if (func_800C73E0() == 0) { + if (get_thread30_level_id_to_load() == 0) { D_801211F8 = D_801211F0[D_801234E8]; gDPFullSync(D_801211F8++) gSPEndDisplayList(D_801211F8++) } } - if (arg0 != -1) { - load_level_3(arg0, arg1, 0, 2, arg2); + if (levelId != -1) { + load_level_3(levelId, numberOfPlayers, 0, 2, cutsceneId); D_80123514 = (u8)0; return; } diff --git a/src/unknown_0C7F50.c b/src/unknown_0C7F50.c deleted file mode 100644 index 3662e251..00000000 --- a/src/unknown_0C7F50.c +++ /dev/null @@ -1,83 +0,0 @@ -/* The comment below is needed for this file to be picked up by generate_ld */ -/* RAM_POS: 0x800C7350 */ - -#include "types.h" -#include "macros.h" -#include "libultra_internal.h" - -/************ .data ************/ - -s32 D_800E3770 = 0; -s32 D_800E3774 = -1; -s32 D_800E3778 = -1; -s32 D_800E377C = 0; - -/*******************************/ - -/************ .bss ************/ - -s32 D_8012AAE0[4]; -OSThread D_8012AAF0; -OSMesgQueue D_8012ACA0; -OSMesg D_8012ACB8; -s32 D_8012ACC0[1306]; - -extern void *D_8012CCC0; - -/*****************************/ - -void func_800C74A0(void *arg); - -void func_800C7350(void) { - osCreateMesgQueue(&D_8012ACA0, &D_8012ACB8, 2); - osCreateThread(&D_8012AAF0, 0x1E, &func_800C74A0, 0, &D_8012CCC0, 8); - osStartThread(&D_8012AAF0); -} - -void func_800C73BC(void) { - osStopThread(&D_8012AAF0); -} - -s32 func_800C73E0(void) { - return D_800E3770; -} - -void func_800C73F0(void) { - s32 temp_t7; - - if (D_800E3770) { - if (D_800E377C > 0) { - D_800E377C--; - if (D_800E377C == 0) { - osSendMesg(&D_8012ACA0, (OSMesg)10, 0); - } - } - } -} - -// Unused? -s32 func_800C7448(void) { - return D_800E377C; -} - -s32 func_800C7458(s32 arg0, s32 arg1) { - if (!D_800E3770) { - D_800E377C = 4; - D_800E3774 = arg0; - D_800E3778 = arg1; - D_800E3770 = 1; - return 1; - } - return 0; -} - -void func_800C74A0(void *arg) { - OSMesg sp34 = 0; - while(1){ - do { - osRecvMesg(&D_8012ACA0, &sp34, 1); - } while(sp34 != (OSMesg)10); - func_8006E2E8(D_800E3774, -1, D_800E3778); - D_800E3770 = 0; - } -}