diff options
| author | M4xw <m4x@m4xw.net> | 2022-03-22 02:51:23 +0100 |
|---|---|---|
| committer | M4xw <m4x@m4xw.net> | 2022-03-22 02:51:23 +0100 |
| commit | 39cc86c2608e2f75ace33fc7f43bc4f2ad743f1a (patch) | |
| tree | 0d3fd9e995d7484eaaeb158ac808bd6a39121189 /soh/src/code/mempak.c | |
| parent | 0bb0e7b53bd80bdc7f78e08c441691737e039b2b (diff) | |
git subrepo clone https://github.com/HarbourMasters/soh.git
subrepo:
subdir: "soh"
merged: "ba904bbd0"
upstream:
origin: "https://github.com/HarbourMasters/soh.git"
branch: "master"
commit: "ba904bbd0"
git-subrepo:
version: "0.4.1"
origin: "???"
commit: "???"
Diffstat (limited to 'soh/src/code/mempak.c')
| -rw-r--r-- | soh/src/code/mempak.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/soh/src/code/mempak.c b/soh/src/code/mempak.c new file mode 100644 index 000000000..1b9d95ee8 --- /dev/null +++ b/soh/src/code/mempak.c @@ -0,0 +1,187 @@ +#include "global.h" + +OSPfs sMempakPfsHandle; +s32 sMempakFreeBytes; +s32 sMempakFiles[10]; + +u16 sMempakCompanyCode = 1; +u32 sMempakGameCode = 1; + +// "ZELDA DEMO TOOL " +u8 sMempakGameName[0x10] = { 0x33, 0x1E, 0x25, 0x1D, 0x1A, 0x0F, 0x1D, 0x1E, + 0x26, 0x28, 0x0F, 0x2D, 0x28, 0x28, 0x25, 0x0F }; +u8 sMempakExtName[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +s32 Mempak_Init(s32 controllerNb) { + OSMesgQueue* mq; + s32 pad; + s32 ret = false; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + if (!osPfsInitPak(mq, &sMempakPfsHandle, controllerNb)) { + ret = true; + } + + osPfsFreeBlocks(&sMempakPfsHandle, &sMempakFreeBytes); + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + + return ret; +} + +s32 Mempak_GetFreeBytes(s32 controllerNb) { + return sMempakFreeBytes; +} + +s32 Mempak_FindFile(s32 controllerNb, char start, char end) { + OSMesgQueue* mq; + s32 error; + char idx; + u32 bit = 1; + s32 flag = 0; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + for (idx = start; idx <= end; idx++) { + sMempakExtName[0] = idx - 0x27; + + error = osPfsFindFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, sMempakExtName, + &sMempakFiles[idx - 'A']); + if (error == 0) { + flag |= bit; + } else { + sMempakFiles[idx - 'A'] = -1; + } + + bit <<= 1; + osSyncPrintf("mempak: find '%c' (%d)\n", idx, error); + } + + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + osSyncPrintf("mempak: find '%c' - '%c' %02x\n", start, end, flag); + + return flag; +} + +s32 Mempak_Write(s32 controllerNb, char idx, void* buffer, s32 offset, ptrdiff_t size) { + OSMesgQueue* mq; + s32 error; + s32 ret = false; + s32 pad; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + if (size < sMempakFreeBytes) { + error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 1, offset, size, buffer); + if (error == 0) { + ret = true; + } + osSyncPrintf("mempak: write %d byte '%c' (%d)->%d\n", size, idx, sMempakFiles[idx - 'A'], error); + } + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + + return ret; +} + +s32 Mempak_Read(s32 controllerNb, char idx, void* buffer, s32 offset, ptrdiff_t size) { + OSMesgQueue* mq; + s32 error; + s32 ret = false; + s32 pad; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + if (size < sMempakFreeBytes) { + error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 0, offset, size, buffer); + if (error == 0) { + ret = true; + } + osSyncPrintf("mempak: read %d byte '%c' (%d)<-%d\n", size, idx, sMempakFiles[idx - 'A'], error); + } + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + return ret; +} + +s32 Mempak_Alloc(s32 controllerNb, char* idx, ptrdiff_t size) { + OSMesgQueue* mq; + s32 error; + s32 ret = 0; + s32 i; + s32 pad; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + if (*idx >= 'A' && *idx < 'L') { + sMempakExtName[0] = *idx - 0x27; + if (-1 == sMempakFiles[*idx - 'A']) { + error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, + sMempakExtName, size, &sMempakFiles[*idx - 'A']); + if (error == 0) { + ret = 1; + } + osSyncPrintf("mempak: alloc %d byte '%c' (%d)\n", size, *idx, error); + } else { + sMempakExtName[0] = *idx - 0x27; + if (osPfsDeleteFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, + sMempakExtName) == 0) { + ret = 1; + } + error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, + sMempakExtName, size, &sMempakFiles[*idx - 'A']); + if (error == 0) { + ret |= 1; + } + osSyncPrintf("mempak: resize %d byte '%c' (%d)\n", size, *idx, error); + } + } else { + for (i = 0; i < ARRAY_COUNT(sMempakFiles); i++) { + if (sMempakFiles[i] == -1) { + break; + } + } + + *idx = i + 'A'; + sMempakExtName[0] = *idx - 0x27; + error = osPfsAllocateFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, + sMempakExtName, size, &sMempakFiles[i]); + osSyncPrintf("mempak: alloc %d byte '%c' (%d) with search\n", size, *idx, error); + if (error == 0) { + ret = 1; + } + } + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + + return ret; +} + +s32 Mempak_DeleteFile(s32 controllerNb, char idx) { + OSMesgQueue* mq; + s32 error; + s32 ret = false; + + mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + + sMempakExtName[0] = idx - 0x27; + error = osPfsDeleteFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, sMempakExtName); + if (error == 0) { + ret = true; + } + osSyncPrintf("mempak: delete '%c' (%d)\n", idx, error); + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + + return ret; +} + +s32 Mempak_GetFileSize(s32 controllerNb, char idx) { + OSMesgQueue* mq = PadMgr_LockSerialMesgQueue(&gPadMgr); + OSPfsState state; + s32 error = osPfsFileState(&sMempakPfsHandle, sMempakFiles[idx - 'A'], &state); + s32 pad; + + PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq); + + if (error != 0) { + return 0; + } + return state.file_size; +} |
