summaryrefslogtreecommitdiff
path: root/arm9/lib/src/FS_rom.c
blob: 44d31a4a1b1fabd29dd3dfb2298d5e3a25a0a21d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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);
}