summaryrefslogtreecommitdiff
path: root/soh/src/code/mempak.c
diff options
context:
space:
mode:
authorM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
committerM4xw <m4x@m4xw.net>2022-03-22 02:51:23 +0100
commit39cc86c2608e2f75ace33fc7f43bc4f2ad743f1a (patch)
tree0d3fd9e995d7484eaaeb158ac808bd6a39121189 /soh/src/code/mempak.c
parent0bb0e7b53bd80bdc7f78e08c441691737e039b2b (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.c187
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;
+}