controller pak stuff (#333)

- Named some variables
This commit is contained in:
tomas
2023-07-11 18:14:23 +00:00
committed by GitHub
parent cf33e2ea5f
commit 84edd67231
17 changed files with 420 additions and 525 deletions
+47 -47
View File
@@ -280,25 +280,25 @@ s32 func_80091D74(void) {
}
osPfsIsPlug(&gSIEventMesgQueue, &sp67);
if (sp67 & 1) {
if (osPfsInit(&gSIEventMesgQueue, &D_8018E868, 0)) {
if (osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, 0)) {
return 0;
}
} else {
return 0;
}
if (osPfsNumFiles(&D_8018E868, &D_8018EB78, &D_8018EB7C)) {
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles)) {
return 0;
}
for (i = 0; i < 16; i++) {
D_8018EB38[i] = osPfsFileState(&D_8018E868, i, D_8018E938 + i);
D_8018EB38[i] = osPfsFileState(&gControllerPak1FileHandle, i, D_8018E938 + i);
}
if (osPfsFreeBlocks(&D_8018E868, &gControllerPakNumPagesFree)) {
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree)) {
return 0;
}
gControllerPakNumPagesFree >>= 8;
gControllerPak1NumPagesFree >>= 8;
return 1;
}
@@ -307,7 +307,7 @@ void func_80091EE4(void) {
s32 temp_s2;
s32 tmp;
D_800E86F8 = 0;
gControllerPak1State = BAD;
tmp = func_800B5F30();
if ((D_8018EDFB != 0) && (tmp == 0)) {
@@ -6947,7 +6947,7 @@ loop_3:
return;
case 0x69:
func_800996BC(segmented_to_virtual_dupe(D_02004A0C), 0);
if (controller_pak_status() == 0) {
if (controller_pak_1_status() == PFS_NO_ERROR) {
func_800B6708();
return;
}
@@ -6962,7 +6962,7 @@ loop_3:
return;
case 0x8C:
func_800996BC(segmented_to_virtual_dupe(D_02004A34), 0);
if (controller_pak_status() == 0) {
if (controller_pak_1_status() == PFS_NO_ERROR) {
func_800B6708();
return;
}
@@ -7054,7 +7054,7 @@ block_63:
var_ra->unk1C = (s32) gTimeTrialDataCourseIndex;
func_800996BC(segmented_to_virtual_dupe(D_02004A0C), 0);
func_8006EF60();
if (controller_pak_status) == 0) {
if (controller_pak_1_status() == PFS_NO_ERROR) {
func_800B6708();
return;
}
@@ -8048,7 +8048,7 @@ void func_800A0DFC(void) {
s32 var_s0;
s32 var_s1;
var_s0 = gControllerPakNumPagesFree;
var_s0 = gControllerPak1NumPagesFree;
var_s1 = 0x00000110;
do {
temp_t6 = var_s0 % 10;
@@ -12954,15 +12954,15 @@ GLOBAL_ASM("asm/non_matchings/code_80091750/func_800AA280.s")
//generated by m2c commit 8267401fa4ef7a38942dcca43353cc1bcc6efabc
s32 check_for_controller_pak(?); /* extern */
extern s8 D_800E86AC;
extern u16 D_800E86F0;
extern u32 D_800E86F4;
extern s8 D_800E86F8;
extern u8 D_800F2E64;
extern u8 D_800F2E74;
extern OSPfs D_8018E868;
extern s32 D_8018EB78;
extern s32 D_8018EB7C;
extern s32 D_8018EB84;
extern u16 gCompanyCode;
extern u32 gGameCode;
extern s8 gControllerPak1State;
extern u8 gGameName;
extern u8 gExtCode;
extern OSPfs gControllerPak1FileHandle;
extern s32 gControllerPak1NumFilesUsed;
extern s32 gControllerPak1MaxWriteableFiles;
extern s32 gControllerPak1FileNote;
extern s8 gMainMenuSelectionDepth;
void func_800AA2EC(struct_8018D9E0_entry *arg0) {
@@ -12987,9 +12987,9 @@ void func_800AA2EC(struct_8018D9E0_entry *arg0) {
case CONFIRM_OK_SELECTION_FROM_BACK_OUT:
case TIME_TRIALS_DATA_SELECTION_FROM_BACK_OUT:
if ((arg0->unk4 == 0) && (temp_v0 = D_8018EDF3, (temp_v0 == 1)) && (*(&D_800E86AC - 1 + temp_v0) == 1)) {
if (D_800E86F8 != 0) {
if (gControllerPak1State != 0) {
sp20 = 0;
temp_v0_2 = osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, &D_800F2E64, &D_800F2E74, &D_8018EB84);
temp_v0_2 = osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, &gGameName, &gExtCode, &gControllerPak1FileNote);
var_t1 = 0;
switch (temp_v0_2) { /* switch 1; irregular */
case 5: /* switch 1 */
@@ -13000,17 +13000,17 @@ void func_800AA2EC(struct_8018D9E0_entry *arg0) {
break;
default: /* switch 1 */
case 2: /* switch 1 */
D_800E86F8 = 0;
gControllerPak1State = 0;
break;
}
}
if (var_t1 == 0) {
if (D_800E86F8 == 0) {
if (gControllerPak1State == 0) {
if (check_for_controller_pak(0) == 0) {
arg0->unk4 = 2;
return;
}
temp_v0_3 = osPfsInit(&gSIEventMesgQueue, &D_8018E868, 0);
temp_v0_3 = osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, 0);
if (temp_v0_3 != 0) {
if (temp_v0_3 != 1) {
if (temp_v0_3 != 4) {
@@ -13031,28 +13031,28 @@ block_22:
arg0->unk4 = 2;
return;
}
D_800E86F8 = 1;
if (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, &D_800F2E64, &D_800F2E74, &D_8018EB84) == 0) {
gControllerPak1State = 1;
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, &gGameName, &gExtCode, &gControllerPak1FileNote) == 0) {
arg0->unk4 = 1;
return;
}
if (osPfsNumFiles(&D_8018E868, &D_8018EB78, &D_8018EB7C) != 0) {
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles) != 0) {
arg0->unk4 = 3;
return;
}
if (osPfsFreeBlocks(&D_8018E868, &gControllerPakNumPagesFree) != 0) {
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree) != 0) {
arg0->unk4 = 3;
return;
}
gControllerPakNumPagesFree = (s32) gControllerPakNumPagesFree >> 8;
gControllerPak1NumPagesFree = (s32) gControllerPak1NumPagesFree >> 8;
goto block_32;
}
block_32:
if (D_8018EB7C >= D_8018EB78) {
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->unk4 = 5;
return;
}
if (gControllerPakNumPagesFree >= 0x79) {
if (gControllerPak1NumPagesFree >= 0x79) {
arg0->unk4 = 1;
return;
}
@@ -14990,9 +14990,9 @@ void func_800AD2E8(struct_8018D9E0_entry *arg0) {
if (temp_f0_3 < 4.2) {
arg0->unk24 = (f32) (temp_f0_3 + 4.0);
}
if (D_800E86F8 != 0) {
if (gControllerPak1State != 0) {
sp28 = 0;
temp_v0_6 = osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84);
temp_v0_6 = osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote);
var_v1 = 0;
switch (temp_v0_6) { /* switch 4; irregular */
case 5: /* switch 4 */
@@ -15007,12 +15007,12 @@ void func_800AD2E8(struct_8018D9E0_entry *arg0) {
case 2: /* switch 4 */
/* fallthrough */
default: /* switch 4 */
D_800E86F8 = 0;
gControllerPak1State = 0;
break;
}
}
if (var_v1 == 0) {
if (D_800E86F8 == 0) {
if (gControllerPak1State == 0) {
sp28 = var_v1;
temp_v0_7 = func_800B5F30();
var_v1_2 = var_v1;
@@ -15044,7 +15044,7 @@ void func_800AD2E8(struct_8018D9E0_entry *arg0) {
play_sound2(0x4900FF07);
return;
}
if (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84) == 0) {
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote) == 0) {
func_800B6708();
arg0->unk4 = func_800B6348((gCupSelection * 4) + gCupCourseSelection) + 0x11;
play_sound2(0x49008001);
@@ -15053,12 +15053,12 @@ void func_800AD2E8(struct_8018D9E0_entry *arg0) {
goto block_56;
}
block_56:
if (D_8018EB7C >= D_8018EB78) {
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->unk4 = 0x0000000E;
play_sound2(0x4900FF07);
return;
}
if (gControllerPakNumPagesFree >= 0x79) {
if (gControllerPak1NumPagesFree >= 0x79) {
arg0->unk4 = 0x00000013;
arg0->unk1C = 0;
play_sound2(0x49008001);
@@ -15293,9 +15293,9 @@ void func_800AE218(struct_8018D9E0_entry *arg0) {
if (temp_f0_3 < 4.2) {
arg0->unk24 = (f32) (temp_f0_3 + 4.0);
}
if (D_800E86F8 != 0) {
if (gControllerPak1State != 0) {
sp28 = 0;
temp_v0_2 = osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84);
temp_v0_2 = osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote);
var_v1 = 0;
switch (temp_v0_2) { /* switch 3; irregular */
case 5: /* switch 3 */
@@ -15308,7 +15308,7 @@ void func_800AE218(struct_8018D9E0_entry *arg0) {
case 2: /* switch 3 */
/* fallthrough */
default: /* switch 3 */
D_800E86F8 = 0;
gControllerPak1State = 0;
break;
}
}
@@ -15316,7 +15316,7 @@ void func_800AE218(struct_8018D9E0_entry *arg0) {
play_sound2(0x49008001);
return;
}
if (D_800E86F8 == 0) {
if (gControllerPak1State == 0) {
sp28 = var_v1;
temp_v0_3 = func_800B5F30();
var_v1_2 = var_v1;
@@ -15348,7 +15348,7 @@ void func_800AE218(struct_8018D9E0_entry *arg0) {
play_sound2(0x4900FF07);
return;
}
if (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84) == 0) {
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote) == 0) {
func_800B6708();
arg0->unk4 = func_800B6348((gCupSelection * 4) + gCupCourseSelection) + 0x1E;
play_sound2(0x49008001);
@@ -15357,12 +15357,12 @@ void func_800AE218(struct_8018D9E0_entry *arg0) {
goto block_49;
}
block_49:
if (D_8018EB7C >= D_8018EB78) {
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
arg0->unk4 = 0x00000018;
play_sound2(0x4900FF07);
return;
}
if (gControllerPakNumPagesFree >= 0x79) {
if (gControllerPak1NumPagesFree >= 0x79) {
arg0->unk4 = 0x00000020;
arg0->unk1C = 0;
play_sound2(0x49008001);
@@ -15520,7 +15520,7 @@ block_49:
break;
case 40: /* switch 1 */
if (arg0->unk1C == 1) {
if (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84) != 0) {
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote) != 0) {
arg0->unk4 = 0x00000029;
play_sound2(0x4900FF07);
return;
@@ -15598,7 +15598,7 @@ void func_800AEDBC(struct_8018D9E0_entry *arg0) {
if (arg0->unk1C != gTimeTrialDataCourseIndex) {
arg0->unk1C = (s32) gTimeTrialDataCourseIndex;
func_8009A594(arg0->D_8018DEE0_index, 0, segmented_to_virtual_dupe_2(D_800E7E34[gCupCourseOrder[gTimeTrialDataCourseIndex / 4][gTimeTrialDataCourseIndex % 4]]));
if (controller_pak_status() == 0) {
if (controller_pak_1_status() == PFS_NO_ERROR) {
func_800B6708();
} else {
D_8018EE10[0].ghostDataSaved = 0;
+132 -151
View File
@@ -17,18 +17,18 @@
#define EEPROM_ADDR(ptr) (((uintptr_t)(ptr) - (uintptr_t)(&D_8018EB90)) / 8)
/*** data ***/
u16 D_800E86F0 = PFS_COMPANY_CODE('0', '1');
u32 D_800E86F4 = PFS_GAME_CODE('N', 'K', 'T', 'J');
s8 D_800E86F8 = 0;
s8 D_800E86FC = 0;
u16 gCompanyCode = PFS_COMPANY_CODE('0', '1');
u32 gGameCode = PFS_GAME_CODE('N', 'K', 'T', 'J');
s8 gControllerPak1State = BAD;
s8 sControllerPak2State = BAD;
/*** rodata ***/
// default time trial records?
const u8 D_800F2E60[4] = {0xc0, 0x27, 0x09, 0x00};
// osPfsFindFile -> game_name ("MARIOKART64" in nosFont)
const u8 D_800F2E64[] = {0x26, 0x1a, 0x2b, 0x22, 0x28, 0x24, 0x1a, 0x2b, 0x2d, 0x16, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00};
// osPfsFindFile -> gGameName ("MARIOKART64" in nosFont)
const u8 gGameName[] = {0x26, 0x1a, 0x2b, 0x22, 0x28, 0x24, 0x1a, 0x2b, 0x2d, 0x16, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00};
// ext_name param to osPfsFindFile (four total bytes, but only one is setable)
const u8 D_800F2E74[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const u8 gExtCode[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
/*** forward declarations ***/
s32 func_800B58C4(s32 arg0);
@@ -702,191 +702,172 @@ s32 validate_save_data_checksum_backup(void)
}
// Check if controller has a Controller Pak connected.
// Return 1 if it does, otherwise return 0.
// Return PAK if it does, otherwise return NO_PAK.
s32 check_for_controller_pak(s32 controller) {
u8 sp1F;
u8 controllerBitpattern;
UNUSED s32 phi_v0;
if ((controller >= 4) || (controller < 0)) {
return 0;
if ((controller >= MAXCONTROLLERS) || (controller < 0)) {
return NO_PAK;
}
osPfsIsPlug(&gSIEventMesgQueue, &sp1F);
if ((sp1F & (1 << controller)) != 0) {
return 1;
osPfsIsPlug(&gSIEventMesgQueue, &controllerBitpattern);
if ((controllerBitpattern & (1 << controller)) != 0) {
return PAK;
}
return 0;
return NO_PAK;
}
s32 controller_pak_status(void) {
if (D_800E86F8 != 0) {
switch (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84)) {
case PFS_READ:
return 0;
// gives status info about controller pak insterted in controller 1
s32 controller_pak_1_status(void) {
if (gControllerPak1State) {
switch (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote)) {
case PFS_NO_ERROR:
return PFS_NO_ERROR;
case PFS_ERR_INVALID:
break;
case PFS_ERR_NEW_PACK:
D_800E86F8 = 0;
gControllerPak1State = BAD;
break;
default:
D_800E86F8 = 0;
gControllerPak1State = BAD;
break;
}
}
if (D_800E86F8 == 0) {
s32 ret;
if (check_for_controller_pak(0) == 0) {
return 1;
if (!gControllerPak1State) {
s32 errorCode;
if (check_for_controller_pak(CONTROLLER_1) == NO_PAK) {
return PFS_NO_PAK_INSERTED;
}
ret = osPfsInit(&gSIEventMesgQueue, &D_8018E868, 0);
errorCode = osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, CONTROLLER_1);
if (ret) {
switch(ret) {
if (errorCode) {
switch(errorCode) {
case PFS_ERR_NOPACK:
case PFS_ERR_DEVICE:
return 1;
return PFS_NO_PAK_INSERTED;
case PFS_ERR_ID_FATAL:
return 2;
return PFS_PAK_BAD_READ;
default:
case PFS_ERR_CONTRFAIL:
return 2;
return PFS_PAK_BAD_READ;
}
}
D_800E86F8 = 1;
if (osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB84) == 0) {
return 0;
gControllerPak1State = OK;
if (osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak1FileNote) == PFS_NO_ERROR) {
return PFS_NO_ERROR;
}
if (osPfsNumFiles(&D_8018E868, &D_8018EB78, &D_8018EB7C) != 0) {
return 2;
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles) != PFS_NO_ERROR) {
return PFS_PAK_BAD_READ;
}
if (osPfsFreeBlocks(&D_8018E868, &gControllerPakNumPagesFree) != 0) {
return 2;
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree) != PFS_NO_ERROR) {
return PFS_PAK_BAD_READ;
}
gControllerPakNumPagesFree = (s32) gControllerPakNumPagesFree >> 8;
gControllerPak1NumPagesFree = gControllerPak1NumPagesFree >> 8;
}
if (D_8018EB7C >= D_8018EB78) {
return 4;
if (gControllerPak1MaxWriteableFiles >= gControllerPak1NumFilesUsed) {
return PFS_FILE_OVERFLOW;
}
if (gControllerPakNumPagesFree >= 0x79) {
return -1;
if (gControllerPak1NumPagesFree >= 0x79) {
return PFS_INVALID_DATA;
}
return 4;
return PFS_FILE_OVERFLOW;
}
#ifdef MIPS_TO_C
//generated by m2c commit d9d3d6575355663122de59f6b2882d8f174e2355 on Dec-11-2022
s32 check_for_controller_pak(?); /* extern */
s32 func_800B5DA4(void) {
s32 temp_v0;
s32 temp_v0_2;
s32 temp_v0_3;
s8 var_v0;
var_v0 = D_800E86FC;
if (var_v0 != 0) {
temp_v0 = osPfsFindFile(&D_8018E8D0, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB88);
switch (temp_v0) { /* switch 1; irregular */
case 0: /* switch 1 */
return 0;
case 5: /* switch 1 */
return -1;
default: /* switch 1 */
case 2: /* switch 1 */
D_800E86FC = 0;
var_v0 = 0;
goto block_8;
// gives status info about controller pak insterted in controller 2
s32 controller_pak_2_status(void) {
s32 stateBorrow = sControllerPak2State;
if (stateBorrow) {
switch (osPfsFindFile(&gControllerPak2FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak2FileNote)) {
case PFS_NO_ERROR:
return PFS_NO_ERROR;
case PFS_ERR_INVALID:
return PFS_INVALID_DATA;
default:
case PFS_ERR_NEW_PACK:
sControllerPak2State = BAD;
stateBorrow = BAD;
}
} else {
block_8:
if (var_v0 == 0) {
if (check_for_controller_pak(1) == 0) {
return 1;
}
if (!stateBorrow) {
s32 errorCode;
if (check_for_controller_pak(CONTROLLER_2) == NO_PAK) {
return PFS_NO_PAK_INSERTED;
}
errorCode = osPfsInit(&gSIEventMesgQueue, &gControllerPak2FileHandle, CONTROLLER_2);
if (errorCode) {
switch (errorCode) {
case PFS_ERR_NOPACK:
case PFS_ERR_DEVICE:
return PFS_NO_PAK_INSERTED;
case PFS_ERR_ID_FATAL:
return PFS_PAK_BAD_READ;
case PFS_ERR_CONTRFAIL:
default:
return PFS_PAK_BAD_READ;
}
temp_v0_2 = osPfsInit(&gSIEventMesgQueue, &D_8018E8D0, 1);
if (temp_v0_2 != 0) {
if (temp_v0_2 != 1) {
if (temp_v0_2 != 4) {
if (temp_v0_2 != 0x0000000A) {
if (temp_v0_2 == 0x0000000B) {
goto block_16;
}
goto block_18;
}
goto block_25;
}
block_18:
goto block_25;
}
block_16:
return 1;
}
D_800E86FC = 1;
temp_v0_3 = osPfsFindFile(&D_8018E8D0, D_800E86F0, D_800E86F4, D_800F2E64, D_800F2E74, &D_8018EB88);
switch (temp_v0_3) { /* irregular */
case 0:
return 0;
case 5:
return -1;
case 2:
block_25:
var_v0 = 2;
/* Duplicate return node #26. Try simplifying control flow for better match */
return (s32) var_v0;
}
} else {
return (s32) var_v0;
}
sControllerPak2State = OK;
switch (osPfsFindFile(&gControllerPak2FileHandle, gCompanyCode, gGameCode, gGameName, gExtCode, &gControllerPak2FileNote)) {
case PFS_NO_ERROR:
return PFS_NO_ERROR;
case PFS_ERR_INVALID:
return PFS_INVALID_DATA;
case PFS_ERR_NEW_PACK:
default:
return PFS_PAK_BAD_READ;
}
}
}
#else
GLOBAL_ASM("asm/non_matchings/menus/func_800B5DA4.s")
#endif
s32 func_800B5F30(void) {
s32 sp1C;
s32 errorCode;
if (D_800E86F8 != 0) {
return -4;
if (gControllerPak1State) {
return PFS_PAK_STATE_OK;
}
if (check_for_controller_pak(0) != 0) {
sp1C = osPfsInit(&gSIEventMesgQueue, &D_8018E868, 0);
if (osPfsNumFiles(&D_8018E868, &D_8018EB78, &D_8018EB7C) != 0) {
D_800E86F8 = 0;
return -2;
if (check_for_controller_pak(CONTROLLER_1) != NO_PAK) {
errorCode = osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, CONTROLLER_1);
if (osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles) != PFS_NO_ERROR) {
gControllerPak1State = BAD;
return PFS_NUM_FILES_ERROR;
}
if (osPfsFreeBlocks(&D_8018E868, &gControllerPakNumPagesFree) != 0) {
D_800E86F8 = 0;
return -3;
if (osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree) != PFS_NO_ERROR) {
gControllerPak1State = BAD;
return PFS_FREE_BLOCKS_ERROR;
}
gControllerPakNumPagesFree = gControllerPakNumPagesFree >> 8;
if (sp1C == 0) {
D_800E86F8 = 1;
gControllerPak1NumPagesFree = gControllerPak1NumPagesFree >> 8;
if (errorCode == PFS_NO_ERROR) {
gControllerPak1State = OK;
}
return sp1C;
return errorCode;
}
return -1;
return PAK_NOT_INSERTED;
}
s32 func_800B6014(void) {
s32 temp_v0;
s32 errorCode;
if (D_800E86FC != 0) {
return -4;
if (sControllerPak2State) {
return PFS_PAK_STATE_OK;
}
if (check_for_controller_pak(1) != 0) {
temp_v0 = osPfsInit(&gSIEventMesgQueue, &D_8018E8D0, 1);
if (temp_v0 == 0) {
D_800E86FC = 1;
if (check_for_controller_pak(CONTROLLER_2) != NO_PAK) {
errorCode = osPfsInit(&gSIEventMesgQueue, &gControllerPak2FileHandle, CONTROLLER_2);
if (errorCode == PFS_NO_ERROR) {
sControllerPak2State = OK;
}
return temp_v0;
return errorCode;
}
return -1;
return PAK_NOT_INSERTED;
}
s32 func_800B6088(s32 arg0) {
@@ -894,7 +875,7 @@ s32 func_800B6088(s32 arg0) {
temp_v1 = &D_8018EE10[arg0];
temp_v1->checksum = func_800B6828(arg0);
return osPfsReadWriteFile(&D_8018E868, D_8018EB84, PFS_WRITE, arg0 * 0x80 /* 0x80 == sizeof(struct_8018EE10_entry) */, sizeof(struct_8018EE10_entry), (u8*) temp_v1);
return osPfsReadWriteFile(&gControllerPak1FileHandle, gControllerPak1FileNote, PFS_WRITE, arg0 * 0x80 /* 0x80 == sizeof(struct_8018EE10_entry) */, sizeof(struct_8018EE10_entry), (u8*) temp_v1);
}
#ifdef MIPS_TO_C
@@ -973,7 +954,7 @@ s32 func_800B6178(s32 arg0) {
var_s1 += 4;
} while (var_s0 != 0x3C);
} else {
var_v0 = osPfsReadWriteFile(&D_8018E868, D_8018EB84, 1U, (arg0 * 0x3C00) + 0x100, 0x00003C00, (u8 *) D_800DC714);
var_v0 = osPfsReadWriteFile(&gControllerPak1FileHandle, gControllerPak1FileNote, 1U, (arg0 * 0x3C00) + 0x100, 0x00003C00, (u8 *) D_800DC714);
var_v1 = var_v0;
if (var_v0 == 0) {
temp_s3->ghostDataSaved = 1;
@@ -1083,7 +1064,7 @@ s32 func_800B64EC(s32 arg0) {
return -1;
}
temp_v0 = osPfsReadWriteFile(&D_8018E868, D_8018EB84, PFS_READ, (arg0 * 0x3C00) + 0x100, 0x3C00, (u8 *) D_800DC714);
temp_v0 = osPfsReadWriteFile(&gControllerPak1FileHandle, gControllerPak1FileNote, PFS_READ, (arg0 * 0x3C00) + 0x100, 0x3C00, (u8 *) D_800DC714);
if (temp_v0 == 0)
{
phi_s1 = (u8 *) &D_8018EE10[arg0]; temp_s0 = 0; while (1) {
@@ -1121,7 +1102,7 @@ s32 func_800B65F4(s32 arg0, s32 arg1) {
if ((arg0 != 0) && (arg0 != 1)) {
return -1;
}
temp_v0 = osPfsReadWriteFile(&D_8018E8D0, D_8018EB88, 0U, (arg0 * 0x3C00) + 0x100, 0x00003C00, (u8 *) D_800DC714);
temp_v0 = osPfsReadWriteFile(&gControllerPak2FileHandle, gControllerPak2FileNote, 0U, (arg0 * 0x3C00) + 0x100, 0x00003C00, (u8 *) D_800DC714);
sp34 = temp_v0;
if (temp_v0 == 0) {
temp_s3 = &D_8018D9C0[arg0];
@@ -1153,7 +1134,7 @@ GLOBAL_ASM("asm/non_matchings/menus/func_800B65F4.s")
void func_800B6708(void) {
s32 temp_s0;
osPfsReadWriteFile(&D_8018E868, D_8018EB84, PFS_READ, 0, 0x100 /* 2*sizeof(struct_8018EE10_entry) ? */, (u8*) &D_8018EE10);
osPfsReadWriteFile(&gControllerPak1FileHandle, gControllerPak1FileNote, PFS_READ, 0, 0x100 /* 2*sizeof(struct_8018EE10_entry) ? */, (u8*) &D_8018EE10);
for (temp_s0 = 0; temp_s0 < 2; ++temp_s0) {
if (D_8018EE10[temp_s0].checksum != func_800B6828(temp_s0)) {
@@ -1168,7 +1149,7 @@ void func_800B6798(void) {
tmp = (u8*) D_8018D9C0;
osPfsReadWriteFile(&D_8018E8D0, D_8018EB88, PFS_READ, 0, 0x100 /* 2*sizeof(struct_8018EE10_entry) ? */, tmp);
osPfsReadWriteFile(&gControllerPak2FileHandle, gControllerPak2FileNote, PFS_READ, 0, 0x100 /* 2*sizeof(struct_8018EE10_entry) ? */, tmp);
for (temp_s0 = 0; temp_s0 < 2; ++temp_s0) {
// if (D_8018D9C0[temp_s0]->checksum != func_800B68F4(temp_s0)) {
@@ -1263,7 +1244,7 @@ s32 func_800B69BC(s32 arg0) {
}
offset = arg0 << 7;
plz->checksum = func_800B6828(arg0);
return osPfsReadWriteFile(&D_8018E868, D_8018EB84, PFS_WRITE, offset, sizeof(struct_8018EE10_entry), (u8 *)plz);
return osPfsReadWriteFile(&gControllerPak1FileHandle, gControllerPak1FileNote, PFS_WRITE, offset, sizeof(struct_8018EE10_entry), (u8 *)plz);
}
#else
GLOBAL_ASM("asm/non_matchings/menus/func_800B69BC.s")
@@ -1274,7 +1255,7 @@ s32 func_800B6A68(void) {
s32 ret;
s32 i;
ret = osPfsAllocateFile(&D_8018E868, D_800E86F0, D_800E86F4, (u8 *)&D_800F2E64, (u8 *)&D_800F2E74, 0x7900, &D_8018EB84);
ret = osPfsAllocateFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8 *)&gGameName, (u8 *)&gExtCode, 0x7900, &gControllerPak1FileNote);
if (ret == 0) {
for (i = 0; i < 2; i++) {
func_800B69BC(i);
@@ -1285,15 +1266,15 @@ s32 func_800B6A68(void) {
}
void func_8800B6AF8(void) {
if (check_for_controller_pak(0)
&& osPfsInit(&gSIEventMesgQueue, &D_8018E868, 0) == 0
&& osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, (u8 *)D_800F2E64, (u8 *)D_800F2E74, &D_8018EB84)
&& osPfsNumFiles(&D_8018E868, &D_8018EB78, &D_8018EB7C) == 0
&& D_8018EB7C < D_8018EB78
&& osPfsFreeBlocks(&D_8018E868, &gControllerPakNumPagesFree) == 0
if (check_for_controller_pak(CONTROLLER_1)
&& osPfsInit(&gSIEventMesgQueue, &gControllerPak1FileHandle, 0) == 0
&& osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8 *)gGameName, (u8 *)gExtCode, &gControllerPak1FileNote)
&& osPfsNumFiles(&gControllerPak1FileHandle, &gControllerPak1NumFilesUsed, &gControllerPak1MaxWriteableFiles) == 0
&& gControllerPak1MaxWriteableFiles < gControllerPak1NumFilesUsed
&& osPfsFreeBlocks(&gControllerPak1FileHandle, &gControllerPak1NumPagesFree) == 0
) {
gControllerPakNumPagesFree >>= 8;
if (gControllerPakNumPagesFree >= 0x79) {
gControllerPak1NumPagesFree >>= 8;
if (gControllerPak1NumPagesFree >= 0x79) {
func_800B6A68();
}
}
+35 -14
View File
@@ -5,6 +5,27 @@
#include "common_structs.h"
#include <types.h>
/* define symbols */
#define CONTROLLER_1 0
#define CONTROLLER_2 1
#define CONTROLLER_3 2
#define CONTROLLER_4 3
#define PFS_NO_ERROR 0 // controller pak no error return
#define PFS_NO_PAK_INSERTED 1 // no pak pressent or wrong device inserted into the controller
#define PFS_PAK_BAD_READ 2 // controller pak error while data transfer
#define PFS_FILE_OVERFLOW 4 // too many files written to in the controller pak
#define PFS_INVALID_DATA -1 // bad arguments, game note does not exist, osPfsInit was not called.
// controller pak test functions
#define PFS_NUM_FILES_ERROR -2
#define PFS_FREE_BLOCKS_ERROR -3
#define PFS_PAK_STATE_OK -4
#define NO_PAK 0
#define PAK 1
#define PAK_NOT_INSERTED -1
union GrandPrixPointsUnion
{
u8 grandPrixPointsArray[4];
@@ -46,8 +67,8 @@ u8 compute_save_data_checksum_backup_1(void);
u8 compute_save_data_checksum_backup_2(void);
s32 validate_save_data_checksum_backup();
s32 func_800B5B2C(s32);
s32 controller_pak_status(void);
s32 func_800B5DA4(void);
s32 controller_pak_1_status(void);
s32 controller_pak_2_status(void);
s32 func_800B5F30();
s32 func_800B6014();
s32 func_800B6088(s32);
@@ -67,9 +88,9 @@ s32 func_800B6A68();
extern u32* D_800DC714;
extern u16 D_800E86F0;
extern u32 D_800E86F4; // osPfs gamecode
extern s8 D_800E86F8;
extern u16 gCompanyCode;
extern u32 gGameCode; // osPfs gamecode
extern s8 gControllerPak1State; // Current state of Controller Pak 1
extern struct_8018EE10_entry D_8018EE10[];
extern struct_8018EE10_entry *D_8018D9C0;
extern u8 D_8018ED16; // D_8018EB90.checksum[1]
@@ -78,22 +99,22 @@ extern u8 D_8018ED4E; // D_8018EB90.onlyBestTimeTrialRecords[0].unknown
extern union GrandPrixPointsUnion D_8018ED10; // Direct reference to the grandPrixPoints section of save data
extern union GrandPrixPointsUnion D_8018ED88; // D_8018EB90.grandPrixPointsBackup[0]
extern s8 D_800E86FC;
extern s8 sControllerPak2State; // Current state of the Controller Pak 2
extern const u8 D_800F2E60[];
extern const u8 D_800F2E64[];
extern const u8 D_800F2E74[];
extern const u8 gGameName[];
extern const u8 gExtCode[];
extern OSMesgQueue gSIEventMesgQueue; // D_8014F0B8
extern u16 D_80162DD6;
extern s32 D_80162DE0;
extern s32 D_80162DFC;
extern OSPfs D_8018E868;
extern OSPfs D_8018E8D0;
extern OSPfs gControllerPak1FileHandle;
extern OSPfs gControllerPak2FileHandle;
extern OSPfsState D_8018E938[];
extern s32 D_8018EB38[16];
extern s32 D_8018EB78;
extern s32 D_8018EB7C;
extern s32 D_8018EB84; // osPfs file_no receiver/out param
extern s32 D_8018EB88;
extern s32 gControllerPak1NumFilesUsed;
extern s32 gControllerPak1MaxWriteableFiles;
extern s32 gControllerPak1FileNote; // osPfs file_no receiver/out param
extern s32 gControllerPak2FileNote;
extern SaveData D_8018EB90;
extern u8 D_8018ED11;
extern u8 D_8018ED12;
+20 -20
View File
@@ -303,44 +303,44 @@ void options_menu_act(struct Controller *controller, u16 arg1) {
}
break;
case 0x17:
switch(func_800B5DA4()) {
case -1:
switch(controller_pak_2_status()) {
case PFS_INVALID_DATA:
D_8018EDEC = 0x2B;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
case 0:
case PFS_NO_ERROR:
func_800B6798();
sp2C = controller_pak_status();
sp2C = controller_pak_1_status();
switch (sp2C) {
case -1:
case PFS_INVALID_DATA:
D_8018EDEC = 0x46;
sp38->unk4 = 0;
play_sound2(SOUND_MENU_SELECT);
break;
case 0:
case PFS_NO_ERROR:
func_800B6708();
break;
case 1:
case PFS_NO_PAK_INSERTED:
D_8018EDEC = 0x34;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
break;
case 4:
case PFS_FILE_OVERFLOW:
D_8018EDEC = 0x37;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
break;
case 2:
case PFS_PAK_BAD_READ:
case 3:
default:
D_8018EDEC = 0x35;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
break;
}
if (sp2C == -1 && !sp30[0].ghostDataSaved && !sp30[1].ghostDataSaved) {
if (sp2C == PFS_INVALID_DATA && !sp30[0].ghostDataSaved && !sp30[1].ghostDataSaved) {
D_8018EDEC = 0x2A;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
if (sp2C == 0) {
if (sp2C == PFS_NO_ERROR) {
if (sp30[0].ghostDataSaved) {
D_8018EDEC = 0x28;
play_sound2(SOUND_MENU_SELECT);
@@ -354,11 +354,11 @@ void options_menu_act(struct Controller *controller, u16 arg1) {
}
// else return?
return;
case 1:
case PFS_NO_PAK_INSERTED:
D_8018EDEC = 0x2C;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
case 2:
case PFS_PAK_BAD_READ:
default:
D_8018EDEC = 0x2D;
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
@@ -567,8 +567,8 @@ void options_menu_act(struct Controller *controller, u16 arg1) {
}
case 0x3B:
{
res = func_800B5DA4();
if (res == 0) {
res = controller_pak_2_status();
if (res == PFS_NO_ERROR) {
res = func_800B65F4(sp38->unk20, sp38->unk1C);
}
if (res != 0) {
@@ -576,8 +576,8 @@ void options_menu_act(struct Controller *controller, u16 arg1) {
play_sound2(SOUND_MENU_FILE_NOT_FOUND);
return;
}
res = osPfsFindFile(&D_8018E868, D_800E86F0, D_800E86F4, (u8 *)D_800F2E64, (u8 *)D_800F2E74, &D_8018EB84);
if (res == 0) {
res = osPfsFindFile(&gControllerPak1FileHandle, gCompanyCode, gGameCode, (u8 *)gGameName, (u8 *)gExtCode, &gControllerPak1FileNote);
if (res == PFS_NO_ERROR) {
res = func_800B6178(sp38->unk1C);
}
if (res != 0) {
@@ -894,7 +894,7 @@ void controller_pak_menu_act(struct Controller* controller, UNUSED u16 arg1) {
if ((buttonAndStickPress & 0x9000) != 0) {
play_sound2(SOUND_MENU_SELECT);
func_8009E1C0();
D_800E86F8 = 0;
gControllerPak1State = BAD;
return;
}
if ((buttonAndStickPress & 0x300) != 0) {
@@ -983,13 +983,13 @@ void controller_pak_menu_act(struct Controller* controller, UNUSED u16 arg1) {
selectedTableRow = D_800E86C4[gControllerPakSelectedTableRow + 2] - 1;
osPfsState = &D_8018E938[selectedTableRow];
switch (osPfsDeleteFile(&D_8018E868, osPfsState->company_code, osPfsState->game_code, (u8 *)&osPfsState->game_name, (u8 *)&osPfsState->ext_name)) {
switch (osPfsDeleteFile(&gControllerPak1FileHandle, osPfsState->company_code, osPfsState->game_code, (u8 *)&osPfsState->game_name, (u8 *)&osPfsState->ext_name)) {
default:
gControllerPakMenuSelection = CONTROLLER_PAK_MENU_ERASE_ERROR_NOT_ERASED;
return;
case 0:
D_8018EB38[selectedTableRow] = -1;
gControllerPakNumPagesFree += (((osPfsState->file_size + 0xFF) >> 8) & 0xFF);
gControllerPak1NumPagesFree += (((osPfsState->file_size + 0xFF) >> 8) & 0xFF);
gControllerPakMenuSelection = CONTROLLER_PAK_MENU_TABLE_GAME_DATA;
return;
case PFS_ERR_NOPACK: