summaryrefslogtreecommitdiff
path: root/arm9/lib/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-05-07 19:39:53 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-05-07 19:39:53 -0400
commit994cfcbc9a1e42043b25ae3ab6471b8ecbd55ff1 (patch)
tree836736bec38533dc7b06db3b34d1973c38f3bde9 /arm9/lib/src
parent34ec05f983cec0517765640d084f58e86aa20d79 (diff)
FS_rom.c
Diffstat (limited to 'arm9/lib/src')
-rw-r--r--arm9/lib/src/FS_rom.c118
-rw-r--r--arm9/lib/src/OS_reset.c1
2 files changed, 118 insertions, 1 deletions
diff --git a/arm9/lib/src/FS_rom.c b/arm9/lib/src/FS_rom.c
new file mode 100644
index 00000000..44d31a4a
--- /dev/null
+++ b/arm9/lib/src/FS_rom.c
@@ -0,0 +1,118 @@
+#include "FS_rom.h"
+#include "FS_archive.h"
+#include "FS_file.h"
+#include "CARD_pullOut.h"
+#include "CARD_rom.h"
+#include "CARD_common.h"
+#include "MB_mb.h"
+#include "OS_printf.h"
+
+u32 fsi_default_dma_no;
+
+void FSi_OnRomReadDone(void * p_arc)
+{
+ FS_NotifyArchiveAsyncEnd(p_arc, CARD_IsPulledOut() ? FS_RESULT_ERROR : FS_RESULT_SUCCESS);
+}
+
+FSResult FSi_ReadRomCallback(FSArchive * p_arc, void * dst, u32 src, u32 len)
+{
+ CARD_ReadRomAsync(fsi_default_dma_no, (const void *)src, dst, len, FSi_OnRomReadDone, p_arc);
+ return FS_RESULT_PROC_ASYNC;
+}
+
+FSResult FSi_WriteDummyCallback(FSArchive * p_arc, const void *src, u32 dst, u32 len)
+{
+ return FS_RESULT_FAILURE;
+}
+
+FSResult FSi_RomArchiveProc(FSFile * p_arc, FSCommandType cmd)
+{
+ switch (cmd)
+ {
+ case FS_COMMAND_ACTIVATE:
+ CARD_LockRom(fsi_card_lock_id);
+ return FS_RESULT_SUCCESS;
+ case FS_COMMAND_IDLE:
+ CARD_UnlockRom(fsi_card_lock_id);
+ return FS_RESULT_SUCCESS;
+ case FS_COMMAND_WRITEFILE:
+ return FS_RESULT_UNSUPPORTED;
+ default:
+ return FS_RESULT_PROC_UNKNOWN;
+ }
+}
+
+FSResult FSi_ReadDummyCallback(FSArchive *p_arc, void *dst, u32 src, u32 len)
+{
+ return FS_RESULT_FAILURE;
+}
+
+FSResult FSi_EmptyArchiveProc(FSFile *p_file, FSCommandType cmd)
+{
+ return FS_RESULT_UNSUPPORTED;
+}
+
+void FSi_InitRom(u32 default_dma_no)
+{
+ fsi_default_dma_no = default_dma_no;
+ fsi_card_lock_id = OS_GetLockID();
+ fsi_ovt9.offset = 0;
+ fsi_ovt9.length = 0;
+ fsi_ovt7.offset = 0;
+ fsi_ovt7.length = 0;
+
+ CARD_Init();
+
+ FS_InitArchive(&fsi_arc_rom);
+ FS_RegisterArchiveName(&fsi_arc_rom, "rom", 3);
+
+ if (MB_IsMultiBootChild())
+ {
+ fsi_ovt9.offset = (u32)~0;
+ fsi_ovt9.length = 0;
+ fsi_ovt7.offset = (u32)~0;
+ fsi_ovt7.length = 0;
+ FS_SetArchiveProc(&fsi_arc_rom, FSi_EmptyArchiveProc, (u32)FS_ARCHIVE_PROC_ALL);
+ FS_LoadArchive(&fsi_arc_rom, 0x00000000, 0, 0, 0, 0, FSi_ReadDummyCallback, FSi_WriteDummyCallback);
+ }
+ else
+ {
+ const CARDRomRegion *const fnt = CARD_GetRomRegionFNT();
+ const CARDRomRegion *const fat = CARD_GetRomRegionFAT();
+
+ FS_SetArchiveProc(&fsi_arc_rom, FSi_RomArchiveProc,
+ FS_ARCHIVE_PROC_WRITEFILE |
+ FS_ARCHIVE_PROC_ACTIVATE | FS_ARCHIVE_PROC_IDLE);
+
+ if ((fnt->offset == 0xFFFFFFFF) || (fnt->offset == 0x00000000) ||
+ (fat->offset == 0xFFFFFFFF) || (fat->offset == 0x00000000))
+ {
+ OS_Warning("file-system : no MAKEROM-information in rom header.");
+ }
+ else
+ {
+ FS_LoadArchive(&fsi_arc_rom, 0x00000000,
+ fat->offset, fat->length,
+ fnt->offset, fnt->length,
+ FSi_ReadRomCallback, FSi_WriteDummyCallback);
+ }
+ }
+}
+
+u32 FS_SetDefaultDMA(u32 dma_no)
+{
+ OSIntrMode bak_psr = OS_DisableInterrupts();
+ u32 bak_dma_no = fsi_default_dma_no;
+ BOOL bak_stat = FS_SuspendArchive(&fsi_arc_rom);
+ fsi_default_dma_no = dma_no;
+ if (bak_stat)
+ FS_ResumeArchive(&fsi_arc_rom);
+ OS_RestoreInterrupts(bak_psr);
+ return bak_dma_no;
+}
+
+u32 FS_TryLoadTable(void * p_mem, u32 size)
+{
+ return FS_LoadArchiveTables(&fsi_arc_rom, p_mem, size);
+}
+
diff --git a/arm9/lib/src/OS_reset.c b/arm9/lib/src/OS_reset.c
index b12703da..774b392b 100644
--- a/arm9/lib/src/OS_reset.c
+++ b/arm9/lib/src/OS_reset.c
@@ -14,7 +14,6 @@ extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
extern void OS_Terminate();
extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void CARD_LockRom(u16 lockId);
-extern u32 OS_GetLockID();
extern void MI_StopDma(u32 dma);
extern void OS_SetIrqMask(u32 mask);
extern void OS_ResetRequestIrqMask(u32 mask);