diff options
| -rw-r--r-- | include/6F12E0.h | 38 | ||||
| -rw-r--r-- | include/6F17B0.h | 25 | ||||
| -rw-r--r-- | include/code_variables.h | 2 | ||||
| -rw-r--r-- | include/m_cpak.h | 65 | ||||
| -rw-r--r-- | include/s_cpak.h | 20 | ||||
| -rw-r--r-- | linker_scripts/jp/symbol_addrs_code.txt | 54 | ||||
| -rw-r--r-- | src/code/m_cpak.c | 490 | ||||
| -rw-r--r-- | src/code/m_private.c | 2 | ||||
| -rw-r--r-- | src/code/s_cpak.c | 181 | ||||
| -rw-r--r-- | src/overlays/gamestates/ovl_second_game/second_game.c | 2 | ||||
| -rw-r--r-- | yamls/jp/code.yaml | 5 |
11 files changed, 528 insertions, 356 deletions
diff --git a/include/6F12E0.h b/include/6F12E0.h deleted file mode 100644 index 18f721e..0000000 --- a/include/6F12E0.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef C_6F12E0_H -#define C_6F12E0_H - -#include "ultra64.h" - -#include "m_cpak.h" - -void func_800CD640_jp(PakInfo74Struct* arg0, void*, void*); -UNK_RET func_800CD68C_jp(PakInfo04Struct* arg0, UNK_TYPE arg1); -size_t func_800CD730_jp(PakInfo04Struct* arg0); -UNK_RET func_800CD760_jp(PakInfo04Struct* arg0, UNK_TYPE arg1, u32 arg2, void* arg3); -UNK_RET func_800CD82C_jp(PakInfo04Struct* arg0, UNK_TYPE arg1, u32 arg2, void* arg3); -UNK_RET func_800CD8F8_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1, u32 arg2); -UNK_RET func_800CD990_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1); -void func_800CD9F0_jp(PakInfo04Struct* arg0, PakInfo74Struct* arg1); -UNK_RET func_800CDA4C_jp(PakInfo04Struct* arg0, PakInfo94Struct* arg1); -UNK_RET func_800CDA90_jp(PakInfo04Struct* arg0, UNK_PTR, UNK_PTR); -// void func_800CDAD0_jp(); -// void func_800CDB10_jp(); -// void func_800CDBE0_jp(); -// void func_800CDBF0_jp(); -// void func_800CDC10_jp(); -// void func_800CDC30_jp(); -// void func_800CDCC0_jp(); -// void func_800CDDE0_jp(); -// void func_800CDE54_jp(); -// void func_800CDECC_jp(); -// void func_800CDEDC_jp(); -// void func_800CDF78_jp(); -// void func_800CE04C_jp(); -// void func_800CE090_jp(); -// void func_800CE0E8_jp(); -// void func_800CE110_jp(); -// void func_800CE120_jp(); -// void func_800CE1CC_jp(); -// void func_800CE328_jp(); - -#endif diff --git a/include/6F17B0.h b/include/6F17B0.h new file mode 100644 index 0000000..3ae179f --- /dev/null +++ b/include/6F17B0.h @@ -0,0 +1,25 @@ +#ifndef C_6F17B0_H +#define C_6F17B0_H + +#include "ultra64.h" + +// void func_800CDB10_jp(); +// void func_800CDBE0_jp(); +// void func_800CDBF0_jp(); +// void func_800CDC10_jp(); +// void func_800CDC30_jp(); +// void func_800CDCC0_jp(); +// void func_800CDDE0_jp(); +// void func_800CDE54_jp(); +// void func_800CDECC_jp(); +// void func_800CDEDC_jp(); +// void func_800CDF78_jp(); +// void func_800CE04C_jp(); +// void func_800CE090_jp(); +// void func_800CE0E8_jp(); +// void func_800CE110_jp(); +// void func_800CE120_jp(); +// void func_800CE1CC_jp(); +// void func_800CE328_jp(); + +#endif diff --git a/include/code_variables.h b/include/code_variables.h index b1e0978..45c637c 100644 --- a/include/code_variables.h +++ b/include/code_variables.h @@ -759,7 +759,7 @@ extern s32 fuusen_DEBUG_mode_flag; // extern UNK_TYPE D_8010EF48_jp; // extern UNK_TYPE D_8010EF50_jp; // extern UNK_TYPE D_8010EF60_jp; -// extern UNK_TYPE D_8010EF70_jp; +extern char D_8010EF70_jp[]; extern vs32 D_8010EFB0_jp; // TODO: Determine where this goes // extern UNK_TYPE D_8010EFB8_jp; diff --git a/include/m_cpak.h b/include/m_cpak.h index 0a6c723..035d9b0 100644 --- a/include/m_cpak.h +++ b/include/m_cpak.h @@ -7,26 +7,21 @@ #include "m_npc.h" #include "m_private.h" -typedef struct B80137C40Unk0000Struct { +typedef struct Passport { /* 0x0000 */ u16 unk_0000; /* 0x0002 */ UNK_TYPE1 unk_0002[0x0006]; /* 0x0008 */ PrivateInfo priv; /* 0x0BD8 */ Animal_c animal; /* 0x1100 */ u16 unk_1100; /* 0x1102 */ UNK_TYPE1 unk_1102[0x00FE]; -} B80137C40Unk0000Struct; // size = 0x1200 +} Passport; // size = 0x1200 -typedef struct B80137C40Struct { - /* 0x0000 */ B80137C40Unk0000Struct unk_0000; - /* 0x1200 */ OSMesgQueue* unk_1200; +typedef struct PakCtrl { + /* 0x0000 */ Passport passport; + /* 0x1200 */ OSMesgQueue* queue; /* 0x1204 */ UNK_TYPE unk_1204; /* 0x1208 */ u16 unk_1208; -} B80137C40Struct; // size = 0x1208 - -// For alignment this can only have members of size 1 or 2 -typedef struct D80104798Struct { - /* 0x0 */ UNK_TYPE1 unk0[0x10]; -} D80104798Struct; // size 0x10 +} PakCtrl; // size = 0x1208 typedef struct D801047A8Struct { /* 0x0 */ UNK_TYPE1 unk_0[0x08]; @@ -37,49 +32,37 @@ typedef struct D801047B0Struct { /* 0x0002 */ UNK_TYPE1 unk_0002[0x66FE]; } D801047B0Struct; // size = 0x6700; -typedef struct PakInfo74Struct { - /* 0x00 */ size_t unk_00; - /* 0x04 */ UNK_TYPE1 unk_04[0x6]; - /* 0x0A */ char unk_0A[4]; - /* 0x0E */ D80104798Struct unk_0E; - /* 0x1E */ UNK_TYPE1 unk_1E[0x2]; -} PakInfo74Struct; // size = 0x20 - -typedef struct PakInfo94Struct { - /* 0x00 */ UNK_TYPE1 unk_00[0x20]; -} PakInfo94Struct; // size = 0x20 - -typedef struct PakInfo04Struct { +typedef struct OSPfsInfo { /* 0x00 */ OSPfs pfs; - /* 0x68 */ s32 unk_68; - /* 0x6C */ s32 unk_6C; -} PakInfo04Struct; // size = 0x70 + /* 0x68 */ s32 fileNo; + /* 0x6C */ s32 err; +} OSPfsInfo; // size = 0x70 typedef struct PakInfo { /* 0x000 */ UNK_TYPE unk_00; - /* 0x004 */ PakInfo04Struct unk_04; - /* 0x074 */ PakInfo74Struct unk_74; - /* 0x090 */ PakInfo94Struct unk_94[16]; + /* 0x004 */ OSPfsInfo pfsInfo; + /* 0x074 */ OSPfsState pfsState; + /* 0x094 */ OSPfsState unk_94[16]; /* 0x294 */ s32 unk_294[16]; - /* 0x2D4 */ size_t unk_2D4; - /* 0x2D8 */ s32 unk_2D8; - /* 0x2DC */ s32 unk_2DC; + /* 0x2D4 */ s32 freeBytes; + /* 0x2D8 */ s32 maxFiles; + /* 0x2DC */ s32 filesUsed; } PakInfo; // size >= 0x2DC -UNK_RET mCPk_PakOpen(PakInfo* info, s32 arg1); -UNK_RET func_80078F08_jp(PakInfo* info); -s32 func_80078FE8_jp(PakInfo* info); -void func_80079080_jp(B80137C40Struct* arg0); -UNK_RET mCPk_InitPak(UNK_TYPE arg0); -PrivateInfo* func_800793A8_jp(void); +s32 mCPk_PakOpen(PakInfo* info, s32 channel); +s32 mCPk_NoteNum(PakInfo* info); +s32 mCPk_FreeBlockNum(PakInfo* info); +void mCPk_ClearPassport(Passport* passport); +s32 mCPk_InitPak(s32 channel); +PrivateInfo* mCPk_GetSaveFilePrivateP(void); s32 mCPk_SavePak(PrivateInfo* priv, Animal_c* animal, PakInfo* info); -s32 func_8007942C_jp(PrivateInfo* priv, Animal_c* animal, PakInfo* info); +s32 mCPk_PakPrivateLoad(PrivateInfo* priv, Animal_c* animal, PakInfo* info); s32 func_80079760_jp(void); void* func_80079838_jp(void); s32 func_800798DC_jp(PakInfo* info); UNK_RET func_80079AAC_jp(void); UNK_RET func_80079D00_jp(void); -s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* arg1); +s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* info); UNK_RET func_80079EA4_jp(UNK_PTR, PakInfo* info); void func_80079EDC_jp(void); s32 func_80079F44_jp(void); diff --git a/include/s_cpak.h b/include/s_cpak.h new file mode 100644 index 0000000..5ad06f9 --- /dev/null +++ b/include/s_cpak.h @@ -0,0 +1,20 @@ +#ifndef S_CPAK_H +#define S_CPAK_H + +#include "ultra64.h" + +#include "m_cpak.h" + +void sCPk_SetCode(OSPfsState* pfsState, u16* companyCode, u32* gameCode); +s32 sCPk_PakOpen(OSPfsInfo* pfsInfo, s32 channel); +s32 sCPk_PakFreeArea(OSPfsInfo* pfsInfo); +s32 sCPk_Save(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer); +s32 sCPk_Load(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer); +s32 sCPk_MakeFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState, size_t size); +s32 sCPk_FileOpen(OSPfsInfo* pfsInfo, OSPfsState* pfsState); +s32 sCPk_DeleteFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState); +u32 sCPk_FileState(OSPfsInfo* pfsInfo, OSPfsState* pfsState); +s32 sCPk_FileNum(OSPfsInfo* pfsInfo, s32* maxFiles, s32* filesUsed); +s32 sCPk_RepairID(OSPfsInfo* pfsInfo); + +#endif diff --git a/linker_scripts/jp/symbol_addrs_code.txt b/linker_scripts/jp/symbol_addrs_code.txt index 45f03e4..5b1cab9 100644 --- a/linker_scripts/jp/symbol_addrs_code.txt +++ b/linker_scripts/jp/symbol_addrs_code.txt @@ -932,21 +932,21 @@ getTrigger = 0x80078DF4; // type:func getJoystick_X = 0x80078E28; // type:func getJoystick_Y = 0x80078E5C; // type:func mCPk_PakOpen = 0x80078E90; // type:func -func_80078EB4_jp = 0x80078EB4; // type:func -func_80078EE0_jp = 0x80078EE0; // type:func -func_80078F08_jp = 0x80078F08; // type:func +mCPk_NoteMake = 0x80078EB4; // type:func +mCPk_NoteOpen = 0x80078EE0; // type:func +mCPk_NoteNum = 0x80078F08; // type:func func_80078F34_jp = 0x80078F34; // type:func -func_80078FE8_jp = 0x80078FE8; // type:func -func_80079030_jp = 0x80079030; // type:func -func_80079080_jp = 0x80079080; // type:func +mCPk_FreeBlockNum = 0x80078FE8; // type:func +mCPk_CheckNoteRest = 0x80079030; // type:func +mCPk_ClearPassport = 0x80079080; // type:func mCPk_InitPak = 0x800790C0; // type:func -func_8007919C_jp = 0x8007919C; // type:func +mCPk_SetForestPakState = 0x8007919C; // type:func func_8007920C_jp = 0x8007920C; // type:func func_800792FC_jp = 0x800792FC; // type:func -func_80079378_jp = 0x80079378; // type:func -func_800793A8_jp = 0x800793A8; // type:func +mCPk_SetPrivateSavefile = 0x80079378; // type:func +mCPk_GetSaveFilePrivateP = 0x800793A8; // type:func mCPk_SavePak = 0x800793B8; // type:func -func_8007942C_jp = 0x8007942C; // type:func +mCPk_PakPrivateLoad = 0x8007942C; // type:func func_800794E4_jp = 0x800794E4; // type:func func_8007967C_jp = 0x8007967C; // type:func func_80079708_jp = 0x80079708; // type:func @@ -3218,17 +3218,17 @@ func_800CCE08_jp = 0x800CCE08; // type:func func_800CCE40_jp = 0x800CCE40; // type:func func_800CD194_jp = 0x800CD194; // type:func func_800CD59C_jp = 0x800CD59C; // type:func -func_800CD640_jp = 0x800CD640; // type:func -func_800CD68C_jp = 0x800CD68C; // type:func -func_800CD730_jp = 0x800CD730; // type:func -func_800CD760_jp = 0x800CD760; // type:func -func_800CD82C_jp = 0x800CD82C; // type:func -func_800CD8F8_jp = 0x800CD8F8; // type:func -func_800CD990_jp = 0x800CD990; // type:func -func_800CD9F0_jp = 0x800CD9F0; // type:func -func_800CDA4C_jp = 0x800CDA4C; // type:func -func_800CDA90_jp = 0x800CDA90; // type:func -func_800CDAD0_jp = 0x800CDAD0; // type:func +sCPk_SetCode = 0x800CD640; // type:func +sCPk_PakOpen = 0x800CD68C; // type:func +sCPk_PakFreeArea = 0x800CD730; // type:func +sCPk_Save = 0x800CD760; // type:func +sCPk_Load = 0x800CD82C; // type:func +sCPk_MakeFile = 0x800CD8F8; // type:func +sCPk_FileOpen = 0x800CD990; // type:func +sCPk_DeleteFile = 0x800CD9F0; // type:func +sCPk_FileState = 0x800CDA4C; // type:func +sCPk_FileNum = 0x800CDA90; // type:func +sCPk_RepairID = 0x800CDAD0; // type:func func_800CDB10_jp = 0x800CDB10; // type:func func_800CDBE0_jp = 0x800CDBE0; // type:func func_800CDBF0_jp = 0x800CDBF0; // type:func @@ -4362,10 +4362,10 @@ oc_collision_function = 0x8010471C; // size:0x24 occ_collision_function = 0x80104740; // OCCClearFunctionTable = 0x80104764; // status_org = 0x80104770; // -D_80104790_jp = 0x80104790; // type:s32 -D_80104794_jp = 0x80104794; // -D_80104798_jp = 0x80104798; // -D_8010479C_jp = 0x8010479C; // +sCompanyCode = 0x80104790; // type:s32 +sGameCode = 0x80104794; // +l_game_name = 0x80104798; // +l_ext_name_table = 0x8010479C; // g_paks_info_p = 0x801047A4; // D_801047A8_jp = 0x801047A8; // D_801047B0_jp = 0x801047B0; // @@ -5331,7 +5331,7 @@ RO_FLT_801167F0_jp = 0x801167F0; // type:f32 RO_FLT_801167F4_jp = 0x801167F4; // type:f32 RO_STR_80116800_jp = 0x80116800; // type:asciz RO_STR_80116804_jp = 0x80116804; // type:asciz -RO_80116808_jp = 0x80116808; // +sFileSizes = 0x80116808; // jtbl_80116810_jp = 0x80116810; // type:jtbl RO_FLT_80116828_jp = 0x80116828; // type:f32 RO_STR_80116830_jp = 0x80116830; // type:asciz @@ -5997,7 +5997,7 @@ B_80126E9C_jp = 0x80126E9C; // common_data = 0x80126EA0; // size:0x10AB8 l_paks_info = 0x80137960; // -B_80137C40_jp = 0x80137C40; // size:0x1208 +l_pak_ctrl = 0x80137C40; // size:0x1208 debug_mode = 0x80138E50; // debug_display = 0x80138E60; // diff --git a/src/code/m_cpak.c b/src/code/m_cpak.c index beb8290..c6a4005 100644 --- a/src/code/m_cpak.c +++ b/src/code/m_cpak.c @@ -8,229 +8,231 @@ #include "padmgr.h" #include "6B8F20.h" -#include "6F12E0.h" +#include "s_cpak.h" -extern PakInfo l_paks_info; -extern B80137C40Struct B_80137C40_jp; +PakInfo l_paks_info; +PakCtrl l_pak_ctrl; -extern D80104798Struct D_8010EF70_jp; - -UNK_TYPE2 D_80104790_jp = 0x3031; -UNK_TYPE D_80104794_jp = 0x4E41464A; -D80104798Struct* D_80104798_jp = &D_8010EF70_jp; -char* D_8010479C_jp[2] = { "\x1A", "\x1B" }; +u16 sCompanyCode = 0x3031; +u32 sGameCode = 0x4E41464A; +char* l_game_name = D_8010EF70_jp; +char* l_ext_name_table[2] = { "\x1A", "\x1B" }; PakInfo* g_paks_info_p = &l_paks_info; D801047A8Struct D_801047A8_jp = { { 0xD4, 0x8E, 0xA6, 0x90, 0x85, 0x42, 0x00, 0x00 } }; -const size_t RO_80116808_jp[2] = { sizeof(B80137C40Unk0000Struct), sizeof(D801047B0Struct) }; +const size_t sFileSizes[2] = { sizeof(Passport), sizeof(D801047B0Struct) }; -UNK_RET mCPk_PakOpen(PakInfo* info, s32 arg1) { - return func_800CD68C_jp(&info->unk_04, arg1); +s32 mCPk_PakOpen(PakInfo* info, s32 channel) { + return sCPk_PakOpen(&info->pfsInfo, channel); } -UNK_RET func_80078EB4_jp(PakInfo* info) { - return func_800CD8F8_jp(&info->unk_04, &info->unk_74, info->unk_74.unk_00); +s32 mCPk_NoteMake(PakInfo* info) { + return sCPk_MakeFile(&info->pfsInfo, &info->pfsState, info->pfsState.file_size); } -UNK_RET func_80078EE0_jp(PakInfo* info) { - return func_800CD990_jp(&info->unk_04, &info->unk_74); +s32 mCPk_NoteOpen(PakInfo* info) { + return sCPk_FileOpen(&info->pfsInfo, &info->pfsState); } -UNK_RET func_80078F08_jp(PakInfo* info) { - return func_800CDA90_jp(&info->unk_04, &info->unk_2D8, &info->unk_2DC); +s32 mCPk_NoteNum(PakInfo* info) { + return sCPk_FileNum(&info->pfsInfo, &info->maxFiles, &info->filesUsed); } s32 func_80078F34_jp(PakInfo* info) { - PakInfo04Struct* var_s2 = &info->unk_04; - PakInfo94Struct* var_s3 = info->unk_94; + OSPfsInfo* pfsInfo = &info->pfsInfo; + OSPfsState* pfsStates = info->unk_94; s32* var_s1 = info->unk_294; s32 i; - s32 temp_v0; + u32 file_size; for (i = 0; i < ARRAY_COUNT(info->unk_94); i++) { var_s1[i] = 0; - var_s2->unk_68 = i; - temp_v0 = func_800CDA4C_jp(var_s2, &var_s3[i]); - if (temp_v0 == 0) { - if (var_s2->unk_6C == 5) { + pfsInfo->fileNo = i; + file_size = sCPk_FileState(pfsInfo, &pfsStates[i]); + if (file_size == 0) { + if (pfsInfo->err == PFS_ERR_INVALID) { var_s1[i] = -1; continue; } - return temp_v0; + return file_size; } } - return temp_v0; + return file_size; } -s32 func_80078FE8_jp(PakInfo* info) { - s32 sp1C = FALSE; +s32 mCPk_FreeBlockNum(PakInfo* info) { + s32 ret = FALSE; - info->unk_2D4 = func_800CD730_jp(&info->unk_04); - if (info->unk_04.unk_6C == 0) { - sp1C = TRUE; + info->freeBytes = sCPk_PakFreeArea(&info->pfsInfo); + if (info->pfsInfo.err == 0) { + ret = TRUE; } - return sp1C; + return ret; } -s32 func_80079030_jp(PakInfo* info) { - s32 sp1C = FALSE; +s32 mCPk_CheckNoteRest(PakInfo* info) { + s32 ret = FALSE; - if ((func_80078FE8_jp(info) == TRUE) && (info->unk_2D4 >= info->unk_74.unk_00)) { - sp1C = TRUE; + if ((mCPk_FreeBlockNum(info) == TRUE) && (info->freeBytes >= info->pfsState.file_size)) { + ret = TRUE; } - return sp1C; + return ret; } -void func_80079080_jp(B80137C40Struct* arg0) { - arg0->unk_0000.unk_0000 = 0; - mPr_ClearPrivateInfo(&arg0->unk_0000.priv); - mNpc_ClearAnimalInfo(&arg0->unk_0000.animal); - arg0->unk_0000.unk_1100 = 0xFFFF; +void mCPk_ClearPassport(Passport* passport) { + passport->unk_0000 = 0; + mPr_ClearPrivateInfo(&passport->priv); + mNpc_ClearAnimalInfo(&passport->animal); + passport->unk_1100 = 0xFFFF; } -UNK_RET mCPk_InitPak(UNK_TYPE arg0) { - PakInfo* sp2C; - PakInfo74Struct* sp28; - PakInfo94Struct* tmp; +s32 mCPk_InitPak(s32 channel) { + PakInfo* info = mCPk_get_pkinfo(); + OSPfsState* pfsState; + OSPfsState* iter; s32 i; - s32 temp_s1; + s32 ret; - sp2C = mCPk_get_pkinfo(); - sp2C->unk_00 = 0; + info->unk_00 = 0; - sp28 = &sp2C->unk_74; - bzero(sp28, sizeof(PakInfo74Struct)); + pfsState = &info->pfsState; + bzero(pfsState, sizeof(OSPfsState)); - tmp = sp2C->unk_94; - for (i = 0; i < ARRAY_COUNT(sp2C->unk_94); i++) { - bzero(tmp, sizeof(PakInfo94Struct)); - tmp++; + iter = info->unk_94; + for (i = 0; i < ARRAY_COUNT(info->unk_94); i++) { + bzero(iter, sizeof(OSPfsState)); + iter++; } - func_800CD640_jp(sp28, &D_80104790_jp, &D_80104794_jp); - bcopy(D_80104798_jp, &sp28->unk_0E, sizeof(D80104798Struct)); - temp_s1 = mCPk_PakOpen(sp2C, arg0); - func_80079080_jp(&B_80137C40_jp); - B_80137C40_jp.unk_1200 = NULL; - B_80137C40_jp.unk_1204 = 0; - B_80137C40_jp.unk_1208 = 0xFFFF; - return temp_s1; + sCPk_SetCode(pfsState, &sCompanyCode, &sGameCode); + + bcopy(l_game_name, &pfsState->game_name, sizeof(pfsState->game_name)); + + ret = mCPk_PakOpen(info, channel); + + mCPk_ClearPassport(&l_pak_ctrl.passport); + + l_pak_ctrl.queue = NULL; + l_pak_ctrl.unk_1204 = 0; + l_pak_ctrl.unk_1208 = 0xFFFF; + + return ret; } -void func_8007919C_jp(PakInfo* info, u8 arg1) { - PakInfo74Struct* sp20 = &info->unk_74; +void mCPk_SetForestPakState(PakInfo* info, u8 state) { + OSPfsState* pfsState = &info->pfsState; - if (arg1 < 2) { - bcopy(D_8010479C_jp[arg1], sp20->unk_0A, sizeof(sp20->unk_0A)); - sp20->unk_00 = RO_80116808_jp[arg1]; + if (state < ARRAY_COUNT(l_ext_name_table)) { + bcopy(l_ext_name_table[state], pfsState->ext_name, sizeof(pfsState->ext_name)); + pfsState->file_size = sFileSizes[state]; } } -UNK_RET func_8007920C_jp(PakInfo* info, void* arg1) { - s32 var_v0; - s32 var_s1; - u32 tmp; +s32 func_8007920C_jp(PakInfo* info, void* buffer) { + s32 ret; + s32 i; + u32 file_size; - for (var_s1 = 0; var_s1 < 1; var_s1++) { - PakInfo04Struct* temp_s3 = &info->unk_04; + for (i = 0; i < 1; i++) { + OSPfsInfo* pfsInfo = &info->pfsInfo; - B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ(); - var_v0 = func_80078EE0_jp(info); + l_pak_ctrl.queue = padmgr_LockSerialMesgQ(); + ret = mCPk_NoteOpen(info); - if (temp_s3->unk_6C == 5) { - var_v0 = func_80078EB4_jp(info); + if (pfsInfo->err == PFS_ERR_INVALID) { + ret = mCPk_NoteMake(info); } - if ((var_v0 == 1) || (temp_s3->unk_6C == 9)) { - tmp = info->unk_74.unk_00; - var_v0 = func_800CD760_jp(temp_s3, 0, tmp, arg1); + if ((ret == 1) || (pfsInfo->err == PFS_ERR_EXIST)) { + file_size = info->pfsState.file_size; + ret = sCPk_Save(pfsInfo, 0, file_size, buffer); } - padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200); + padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue); } - return var_v0; + return ret; } -s32 func_800792FC_jp(PakInfo* info, void* arg1) { - s32 sp1C; - u32 tmp; +s32 func_800792FC_jp(PakInfo* info, void* buffer) { + s32 ret; + u32 file_size; - B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ(); - sp1C = func_80078EE0_jp(info); + l_pak_ctrl.queue = padmgr_LockSerialMesgQ(); + ret = mCPk_NoteOpen(info); - if (sp1C == 1) { - tmp = info->unk_74.unk_00; - sp1C = func_800CD82C_jp(&info->unk_04, 0, tmp, arg1); - if (sp1C == 0) { - sp1C = -1; + if (ret == 1) { + file_size = info->pfsState.file_size; + ret = sCPk_Load(&info->pfsInfo, 0, file_size, buffer); + if (ret == 0) { + ret = -1; } } - padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200); + padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue); - return sp1C; + return ret; } -void func_80079378_jp(PrivateInfo* priv) { +void mCPk_SetPrivateSavefile(PrivateInfo* priv) { if (priv != NULL) { - mem_copy((void*)&B_80137C40_jp.unk_0000.priv, (void*)priv, sizeof(PrivateInfo)); + mem_copy((void*)&l_pak_ctrl.passport.priv, (void*)priv, sizeof(PrivateInfo)); } } -PrivateInfo* func_800793A8_jp(void) { - return &B_80137C40_jp.unk_0000.priv; +PrivateInfo* mCPk_GetSaveFilePrivateP(void) { + return &l_pak_ctrl.passport.priv; } s32 mCPk_SavePak(PrivateInfo* priv, Animal_c* animal, PakInfo* info) { - func_8007919C_jp(info, 0); - func_80079378_jp(priv); - mem_copy((void*)&B_80137C40_jp.unk_0000.animal, (void*)animal, sizeof(Animal_c)); - B_80137C40_jp.unk_0000.unk_0000 = - func_8008EEB4_jp(&B_80137C40_jp.unk_0000, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000); + mCPk_SetForestPakState(info, 0); + mCPk_SetPrivateSavefile(priv); + mem_copy((void*)&l_pak_ctrl.passport.animal, (void*)animal, sizeof(Animal_c)); + l_pak_ctrl.passport.unk_0000 = + func_8008EEB4_jp(&l_pak_ctrl.passport, sizeof(Passport), l_pak_ctrl.passport.unk_0000); - return func_8007920C_jp(info, &B_80137C40_jp); + return func_8007920C_jp(info, &l_pak_ctrl.passport); } -s32 func_8007942C_jp(PrivateInfo* priv, Animal_c* animal, PakInfo* info) { - s32 sp1C; +s32 mCPk_PakPrivateLoad(PrivateInfo* priv, Animal_c* animal, PakInfo* info) { + s32 ret; - func_8007919C_jp(info, 0); - sp1C = func_800792FC_jp(info, &B_80137C40_jp); + mCPk_SetForestPakState(info, 0); + ret = func_800792FC_jp(info, &l_pak_ctrl.passport); - if (sp1C == 1) { - B_80137C40_jp.unk_1204 = 1; + if (ret == 1) { + l_pak_ctrl.unk_1204 = 1; } - if (sp1C == 1) { - if (mPr_CheckPrivate(&B_80137C40_jp.unk_0000.priv) == TRUE) { - mem_copy((void*)priv, (void*)&B_80137C40_jp.unk_0000.priv, sizeof(PrivateInfo)); - mem_copy((void*)animal, (void*)&B_80137C40_jp.unk_0000.animal, sizeof(Animal_c)); + if (ret == 1) { + if (mPr_CheckPrivate(&l_pak_ctrl.passport.priv) == TRUE) { + mem_copy((void*)priv, (void*)&l_pak_ctrl.passport.priv, sizeof(PrivateInfo)); + mem_copy((void*)animal, (void*)&l_pak_ctrl.passport.animal, sizeof(Animal_c)); } else { - sp1C = 0; + ret = 0; } } else { - sp1C = 0; + ret = 0; } - return sp1C; + return ret; } -s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* arg2, void* arg3) { - PakInfo04Struct* unkStruct = &arg2->unk_04; - void* var_a3; - s32 sp24 = FALSE; +s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* info, void* arg3) { + OSPfsInfo* pfsInfo = &info->pfsInfo; + void* buffer; + s32 ret = FALSE; UNUSED s32 pad[2]; *arg0 = 5; - B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ(); - if ((func_80078EE0_jp(arg2) == 1) || (unkStruct->unk_6C == 9)) { - var_a3 = (arg1 == 0) ? &B_80137C40_jp : arg3; - if ((var_a3 != NULL) && (func_800CD82C_jp(unkStruct, 0, arg2->unk_74.unk_00, var_a3) == 1)) { + l_pak_ctrl.queue = padmgr_LockSerialMesgQ(); + if ((mCPk_NoteOpen(info) == 1) || (pfsInfo->err == PFS_ERR_EXIST)) { + buffer = (arg1 == 0) ? &l_pak_ctrl.passport : arg3; + if ((buffer != NULL) && (sCPk_Load(pfsInfo, 0, info->pfsState.file_size, buffer) == 1)) { if (arg1 == 0) { - if (!mPr_NullCheckPersonalID(&B_80137C40_jp.unk_0000.priv.playerId)) { - B_80137C40_jp.unk_1204 = 1; + if (!mPr_NullCheckPersonalID(&l_pak_ctrl.passport.priv.playerId)) { + l_pak_ctrl.unk_1204 = 1; *arg0 = 0; } else { *arg0 = 2; @@ -238,103 +240,103 @@ s32 func_800794E4_jp(s32* arg0, s32 arg1, PakInfo* arg2, void* arg3) { } else { *arg0 = 2; } - sp24 = TRUE; + ret = TRUE; } - } else if (unkStruct->unk_6C == 5) { - if ((func_80078F08_jp(arg2) == 1) && (arg2->unk_2DC >= 0x10)) { + } else if (pfsInfo->err == PFS_ERR_INVALID) { + if ((mCPk_NoteNum(info) == 1) && (info->filesUsed >= 0x10)) { *arg0 = 4; - sp24 = TRUE; - } else if (func_80079030_jp(arg2) == TRUE) { + ret = TRUE; + } else if (mCPk_CheckNoteRest(info) == TRUE) { *arg0 = 1; - sp24 = TRUE; - } else if (unkStruct->unk_6C == 0) { + ret = TRUE; + } else if (pfsInfo->err == 0) { *arg0 = 3; - sp24 = TRUE; + ret = TRUE; } } - padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200); - return sp24; + padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue); + return ret; } -s32 func_8007967C_jp(s32* arg0, s32 arg1, PakInfo* arg2) { +s32 func_8007967C_jp(s32* arg0, s32 arg1, PakInfo* info) { UNUSED s32 pad; - s32 sp20; + s32 ret; void* sp1C; if (arg1 == 0) { - sp1C = &B_80137C40_jp; + sp1C = &l_pak_ctrl; } else { - sp1C = zelda_malloc(arg2->unk_74.unk_00); + sp1C = zelda_malloc(info->pfsState.file_size); } - sp20 = func_800794E4_jp(arg0, arg1, arg2, sp1C); + ret = func_800794E4_jp(arg0, arg1, info, sp1C); if ((arg1 != 0) && (sp1C != NULL)) { zelda_free(sp1C); } - return sp20; + return ret; } UNK_RET func_80079708_jp(s32 arg0) { - s32 var_v1; + s32 ret; switch (arg0) { case 0: - var_v1 = 4; + ret = 4; break; case 1: case 2: - var_v1 = 3; + ret = 3; break; case 3: - var_v1 = 2; + ret = 2; break; case 4: - var_v1 = 6; + ret = 6; break; case 5: - var_v1 = 5; + ret = 5; break; default: - var_v1 = 5; + ret = 5; break; } - return var_v1; + return ret; } s32 func_80079760_jp(void) { PakInfo* info = mCPk_get_pkinfo(); PrivateInfo* iter = &common_data.save.saveFilePrivateInfo[0]; - s32 sp34 = -1; + s32 ret = -1; s32 temp_v0_2; s32 i; - func_8007919C_jp(info, 0); + mCPk_SetForestPakState(info, 0); - temp_v0_2 = func_800792FC_jp(info, &B_80137C40_jp); + temp_v0_2 = func_800792FC_jp(info, &l_pak_ctrl.passport); if (temp_v0_2 == 1) { - B_80137C40_jp.unk_1204 = 1; + l_pak_ctrl.unk_1204 = 1; } - if ((temp_v0_2 == 1) && !mPr_NullCheckPersonalID(&B_80137C40_jp.unk_0000.priv.playerId)) { - sp34 = 4; + if ((temp_v0_2 == 1) && !mPr_NullCheckPersonalID(&l_pak_ctrl.passport.priv.playerId)) { + ret = 4; for (i = 0; i < ARRAY_COUNT(common_data.save.saveFilePrivateInfo); i++) { - if (mPr_CheckCmpPrivate(&B_80137C40_jp.unk_0000.priv, iter) == TRUE) { - sp34 = i; + if (mPr_CheckCmpPrivate(&l_pak_ctrl.passport.priv, iter) == TRUE) { + ret = i; break; } iter++; } } - return sp34; + return ret; } void* func_80079838_jp(void) { @@ -342,14 +344,14 @@ void* func_80079838_jp(void) { PakInfo* info = mCPk_get_pkinfo(); void* sp24 = &D_801047A8_jp; - if (B_80137C40_jp.unk_1204 == 0) { - func_8007919C_jp(info, 0); - if (func_800792FC_jp(info, &B_80137C40_jp) == 1) { - B_80137C40_jp.unk_1204 = 1; - id = &B_80137C40_jp.unk_0000.priv.playerId; + if (l_pak_ctrl.unk_1204 == 0) { + mCPk_SetForestPakState(info, 0); + if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) { + l_pak_ctrl.unk_1204 = 1; + id = &l_pak_ctrl.passport.priv.playerId; } } else { - id = &B_80137C40_jp.unk_0000.priv.playerId; + id = &l_pak_ctrl.passport.priv.playerId; } if ((id != NULL) && !mPr_NullCheckPersonalID(id)) { @@ -362,62 +364,61 @@ void* func_80079838_jp(void) { s32 func_800798DC_jp(PakInfo* info) { UNUSED s32 pad; u32 temp_v0; - s32 sp24 = FALSE; + s32 ret = FALSE; - if (B_80137C40_jp.unk_1204 == 0) { - func_8007919C_jp(info, 0); - if (func_800792FC_jp(info, &B_80137C40_jp) == 1) { - B_80137C40_jp.unk_1204 = 1; + if (l_pak_ctrl.unk_1204 == 0) { + mCPk_SetForestPakState(info, 0); + if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) { + l_pak_ctrl.unk_1204 = 1; } } - if (B_80137C40_jp.unk_1204 == 1) { + if (l_pak_ctrl.unk_1204 == 1) { temp_v0 = fqrand() * 65534.0f; - B_80137C40_jp.unk_1208 = temp_v0; - B_80137C40_jp.unk_0000.unk_1100 = temp_v0; - B_80137C40_jp.unk_0000.unk_0000 = - func_8008EEB4_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000); + l_pak_ctrl.unk_1208 = temp_v0; + l_pak_ctrl.passport.unk_1100 = temp_v0; + l_pak_ctrl.passport.unk_0000 = func_8008EEB4_jp(&l_pak_ctrl, sizeof(Passport), l_pak_ctrl.passport.unk_0000); - if (func_8007920C_jp(info, &B_80137C40_jp) == 1) { - sp24 = TRUE; + if (func_8007920C_jp(info, &l_pak_ctrl.passport) == 1) { + ret = TRUE; } } - return sp24; + return ret; } s32 func_80079A24_jp(PakInfo* info) { - s32 sp1C; - - if (B_80137C40_jp.unk_1208 != 0xFFFF) { - sp1C = FALSE; - func_8007919C_jp(info, 0); - if (func_800792FC_jp(info, &B_80137C40_jp) == 1) { - B_80137C40_jp.unk_1204 = 1; - if (B_80137C40_jp.unk_1208 == B_80137C40_jp.unk_0000.unk_1100) { - sp1C = TRUE; + s32 ret; + + if (l_pak_ctrl.unk_1208 != 0xFFFF) { + ret = FALSE; + mCPk_SetForestPakState(info, 0); + if (func_800792FC_jp(info, &l_pak_ctrl.passport) == 1) { + l_pak_ctrl.unk_1204 = 1; + if (l_pak_ctrl.unk_1208 == l_pak_ctrl.passport.unk_1100) { + ret = TRUE; } } } else { - sp1C = TRUE; + ret = TRUE; } - return sp1C; + return ret; } UNK_RET func_80079AAC_jp(void) { PakInfo* info = mCPk_get_pkinfo(); - s32 sp20 = 0; + s32 ret = 0; s32 sp1C; - func_8007919C_jp(info, 0); + mCPk_SetForestPakState(info, 0); if (func_80079A24_jp(info) == 1) { if (func_8007967C_jp(&sp1C, 0, info) == 1) { - sp20 = func_80079708_jp(sp1C); + ret = func_80079708_jp(sp1C); } } else { - sp20 = 1; + ret = 1; } - return sp20; + return ret; } void func_80079B28_jp(UNK_PTR arg0, u32 arg1, PakInfo* info) { @@ -428,65 +429,65 @@ void func_80079B28_jp(UNK_PTR arg0, u32 arg1, PakInfo* info) { if (temp_v0 == 1) { if (func_8008EE7C_jp(arg0, arg1) != 0) { - func_8007919C_jp(info, 1); + mCPk_SetForestPakState(info, 1); queue = padmgr_LockSerialMesgQ(); - func_800CD9F0_jp(&info->unk_04, &info->unk_74); + sCPk_DeleteFile(&info->pfsInfo, &info->pfsState); padmgr_UnlockSerialMesgQ(queue); } } else if (temp_v0 == -1) { info2 = mCPk_get_pkinfo(); - func_8007919C_jp(info2, 1); - B_80137C40_jp.unk_1200 = padmgr_LockSerialMesgQ(); - func_800CD9F0_jp(&info2->unk_04, &info2->unk_74); - padmgr_UnlockSerialMesgQ(B_80137C40_jp.unk_1200); + mCPk_SetForestPakState(info2, 1); + l_pak_ctrl.queue = padmgr_LockSerialMesgQ(); + sCPk_DeleteFile(&info2->pfsInfo, &info2->pfsState); + padmgr_UnlockSerialMesgQ(l_pak_ctrl.queue); } } UNK_RET func_80079BF8_jp(PakInfo* info) { UNUSED s32 pad; s32 sp28; - s32 sp24 = 0; + s32 ret = 0; UNK_PTR sp20; if (!mLd_PlayerManKindCheck()) { - func_8007919C_jp(info, 1); - sp20 = zelda_malloc(info->unk_74.unk_00); + mCPk_SetForestPakState(info, 1); + sp20 = zelda_malloc(info->pfsState.file_size); if (sp20 != NULL) { - func_80079B28_jp(sp20, info->unk_74.unk_00, info); + func_80079B28_jp(sp20, info->pfsState.file_size, info); } if (func_800794E4_jp(&sp28, 1, info, sp20) == TRUE) { - sp24 = func_80079708_jp(sp28); + ret = func_80079708_jp(sp28); } if (sp20 != NULL) { zelda_free(sp20); } } else if (func_800966E0_jp() == 1) { - func_8007919C_jp(info, 0); + mCPk_SetForestPakState(info, 0); if (func_80079A24_jp(info) == 1) { if (func_8007967C_jp(&sp28, 0, info) == 1) { - sp24 = func_80079708_jp(sp28); + ret = func_80079708_jp(sp28); } } else { - sp24 = 1; + ret = 1; } } - return sp24; + return ret; } UNK_RET func_80079D00_jp(void) { PakInfo* info = mCPk_get_pkinfo(); - s32 sp18 = 0; + s32 ret = 0; - if (mCPk_PakOpen(info, 0) == 1) { - sp18 = func_80079BF8_jp(info); + if (mCPk_PakOpen(info, 0) == TRUE) { + ret = func_80079BF8_jp(info); } - return sp18; + return ret; } s32 func_80079D50_jp(D801047B0Struct* arg0, PakInfo* info, u8* index) { - func_8007919C_jp(info, 1); + mCPk_SetForestPakState(info, 1); arg0->unk_0000 = func_8008EEB4_jp(arg0, sizeof(D801047B0Struct), arg0->unk_0000); if (func_8007920C_jp(info, arg0) == 1) { if (mLd_PlayerManKindCheck()) { @@ -506,70 +507,69 @@ s32 func_80079D50_jp(D801047B0Struct* arg0, PakInfo* info, u8* index) { } s32 func_80079E14_jp(UNUSED D801047B0Struct* arg0, UNUSED PakInfo* info, u8* arg2) { - s32 temp_v0 = func_80090044_jp(); + s32 ret = func_80090044_jp(); - if (temp_v0 != 0) { + if (ret != 0) { *arg2 = 0; } - return temp_v0; + return ret; } typedef s32 (*D801047B0Func)(D801047B0Struct*, PakInfo*, u8*); D801047B0Func D_801047B0_jp[2] = { func_80079D50_jp, func_80079E14_jp }; -s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* arg1) { +s32 func_80079E54_jp(D801047B0Struct* arg0, PakInfo* info) { static u8 D_801047B8_jp = 0; if (D_801047B8_jp >= ARRAY_COUNT(D_801047B0_jp)) { D_801047B8_jp = 0; } - return D_801047B0_jp[D_801047B8_jp](arg0, arg1, &D_801047B8_jp); + return D_801047B0_jp[D_801047B8_jp](arg0, info, &D_801047B8_jp); } s32 func_80079EA4_jp(UNK_PTR arg0, PakInfo* info) { - func_8007919C_jp(info, 1); + mCPk_SetForestPakState(info, 1); return func_800792FC_jp(info, arg0); } void func_80079EDC_jp(void) { PakInfo* info = mCPk_get_pkinfo(); - func_80079080_jp(&B_80137C40_jp); - func_8007919C_jp(info, 0); - B_80137C40_jp.unk_0000.unk_0000 = - func_8008EEB4_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct), B_80137C40_jp.unk_0000.unk_0000); - func_8007920C_jp(info, &B_80137C40_jp); + mCPk_ClearPassport(&l_pak_ctrl.passport); + mCPk_SetForestPakState(info, 0); + l_pak_ctrl.passport.unk_0000 = func_8008EEB4_jp(&l_pak_ctrl, sizeof(Passport), l_pak_ctrl.passport.unk_0000); + func_8007920C_jp(info, &l_pak_ctrl.passport); } s32 func_80079F44_jp(void) { PakInfo* info = mCPk_get_pkinfo(); u16 sp2A = 0; s32 sp24; - s32 var_s0 = 0; + s32 ret = 0; - func_8007919C_jp(info, 0); + mCPk_SetForestPakState(info, 0); - sp24 = func_800792FC_jp(info, &B_80137C40_jp); + sp24 = func_800792FC_jp(info, &l_pak_ctrl.passport); if (sp24 == 1) { - B_80137C40_jp.unk_1204 = 1; - sp2A = func_8008EE7C_jp(&B_80137C40_jp, sizeof(B80137C40Unk0000Struct)); + l_pak_ctrl.unk_1204 = 1; + sp2A = func_8008EE7C_jp(&l_pak_ctrl, sizeof(Passport)); } else if (sp24 == -1) { - var_s0 = -2; + ret = -2; } else { - var_s0 = -1; + ret = -1; } if ((sp24 == 1) && (sp2A == 0)) { - var_s0 = 1; + ret = 1; } else { - B_80137C40_jp.unk_1204 = 0; - func_80079080_jp(&B_80137C40_jp); + l_pak_ctrl.unk_1204 = 0; + mCPk_ClearPassport(&l_pak_ctrl.passport); } - return var_s0; + return ret; } void func_8007A008_jp(void) { @@ -578,9 +578,9 @@ void func_8007A008_jp(void) { OSMesgQueue* queue; if ((temp_v0 == 0) || (temp_v0 == -2)) { - func_8007919C_jp(info, 0); + mCPk_SetForestPakState(info, 0); queue = padmgr_LockSerialMesgQ(); - func_800CD9F0_jp(&info->unk_04, &info->unk_74); + sCPk_DeleteFile(&info->pfsInfo, &info->pfsState); padmgr_UnlockSerialMesgQ(queue); } } @@ -591,11 +591,11 @@ PakInfo* mCPk_get_pkinfo(void) { s32 func_8007A080_jp(void) { PakInfo* info = mCPk_get_pkinfo(); - s32 var_v1 = TRUE; + s32 ret = TRUE; - if ((info != NULL) && (info->unk_04.unk_6C == 10)) { - var_v1 = FALSE; + if ((info != NULL) && (info->pfsInfo.err == PFS_ERR_ID_FATAL)) { + ret = FALSE; } - return var_v1; + return ret; } diff --git a/src/code/m_private.c b/src/code/m_private.c index f957663..8ee4297 100644 --- a/src/code/m_private.c +++ b/src/code/m_private.c @@ -666,7 +666,7 @@ s32 mPr_CheckMuseumInfoMail(PrivateInfo* priv) { s32 mPr_LoadPak_and_SetPrivateInfo2(u8 player, PakInfo* pak) { PrivateInfo* priv; s32 res = FALSE; - s32 save = func_8007942C_jp(&g_foreigner_private, mNpc_GetInAnimalP(), pak); + s32 save = mCPk_PakPrivateLoad(&g_foreigner_private, mNpc_GetInAnimalP(), pak); if (save == TRUE) { if (player < 4) { diff --git a/src/code/s_cpak.c b/src/code/s_cpak.c new file mode 100644 index 0000000..832fb4d --- /dev/null +++ b/src/code/s_cpak.c @@ -0,0 +1,181 @@ +#include "s_cpak.h" +#include "global.h" + +#include "getcurrentms.h" +#include "padmgr.h" + +void sCPk_SetCode(OSPfsState* pfsState, u16* companyCode, u32* gameCode) { + bcopy(companyCode, &pfsState->company_code, sizeof(pfsState->company_code)); + bcopy(gameCode, &pfsState->game_code, sizeof(pfsState->game_code)); +} + +s32 sCPk_PakOpen(OSPfsInfo* pfsInfo, s32 channel) { + OSMesgQueue* queue; + s32 err; + s32 ret = FALSE; + + queue = padmgr_LockSerialMesgQ(); + err = osPfsInitPak(queue, &pfsInfo->pfs, channel); + + if (err == 0) { + ret = TRUE; + } + + if (err == PFS_ERR_DEVICE) { + if (osMotorInit(queue, &pfsInfo->pfs, channel) != 0) { + if (osGbpakInit(queue, &pfsInfo->pfs, channel) != 0) { + err = PFS_ERR_ID_FATAL; + } + } + } + + pfsInfo->err = err; + padmgr_UnlockSerialMesgQ(queue); + + return ret; +} + +s32 sCPk_PakFreeArea(OSPfsInfo* pfsInfo) { + s32 bytes; + + pfsInfo->err = osPfsFreeBlocks(&pfsInfo->pfs, &bytes); + return bytes; +} + +s32 sCPk_Save(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer) { + UNUSED s32 pad; + s32 err; + s32 ret = FALSE; + s32 writeSize = 0x2300; + + do { + if (size < writeSize) { + writeSize = size; + } + err = osPfsReadWriteFile(&pfsInfo->pfs, pfsInfo->fileNo, PFS_WRITE, offset, writeSize, buffer); + offset += writeSize; + buffer += writeSize; + size -= writeSize; + B_80145FF8_jp = GetCurrentMilliseconds(); + } while ((size > 0) && (err == 0)); + + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + return ret; +} + +s32 sCPk_Load(OSPfsInfo* pfsInfo, s32 offset, s32 size, u8* buffer) { + UNUSED s32 pad; + s32 err; + s32 ret = FALSE; + s32 readSize = 0x2300; + + do { + if (size < readSize) { + readSize = size; + } + err = osPfsReadWriteFile(&pfsInfo->pfs, pfsInfo->fileNo, PFS_READ, offset, readSize, buffer); + offset += readSize; + buffer += readSize; + size -= readSize; + B_80145FF8_jp = GetCurrentMilliseconds(); + } while ((size > 0) && (err == 0)); + + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + return ret; +} + +s32 sCPk_MakeFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState, size_t size) { + s32 alignedSize = ALIGN256(size); + s32 ret = FALSE; + s32 err; + + if (sCPk_PakFreeArea(pfsInfo) < alignedSize) { + return FALSE; + } + + err = osPfsAllocateFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name, + (u8*)pfsState->ext_name, alignedSize, &pfsInfo->fileNo); + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + return ret; +} + +s32 sCPk_FileOpen(OSPfsInfo* pfsInfo, OSPfsState* pfsState) { + s32 err; + s32 ret = FALSE; + + err = osPfsFindFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name, + (u8*)pfsState->ext_name, &pfsInfo->fileNo); + + pfsInfo->err = err; + if (err == 0) { + ret = TRUE; + } + + return ret; +} + +s32 sCPk_DeleteFile(OSPfsInfo* pfsInfo, OSPfsState* pfsState) { + s32 err; + s32 ret = FALSE; + + err = osPfsDeleteFile(&pfsInfo->pfs, pfsState->company_code, pfsState->game_code, (u8*)pfsState->game_name, + (u8*)pfsState->ext_name); + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + + return ret; +} + +u32 sCPk_FileState(OSPfsInfo* pfsInfo, OSPfsState* pfsState) { + s32 err = osPfsFileState(&pfsInfo->pfs, pfsInfo->fileNo, pfsState); + + pfsInfo->err = err; + if (err != 0) { + return 0; + } + + return pfsState->file_size; +} + +s32 sCPk_FileNum(OSPfsInfo* pfsInfo, s32* maxFiles, s32* filesUsed) { + s32 err; + s32 ret = FALSE; + + err = osPfsNumFiles(&pfsInfo->pfs, maxFiles, filesUsed); + + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + return ret; +} + +s32 sCPk_RepairID(OSPfsInfo* pfsInfo) { + s32 err; + s32 ret = FALSE; + + err = osPfsRepairId(&pfsInfo->pfs); + + if (err == 0) { + ret = TRUE; + } + + pfsInfo->err = err; + return ret; +} diff --git a/src/overlays/gamestates/ovl_second_game/second_game.c b/src/overlays/gamestates/ovl_second_game/second_game.c index afa4e2f..1fdf266 100644 --- a/src/overlays/gamestates/ovl_second_game/second_game.c +++ b/src/overlays/gamestates/ovl_second_game/second_game.c @@ -14,7 +14,7 @@ void second_game_main(Game* game) { Game_SecondGame* secondGame = (Game_SecondGame*)game; if (mCPk_PakOpen(info, 0) == 0) { - if (info->unk_04.unk_6C == 1 || info->unk_04.unk_6C == 11) { + if (info->pfsInfo.err == PFS_ERR_NOPACK || info->pfsInfo.err == PFS_ERR_DEVICE) { mempak = 0; } else { mempak = 1; diff --git a/yamls/jp/code.yaml b/yamls/jp/code.yaml index 0ce6406..019bf93 100644 --- a/yamls/jp/code.yaml +++ b/yamls/jp/code.yaml @@ -87,7 +87,8 @@ - [0x6EDD10, c, code/m_time] - [0x6EE540, c, code/m_view] - [0x6EFC20, asm, code/6EFC20] - - [0x6F12E0, asm, code/6F12E0] + - [0x6F12E0, c, code/s_cpak] + - [0x6F17B0, asm, code/6F17B0] - [0x6F2150, c, code/m_roll_lib] - [0x6F2EE0, c, code/PreRender] - [0x6F5180, c, code/THA_GA] @@ -304,7 +305,7 @@ - { start: 0x74AB40, type: bss, vram: 0x80123F80, name: code/80123F80} - { start: 0x73F4D0, type: .bss, vram: 0x80126E70, name: code/m_collision_obj } - { start: 0x74AB40, type: .bss, vram: 0x80126EA0, name: code/m_common_data } - - { start: 0x75B600, type: bss, vram: 0x80137960, name: code/m_cpak } + - { start: 0x75B600, type: .bss, vram: 0x80137960, name: code/m_cpak } - { start: 0x73F4D0, type: .bss, vram: 0x80138E50, name: code/m_debug} - { start: 0x73F4D0, type: .bss, vram: 0x80138E60, name: code/m_debug_display} - { start: 0x73F4D0, type: bss, vram: 0x80138E70, name: code/80138E70 } |
