diff options
Diffstat (limited to 'arm9/lib/src/FS_archive.c')
-rw-r--r-- | arm9/lib/src/FS_archive.c | 445 |
1 files changed, 0 insertions, 445 deletions
diff --git a/arm9/lib/src/FS_archive.c b/arm9/lib/src/FS_archive.c deleted file mode 100644 index 01f794f8..00000000 --- a/arm9/lib/src/FS_archive.c +++ /dev/null @@ -1,445 +0,0 @@ -#include "FS_archive.h" -#include "FS_command.h" -#include "FSi_util.h" -#include "MI_memory.h" -#include "MI_byteAccess.h" -#include "OS_printf.h" - -FSArchive * arc_list = NULL; -FSDirPos current_dir_pos; - -ARM_FUNC u32 FSi_GetPackedName(const char * name, int name_len) -{ - u32 ret = 0; - if (name_len <= FS_ARCHIVE_NAME_LEN_MAX) - { - int i = 0; - for (; i < name_len; i++) - { - u32 c = MI_ReadByte(name + i); - if (!c) - break; - c = (u32)(c - 'A'); - if (c <= (u32)('Z' - 'A')) - c = (u32)(c + 'a'); - else - c = (u32)(c + 'A'); - ret |= (u32)(c << (i * 8)); - } - } - return ret; -} - -ARM_FUNC FSResult FSi_ReadMemCallback(struct FSArchive * p_arc, void * dest, u32 pos, u32 size) -{ - MI_CpuCopy8((const void *)FS_GetArchiveOffset(p_arc, pos), dest, size); - return FS_RESULT_SUCCESS; -} - -ARM_FUNC FSResult FSi_WriteMemCallback(struct FSArchive * p_arc, const void * src, u32 pos, u32 size) -{ - MI_CpuCopy8(src, (void *)FS_GetArchiveOffset(p_arc, pos), size); - return FS_RESULT_SUCCESS; -} - -ARM_FUNC FSResult FSi_ReadMemoryCore(FSArchive * p_arc, void * dest, u32 pos, u32 size) -{ -#pragma unused(p_arc) - MI_CpuCopy8((const void *)pos, dest, size); - return FS_RESULT_SUCCESS; -} - -ARM_FUNC FSFile * FSi_NextCommand(FSArchive * p_arc) -{ - OSIntrMode bak_psr = OS_DisableInterrupts(); - if (FSi_IsArchiveCanceling(p_arc)) - { - FSFile *p, *q; - p_arc->flag &= ~FS_ARCHIVE_FLAG_CANCELING; - for (p = p_arc->list.next; p; p = q) - { - q = p->link.next; - if (FS_IsCanceling(p)) - { - if (p_arc->list.next == p) - p_arc->list.next = q; - FSi_ReleaseCommand(p, FS_RESULT_CANCELED); - if (!q) - q = p_arc->list.next; - } - } - } - if (!FSi_IsArchiveSuspending(p_arc) && !FS_IsArchiveSuspended(p_arc)) - { - FSFile * p_file = p_arc->list.next; - if (p_file != NULL) - { - const BOOL is_start = !FSi_IsArchiveRunning(p_arc); - if (is_start) - p_arc->flag |= FS_ARCHIVE_FLAG_RUNNING; - (void)OS_RestoreInterrupts(bak_psr); - if (is_start) - { - if ((p_arc->proc_flag & FS_ARCHIVE_PROC_ACTIVATE) != 0) - (void)((*p_arc->proc) (p_file, FS_COMMAND_ACTIVATE)); - } - bak_psr = OS_DisableInterrupts(); - p_file->stat |= FS_FILE_STATUS_OPERATING; - if (FS_IsFileSyncMode(p_file)) - { - OS_WakeupThread(p_file->queue); - (void)OS_RestoreInterrupts(bak_psr); - return NULL; - } - (void)OS_RestoreInterrupts(bak_psr); - return p_file; - } - } - if (FSi_IsArchiveRunning(p_arc)) - { - p_arc->flag &= ~FS_ARCHIVE_FLAG_RUNNING; - if (p_arc->proc_flag & FS_ARCHIVE_PROC_IDLE) - { - FSFile tmp; - FS_InitFile(&tmp); - tmp.arc = p_arc; - (void)((*p_arc->proc)(&tmp, FS_COMMAND_IDLE)); - } - } - if (FSi_IsArchiveSuspending(p_arc)) - { - p_arc->flag &= ~FS_ARCHIVE_FLAG_SUSPENDING; - p_arc->flag |= FS_ARCHIVE_FLAG_SUSPEND; - OS_WakeupThread(&p_arc->stat_q); - } - (void)OS_RestoreInterrupts(bak_psr); - return NULL; -} - -ARM_FUNC void FSi_ExecuteAsyncCommand(FSFile * p_file) -{ - FSArchive *const p_arc = p_file->arc; - while (p_file) - { - OSIntrMode bak_psr = OS_DisableInterrupts(); - p_file->stat |= FS_FILE_STATUS_OPERATING; - if (FS_IsFileSyncMode(p_file)) - { - OS_WakeupThread(p_file->queue); - (void)OS_RestoreInterrupts(bak_psr); - break; - } - p_file->stat |= FS_FILE_STATUS_ASYNC; - (void)OS_RestoreInterrupts(bak_psr); - if (FSi_TranslateCommand(p_file, p_file->command) == FS_RESULT_PROC_ASYNC) - break; - p_file = FSi_NextCommand(p_arc); - } -} - -ARM_FUNC BOOL FSi_ExecuteSyncCommand(FSFile * p_file) -{ - FSFile * p_target; - FSResult ret = FSi_TranslateCommand(p_file, p_file->command); - FSi_ReleaseCommand(p_file, ret); - p_target = FSi_NextCommand(p_file->arc); - if (p_target) - FSi_ExecuteAsyncCommand(p_target); - return FS_IsSucceeded(p_file); -} - -ARM_FUNC BOOL FSi_SendCommand(FSFile * p_file, FSCommandType command) -{ - FSArchive * p_arc = p_file->arc; - const int bit = 1 << command; - p_file->command = command; - p_file->error = FS_RESULT_BUSY; - p_file->stat |= FS_FILE_STATUS_BUSY; - { - OSIntrMode bak_psr = OS_DisableInterrupts(); - if (FSi_IsArchiveUnloading(p_arc)) - { - FSi_ReleaseCommand(p_file, FS_RESULT_CANCELLED); - (void)OS_RestoreInterrupts(bak_psr); - return FALSE; - } - if ((bit & FS_ARCHIVE_PROC_SYNC) != 0) - p_file->stat |= FS_FILE_STATUS_SYNC; - FSi_AppendToList(p_file, (FSFile *)&p_arc->list); - if (!FS_IsArchiveSuspended(p_arc) && !FSi_IsArchiveRunning(p_arc)) - { - p_arc->flag |= FS_ARCHIVE_FLAG_RUNNING; - (void)OS_RestoreInterrupts(bak_psr); - if ((p_arc->proc_flag & FS_ARCHIVE_PROC_ACTIVATE)) - (void)((*p_arc->proc)(p_file, FS_COMMAND_ACTIVATE)); - bak_psr = OS_DisableInterrupts(); - p_file->stat |= FS_FILE_STATUS_OPERATING; - if (!FS_IsFileSyncMode(p_file)) - { - (void)OS_RestoreInterrupts(bak_psr); - FSi_ExecuteAsyncCommand(p_file); - return TRUE; - } - (void)OS_RestoreInterrupts(bak_psr); - } - else if (!FS_IsFileSyncMode(p_file)) - { - (void)OS_RestoreInterrupts(bak_psr); - return TRUE; - } - else - { - do - { - OS_SleepThread(p_file->queue); - } while (!(p_file->stat & FS_FILE_STATUS_OPERATING)); - (void)OS_RestoreInterrupts(bak_psr); - } - } - return FSi_ExecuteSyncCommand(p_file); -} - -ARM_FUNC void FS_InitArchive(FSArchive * p_arc) -{ - MI_CpuClear8(p_arc, sizeof(FSArchive)); - p_arc->sync_q.head = p_arc->sync_q.tail = NULL; - p_arc->stat_q.head = p_arc->stat_q.tail = NULL; -} - -ARM_FUNC FSArchive * const FS_FindArchive(const char * name, int name_len) -{ - u32 pack = FSi_GetPackedName(name, name_len); - OSIntrMode bak_psr = OS_DisableInterrupts(); - FSArchive * p_arc = arc_list; - while (p_arc && (p_arc->name.pack != pack)) - p_arc = p_arc->next; - (void)OS_RestoreInterrupts(bak_psr); - return p_arc; -} - -ARM_FUNC BOOL FS_RegisterArchiveName(FSArchive * p_arc, const char * name, int name_len) -{ - BOOL ret = FALSE; - OSIntrMode bak_psr = OS_DisableInterrupts(); - if (!FS_FindArchive(name, name_len)) - { - FSArchive * p_tail = arc_list; - if (!p_tail) - { - arc_list = p_arc; - current_dir_pos.arc = p_arc; - current_dir_pos.pos = 0; - current_dir_pos.index = 0; - current_dir_pos.own_id = 0; - } - else - { - while (p_tail->next) - p_tail = p_tail->next; - p_tail->next = p_arc; - p_arc->prev = p_tail; - } - p_arc->name.pack = FSi_GetPackedName(name, name_len); - p_arc->flag |= FS_ARCHIVE_FLAG_REGISTER; - ret = TRUE; - } - (void)OS_RestoreInterrupts(bak_psr); - return ret; -} - -ARM_FUNC void FS_ReleaseArchiveName(FSArchive * p_arc) -{ - if (p_arc->name.pack) - { - OSIntrMode bak_psr = OS_DisableInterrupts(); - if (p_arc->next) - p_arc->next->prev = p_arc->prev; - if (p_arc->prev) - p_arc->prev->next = p_arc->next; - p_arc->name.pack = 0; - p_arc->next = p_arc->prev = NULL; - p_arc->flag &= ~FS_ARCHIVE_FLAG_REGISTER; - if (current_dir_pos.arc == p_arc) - { - current_dir_pos.arc = arc_list; - current_dir_pos.pos = 0; - current_dir_pos.index = 0; - current_dir_pos.own_id = 0; - } - (void)OS_RestoreInterrupts(bak_psr); - } -} - -ARM_FUNC BOOL FS_LoadArchive(FSArchive * p_arc, u32 base, u32 fat, u32 fat_size, u32 fnt, u32 fnt_size, FS_ARCHIVE_READ_FUNC read_func, FS_ARCHIVE_WRITE_FUNC write_func) -{ - p_arc->base = base; - p_arc->fat_size = fat_size; - p_arc->fat = p_arc->fat_bak = fat; - p_arc->fnt_size = fnt_size; - p_arc->fnt = p_arc->fnt_bak = fnt; - p_arc->read_func = (read_func != NULL) ? read_func : FSi_ReadMemCallback; - p_arc->write_func = (write_func != NULL) ? write_func : FSi_WriteMemCallback; - p_arc->table_func = p_arc->read_func; - p_arc->load_mem = NULL; - p_arc->flag |= FS_ARCHIVE_FLAG_LOADED; - return TRUE; -} - -ARM_FUNC BOOL FS_UnloadArchive(FSArchive * p_arc) -{ - OSIntrMode bak_psr = OS_DisableInterrupts(); - if (FS_IsArchiveLoaded(p_arc)) - { - if (FS_IsArchiveTableLoaded(p_arc)) - { - OS_TWarning("memory may leak. preloaded-table of archive \"%s\" (0x%08X)", p_arc->name.ptr, p_arc->load_mem); - } - { - FSFile *p, *q; - BOOL bak_state = FS_SuspendArchive(p_arc); - p_arc->flag |= FS_ARCHIVE_FLAG_UNLOADING; - for (p = p_arc->list.next; p; p = q) - { - q = p->link.next; - FSi_ReleaseCommand(p, FS_RESULT_CANCELED); - } - p_arc->list.next = NULL; - if (bak_state) - (void)FS_ResumeArchive(p_arc); - } - p_arc->base = 0; - p_arc->fat = 0; - p_arc->fat_size = 0; - p_arc->fnt = 0; - p_arc->fnt_size = 0; - p_arc->fat_bak = p_arc->fnt_bak = 0; - p_arc->flag &= ~(FS_ARCHIVE_FLAG_CANCELING | FS_ARCHIVE_FLAG_LOADED | FS_ARCHIVE_FLAG_UNLOADING); - } - (void)OS_RestoreInterrupts(bak_psr); - return TRUE; -} - -ARM_FUNC u32 FS_LoadArchiveTables(FSArchive *p_arc, void *p_mem, u32 max_size) -{ - u32 total_size = ALIGN_BYTE(p_arc->fat_size + p_arc->fnt_size + 32, 32); - if (total_size <= max_size) - { - u8 *p_cache = (u8 *)ALIGN_BYTE((u32)p_mem, 32); - FSFile tmp; - FS_InitFile(&tmp); - if (FS_OpenFileDirect(&tmp, p_arc, p_arc->fat, p_arc->fat + p_arc->fat_size, (u32)~0)) - { - if (FS_ReadFile(&tmp, p_cache, (s32)p_arc->fat_size) < 0) - { - MI_CpuFill8(p_cache, 0x00, p_arc->fat_size); - } - (void)FS_CloseFile(&tmp); - } - p_arc->fat = (u32)p_cache; - p_cache += p_arc->fat_size; - if (FS_OpenFileDirect(&tmp, p_arc, p_arc->fnt, p_arc->fnt + p_arc->fnt_size, (u32)~0)) - { - if (FS_ReadFile(&tmp, p_cache, (s32)p_arc->fnt_size) < 0) - { - MI_CpuFill8(p_cache, 0x00, p_arc->fnt_size); - } - (void)FS_CloseFile(&tmp); - } - p_arc->fnt = (u32)p_cache; - p_arc->load_mem = p_mem; - p_arc->table_func = FSi_ReadMemoryCore; - p_arc->flag |= FS_ARCHIVE_FLAG_TABLE_LOAD; - } - return total_size; -} - -ARM_FUNC void * FS_UnloadArchiveTables(FSArchive * p_arc) -{ - void *ret = NULL; - if (FS_IsArchiveLoaded(p_arc)) - { - BOOL bak_stat = FS_SuspendArchive(p_arc); - if (FS_IsArchiveTableLoaded(p_arc)) - { - p_arc->flag &= ~FS_ARCHIVE_FLAG_TABLE_LOAD; - ret = p_arc->load_mem; - p_arc->load_mem = NULL; - p_arc->fat = p_arc->fat_bak; - p_arc->fnt = p_arc->fnt_bak; - p_arc->table_func = p_arc->read_func; - } - if (bak_stat) - (void)FS_ResumeArchive(p_arc); - } - return ret; -} - -ARM_FUNC BOOL FS_SuspendArchive(FSArchive * p_arc) -{ - OSIntrMode bak_psr = OS_DisableInterrupts(); - const BOOL bak_stat = !FS_IsArchiveSuspended(p_arc); - if (bak_stat) - { - if (FSi_IsArchiveRunning(p_arc)) - { - p_arc->flag |= FS_ARCHIVE_FLAG_SUSPENDING; - do { - OS_SleepThread(&p_arc->stat_q); - } while (FSi_IsArchiveSuspending(p_arc)); - } - else - { - p_arc->flag |= FS_ARCHIVE_FLAG_SUSPEND; - } - } - (void)OS_RestoreInterrupts(bak_psr); - return bak_stat; -} - -ARM_FUNC BOOL FS_ResumeArchive(FSArchive * p_arc) -{ - FSFile * p_target = NULL; - OSIntrMode bak_psr = OS_DisableInterrupts(); - const BOOL bak_stat = !FS_IsArchiveSuspended(p_arc); - if (!bak_stat) - { - p_arc->flag &= ~FS_ARCHIVE_FLAG_SUSPEND; - p_target = FSi_NextCommand(p_arc); - } - (void)OS_RestoreInterrupts(bak_psr); - if (p_target) - FSi_ExecuteAsyncCommand(p_target); - return bak_stat; -} - -ARM_FUNC void FS_SetArchiveProc(struct FSArchive * p_arc, FS_ARCHIVE_PROC_FUNC proc, u32 flags) -{ - if (!flags) - proc = NULL; - else if (!proc) - flags = 0; - p_arc->proc = proc; - p_arc->proc_flag = flags; -} - -ARM_FUNC void FS_NotifyArchiveAsyncEnd(FSArchive *p_arc, FSResult ret) -{ - if (FSi_IsArchiveAsync(p_arc)) - { - FSFile *p_file = p_arc->list.next; - p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_ASYNC; - FSi_ReleaseCommand(p_file, ret); - p_file = FSi_NextCommand(p_arc); - if (p_file) - FSi_ExecuteAsyncCommand(p_file); - } - else - { - FSFile *p_file = p_arc->list.next; - OSIntrMode bak_psr = OS_DisableInterrupts(); - p_file->error = ret; - p_arc->flag &= ~FS_ARCHIVE_FLAG_IS_SYNC; - OS_WakeupThread(&p_arc->sync_q); - (void)OS_RestoreInterrupts(bak_psr); - } -} |