diff options
Diffstat (limited to 'src/code/s_cpak.c')
| -rw-r--r-- | src/code/s_cpak.c | 181 |
1 files changed, 181 insertions, 0 deletions
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; +} |
