summaryrefslogtreecommitdiff
path: root/arm9
diff options
context:
space:
mode:
Diffstat (limited to 'arm9')
-rw-r--r--arm9/Makefile10
-rw-r--r--arm9/arm9.lcf9
-rw-r--r--arm9/asm/FS_archive.s897
-rw-r--r--arm9/asm/FS_command.s140
-rw-r--r--arm9/asm/FS_command_default.s748
-rw-r--r--arm9/asm/FS_overlay.s546
-rw-r--r--arm9/asm/FS_rom.s246
-rw-r--r--arm9/asm/libfs.s3011
-rw-r--r--arm9/asm/unk_020023C0.s548
-rw-r--r--arm9/asm/unk_020061E8.s181
-rw-r--r--arm9/global.inc9
-rw-r--r--arm9/lib/include/CARD_rom.h11
-rw-r--r--arm9/lib/include/FS_archive.h113
-rw-r--r--arm9/lib/include/FS_file.h179
-rw-r--r--arm9/lib/include/FS_overlay.h41
-rw-r--r--arm9/lib/include/FS_rom.h6
-rw-r--r--arm9/lib/include/MI_byteAccess.h9
-rw-r--r--arm9/lib/include/MI_exMemory.h9
-rw-r--r--arm9/lib/include/OS_system.h1
-rw-r--r--arm9/lib/include/OS_thread.h14
-rw-r--r--arm9/lib/include/mmap.h2
-rw-r--r--arm9/lib/include/mmap_global.h4
-rw-r--r--arm9/lib/src/FS_file.c258
-rw-r--r--arm9/src/poke_overlay.c234
-rw-r--r--arm9/undefined_syms.txt3
25 files changed, 3665 insertions, 3564 deletions
diff --git a/arm9/Makefile b/arm9/Makefile
index aa41512d..d96f5ba1 100644
--- a/arm9/Makefile
+++ b/arm9/Makefile
@@ -91,15 +91,16 @@ OBJCOPY := $(CROSS)objcopy
# ./tools/mwccarm/2.0/base/mwasmarm.exe -proc arm5te asm/arm9_thumb.s -o arm9.o
ASFLAGS = -proc arm5te -i ..
-CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir lib/include -interworking
+CFLAGS = -O4,p -proc arm946e -fp soft -lang c99 -Cpp_exceptions off -ir ../include -ir ../include-mw -ir lib/include -interworking -DFS_IMPLEMENT
LDFLAGS = -map -nodead -w off -proc v5te -interworking -map -symtab -m _start
####################### Other Tools #########################
# DS TOOLS
SHA1SUM = sha1sum
-JSONPROC = $(TOOLS_DIR)/jsonproc/jsonproc
-GFX = $(TOOLS_DIR)/nitrogfx/nitrogfx
+JSONPROC = $(TOOLS_DIR)/jsonproc/jsonproc$(EXE)
+GFX = $(TOOLS_DIR)/nitrogfx/nitrogfx$(EXE)
+SCANINC = $(TOOLS_DIR)/scaninc/scaninc$(EXE)
MWASMARM_PATCHER = $(TOOLS_DIR)/mwasmarm_patcher/mwasmarm_patcher$(EXE) -q
TOOLDIRS = $(filter-out $(TOOLS_DIR)/mwccarm $(TOOLS_DIR)/bin,$(wildcard $(TOOLS_DIR)/*))
@@ -150,12 +151,13 @@ ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(ASM_DIRS))
# TODO: Move out to lib/Makefile
build/lib/src/%.o: MWCCVERSION = 1.2/sp2p3
+build/lib/src/%.o: CFLAGS += -enum int
build/src/FUN_020910A4.o: MWCCVERSION = 1.2/sp2p3
####################### Everything Else ######################
ifeq (,$(NODEP))
-$(BUILD_DIR)/%.o: dep = $(shell grep -E '(#\s*|\.)(include|incbin)\s*"(\S+?)"' $*.[cs] | cut -d'"' -f2 | sort -u)
+$(BUILD_DIR)/%.o: dep = $(shell $(SCANINC) -I ../include -I ../include-mw -I lib/include $*.[cs])
else
$(BUILD_DIR)/%.o: dep :=
endif
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 8de69f44..7a4a43fb 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -110,6 +110,8 @@ SECTIONS {
unk_02000E0C.o (.text)
string_util.o (.text)
unk_020023C0.o (.text)
+ poke_overlay.o (.text)
+ unk_020061E8.o (.text)
filesystem.o (.text)
unk_02006864.o (.text)
script.o (.text)
@@ -188,7 +190,12 @@ SECTIONS {
SND_bank.o (.text)
PXI_init.o (.text)
PXI_fifo.o (.text)
- libfs.o (.text)
+ FS_command.o (.text)
+ FS_command_default.o (.text)
+ FS_archive.o (.text)
+ FS_file.o (.text)
+ FS_rom.o (.text)
+ FS_overlay.o (.text)
libdgt.o (.text)
libcp.o (.text)
libspi.o (.text)
diff --git a/arm9/asm/FS_archive.s b/arm9/asm/FS_archive.s
new file mode 100644
index 00000000..51a3e121
--- /dev/null
+++ b/arm9/asm/FS_archive.s
@@ -0,0 +1,897 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FS_NotifyArchiveAsyncEnd
+FS_NotifyArchiveAsyncEnd: ; 0x020D0B40
+ stmdb sp!, {r4-r6,lr}
+ mov r4, r0
+ ldr r0, [r4, #0x1c]
+ mov r6, r1
+ ands r0, r0, #0x100
+ beq _020D0B8C
+ ldr r2, [r4, #0x1c]
+ ldr r0, [r4, #0x24]
+ bic r2, r2, #0x100
+ str r2, [r4, #0x1c]
+ bl FSi_ReleaseCommand
+ mov r0, r4
+ bl FSi_NextCommand
+_020D0B74:
+ cmp r0, #0x0
+ ldmeqia sp!, {r4-r6,lr}
+ bxeq lr
+ bl FSi_ExecuteAsyncCommand
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+_020D0B8C:
+ ldr r5, [r4, #0x24]
+ bl OS_DisableInterrupts
+ str r6, [r5, #0x14]
+ ldr r1, [r4, #0x1c]
+ mov r5, r0
+ bic r1, r1, #0x200
+ add r0, r4, #0xc
+ str r1, [r4, #0x1c]
+ bl OS_WakeupThread
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start FS_SetArchiveProc
+FS_SetArchiveProc: ; 0x020D0BC0
+ cmp r2, #0x0
+ moveq r1, #0x0
+ beq _020D0BD4
+ cmp r1, #0x0
+ moveq r2, #0x0
+_020D0BD4:
+ str r1, [r0, #0x54]
+ str r2, [r0, #0x58]
+ bx lr
+
+ arm_func_start FS_ResumeArchive
+FS_ResumeArchive:
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r4, r0
+ mov r6, #0x0
+ bl OS_DisableInterrupts
+ ldr r1, [r4, #0x1c]
+ mov r5, r0
+ ands r0, r1, #0x8
+ movne r0, #0x1
+ moveq r0, r6
+ cmp r0, #0x0
+ moveq r7, #0x1
+ movne r7, #0x0
+ cmp r7, #0x0
+ bne _020D0C34
+ ldr r1, [r4, #0x1c]
+ mov r0, r4
+ bic r1, r1, #0x8
+ str r1, [r4, #0x1c]
+ bl FSi_NextCommand
+ mov r6, r0
+_020D0C34:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_020D0C3C:
+ cmp r6, #0x0
+ beq _020D0C4C
+ mov r0, r6
+ bl FSi_ExecuteAsyncCommand
+_020D0C4C:
+ mov r0, r7
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7, lr}
+ bx lr
+
+ arm_func_start FS_SuspendArchive
+FS_SuspendArchive: ; 0x020D0C5C
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r6, r0
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x1c]
+ mov r4, r0
+ ands r0, r1, #0x8
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ moveq r5, #0x1
+ movne r5, #0x0
+ cmp r5, #0x0
+ beq _020D0CD4
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x10
+ beq _020D0CC8
+ ldr r0, [r6, #0x1c]
+ orr r0, r0, #0x40
+ str r0, [r6, #0x1c]
+ add r7, r6, #0x14
+_020D0CB0:
+ mov r0, r7
+ bl OS_SleepThread
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x40
+ bne _020D0CB0
+ b _020D0CD4
+_020D0CC8:
+ ldr r0, [r6, #0x1c]
+ orr r0, r0, #0x8
+ str r0, [r6, #0x1c]
+_020D0CD4:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, r5
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+
+ arm_func_start FS_UnloadArchiveTables
+FS_UnloadArchiveTables: ; 0x020D0CEC
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ ldr r0, [r5, #0x1c]
+ mov r4, #0x0
+ ands r0, r0, #0x2
+ movne r0, #0x1
+ moveq r0, r4
+ cmp r0, #0x0
+ beq _020D0D74
+ mov r0, r5
+ bl FS_SuspendArchive
+ ldr r1, [r5, #0x1c]
+ ands r1, r1, #0x4
+ movne r1, #0x1
+ moveq r1, #0x0
+ cmp r1, #0x0
+ beq _020D0D64
+ ldr r2, [r5, #0x1c]
+ mov r1, #0x0
+ bic r2, r2, #0x4
+ str r2, [r5, #0x1c]
+ ldr r4, [r5, #0x44]
+ str r1, [r5, #0x44]
+ ldr r1, [r5, #0x3c]
+ str r1, [r5, #0x2c]
+ ldr r1, [r5, #0x40]
+ str r1, [r5, #0x34]
+ ldr r1, [r5, #0x48]
+ str r1, [r5, #0x50]
+_020D0D64:
+ cmp r0, #0x0
+ beq _020D0D74
+ mov r0, r5
+ bl FS_ResumeArchive
+_020D0D74:
+ mov r0, r4
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start FUN_020D0D84
+FUN_020D0D84: ; 0x020D0D84
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4c
+ mov r7, r0
+ ldr r3, [r7, #0x30]
+ ldr r0, [r7, #0x38]
+ mov r6, r1
+ add r0, r3, r0
+ add r0, r0, #0x20
+ add r0, r0, #0x1f
+ bic r5, r0, #0x1f
+ cmp r5, r2
+ bhi _020D0E9C
+ add r1, r6, #0x1f
+ add r0, sp, #0x4
+ bic r4, r1, #0x1f
+ bl FS_InitFile
+ ldr r2, [r7, #0x2c]
+ mvn r0, #0x0
+ str r0, [sp, #0x0]
+ ldr r3, [r7, #0x30]
+ add r0, sp, #0x4
+ mov r1, r7
+ add r3, r2, r3
+ bl FS_OpenFileDirect
+_020D0DE4:
+ cmp r0, #0x0
+ beq _020D0E1C
+ ldr r2, [r7, #0x30]
+ add r0, sp, #0x4
+ mov r1, r4
+ bl FS_ReadFile
+ cmp r0, #0x0
+ bge _020D0E14
+ ldr r2, [r7, #0x30]
+ mov r0, r4
+ mov r1, #0x0
+ bl MI_CpuFill8
+_020D0E14:
+ add r0, sp, #0x4
+ bl FS_CloseFile
+_020D0E1C:
+ str r4, [r7, #0x2C]
+ ldr ip, [r7, #0x30]
+ ldr r2, [r7, #0x34]
+ mvn r0, #0x0
+ str r0, [sp]
+ ldr r3, [r7, #0x38]
+ add r0, sp, #0x4
+ mov r1, r7
+ add r3, r2, r3
+ add r4, r4, ip
+ bl FS_OpenFileDirect
+ cmp r0, #0x0
+ beq _020D0E80
+ ldr r2, [r7, #0x38]
+ add r0, sp, #0x4
+ mov r1, r4
+ bl FS_ReadFile
+ cmp r0, #0x0
+ bge _020D0E78
+ ldr r2, [r7, #0x38]
+ mov r0, r4
+ mov r1, #0x0
+ bl MI_CpuFill8
+_020D0E78:
+ add r0, sp, #0x4
+ bl FS_CloseFile
+_020D0E80:
+ str r4, [r7, #0x34]
+ ldr r0, _020D0EAC
+ str r6, [r7, #0x44]
+ str r0, [r7, #0x50]
+ ldr r0, [r7, #0x1C]
+ orr r0, r0, #0x4
+ str r0, [r7, #0x1C]
+_020D0E9C:
+ mov r0, r5
+ add sp, sp, #0x4C
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020D0EAC:
+ .word FSi_ReadMemoryCore
+
+ arm_func_start FUN_020D0EB0
+FUN_020D0EB0: ; 0x020D0EB0
+ stmdb sp!, {r4-r8,lr}
+ mov r5, r0
+ bl OS_DisableInterrupts
+ ldr r1, [r5, #0x1c]
+ mov r4, r0
+ ands r0, r1, #0x2
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ beq _020D0F64
+ mov r0, r5
+ ldr r1, [r5, #0x1c]
+ bl FS_SuspendArchive
+ ldr r1, [r5, #0x1c]
+ mov r7, r0
+ orr r0, r1, #0x80
+ str r0, [r5, #0x1c]
+ ldr r0, [r5, #0x24]
+ cmp r0, #0x0
+ beq _020D0F1C
+ mov r6, #0x3
+_020D0F04:
+ ldr r8, [r0, #0x4]
+ mov r1, r6
+ bl FSi_ReleaseCommand
+ mov r0, r8
+ cmp r8, #0x0
+ bne _020D0F04
+_020D0F1C:
+ mov r0, #0x0
+ str r0, [r5, #0x24]
+ cmp r7, #0x0
+ beq _020D0F34
+ mov r0, r5
+ bl FS_ResumeArchive
+_020D0F34:
+ mov r0, #0x0
+ str r0, [r5, #0x28]
+ str r0, [r5, #0x2c]
+ str r0, [r5, #0x30]
+ str r0, [r5, #0x34]
+ str r0, [r5, #0x38]
+ str r0, [r5, #0x40]
+ ldr r0, [r5, #0x40]
+ str r0, [r5, #0x3c]
+ ldr r0, [r5, #0x1c]
+ bic r0, r0, #0xa2
+ str r0, [r5, #0x1c]
+_020D0F64:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, #0x1
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+
+ arm_func_start FS_LoadArchive
+FS_LoadArchive: ; 0x020D0F78
+ str r1, [r0, #0x28]
+ str r3, [r0, #0x30]
+ str r2, [r0, #0x3c]
+ ldr r1, [r0, #0x3c]
+ ldr r2, [sp, #0x4]
+ str r1, [r0, #0x2c]
+ str r2, [r0, #0x38]
+ ldr r1, [sp, #0x0]
+ ldr r2, [sp, #0x8]
+ str r1, [r0, #0x40]
+ ldr r1, [r0, #0x40]
+ cmp r2, #0x0
+ str r1, [r0, #0x34]
+ ldreq r2, _020D0FE8 ; =FSi_ReadMemCallback
+ ldr r1, [sp, #0xc]
+ str r2, [r0, #0x48]
+ cmp r1, #0x0
+ ldreq r1, _020D0FEC ; =FSi_WriteMemCallback
+ str r1, [r0, #0x4c]
+ ldr r2, [r0, #0x48]
+ mov r1, #0x0
+ str r2, [r0, #0x50]
+ str r1, [r0, #0x44]
+ ldr r1, [r0, #0x1c]
+ orr r1, r1, #0x2
+ str r1, [r0, #0x1c]
+ mov r0, #0x1
+ bx lr
+ .balign 4
+_020D0FE8: .word FSi_ReadMemCallback
+_020D0FEC: .word FSi_WriteMemCallback
+
+ arm_func_start FUN_020D0FF0
+FUN_020D0FF0: ; 0x020D0FF0
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ ldr r0, [r4, #0x0]
+ cmp r0, #0x0
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ bl OS_DisableInterrupts
+ ldr r2, [r4, #0x4]
+ mov r3, #0x0
+ cmp r2, #0x0
+ ldrne r1, [r4, #0x8]
+ strne r1, [r2, #0x8]
+ ldr r2, [r4, #0x8]
+ cmp r2, #0x0
+ ldrne r1, [r4, #0x4]
+ strne r1, [r2, #0x4]
+ str r3, [r4, #0x0]
+ str r3, [r4, #0x8]
+ ldr r1, [r4, #0x8]
+ ldr r2, _020D1080 ; =0x021D53EC
+ str r1, [r4, #0x4]
+ ldr r1, [r4, #0x1c]
+ bic r1, r1, #0x1
+ str r1, [r4, #0x1c]
+ ldr r1, [r2, #0x0]
+ cmp r1, r4
+ bne _020D1074
+ ldr r1, _020D1084 ; =0x021D53E8
+ str r3, [r2, #0x8]
+ ldr r1, [r1, #0x0]
+ strh r3, [r2, #0x6]
+ str r1, [r2, #0x0]
+ strh r3, [r2, #0x4]
+_020D1074:
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020D1080: .word 0x021D53EC
+_020D1084: .word 0x021D53E8
+
+ arm_func_start FS_RegisterArchiveName
+FS_RegisterArchiveName: ; 0x020D1088
+ stmdb sp!, {r4-r8,lr}
+ mov r6, r1
+ mov r5, r2
+ mov r7, r0
+ mov r8, #0x0
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, r6
+ mov r1, r5
+ bl FS_FindArchive
+_020D10B0:
+ cmp r0, #0x0
+ bne _020D112C
+ ldr r1, _020D1140
+ ldr r2, [r1]
+ cmp r2, #0x0
+ bne _020D10E8
+ ldr r0, _020D1144
+ mov r2, r8
+ str r7, [r1]
+ str r7, [r0]
+ str r2, [r0, #0x8]
+ strh r2, [r0, #0x6]
+ strh r2, [r0, #0x4]
+ b _020D110C
+_020D10E8:
+ ldr r0, [r2, #0x4]
+ cmp r0, #0x0
+ beq _020D1104
+_020D10F4:
+ mov r2, r0
+ ldr r0, [r0, #0x4]
+ cmp r0, #0x0
+ bne _020D10F4
+_020D1104:
+ str r7, [r2, #0x4]
+ str r2, [r7, #0x8]
+_020D110C:
+ mov r0, r6
+ mov r1, r5
+ bl FSi_GetPackedName
+ str r0, [r7]
+ ldr r0, [r7, #0x1C]
+ mov r8, #0x1
+ orr r0, r0, #0x1
+ str r0, [r7, #0x1C]
+_020D112C:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, r8
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+_020D1140: .word 0x021D53E8
+_020D1144: .word 0x021D53EC
+
+ arm_func_start FS_FindArchive
+FS_FindArchive:
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ bl FSi_GetPackedName
+ mov r5, r0
+ bl OS_DisableInterrupts
+ ldr r1, _020D1194 ; =0x021D53E8
+ ldr r4, [r1, #0x0]
+ b _020D116C
+_020D1168:
+ ldr r4, [r4, #0x4]
+_020D116C:
+ cmp r4, #0x0
+ beq _020D1180
+ ldr r1, [r4, #0x0]
+ cmp r1, r5
+ bne _020D1168
+_020D1180:
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D1194: .word 0x021D53E8
+
+ arm_func_start FS_InitArchive
+FS_InitArchive: ; 0x020D1198
+ stmdb sp!, {r4,lr}
+ mov r1, #0x0
+ mov r2, #0x5c
+ mov r4, r0
+ bl MI_CpuFill8
+ mov r1, #0x0
+ str r1, [r4, #0x10]
+ ldr r0, [r4, #0x10]
+ str r0, [r4, #0xc]
+ str r1, [r4, #0x18]
+ ldr r0, [r4, #0x18]
+ str r0, [r4, #0x14]
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start FSi_SendCommand
+FSi_SendCommand:
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r7, r0
+ ldr r6, [r7, #0x8]
+ mov r2, #0x1
+ str r1, [r7, #0x10]
+ mov r0, #0x2
+ str r0, [r7, #0x14]
+ ldr r0, [r7, #0xc]
+ mov r5, r2, lsl r1
+ orr r0, r0, #0x1
+ str r0, [r7, #0xc]
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x1c]
+ mov r4, r0
+ ands r0, r1, #0x80
+ beq _020D1238
+ mov r0, r7
+ mov r1, #0x3
+ bl FSi_ReleaseCommand
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020D1238:
+ ands r0, r5, #0x1fc
+ ldrne r0, [r7, #0xc]
+ add r2, r6, #0x20
+ orrne r0, r0, #0x4
+ strne r0, [r7, #0xc]
+ ldr r1, [r7, #0x0]
+ ldr r0, [r7, #0x4]
+ cmp r1, #0x0
+ strne r0, [r1, #0x4]
+ cmp r0, #0x0
+ strne r1, [r0, #0x0]
+ ldr r0, [r2, #0x4]
+ cmp r0, #0x0
+ beq _020D1280
+_020D1270:
+ mov r2, r0
+ ldr r0, [r0, #0x4]
+ cmp r0, #0x0
+ bne _020D1270
+_020D1280:
+ str r7, [r2, #0x4]
+ str r2, [r7, #0x0]
+ mov r1, #0x0
+ str r1, [r7, #0x4]
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x8
+ movne r1, #0x1
+ cmp r1, #0x0
+ bne _020D132C
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x10
+ bne _020D132C
+ ldr r1, [r6, #0x1c]
+ mov r0, r4
+ orr r1, r1, #0x10
+ str r1, [r6, #0x1c]
+ bl OS_RestoreInterrupts
+ ldr r0, [r6, #0x58]
+ ands r0, r0, #0x200
+ beq _020D12E0
+ ldr r2, [r6, #0x54]
+ mov r0, r7
+ mov r1, #0x9
+ blx r2
+_020D12E0:
+ bl OS_DisableInterrupts
+ ldr r1, [r7, #0xc]
+ orr r1, r1, #0x40
+ str r1, [r7, #0xc]
+ ldr r1, [r7, #0xc]
+ ands r1, r1, #0x4
+ movne r1, #0x1
+ moveq r1, #0x0
+ cmp r1, #0x0
+ bne _020D1324
+ bl OS_RestoreInterrupts
+ mov r0, r7
+ bl FSi_ExecuteAsyncCommand
+ add sp, sp, #0x4
+ mov r0, #0x1
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020D1324:
+ bl OS_RestoreInterrupts
+ b _020D1378
+_020D132C:
+ ldr r0, [r7, #0xc]
+ ands r0, r0, #0x4
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ bne _020D135C
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x1
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020D135C:
+ add r0, r7, #0x18
+ bl OS_SleepThread
+ ldr r0, [r7, #0xc]
+ ands r0, r0, #0x40
+ beq _020D135C
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_020D1378:
+ mov r0, r7
+ bl FSi_ExecuteSyncCommand
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+
+ arm_func_start FSi_ExecuteSyncCommand
+FSi_ExecuteSyncCommand: ; 0x020D138C
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ ldr r1, [r4, #0x10]
+ bl FSi_TranslateCommand
+ mov r1, r0
+ mov r0, r4
+ bl FSi_ReleaseCommand
+ ldr r0, [r4, #0x8]
+ bl FSi_NextCommand
+_020D13B0:
+ cmp r0, #0x0
+ beq _020D13BC
+ bl FSi_ExecuteAsyncCommand
+_020D13BC:
+ ldr r0, [r4, #0x14]
+ cmp r0, #0x0
+ moveq r0, #0x1
+ movne r0, #0x0
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start FSi_ExecuteAsyncCommand
+FSi_ExecuteAsyncCommand: ; 0x020D13D4
+ stmdb sp!, {r4-r8,lr}
+ movs r6, r0
+ ldr r5, [r6, #0x8]
+ ldmeqia sp!, {r4-r8,lr}
+ bxeq lr
+ mov r7, #0x0
+ mov r8, #0x1
+_020D13F0:
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0xc]
+ mov r4, r0
+ orr r0, r1, #0x40
+ str r0, [r6, #0xc]
+ ldr r0, [r6, #0xc]
+ ands r0, r0, #0x4
+ movne r0, r8
+ moveq r0, r7
+ cmp r0, #0x0
+ beq _020D1434
+ add r0, r6, #0x18
+ bl OS_WakeupThread
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+_020D1434:
+ ldr r1, [r6, #0xc]
+ mov r0, r4
+ orr r1, r1, #0x8
+ str r1, [r6, #0xc]
+ bl OS_RestoreInterrupts
+ ldr r1, [r6, #0x10]
+ mov r0, r6
+ bl FSi_TranslateCommand
+ cmp r0, #0x6
+ ldmeqia sp!, {r4-r8,lr}
+ bxeq lr
+ mov r0, r5
+ bl FSi_NextCommand
+ movs r6, r0
+ bne _020D13F0
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+
+ arm_func_start FSi_NextCommand
+FSi_NextCommand:
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x4c
+ mov r6, r0
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x1c]
+ mov r5, r0
+ ands r0, r1, #0x20
+ beq _020D1500
+ ldr r0, [r6, #0x1c]
+ bic r0, r0, #0x20
+ str r0, [r6, #0x1c]
+ ldr r0, [r6, #0x24]
+ cmp r0, #0x0
+ beq _020D1500
+ mov r8, #0x0
+ mov r9, #0x1
+ mov r7, #0x3
+_020D14BC:
+ ldr r1, [r0, #0xc]
+ ldr r4, [r0, #0x4]
+ ands r1, r1, #0x2
+ movne r1, r9
+ moveq r1, r8
+ cmp r1, #0x0
+ beq _020D14F4
+ ldr r1, [r6, #0x24]
+ cmp r1, r0
+ mov r1, r7
+ streq r4, [r6, #0x24]
+ bl FSi_ReleaseCommand
+_020D14EC:
+ cmp r4, #0x0
+ ldreq r4, [r6, #0x24]
+_020D14F4:
+ mov r0, r4
+ cmp r4, #0x0
+ bne _020D14BC
+_020D1500:
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x40
+ bne _020D15EC
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x8
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ bne _020D15EC
+ ldr r4, [r6, #0x24]
+ cmp r4, #0x0
+ beq _020D15EC
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x10
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ moveq r7, #0x1
+ movne r7, #0x0
+ cmp r7, #0x0
+ ldrne r0, [r6, #0x1c]
+ orrne r0, r0, #0x10
+ strne r0, [r6, #0x1c]
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_020D1564:
+ cmp r7, #0x0
+ beq _020D1588
+ ldr r0, [r6, #0x58]
+ ands r0, r0, #0x200
+ beq _020D1588
+ ldr r2, [r6, #0x54]
+ mov r0, r4
+ mov r1, #0x9
+ blx r2
+_020D1588:
+ bl OS_DisableInterrupts
+ ldr r1, [r4, #0xC]
+ mov r5, r0
+ orr r0, r1, #0x40
+ str r0, [r4, #0xC]
+ ldr r0, [r4, #0xC]
+ ands r0, r0, #0x4
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ beq _020D15D4
+ add r0, r4, #0x18
+ bl OS_WakeupThread
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4c
+ mov r0, #0x0
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020D15D4:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4c
+ mov r0, r4
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020D15EC:
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x10
+ beq _020D162C
+ ldr r0, [r6, #0x1c]
+ bic r0, r0, #0x10
+ str r0, [r6, #0x1c]
+ ldr r0, [r6, #0x58]
+ ands r0, r0, #0x400
+ beq _020D162C
+ add r0, sp, #0x0
+ bl FS_InitFile
+ str r6, [sp, #0x8]
+ ldr r2, [r6, #0x54]
+ add r0, sp, #0x0
+ mov r1, #0xa
+ blx r2
+_020D162C:
+ ldr r0, [r6, #0x1c]
+ ands r0, r0, #0x40
+ beq _020D1658
+ ldr r1, [r6, #0x1c]
+ add r0, r6, #0x14
+ bic r1, r1, #0x40
+ str r1, [r6, #0x1c]
+ ldr r1, [r6, #0x1c]
+ orr r1, r1, #0x8
+ str r1, [r6, #0x1c]
+ bl OS_WakeupThread
+_020D1658:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_020D1660:
+ mov r0, #0x0
+ add sp, sp, #0x4c
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+
+ arm_func_start FSi_ReadMemoryCore
+FSi_ReadMemoryCore: ; 0x020D1670
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r0, r2
+ mov r2, r3
+ bl MI_CpuCopy8
+_020D1684:
+ mov r0, #0x0
+ add sp, sp, #0x4
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FSi_WriteMemCallback
+FSi_WriteMemCallback: ; 0x020D1694
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r12, [r0, #0x28]
+ mov r0, r1
+ add r1, r12, r2
+ mov r2, r3
+ bl MI_CpuCopy8
+_020D16B0:
+ mov r0, #0x0
+ add sp, sp, #0x4
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FSi_ReadMemCallback
+FSi_ReadMemCallback: ; 0x020D16C0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r0, [r0, #0x28]
+ add r0, r0, r2
+ mov r2, r3
+ bl MI_CpuCopy8
+_020D16D8:
+ mov r0, #0x0
+ add sp, sp, #0x4
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FSi_GetPackedName
+FSi_GetPackedName: ; 0x020D16E8
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r1, #0x3
+ mov lr, #0x0
+ bgt _020D173C
+ mov r12, lr
+ cmp r1, #0x0
+ ble _020D173C
+ mov r3, lr
+_020D170C:
+ ldrb r2, [r0, r12]
+ cmp r2, #0x0
+ beq _020D173C
+ sub r2, r2, #0x41
+ cmp r2, #0x19
+ addls r2, r2, #0x61
+ addhi r2, r2, #0x41
+ add r12, r12, #0x1
+ orr lr, lr, r2, lsl r3
+ cmp r12, r1
+ add r3, r3, #0x8
+ blt _020D170C
+_020D173C:
+ mov r0, lr
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
diff --git a/arm9/asm/FS_command.s b/arm9/asm/FS_command.s
new file mode 100644
index 00000000..0c2ec755
--- /dev/null
+++ b/arm9/asm/FS_command.s
@@ -0,0 +1,140 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FSi_TranslateCommand
+FSi_TranslateCommand:
+ stmdb sp!, {r4-r8,lr}
+ mov r8, r0
+ ldr r0, [r8, #0xc]
+ mov r7, r1
+ mov r1, #0x1
+ ldr r5, [r8, #0x8]
+ mov r4, r1, lsl r7
+ ands r0, r0, #0x4
+ moveq r1, #0x0
+ cmp r1, #0x0
+ ldrne r0, [r5, #0x1c]
+ orrne r0, r0, #0x200
+ strne r0, [r5, #0x1c]
+ ldreq r0, [r5, #0x1c]
+ orreq r0, r0, #0x100
+ streq r0, [r5, #0x1c]
+ ldr r0, [r5, #0x58]
+ ands r0, r0, r4
+ beq _020CFFE4
+ ldr r2, [r5, #0x54]
+ mov r0, r8
+ mov r1, r7
+ blx r2
+ mov r6, r0
+ cmp r6, #0x8
+ addls pc, pc, r6, lsl #0x2
+ b _020CFFE8
+_020CFFA0:
+ b _020CFFC4
+ b _020CFFC4
+ b _020CFFE8
+ b _020CFFE8
+ b _020CFFC4
+ b _020CFFE8
+ b _020CFFE8
+ b _020CFFE8
+ b _020CFFCC
+_020CFFC4:
+ str r6, [r8, #0x14]
+ b _020CFFE8
+_020CFFCC:
+ ldr r1, [r5, #0x58]
+ mvn r0, r4
+ and r0, r1, r0
+ str r0, [r5, #0x58]
+ mov r6, #0x7
+ b _020CFFE8
+_020CFFE4:
+ mov r6, #0x7
+_020CFFE8:
+ cmp r6, #0x7
+ bne _020D0004
+ ldr r1, _020D00AC ; =0x02103F80
+ mov r0, r8
+ ldr r1, [r1, r7, lsl #0x2]
+ blx r1
+ mov r6, r0
+_020D0004:
+ cmp r6, #0x6
+ bne _020D0060
+ ldr r0, [r8, #0xc]
+ ands r0, r0, #0x4
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ beq _020D00A0
+ bl OS_DisableInterrupts
+ ldr r1, [r5, #0x1c]
+ mov r4, r0
+ ands r0, r1, #0x200
+ beq _020D0050
+ add r6, r5, #0xc
+_020D003C:
+ mov r0, r6
+ bl OS_SleepThread
+ ldr r0, [r5, #0x1c]
+ ands r0, r0, #0x200
+ bne _020D003C
+_020D0050:
+ mov r0, r4
+ ldr r6, [r8, #0x14]
+ bl OS_RestoreInterrupts
+ b _020D00A0
+_020D0060:
+ ldr r0, [r8, #0xc]
+ ands r0, r0, #0x4
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ ldrne r0, [r5, #0x1c]
+ bicne r0, r0, #0x200
+ strne r0, [r5, #0x1c]
+ strne r6, [r8, #0x14]
+ bne _020D00A0
+ ldr r1, [r5, #0x1c]
+ mov r0, r8
+ bic r2, r1, #0x100
+ mov r1, r6
+ str r2, [r5, #0x1c]
+ bl FSi_ReleaseCommand
+_020D00A0:
+ mov r0, r6
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+ .balign 4
+_020D00AC: .word 0x02103F80
+
+ arm_func_start FSi_ReleaseCommand
+FSi_ReleaseCommand:
+ stmdb sp!, {r4-r6,lr}
+ mov r6, r0
+ mov r5, r1
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x0]
+ mov r4, r0
+ ldr r0, [r6, #0x4]
+ cmp r1, #0x0
+ strne r0, [r1, #0x4]
+ cmp r0, #0x0
+ strne r1, [r0, #0x0]
+ mov r0, #0x0
+ str r0, [r6, #0x0]
+ ldr r1, [r6, #0x0]
+ add r0, r6, #0x18
+ str r1, [r6, #0x4]
+ ldr r1, [r6, #0xc]
+ bic r1, r1, #0x4f
+ str r1, [r6, #0xc]
+ str r5, [r6, #0x14]
+ bl OS_WakeupThread
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4-r6,lr}
+ bx lr
diff --git a/arm9/asm/FS_command_default.s b/arm9/asm/FS_command_default.s
new file mode 100644
index 00000000..eea33a0a
--- /dev/null
+++ b/arm9/asm/FS_command_default.s
@@ -0,0 +1,748 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FSi_CloseFileCommand
+FSi_CloseFileCommand: ; 0x020D0114
+ mov r0, #0x0
+ bx lr
+
+ arm_func_start FSi_OpenFileDirectCommand
+FSi_OpenFileDirectCommand: ; 0x020D011C
+ ldr r1, [r0, #0x30]
+ str r1, [r0, #0x24]
+ ldr r1, [r0, #0x30]
+ str r1, [r0, #0x2c]
+ ldr r1, [r0, #0x34]
+ str r1, [r0, #0x28]
+ ldr r1, [r0, #0x38]
+ str r1, [r0, #0x20]
+ mov r0, #0x0
+ bx lr
+
+ arm_func_start FSi_OpenFileFastCommand
+FSi_OpenFileFastCommand: ; 0x020D0144
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x14
+ mov r5, r0
+ ldr r1, [r5, #0x8]
+ ldr r4, [r5, #0x34]
+ ldr r0, [r1, #0x30]
+ mov r2, r4, lsl #0x3
+ cmp r2, r0
+ addcs sp, sp, #0x14
+ movcs r0, #0x1
+ ldmcsia sp!, {r4-r5,lr}
+ bxcs lr
+ str r1, [sp, #0x8]
+ ldr r1, [r1, #0x2c]
+ add r0, sp, #0x8
+ add r3, r1, r2
+ add r1, sp, #0x0
+ mov r2, #0x8
+ str r3, [sp, #0xc]
+ bl FSi_ReadTable
+_020D0194:
+ cmp r0, #0
+ addne sp, sp, #0x14
+ ldmneia sp!, {r4-r5,lr}
+ bxne lr
+ ldr r1, [sp]
+ mov r0, r5
+ str r1, [r5, #0x30]
+ ldr r2, [sp, #0x4]
+ mov r1, #7
+ str r2, [r5, #0x34]
+ str r4, [r5, #0x38]
+ bl FSi_TranslateCommand
+ add sp, sp, #0x14
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start FSi_GetPathCommand
+FSi_GetPathCommand: ; 0x020D01D0
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0xe4
+ mov r4, r0
+ ldr r1, [r4, #0x8]
+ add r0, sp, #0x98
+ add r11, r4, #0x30
+ str r1, [sp, #0x0]
+ bl FS_InitFile
+ ldr r0, [r4, #0x8]
+ str r0, [sp, #0xa0]
+ ldr r0, [r4, #0xc]
+ ands r0, r0, #0x20
+ movne r0, #0x1
+ moveq r0, #0x0
+ cmp r0, #0x0
+ ldrneh r5, [r4, #0x24]
+ movne r4, #0x10000
+ bne _020D02BC
+ ldrh r0, [r11, #0x8]
+ ldr r4, [r4, #0x20]
+ cmp r0, #0x0
+ ldrneh r5, [r11, #0xa]
+ bne _020D02BC
+ mov r10, #0x0
+ mov r9, r10
+ mov r5, #0x10000
+ add r8, sp, #0x98
+ mov r6, #0x3
+ mov r7, #0x1
+_020D0244:
+ mov r0, r8
+ mov r1, r10
+ bl FSi_SeekDirDirect
+ add r2, sp, #0x4
+ cmp r10, #0x0
+ mov r0, r8
+ mov r1, r6
+ ldreq r9, [sp, #0xc4]
+ str r2, [sp, #0xc8]
+ str r7, [sp, #0xcc]
+ bl FSi_TranslateCommand
+_020D0270:
+ cmp r0, #0x0
+ bne _020D02A8
+_020D0278:
+ ldr r0, [sp, #0x10]
+ cmp r0, #0x0
+ bne _020D0294
+ ldr r0, [sp, #0x8]
+ cmp r0, r4
+ ldreqh r5, [sp, #0xbc]
+ beq _020D02A8
+_020D0294:
+ mov r0, r8
+ mov r1, r6
+ bl FSi_TranslateCommand
+ cmp r0, #0x0
+ beq _020D0278
+_020D02A8:
+ cmp r5, #0x10000
+ bne _020D02BC
+ add sl, sl, #0x1
+ cmp sl, r9
+ bcc _020D0244
+_020D02BC:
+ cmp r5, #0x10000
+ moveq r0, #0x0
+ streqh r0, [r11, #0x8]
+ addeq sp, sp, #0xe4
+ moveq r0, #0x1
+ ldmeqia sp!, {r4-r11,lr}
+ bxeq lr
+ ldrh r0, [r11, #0x8]
+ cmp r0, #0x0
+ bne _020D03B8
+ ldr r0, [sp, #0x0]
+ mov r1, #0x0
+ ldr r0, [r0, #0x0]
+ cmp r0, #0xff
+ addls r9, r1, #0x1
+ bls _020D0308
+ cmp r0, #0xff00
+ addls r9, r1, #0x2
+ addhi r9, r1, #0x3
+_020D0308:
+ cmp r4, #0x10000
+ ldrne r0, [sp, #0x14]
+ add r9, r9, #0x2
+ addne r9, r9, r0
+ mov r10, r5
+ cmp r5, #0x0
+ beq _020D03AC
+ add r0, sp, #0x98
+ mov r1, r5
+ bl FSi_SeekDirDirect
+ add r8, sp, #0x98
+ mov r6, #0x3
+ mov r7, #0x1
+_020D033C:
+ ldr r1, [sp, #0xc4]
+ mov r0, r8
+ bl FSi_SeekDirDirect
+ add r2, sp, #0x4
+ mov r0, r8
+ mov r1, r6
+ str r2, [sp, #0xc8]
+ str r7, [sp, #0xcc]
+ bl FSi_TranslateCommand
+_020D0360:
+ cmp r0, #0x0
+ bne _020D03A0
+_020D0368:
+ ldr r0, [sp, #0x10]
+ cmp r0, #0x0
+ beq _020D038C
+ ldrh r0, [sp, #0x8]
+ cmp r0, sl
+ ldreq r0, [sp, #0x14]
+ addeq r0, r0, #0x1
+ addeq r9, r9, r0
+ beq _020D03A0
+_020D038C:
+ mov r0, r8
+ mov r1, r6
+ bl FSi_TranslateCommand
+ cmp r0, #0x0
+ beq _020D0368
+_020D03A0:
+ ldrh sl, [sp, #0xbc]
+ cmp sl, #0x0
+ bne _020D033C
+_020D03AC:
+ add r0, r9, #0x1
+ strh r0, [r11, #0x8]
+ strh r5, [r11, #0xa]
+_020D03B8:
+ ldr r7, [r11, #0x0]
+ cmp r7, #0x0
+ addeq sp, sp, #0xe4
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r11,lr}
+ bxeq lr
+ ldrh r6, [r11, #0x8]
+ ldr r0, [r11, #0x4]
+ cmp r0, r6
+ addcc sp, sp, #0xe4
+ movcc r0, #0x1
+ ldmccia sp!, {r4-r11,lr}
+ bxcc lr
+ ldr r0, [sp, #0x0]
+ mov r9, #0x0
+ ldr r0, [r0, #0x0]
+ cmp r0, #0xff
+ movls r8, #0x1
+ bls _020D0410
+ cmp r0, #0xff00
+ movls r8, #0x2
+ movhi r8, #0x3
+_020D0410:
+ ldr r0, [sp, #0x0]
+ mov r1, r7
+ mov r2, r8
+ bl MI_CpuCopy8
+ add r1, r9, r8
+ ldr r0, _020D058C ; =0x0210682C
+ add r1, r7, r1
+ mov r2, #0x2
+ bl MI_CpuCopy8
+ add r0, sp, #0x98
+ mov r1, r5
+ bl FSi_SeekDirDirect
+ cmp r4, #0x10000
+ beq _020D04C4
+ add r3, sp, #0x4
+ mov r2, #0x0
+ add r0, sp, #0x98
+ mov r1, #0x3
+ str r3, [sp, #0xc8]
+ str r2, [sp, #0xcc]
+ bl FSi_TranslateCommand
+_020D0464:
+ cmp r0, #0x0
+ bne _020D04A0
+ add r9, sp, #0x98
+ mov r8, #0x3
+_020D0474:
+ ldr r0, [sp, #0x10]
+ cmp r0, #0x0
+ bne _020D048C
+ ldr r0, [sp, #0x8]
+ cmp r0, r4
+ beq _020D04A0
+_020D048C:
+ mov r0, r9
+ mov r1, r8
+ bl FSi_TranslateCommand
+ cmp r0, #0x0
+ beq _020D0474
+_020D04A0:
+ ldr r0, [sp, #0x14]
+ add r1, r7, r6
+ add r4, r0, #0x1
+ add r0, sp, #0x18
+ mov r2, r4
+ sub r1, r1, r4
+ bl MI_CpuCopy8
+ sub r6, r6, r4
+ b _020D04D4
+_020D04C4:
+ add r0, r7, r6
+ mov r1, #0x0
+ strb r1, [r0, #-0x1]
+ sub r6, r6, #0x1
+_020D04D4:
+ cmp r5, #0x0
+ beq _020D057C
+ add r10, sp, #0x98
+ add r11, sp, #0x4
+ mov r4, #0x3
+ mov r9, #0x0
+ mov r8, #0x2f
+_020D04F0:
+ ldr r1, [sp, #0xc4]
+ mov r0, r10
+ bl FSi_SeekDirDirect
+ add r2, r7, r6
+ mov r0, r10
+ mov r1, r4
+ str r11, [sp, #0xc8]
+ str r9, [sp, #0xcc]
+ strb r8, [r2, #-0x1]
+ sub r6, r6, #0x1
+ bl FSi_TranslateCommand
+_020D051C:
+ cmp r0, #0x0
+ bne _020D0570
+_020D0524:
+ ldr r0, [sp, #0x10]
+ cmp r0, #0x0
+ beq _020D055C
+ ldrh r0, [sp, #0x8]
+ cmp r0, r5
+ bne _020D055C
+ ldr r5, [sp, #0x14]
+ add r1, r7, r6
+ add r0, sp, #0x18
+ mov r2, r5
+ sub r1, r1, r5
+ bl MI_CpuCopy8
+ sub r6, r6, r5
+ b _020D0570
+_020D055C:
+ mov r0, sl
+ mov r1, r4
+ bl FSi_TranslateCommand
+ cmp r0, #0x0
+ beq _020D0524
+_020D0570:
+ ldrh r5, [sp, #0xbc]
+ cmp r5, #0x0
+ bne _020D04F0
+_020D057C:
+ mov r0, #0x0
+ add sp, sp, #0xe4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_020D058C: .word 0x0210682C
+
+ arm_func_start FSi_FindPathCommand
+FSi_FindPathCommand: ; 0x020D0590
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x9c
+ mov r10, r0
+ ldr r2, [r10, #0x40]
+ ldr r9, [r10, #0x3c]
+ mov r1, #0x2
+ str r2, [sp, #0x0]
+ bl FSi_TranslateCommand
+ ldrb r1, [r9, #0x0]
+ cmp r1, #0x0
+ beq _020D0780
+ mov r0, #0x2
+ add r11, sp, #0x1c
+ mov r4, #0x3
+ mov r5, #0x1
+ mov r6, #0x0
+ str r0, [sp, #0x4]
+_020D05D4:
+ mov r7, r6
+ b _020D05E0
+_020D05DC:
+ add r7, r7, #0x1
+_020D05E0:
+ ldrb r8, [r9, r7]
+ mov r0, r6
+ cmp r8, #0x0
+ beq _020D0600
+ cmp r8, #0x2f
+ beq _020D0600
+ cmp r8, #0x5c
+ movne r0, r5
+_020D0600:
+ cmp r0, #0x0
+ bne _020D05DC
+ cmp r8, #0x0
+ bne _020D061C
+ ldr r0, [sp, #0x0]
+ cmp r0, #0x0
+ beq _020D0620
+_020D061C:
+ mov r8, r5
+_020D0620:
+ cmp r7, #0x0
+ addeq sp, sp, #0x9c
+ moveq r0, #0x1
+ ldmeqia sp!, {r4-r11,lr}
+ bxeq lr
+ cmp r1, #0x2e
+ bne _020D068C
+ cmp r7, #0x1
+ addeq r9, r9, #0x1
+ beq _020D0764
+ ldrb r0, [r9, #0x1]
+ cmp r7, #0x2
+ moveq r1, r5
+ movne r1, r6
+ cmp r0, #0x2e
+ moveq r0, r5
+ movne r0, r6
+ ands r0, r1, r0
+ beq _020D068C
+ ldrh r0, [r10, #0x24]
+ cmp r0, #0x0
+ beq _020D0684
+ ldr r1, [r10, #0x2c]
+ mov r0, r10
+ bl FSi_SeekDirDirect
+_020D0684:
+ add r9, r9, #0x2
+ b _020D0764
+_020D068C:
+ cmp r7, #0x7f
+ addgt sp, sp, #0x9c
+ movgt r0, #0x1
+ ldmgtia sp!, {r4-r11,lr}
+ bxgt lr
+ add r0, sp, #0x8
+ str r0, [r10, #0x30]
+ str r6, [r10, #0x34]
+_020D06AC:
+ mov r0, r10
+ mov r1, r4
+ bl FSi_TranslateCommand
+_020D06B8:
+ cmp r0, #0x0
+ addne sp, sp, #0x9c
+ movne r0, #0x1
+ ldmneia sp!, {r4-r11,lr}
+ bxne lr
+ ldr r0, [sp, #0x14]
+ cmp r8, r0
+ bne _020D06AC
+ ldr r0, [sp, #0x18]
+ cmp r7, r0
+ bne _020D06AC
+ mov r0, r9
+ mov r1, fp
+ mov r2, r7
+ bl FSi_StrNICmp
+ cmp r0, #0x0
+ bne _020D06AC
+ cmp r8, #0x0
+ beq _020D0728
+ add r0, sp, #0x8
+ add r3, sl, #0x30
+ ldmia r0, {r0, r1, r2}
+ stmia r3, {r0, r1, r2}
+ ldr r1, [sp, #0x4]
+ mov r0, sl
+ add r9, r9, r7
+ bl FSi_TranslateCommand
+ b _020D0764
+_020D0728:
+ ldr r0, [sp]
+ cmp r0, #0x0
+ addne sp, sp, #0x9c
+ movne r0, #0x1
+ ldmneia sp!, {r4-r11,lr}
+ bxne lr
+ ldr r3, [sl, #0x44]
+ ldr r2, [sp, #0x8]
+ ldr r1, [sp, #0xC]
+ add sp, sp, #0x9c
+ str r2, [r3]
+ str r1, [r3, #0x4]
+ mov r0, #0x0
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+_020D0764:
+ ldrb r0, [r9, #0x0]
+ cmp r0, #0x0
+ movne r0, r5
+ moveq r0, r6
+ ldrb r1, [r9, r0]!
+ cmp r1, #0x0
+ bne _020D05D4
+_020D0780:
+ ldr r0, [sp, #0x0]
+ cmp r0, #0x0
+ moveq r0, #0x1
+ addne r0, r10, #0x20
+ ldrne r3, [r10, #0x44]
+ ldmneia r0, {r0-r2}
+ stmneia r3, {r0-r2}
+ movne r0, #0x0
+ add sp, sp, #0x9c
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+
+ arm_func_start FSi_ReadDirCommand
+FSi_ReadDirCommand: ; 0x020D07AC
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0xc
+ mov r5, r0
+ ldr r4, [r5, #0x30]
+ ldr r1, [r5, #0x8]
+ add r0, sp, #0x4
+ str r1, [sp, #0x4]
+ ldr r3, [r5, #0x28]
+ add r1, sp, #0x0
+ mov r2, #0x1
+ str r3, [sp, #0x8]
+ bl FSi_ReadTable
+_020D07DC:
+ cmp r0, #0x0
+ addne sp, sp, #0xC
+ ldmneia sp!, {r4-r5,lr}
+ bxne lr
+ ldrb r1, [sp]
+ and r2, r1, #0x7F
+ mov r1, r1, asr #0x7
+ str r2, [r4, #0x10]
+ and r1, r1, #0x1
+ str r1, [r4, #0xC]
+ ldr r2, [r4, #0x10]
+ cmp r2, #0x0
+ addeq sp, sp, #0xC
+ moveq r0, #0x1
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ ldr r1, [r5, #0x34]
+ cmp r1, #0x0
+ bne _020D0858
+ add r0, sp, #0x4
+ add r1, r4, #0x14
+ bl FSi_ReadTable
+ cmp r0, #0x0
+ addne sp, sp, #0xC
+ ldmneia sp!, {r4-r5,lr}
+ bxne lr
+ ldr r1, [r4, #0x10]
+ mov r2, #0x0
+ add r1, r4, r1
+ strb r2, [r1, #0x14]
+ b _020D0864
+_020D0858:
+ ldr r1, [sp, #0x8]
+ add r1, r1, r2
+ str r1, [sp, #0x8]
+_020D0864:
+ ldr r1, [r4, #0xC]
+ cmp r1, #0x0
+ beq _020D08B8
+ add r0, sp, #0x4
+ add r1, sp, #0x2
+ mov r2, #0x2
+ bl FSi_ReadTable
+ cmp r0, #0x0
+ addne sp, sp, #0xC
+ ldmneia sp!, {r4-r5,lr}
+ bxne lr
+ ldr r2, [r5, #0x8]
+ ldr r1, _020D08E8
+ str r2, [r4]
+ ldrh r3, [sp, #0x2]
+ mov r2, #0x0
+ and r1, r3, r1
+ strh r1, [r4, #0x4]
+ strh r2, [r4, #0x6]
+ str r2, [r4, #0x8]
+ b _020D08D4
+_020D08B8:
+ ldr r1, [r5, #0x8]
+ str r1, [r4]
+ ldrh r1, [r5, #0x26]
+ str r1, [r4, #0x4]
+ ldrh r1, [r5, #0x26]
+ add r1, r1, #0x1
+ strh r1, [r5, #0x26]
+_020D08D4:
+ ldr r1, [sp, #0x8]
+ str r1, [r5, #0x28]
+ add sp, sp, #0xC
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D08E8: .word 0x00000FFF
+
+ arm_func_start FSi_SeekDirCommand
+FSi_SeekDirCommand: ; 0x020D08EC
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x10
+ mov r6, r0
+ ldr r5, [r6, #0x8]
+ add r4, r6, #0x30
+ str r5, [sp, #0x8]
+ ldrh r1, [r4, #0x4]
+ ldr r2, [r5, #0x34]
+ add r0, sp, #0x8
+ add r3, r2, r1, lsl #0x3
+ add r1, sp, #0x0
+ mov r2, #0x8
+ str r3, [sp, #0xc]
+ bl FSi_ReadTable
+ movs r3, r0
+ bne _020D0978
+ add r12, r6, #0x20
+ ldmia r4, {r0-r2}
+ stmia r12, {r0-r2}
+ ldrh r0, [r4, #0x6]
+ cmp r0, #0x0
+ bne _020D0968
+ ldr r0, [r4, #0x8]
+ cmp r0, #0x0
+ bne _020D0968
+ ldrh r0, [sp, #0x4]
+ strh r0, [r6, #0x26]
+ ldr r1, [r5, #0x34]
+ ldr r0, [sp, #0x0]
+ add r0, r1, r0
+ str r0, [r6, #0x28]
+_020D0968:
+ ldrh r1, [sp, #0x6]
+ ldr r0, _020D0988 ; =0x00000FFF
+ and r0, r1, r0
+ str r0, [r6, #0x2c]
+_020D0978:
+ mov r0, r3
+ add sp, sp, #0x10
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D0988: .word 0x00000FFF
+
+ arm_func_start FSi_WriteFileCommand
+FSi_WriteFileCommand: ; 0x020D098C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r2, [r0, #0x2c]
+ ldr r3, [r0, #0x38]
+ ldr lr, [r0, #0x8]
+ ldr r1, [r0, #0x30]
+ add r12, r2, r3
+ str r12, [r0, #0x2c]
+ ldr r12, [lr, #0x4c]
+ mov r0, lr
+ blx r12
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FSi_ReadFileCommand
+FSi_ReadFileCommand: ; 0x020D09C4
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r2, [r0, #0x2c]
+ ldr r3, [r0, #0x38]
+ ldr lr, [r0, #0x8]
+ ldr r1, [r0, #0x30]
+ add r12, r2, r3
+ str r12, [r0, #0x2c]
+ ldr r12, [lr, #0x48]
+ mov r0, lr
+ blx r12
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FSi_SeekDirDirect
+FSi_SeekDirDirect: ; 0x020D09FC
+ ldr r3, [r0, #0xc]
+ mov r2, #0x0
+ orr r3, r3, #0x4
+ str r3, [r0, #0xc]
+ ldr r3, [r0, #0x8]
+ ldr ip, _020D0A2C ; =FSi_TranslateCommand
+ str r3, [r0, #0x30]
+ str r2, [r0, #0x38]
+ strh r2, [r0, #0x36]
+ strh r1, [r0, #0x34]
+ mov r1, #0x2
+ bx r12
+ .balign 4
+_020D0A2C: .word FSi_TranslateCommand
+
+ arm_func_start FSi_ReadTable
+FSi_ReadTable:
+ stmdb sp!, {r4-r8,lr}
+ mov r7, r0
+ ldr r5, [r7, #0x0]
+ mov r6, r2
+ ldr r2, [r5, #0x1c]
+ mov r0, r5
+ orr r2, r2, #0x200
+ str r2, [r5, #0x1c]
+ ldr r2, [r7, #0x4]
+ ldr r4, [r5, #0x50]
+ mov r3, r6
+ blx r4
+ cmp r0, #0x0
+ beq _020D0A7C
+ cmp r0, #0x1
+ beq _020D0A7C
+ cmp r0, #0x6
+ beq _020D0A8C
+ b _020D0AC8
+_020D0A7C:
+ ldr r1, [r5, #0x1c]
+ bic r1, r1, #0x200
+ str r1, [r5, #0x1c]
+ b _020D0AC8
+_020D0A8C:
+ bl OS_DisableInterrupts
+ ldr r1, [r5, #0x1c]
+ mov r4, r0
+ ands r0, r1, #0x200
+ beq _020D0AB8
+ add r8, r5, #0xc
+_020D0AA4:
+ mov r0, r8
+ bl OS_SleepThread
+ ldr r0, [r5, #0x1c]
+ ands r0, r0, #0x200
+ bne _020D0AA4
+_020D0AB8:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r0, [r5, #0x24]
+ ldr r0, [r0, #0x14]
+_020D0AC8:
+ ldr r1, [r7, #0x4]
+ add r1, r1, r6
+ str r1, [r7, #0x4]
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+
+ arm_func_start FSi_StrNICmp
+FSi_StrNICmp: ; 0x020D0ADC
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r2, #0x0
+ mov lr, #0x0
+ bls _020D0B30
+_020D0AF0:
+ ldrb r12, [r0, lr]
+ ldrb r3, [r1, lr]
+ sub r12, r12, #0x41
+ cmp r12, #0x19
+ sub r3, r3, #0x41
+ addls r12, r12, #0x20
+ cmp r3, #0x19
+ addls r3, r3, #0x20
+ cmp r12, r3
+ addne sp, sp, #0x4
+ subne r0, r12, r3
+ ldmneia sp!, {lr}
+ bxne lr
+ add lr, lr, #0x1
+ cmp lr, r2
+ blo _020D0AF0
+_020D0B30:
+ mov r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
diff --git a/arm9/asm/FS_overlay.s b/arm9/asm/FS_overlay.s
new file mode 100644
index 00000000..78635558
--- /dev/null
+++ b/arm9/asm/FS_overlay.s
@@ -0,0 +1,546 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FS_UnloadOverlay
+FS_UnloadOverlay: ; 0x020D2040
+ stmdb sp!, {lr}
+ sub sp, sp, #0x2c
+ mov r3, r0
+ mov r2, r1
+ add r0, sp, #0x0
+ mov r1, r3
+ bl FS_LoadOverlayInfo
+_020D205C:
+ cmp r0, #0x0
+ beq _020D2074
+ add r0, sp, #0x0
+ bl FS_UnloadOverlayImage
+ cmp r0, #0x0
+ bne _020D2084
+_020D2074:
+ add sp, sp, #0x2c
+ mov r0, #0x0
+ ldmfd sp!, {lr}
+ bx lr
+_020D2084:
+ mov r0, #0x1
+ add sp, sp, #0x2c
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlay
+FS_LoadOverlay: ; 0x020D2094
+ stmdb sp!, {lr}
+ sub sp, sp, #0x2c
+ mov r3, r0
+ mov r2, r1
+ add r0, sp, #0x0
+ mov r1, r3
+ bl FS_LoadOverlayInfo
+_020D20B0:
+ cmp r0, #0x0
+ beq _020D20C8
+ add r0, sp, #0x0
+ bl FS_LoadOverlayImage
+ cmp r0, #0x0
+ bne _020D20D8
+_020D20C8:
+ add sp, sp, #0x2c
+ mov r0, #0x0
+ ldmfd sp!, {lr}
+ bx lr
+_020D20D8:
+ add r0, sp, #0x0
+ bl FS_StartOverlay
+ mov r0, #0x1
+ add sp, sp, #0x2c
+ ldmfd sp!, {lr}
+ bx lr
+
+ arm_func_start FS_UnloadOverlayImage
+FS_UnloadOverlayImage: ; 0x020D20F0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl FS_EndOverlay
+ mov r0, #0x1
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FS_EndOverlay
+FS_EndOverlay: ; 0x020D210C
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ ldr r8, _020D220C ; =0x021D74C8
+ mov r11, r0
+ mov r9, #0x0
+_020D2120:
+ ldr r1, [r11, #0x8]
+ ldr r0, [r11, #0xc]
+ ldr r5, [r11, #0x4]
+ add r0, r1, r0
+ mov r7, r9
+ mov r6, r9
+ add r4, r5, r0
+ bl OS_DisableInterrupts
+ ldr lr, [r8, #0x0]
+ mov r10, r9
+ mov r12, lr
+ cmp lr, #0x0
+ beq _020D21C4
+_020D2154:
+ ldr r2, [r12, #0x8]
+ ldr r3, [r12, #0x0]
+ cmp r2, #0x0
+ ldr r1, [r12, #0x4]
+ bne _020D2178
+ cmp r1, r5
+ blo _020D2178
+ cmp r1, r4
+ blo _020D2188
+_020D2178:
+ cmp r2, r5
+ blo _020D21B4
+ cmp r2, r4
+ bhs _020D21B4
+_020D2188:
+ cmp r6, #0x0
+ strne r12, [r6, #0x0]
+ moveq r7, r12
+ cmp lr, r12
+ streq r3, [r8, #0x0]
+ moveq lr, r3
+ str r9, [r12, #0x0]
+ cmp r10, #0x0
+ mov r6, r12
+ strne r3, [r10, #0x0]
+ b _020D21B8
+_020D21B4:
+ mov r10, r12
+_020D21B8:
+ mov r12, r3
+ cmp r3, #0x0
+ bne _020D2154
+_020D21C4:
+ bl OS_RestoreInterrupts
+_020D21C8:
+ cmp r7, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r11, lr}
+ bxeq lr
+_020D21D8:
+ ldr r1, [r7, #0x4]
+ ldr r4, [r7]
+ cmp r1, #0x0
+ beq _020D21F0
+ ldr r0, [r7, #0x8]
+ blx r1
+_020D21F0:
+ mov r7, r4
+ cmp r4, #0x0
+ bne _020D21D8
+ b _020D2120
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11, lr}
+ bx lr
+_020D220C: .word 0x021D74C8
+
+ arm_func_start FS_StartOverlay
+FS_StartOverlay: ; 0x020D2210
+ stmdb sp!, {r4-r6,lr}
+ mov r5, r0
+ bl FSi_GetOverlayBinarySize
+ ldr r1, _020D2300 ; =0x027FFC40
+ mov r4, r0
+ ldrh r0, [r1, #0x0]
+ cmp r0, #0x2
+ bne _020D22A4
+ ldrb r1, [r5, #0x1f]
+ mov r0, #0x0
+ ands r1, r1, #0x2
+ beq _020D2280
+ ldr r1, _020D2304 ; =0x02106F84
+ ldr r3, _020D2308 ; =0x02106F84
+ ldr r2, _020D230C ; =0x66666667
+ sub r12, r1, r3
+ smull r1, lr, r2, r12
+ mov lr, lr, asr #0x3
+ mov r1, r12, lsr #0x1f
+ ldr r2, [r5, #0x0]
+ add lr, r1, lr
+ cmp r2, lr
+ bhs _020D2280
+ mov r0, #0x14
+ mla r0, r2, r0, r3
+ ldr r1, [r5, #0x4]
+ mov r2, r4
+ bl FSi_CompareDigest
+_020D2280:
+ cmp r0, #0x0
+ bne _020D22A4
+ ldr r0, [r5, #0x4]
+ mov r2, r4
+ mov r1, #0x0
+ bl MI_CpuFill8
+ bl OS_Terminate
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+_020D22A4:
+ ldrb r0, [r5, #0x1f]
+ ands r0, r0, #0x1
+ beq _020D22BC
+ ldr r0, [r5, #0x4]
+ add r0, r0, r4
+ bl MIi_UncompressBackward
+_020D22BC:
+ ldr r0, [r5, #0x4]
+ ldr r1, [r5, #0x8]
+ bl DC_FlushRange
+ ldr r6, [r5, #0x10]
+ ldr r4, [r5, #0x14]
+ cmp r6, r4
+ ldmcsia sp!, {r4-r6,lr}
+ bxcs lr
+_020D22DC:
+ ldr r0, [r6, #0x0]
+ cmp r0, #0x0
+ beq _020D22EC
+ blx r0
+_020D22EC:
+ add r6, r6, #0x4
+ cmp r6, r4
+ blo _020D22DC
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D2300: .word 0x027FFC40
+_020D2304: .word 0x02106F84
+_020D2308: .word 0x02106F84
+_020D230C: .word 0x66666667
+
+ arm_func_start FSi_CompareDigest
+FSi_CompareDigest:
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x58
+ mov r4, r0
+ mov r6, r1
+ mov r5, r2
+ add r0, sp, #0x4
+ mov r1, #0x0
+ mov r2, #0x14
+ bl MI_CpuFill8
+ ldr r0, _020D23AC ; =0x02106834
+ ldr r1, _020D23B0 ; =0x02106838
+ ldr r0, [r0, #0x0]
+ ldr r2, [r1, #0x0]
+ add r1, sp, #0x18
+ bl MI_CpuCopy8
+ ldr r3, _020D23B0 ; =0x02106838
+ mov r1, r6
+ ldr r12, [r3, #0x0]
+ mov r2, r5
+ add r0, sp, #0x4
+ add r3, sp, #0x18
+ str r12, [sp, #0x0]
+ bl MATH_CalcHMACSHA1
+ add r2, sp, #0x4
+ mov r3, #0x0
+_020D2374:
+ ldr r1, [r2, #0x0]
+ ldr r0, [r4, r3]
+ cmp r1, r0
+ bne _020D2394
+ add r3, r3, #0x4
+ cmp r3, #0x14
+ add r2, r2, #0x4
+ blo _020D2374
+_020D2394:
+ cmp r3, #0x14
+ moveq r0, #0x1
+ movne r0, #0x0
+ add sp, sp, #0x58
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D23AC: .word 0x02106834
+_020D23B0: .word 0x02106838
+
+ arm_func_start FS_LoadOverlayImage
+FS_LoadOverlayImage: ; 0x020D23B4
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x54
+ mov r5, r0
+ add r0, sp, #0x8
+ bl FS_InitFile
+_020D23C8:
+ add r0, sp, #0x0
+ mov r1, r5
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x0
+ add r0, sp, #0x8
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x54
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r5, lr}
+ bxeq lr
+ mov r0, r5
+ bl FSi_GetOverlayBinarySize
+ mov r4, r0
+ mov r0, r5
+ bl FS_ClearOverlayImage
+ ldr r1, [r5, #0x4]
+ add r0, sp, #0x8
+ mov r2, r4
+ bl FS_ReadFile
+ cmp r4, r0
+ beq _020D243C
+ add r0, sp, #0x8
+ bl FS_CloseFile
+ add sp, sp, #0x54
+ mov r0, #0x0
+ ldmia sp!, {r4-r5, lr}
+ bx lr
+_020D243C:
+ add r0, sp, #0x8
+ bl FS_CloseFile
+ mov r0, #0x1
+ add sp, sp, #0x54
+ ldmia sp!, {r4-r5, lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlayImageAsync
+FS_LoadOverlayImageAsync: ; 0x020D2454
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x8
+ mov r5, r1
+ mov r6, r0
+ mov r0, r5
+ bl FS_InitFile
+_020D246C:
+ add r0, sp, #0x0
+ mov r1, r6
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x0
+ mov r0, r5
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x8
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r6, lr}
+ bxeq lr
+ mov r0, r6
+ bl FSi_GetOverlayBinarySize
+ mov r4, r0
+ mov r0, r6
+ bl FS_ClearOverlayImage
+ ldr r1, [r6, #0x4]
+ mov r0, r5
+ mov r2, r4
+ bl FS_ReadFileAsync
+ cmp r4, r0
+ addeq sp, sp, #0x8
+ moveq r0, #0x1
+ ldmeqia sp!, {r4-r6, lr}
+ bxeq lr
+ mov r0, r5
+ bl FS_CloseFile
+ mov r0, #0x0
+ add sp, sp, #0x8
+ ldmia sp!, {r4-r6, lr}
+ bx lr
+
+ arm_func_start FS_LoadOverlayInfo
+FS_LoadOverlayInfo:
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x64
+ movs r4, r1
+ mov r5, r0
+ ldreq r0, _020D25EC ; =0x021D5404
+ ldrne r0, _020D25F0 ; =0x021D540C
+ ldr r3, [r0, #0x0]
+ cmp r3, #0x0
+ beq _020D25A8
+ ldr r0, [r0, #0x4]
+ mov r2, r2, lsl #0x5
+ cmp r2, r0
+ addcs sp, sp, #0x64
+ movcs r0, #0x0
+ ldmcsia sp!, {r4-r5,lr}
+ bxcs lr
+ add r0, r3, r2
+ mov r1, r5
+ mov r2, #0x20
+ bl MI_CpuCopy8
+ add r0, sp, #0x18
+ str r4, [r5, #0x20]
+ bl FS_InitFile
+ add r0, sp, #0x10
+ mov r1, r5
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x10
+ add r0, sp, #0x18
+ ldmia r1, {r1-r2}
+ bl FS_OpenFileFast
+_020D2564:
+ cmp r0, #0x0
+ addeq sp, sp, #0x64
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ ldr r1, [sp, #0x3c]
+ add r0, sp, #0x18
+ str r1, [r5, #0x24]
+ ldr r2, [sp, #0x40]
+ ldr r1, [sp, #0x3c]
+ sub r1, r2, r1
+ str r1, [r5, #0x28]
+ bl FS_CloseFile
+ add sp, sp, #0x64
+ mov r0, #0x1
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D25A8:
+ ldr r1, _020D25F4 ; =0x027FFE50
+ ldr ip, _020D25F8 ; =0x027FFE58
+ ldr r0, [r1, #0x0]
+ ldr r3, _020D25FC ; =0x021D5414
+ str r0, [sp, #0x0]
+ ldr r1, [r1, #0x4]
+ mov r0, r5
+ str r1, [sp, #0x4]
+ ldr r5, [r12, #0x0]
+ mov r1, r4
+ str r5, [sp, #0x8]
+ ldr r4, [r12, #0x4]
+ str r4, [sp, #0xc]
+ bl FSi_LoadOverlayInfoCore
+ add sp, sp, #0x64
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D25EC: .word 0x021D5404
+_020D25F0: .word 0x021D540C
+_020D25F4: .word 0x027FFE50
+_020D25F8: .word 0x027FFE58
+_020D25FC: .word 0x021D5414
+
+ arm_func_start FSi_LoadOverlayInfoCore
+FSi_LoadOverlayInfoCore: ; 0x020D2600
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x54
+ movs r9, r1
+ ldreq r5, [sp, #0x74]
+ ldreq r6, [sp, #0x70]
+ ldrne r5, [sp, #0x7c]
+ ldrne r6, [sp, #0x78]
+ mov r7, r2, lsl #0x5
+ cmp r7, r5
+ mov r4, r0
+ mov r8, r3
+ addcs sp, sp, #0x54
+ movcs r0, #0x0
+ ldmcsia sp!, {r4-r9,lr}
+ bxcs lr
+ add r0, sp, #0xc
+ bl FS_InitFile
+ mvn r12, #0x0
+ add r0, sp, #0xc
+ mov r1, r8
+ add r2, r6, r7
+ add r3, r6, r5
+ str r12, [sp, #0x0]
+ bl FS_OpenFileDirect
+_020D2660:
+ cmp r0, #0
+ addeq sp, sp, #0x54
+ moveq r0, #0
+ ldmeqia sp!, {r4-r9, lr}
+ bxeq lr
+ add r0, sp, #12
+ mov r1, r4
+ mov r2, #32
+ bl FS_ReadFile
+ cmp r0, #32
+ beq _020D26A4
+ add r0, sp, #12
+ bl FS_CloseFile
+ add sp, sp, #0x54
+ mov r0, #0x0
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020D26A4:
+ add r0, sp, #0xC
+ bl FS_CloseFile
+ add r0, sp, #0x4
+ mov r1, r4
+ str r9, [r4, #0x20]
+ bl FS_GetOverlayFileID
+ add r1, sp, #0x4
+ add r0, sp, #0xC
+ ldmia r1, {r1, r2}
+ bl FS_OpenFileFast
+ cmp r0, #0x0
+ addeq sp, sp, #0x54
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r9, lr}
+ bxeq lr
+ ldr r1, [sp, #0x30]
+ add r0, sp, #0xC
+ str r1, [r4, #0x24]
+ ldr r2, [sp, #0x34]
+ ldr r1, [sp, #0x30]
+ sub r1, r2, r1
+ str r1, [r4, #0x28]
+ bl FS_CloseFile
+ mov r0, #0x1
+ add sp, sp, #0x54
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+
+ arm_func_start FS_GetOverlayFileID
+FS_GetOverlayFileID: ; 0x020D2710
+ sub sp, sp, #0x8
+ ldr r2, _020D2734 ; =0x021D5414
+ str r2, [sp, #0x0]
+ ldr r1, [r1, #0x18]
+ str r1, [sp, #0x4]
+ str r2, [r0, #0x0]
+ str r1, [r0, #0x4]
+ add sp, sp, #0x8
+ bx lr
+ .balign 4
+_020D2734: .word 0x021D5414
+
+ arm_func_start FS_ClearOverlayImage
+FS_ClearOverlayImage: ; 0x020D2738
+ stmdb sp!, {r4-r6,lr}
+ ldr r5, [r0, #0x8]
+ ldr r1, [r0, #0xc]
+ ldr r6, [r0, #0x4]
+ add r4, r5, r1
+ mov r0, r6
+ mov r1, r4
+ bl IC_InvalidateRange
+ mov r0, r6
+ mov r1, r4
+ bl DC_InvalidateRange
+ add r0, r6, r5
+ sub r2, r4, r5
+ mov r1, #0x0
+ bl MI_CpuFill8
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start FSi_GetOverlayBinarySize
+FSi_GetOverlayBinarySize: ; 0x020D277C
+ ldrb r1, [r0, #0x1f]
+ ands r1, r1, #0x1
+ ldrne r0, [r0, #0x1c]
+ movne r0, r0, lsl #0x8
+ movne r0, r0, lsr #0x8
+ ldreq r0, [r0, #0x8]
+ bx lr
diff --git a/arm9/asm/FS_rom.s b/arm9/asm/FS_rom.s
new file mode 100644
index 00000000..61a7c521
--- /dev/null
+++ b/arm9/asm/FS_rom.s
@@ -0,0 +1,246 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start FS_TryLoadTable
+FS_TryLoadTable: ; 0x020D1D10
+ ldr ip, _020D1D28 ; =FUN_020D0D84
+ mov r3, r0
+ mov r2, r1
+ ldr r0, _020D1D2C ; =0x021D5414
+ mov r1, r3
+ bx r12
+ .balign 4
+_020D1D28: .word FUN_020D0D84
+_020D1D2C: .word 0x021D5414
+
+ arm_func_start FS_SetDefaultDMA
+FS_SetDefaultDMA: ; 0x020D1D30
+ stmdb sp!, {r4-r6,lr}
+ mov r6, r0
+ bl OS_DisableInterrupts
+ mov r5, r0
+ ldr r1, _020D1D7C ; =0x021D5400
+ ldr r0, _020D1D80 ; =0x021D5414
+ ldr r4, [r1, #0x0]
+ bl FS_SuspendArchive
+ ldr r1, _020D1D7C ; =0x021D5400
+ cmp r0, #0x0
+ str r6, [r1, #0x0]
+ beq _020D1D68
+ ldr r0, _020D1D80 ; =0x021D5414
+ bl FS_ResumeArchive
+_020D1D68:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D1D7C: .word 0x021D5400
+_020D1D80: .word 0x021D5414
+
+ arm_func_start FSi_InitRom
+FSi_InitRom: ; 0x020D1D84
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x14
+ ldr r1, _020D1EE8 ; =0x021D5400
+ str r0, [r1, #0x0]
+ bl OS_GetLockID
+ ldr r3, _020D1EEC ; =0x021D53FC
+ ldr r2, _020D1EF0 ; =0x021D5404
+ mov r12, #0x0
+ ldr r1, _020D1EF4 ; =0x021D540C
+ str r0, [r3, #0x0]
+ str r12, [r2, #0x0]
+ str r12, [r2, #0x4]
+ str r12, [r1, #0x0]
+ str r12, [r1, #0x4]
+ bl CARD_Init
+ ldr r0, _020D1EF8 ; =0x021D5414
+ bl FS_InitArchive
+ ldr r0, _020D1EF8 ; =0x021D5414
+ ldr r1, _020D1EFC ; =0x02106830
+ mov r2, #0x3
+ bl FS_RegisterArchiveName
+ ldr r0, _020D1F00 ; =0x027FFC40
+ ldrh r0, [r0, #0x0]
+ cmp r0, #0x2
+ bne _020D1E4C
+ ldr ip, _020D1EF0 ; =0x021D5404
+ mvn r2, #0x0
+ ldr r3, _020D1EF4 ; =0x021D540C
+ mov lr, #0x0
+ ldr r0, _020D1EF8 ; =0x021D5414
+ ldr r1, _020D1F04 ; =FSi_EmptyArchiveProc
+ str r2, [r12, #0x0]
+ str lr, [r12, #0x4]
+ str r2, [r3, #0x0]
+ str lr, [r3, #0x4]
+ bl FS_SetArchiveProc
+ mov r1, #0x0
+ str r1, [sp, #0x0]
+ ldr r0, _020D1F08 ; =FSi_ReadDummyCallback
+ str r1, [sp, #0x4]
+ str r0, [sp, #0x8]
+ ldr ip, _020D1F0C ; =FSi_WriteDummyCallback
+ ldr r0, _020D1EF8 ; =0x021D5414
+ mov r2, r1
+ mov r3, r1
+ str r12, [sp, #0xc]
+ bl FS_LoadArchive
+ add sp, sp, #0x14
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D1E4C:
+ ldr r5, _020D1F10 ; =0x027FFE40
+ ldr r0, _020D1EF8 ; =0x021D5414
+ ldr r1, _020D1F14 ; =FSi_RomArchiveProc
+ ldr r2, _020D1F18 ; =0x00000602
+ ldr r4, _020D1F1C ; =0x027FFE48
+ bl FS_SetArchiveProc
+ ldr r1, [r5, #0x0]
+ mvn r0, #0x0
+ cmp r1, r0
+ addeq sp, sp, #0x14
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ cmp r1, #0x0
+ addeq sp, sp, #0x14
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ ldr r2, [r4, #0x0]
+ cmp r2, r0
+ addeq sp, sp, #0x14
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ cmp r2, #0x0
+ addeq sp, sp, #0x14
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ str r1, [sp, #0x0]
+ ldr r0, [r5, #0x4]
+ ldr r1, _020D1F20 ; =FSi_ReadRomCallback
+ str r0, [sp, #0x4]
+ ldr r0, _020D1F0C ; =FSi_WriteDummyCallback
+ str r1, [sp, #0x8]
+ str r0, [sp, #0xc]
+ ldr r3, [r4, #0x4]
+ ldr r0, _020D1EF8 ; =0x021D5414
+ mov r1, #0x0
+ bl FS_LoadArchive
+ add sp, sp, #0x14
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D1EE8: .word 0x021D5400
+_020D1EEC: .word 0x021D53FC
+_020D1EF0: .word 0x021D5404
+_020D1EF4: .word 0x021D540C
+_020D1EF8: .word 0x021D5414
+_020D1EFC: .word 0x02106830
+_020D1F00: .word 0x027FFC40
+_020D1F04: .word FSi_EmptyArchiveProc
+_020D1F08: .word FSi_ReadDummyCallback
+_020D1F0C: .word FSi_WriteDummyCallback
+_020D1F10: .word 0x027FFE40
+_020D1F14: .word FSi_RomArchiveProc
+_020D1F18: .word 0x00000602
+_020D1F1C: .word 0x027FFE48
+_020D1F20: .word FSi_ReadRomCallback
+
+ arm_func_start FSi_EmptyArchiveProc
+FSi_EmptyArchiveProc: ; 0x020D1F24
+ mov r0, #0x4
+ bx lr
+
+ arm_func_start FSi_ReadDummyCallback
+FSi_ReadDummyCallback: ; 0x020D1F2C
+ mov r0, #0x1
+ bx lr
+
+ arm_func_start FSi_RomArchiveProc
+FSi_RomArchiveProc: ; 0x020D1F34
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r1, #0x1
+ beq _020D1FA0
+ cmp r1, #0x9
+ beq _020D1F58
+ cmp r1, #0xa
+ beq _020D1F7C
+ b _020D1FB0
+_020D1F58:
+ ldr r0, _020D1FC0 ; =0x021D53FC
+ ldr r0, [r0, #0x0]
+ mov r0, r0, lsl #0x10
+ mov r0, r0, lsr #0x10
+ bl CARD_LockRom
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {lr}
+ bx lr
+_020D1F7C:
+ ldr r0, _020D1FC0 ; =0x021D53FC
+ ldr r0, [r0, #0x0]
+ mov r0, r0, lsl #0x10
+ mov r0, r0, lsr #0x10
+ bl CARD_UnlockRom
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {lr}
+ bx lr
+_020D1FA0:
+ add sp, sp, #0x4
+ mov r0, #0x4
+ ldmia sp!, {lr}
+ bx lr
+_020D1FB0:
+ mov r0, #0x8
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D1FC0: .word 0x021D53FC
+
+ arm_func_start FSi_WriteDummyCallback
+FSi_WriteDummyCallback: ; 0x020D1FC4
+ mov r0, #0x1
+ bx lr
+
+ arm_func_start FSi_ReadRomCallback
+FSi_ReadRomCallback: ; 0x020D1FCC
+ stmdb sp!, {lr}
+ sub sp, sp, #0xc
+ ldr ip, _020D2010 ; =FSi_OnRomReadDone
+ mov lr, r1
+ str r12, [sp, #0x0]
+ str r0, [sp, #0x4]
+ mov r1, #0x1
+ ldr r0, _020D2014 ; =0x021D5400
+ str r1, [sp, #0x8]
+ mov r1, r2
+ ldr r0, [r0, #0x0]
+ mov r2, lr
+ bl CARDi_ReadRom
+ mov r0, #0x6
+ add sp, sp, #0xc
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D2010: .word FSi_OnRomReadDone
+_020D2014: .word 0x021D5400
+
+ arm_func_start FSi_OnRomReadDone
+FSi_OnRomReadDone: ; 0x020D2018
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ bl CARD_IsPulledOut
+_020D2024:
+ cmp r0, #0x0
+ movne r1, #0x5
+ moveq r1, #0x0
+ mov r0, r4
+ bl FS_NotifyArchiveAsyncEnd
+ ldmia sp!, {r4,lr}
+ bx lr
diff --git a/arm9/asm/libfs.s b/arm9/asm/libfs.s
deleted file mode 100644
index d9b791b8..00000000
--- a/arm9/asm/libfs.s
+++ /dev/null
@@ -1,3011 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
- .section .text
-
- arm_func_start FSi_TranslateCommand
-FSi_TranslateCommand:
- stmdb sp!, {r4-r8,lr}
- mov r8, r0
- ldr r0, [r8, #0xc]
- mov r7, r1
- mov r1, #0x1
- ldr r5, [r8, #0x8]
- mov r4, r1, lsl r7
- ands r0, r0, #0x4
- moveq r1, #0x0
- cmp r1, #0x0
- ldrne r0, [r5, #0x1c]
- orrne r0, r0, #0x200
- strne r0, [r5, #0x1c]
- ldreq r0, [r5, #0x1c]
- orreq r0, r0, #0x100
- streq r0, [r5, #0x1c]
- ldr r0, [r5, #0x58]
- ands r0, r0, r4
- beq _020CFFE4
- ldr r2, [r5, #0x54]
- mov r0, r8
- mov r1, r7
- blx r2
- mov r6, r0
- cmp r6, #0x8
- addls pc, pc, r6, lsl #0x2
- b _020CFFE8
-_020CFFA0:
- b _020CFFC4
- b _020CFFC4
- b _020CFFE8
- b _020CFFE8
- b _020CFFC4
- b _020CFFE8
- b _020CFFE8
- b _020CFFE8
- b _020CFFCC
-_020CFFC4:
- str r6, [r8, #0x14]
- b _020CFFE8
-_020CFFCC:
- ldr r1, [r5, #0x58]
- mvn r0, r4
- and r0, r1, r0
- str r0, [r5, #0x58]
- mov r6, #0x7
- b _020CFFE8
-_020CFFE4:
- mov r6, #0x7
-_020CFFE8:
- cmp r6, #0x7
- bne _020D0004
- ldr r1, _020D00AC ; =0x02103F80
- mov r0, r8
- ldr r1, [r1, r7, lsl #0x2]
- blx r1
- mov r6, r0
-_020D0004:
- cmp r6, #0x6
- bne _020D0060
- ldr r0, [r8, #0xc]
- ands r0, r0, #0x4
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- beq _020D00A0
- bl OS_DisableInterrupts
- ldr r1, [r5, #0x1c]
- mov r4, r0
- ands r0, r1, #0x200
- beq _020D0050
- add r6, r5, #0xc
-_020D003C:
- mov r0, r6
- bl OS_SleepThread
- ldr r0, [r5, #0x1c]
- ands r0, r0, #0x200
- bne _020D003C
-_020D0050:
- mov r0, r4
- ldr r6, [r8, #0x14]
- bl OS_RestoreInterrupts
- b _020D00A0
-_020D0060:
- ldr r0, [r8, #0xc]
- ands r0, r0, #0x4
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- ldrne r0, [r5, #0x1c]
- bicne r0, r0, #0x200
- strne r0, [r5, #0x1c]
- strne r6, [r8, #0x14]
- bne _020D00A0
- ldr r1, [r5, #0x1c]
- mov r0, r8
- bic r2, r1, #0x100
- mov r1, r6
- str r2, [r5, #0x1c]
- bl FSi_ReleaseCommand
-_020D00A0:
- mov r0, r6
- ldmia sp!, {r4-r8,lr}
- bx lr
- .balign 4
-_020D00AC: .word 0x02103F80
-
- arm_func_start FSi_ReleaseCommand
-FSi_ReleaseCommand:
- stmdb sp!, {r4-r6,lr}
- mov r6, r0
- mov r5, r1
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x0]
- mov r4, r0
- ldr r0, [r6, #0x4]
- cmp r1, #0x0
- strne r0, [r1, #0x4]
- cmp r0, #0x0
- strne r1, [r0, #0x0]
- mov r0, #0x0
- str r0, [r6, #0x0]
- ldr r1, [r6, #0x0]
- add r0, r6, #0x18
- str r1, [r6, #0x4]
- ldr r1, [r6, #0xc]
- bic r1, r1, #0x4f
- str r1, [r6, #0xc]
- str r5, [r6, #0x14]
- bl OS_WakeupThread
- mov r0, r4
- bl OS_RestoreInterrupts
- ldmia sp!, {r4-r6,lr}
- bx lr
-
- arm_func_start FSi_CloseFileCommand
-FSi_CloseFileCommand: ; 0x020D0114
- mov r0, #0x0
- bx lr
-
- arm_func_start FSi_OpenFileDirectCommand
-FSi_OpenFileDirectCommand: ; 0x020D011C
- ldr r1, [r0, #0x30]
- str r1, [r0, #0x24]
- ldr r1, [r0, #0x30]
- str r1, [r0, #0x2c]
- ldr r1, [r0, #0x34]
- str r1, [r0, #0x28]
- ldr r1, [r0, #0x38]
- str r1, [r0, #0x20]
- mov r0, #0x0
- bx lr
-
- arm_func_start FSi_OpenFileFastCommand
-FSi_OpenFileFastCommand: ; 0x020D0144
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x14
- mov r5, r0
- ldr r1, [r5, #0x8]
- ldr r4, [r5, #0x34]
- ldr r0, [r1, #0x30]
- mov r2, r4, lsl #0x3
- cmp r2, r0
- addcs sp, sp, #0x14
- movcs r0, #0x1
- ldmcsia sp!, {r4-r5,lr}
- bxcs lr
- str r1, [sp, #0x8]
- ldr r1, [r1, #0x2c]
- add r0, sp, #0x8
- add r3, r1, r2
- add r1, sp, #0x0
- mov r2, #0x8
- str r3, [sp, #0xc]
- bl FSi_ReadTable
-_020D0194:
- cmp r0, #0
- addne sp, sp, #0x14
- ldmneia sp!, {r4-r5,lr}
- bxne lr
- ldr r1, [sp]
- mov r0, r5
- str r1, [r5, #0x30]
- ldr r2, [sp, #0x4]
- mov r1, #7
- str r2, [r5, #0x34]
- str r4, [r5, #0x38]
- bl FSi_TranslateCommand
- add sp, sp, #0x14
- ldmia sp!, {r4-r5,lr}
- bx lr
-
- arm_func_start FSi_GetPathCommand
-FSi_GetPathCommand: ; 0x020D01D0
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0xe4
- mov r4, r0
- ldr r1, [r4, #0x8]
- add r0, sp, #0x98
- add r11, r4, #0x30
- str r1, [sp, #0x0]
- bl FS_InitFile
- ldr r0, [r4, #0x8]
- str r0, [sp, #0xa0]
- ldr r0, [r4, #0xc]
- ands r0, r0, #0x20
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- ldrneh r5, [r4, #0x24]
- movne r4, #0x10000
- bne _020D02BC
- ldrh r0, [r11, #0x8]
- ldr r4, [r4, #0x20]
- cmp r0, #0x0
- ldrneh r5, [r11, #0xa]
- bne _020D02BC
- mov r10, #0x0
- mov r9, r10
- mov r5, #0x10000
- add r8, sp, #0x98
- mov r6, #0x3
- mov r7, #0x1
-_020D0244:
- mov r0, r8
- mov r1, r10
- bl FSi_SeekDirDirect
- add r2, sp, #0x4
- cmp r10, #0x0
- mov r0, r8
- mov r1, r6
- ldreq r9, [sp, #0xc4]
- str r2, [sp, #0xc8]
- str r7, [sp, #0xcc]
- bl FSi_TranslateCommand
-_020D0270:
- cmp r0, #0x0
- bne _020D02A8
-_020D0278:
- ldr r0, [sp, #0x10]
- cmp r0, #0x0
- bne _020D0294
- ldr r0, [sp, #0x8]
- cmp r0, r4
- ldreqh r5, [sp, #0xbc]
- beq _020D02A8
-_020D0294:
- mov r0, r8
- mov r1, r6
- bl FSi_TranslateCommand
- cmp r0, #0x0
- beq _020D0278
-_020D02A8:
- cmp r5, #0x10000
- bne _020D02BC
- add sl, sl, #0x1
- cmp sl, r9
- bcc _020D0244
-_020D02BC:
- cmp r5, #0x10000
- moveq r0, #0x0
- streqh r0, [r11, #0x8]
- addeq sp, sp, #0xe4
- moveq r0, #0x1
- ldmeqia sp!, {r4-r11,lr}
- bxeq lr
- ldrh r0, [r11, #0x8]
- cmp r0, #0x0
- bne _020D03B8
- ldr r0, [sp, #0x0]
- mov r1, #0x0
- ldr r0, [r0, #0x0]
- cmp r0, #0xff
- addls r9, r1, #0x1
- bls _020D0308
- cmp r0, #0xff00
- addls r9, r1, #0x2
- addhi r9, r1, #0x3
-_020D0308:
- cmp r4, #0x10000
- ldrne r0, [sp, #0x14]
- add r9, r9, #0x2
- addne r9, r9, r0
- mov r10, r5
- cmp r5, #0x0
- beq _020D03AC
- add r0, sp, #0x98
- mov r1, r5
- bl FSi_SeekDirDirect
- add r8, sp, #0x98
- mov r6, #0x3
- mov r7, #0x1
-_020D033C:
- ldr r1, [sp, #0xc4]
- mov r0, r8
- bl FSi_SeekDirDirect
- add r2, sp, #0x4
- mov r0, r8
- mov r1, r6
- str r2, [sp, #0xc8]
- str r7, [sp, #0xcc]
- bl FSi_TranslateCommand
-_020D0360:
- cmp r0, #0x0
- bne _020D03A0
-_020D0368:
- ldr r0, [sp, #0x10]
- cmp r0, #0x0
- beq _020D038C
- ldrh r0, [sp, #0x8]
- cmp r0, sl
- ldreq r0, [sp, #0x14]
- addeq r0, r0, #0x1
- addeq r9, r9, r0
- beq _020D03A0
-_020D038C:
- mov r0, r8
- mov r1, r6
- bl FSi_TranslateCommand
- cmp r0, #0x0
- beq _020D0368
-_020D03A0:
- ldrh sl, [sp, #0xbc]
- cmp sl, #0x0
- bne _020D033C
-_020D03AC:
- add r0, r9, #0x1
- strh r0, [r11, #0x8]
- strh r5, [r11, #0xa]
-_020D03B8:
- ldr r7, [r11, #0x0]
- cmp r7, #0x0
- addeq sp, sp, #0xe4
- moveq r0, #0x0
- ldmeqia sp!, {r4-r11,lr}
- bxeq lr
- ldrh r6, [r11, #0x8]
- ldr r0, [r11, #0x4]
- cmp r0, r6
- addcc sp, sp, #0xe4
- movcc r0, #0x1
- ldmccia sp!, {r4-r11,lr}
- bxcc lr
- ldr r0, [sp, #0x0]
- mov r9, #0x0
- ldr r0, [r0, #0x0]
- cmp r0, #0xff
- movls r8, #0x1
- bls _020D0410
- cmp r0, #0xff00
- movls r8, #0x2
- movhi r8, #0x3
-_020D0410:
- ldr r0, [sp, #0x0]
- mov r1, r7
- mov r2, r8
- bl MI_CpuCopy8
- add r1, r9, r8
- ldr r0, _020D058C ; =0x0210682C
- add r1, r7, r1
- mov r2, #0x2
- bl MI_CpuCopy8
- add r0, sp, #0x98
- mov r1, r5
- bl FSi_SeekDirDirect
- cmp r4, #0x10000
- beq _020D04C4
- add r3, sp, #0x4
- mov r2, #0x0
- add r0, sp, #0x98
- mov r1, #0x3
- str r3, [sp, #0xc8]
- str r2, [sp, #0xcc]
- bl FSi_TranslateCommand
-_020D0464:
- cmp r0, #0x0
- bne _020D04A0
- add r9, sp, #0x98
- mov r8, #0x3
-_020D0474:
- ldr r0, [sp, #0x10]
- cmp r0, #0x0
- bne _020D048C
- ldr r0, [sp, #0x8]
- cmp r0, r4
- beq _020D04A0
-_020D048C:
- mov r0, r9
- mov r1, r8
- bl FSi_TranslateCommand
- cmp r0, #0x0
- beq _020D0474
-_020D04A0:
- ldr r0, [sp, #0x14]
- add r1, r7, r6
- add r4, r0, #0x1
- add r0, sp, #0x18
- mov r2, r4
- sub r1, r1, r4
- bl MI_CpuCopy8
- sub r6, r6, r4
- b _020D04D4
-_020D04C4:
- add r0, r7, r6
- mov r1, #0x0
- strb r1, [r0, #-0x1]
- sub r6, r6, #0x1
-_020D04D4:
- cmp r5, #0x0
- beq _020D057C
- add r10, sp, #0x98
- add r11, sp, #0x4
- mov r4, #0x3
- mov r9, #0x0
- mov r8, #0x2f
-_020D04F0:
- ldr r1, [sp, #0xc4]
- mov r0, r10
- bl FSi_SeekDirDirect
- add r2, r7, r6
- mov r0, r10
- mov r1, r4
- str r11, [sp, #0xc8]
- str r9, [sp, #0xcc]
- strb r8, [r2, #-0x1]
- sub r6, r6, #0x1
- bl FSi_TranslateCommand
-_020D051C:
- cmp r0, #0x0
- bne _020D0570
-_020D0524:
- ldr r0, [sp, #0x10]
- cmp r0, #0x0
- beq _020D055C
- ldrh r0, [sp, #0x8]
- cmp r0, r5
- bne _020D055C
- ldr r5, [sp, #0x14]
- add r1, r7, r6
- add r0, sp, #0x18
- mov r2, r5
- sub r1, r1, r5
- bl MI_CpuCopy8
- sub r6, r6, r5
- b _020D0570
-_020D055C:
- mov r0, sl
- mov r1, r4
- bl FSi_TranslateCommand
- cmp r0, #0x0
- beq _020D0524
-_020D0570:
- ldrh r5, [sp, #0xbc]
- cmp r5, #0x0
- bne _020D04F0
-_020D057C:
- mov r0, #0x0
- add sp, sp, #0xe4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D058C: .word 0x0210682C
-
- arm_func_start FSi_FindPathCommand
-FSi_FindPathCommand: ; 0x020D0590
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x9c
- mov r10, r0
- ldr r2, [r10, #0x40]
- ldr r9, [r10, #0x3c]
- mov r1, #0x2
- str r2, [sp, #0x0]
- bl FSi_TranslateCommand
- ldrb r1, [r9, #0x0]
- cmp r1, #0x0
- beq _020D0780
- mov r0, #0x2
- add r11, sp, #0x1c
- mov r4, #0x3
- mov r5, #0x1
- mov r6, #0x0
- str r0, [sp, #0x4]
-_020D05D4:
- mov r7, r6
- b _020D05E0
-_020D05DC:
- add r7, r7, #0x1
-_020D05E0:
- ldrb r8, [r9, r7]
- mov r0, r6
- cmp r8, #0x0
- beq _020D0600
- cmp r8, #0x2f
- beq _020D0600
- cmp r8, #0x5c
- movne r0, r5
-_020D0600:
- cmp r0, #0x0
- bne _020D05DC
- cmp r8, #0x0
- bne _020D061C
- ldr r0, [sp, #0x0]
- cmp r0, #0x0
- beq _020D0620
-_020D061C:
- mov r8, r5
-_020D0620:
- cmp r7, #0x0
- addeq sp, sp, #0x9c
- moveq r0, #0x1
- ldmeqia sp!, {r4-r11,lr}
- bxeq lr
- cmp r1, #0x2e
- bne _020D068C
- cmp r7, #0x1
- addeq r9, r9, #0x1
- beq _020D0764
- ldrb r0, [r9, #0x1]
- cmp r7, #0x2
- moveq r1, r5
- movne r1, r6
- cmp r0, #0x2e
- moveq r0, r5
- movne r0, r6
- ands r0, r1, r0
- beq _020D068C
- ldrh r0, [r10, #0x24]
- cmp r0, #0x0
- beq _020D0684
- ldr r1, [r10, #0x2c]
- mov r0, r10
- bl FSi_SeekDirDirect
-_020D0684:
- add r9, r9, #0x2
- b _020D0764
-_020D068C:
- cmp r7, #0x7f
- addgt sp, sp, #0x9c
- movgt r0, #0x1
- ldmgtia sp!, {r4-r11,lr}
- bxgt lr
- add r0, sp, #0x8
- str r0, [r10, #0x30]
- str r6, [r10, #0x34]
-_020D06AC:
- mov r0, r10
- mov r1, r4
- bl FSi_TranslateCommand
-_020D06B8:
- cmp r0, #0x0
- addne sp, sp, #0x9c
- movne r0, #0x1
- ldmneia sp!, {r4-r11,lr}
- bxne lr
- ldr r0, [sp, #0x14]
- cmp r8, r0
- bne _020D06AC
- ldr r0, [sp, #0x18]
- cmp r7, r0
- bne _020D06AC
- mov r0, r9
- mov r1, fp
- mov r2, r7
- bl FSi_StrNICmp
- cmp r0, #0x0
- bne _020D06AC
- cmp r8, #0x0
- beq _020D0728
- add r0, sp, #0x8
- add r3, sl, #0x30
- ldmia r0, {r0, r1, r2}
- stmia r3, {r0, r1, r2}
- ldr r1, [sp, #0x4]
- mov r0, sl
- add r9, r9, r7
- bl FSi_TranslateCommand
- b _020D0764
-_020D0728:
- ldr r0, [sp]
- cmp r0, #0x0
- addne sp, sp, #0x9c
- movne r0, #0x1
- ldmneia sp!, {r4-r11,lr}
- bxne lr
- ldr r3, [sl, #0x44]
- ldr r2, [sp, #0x8]
- ldr r1, [sp, #0xC]
- add sp, sp, #0x9c
- str r2, [r3]
- str r1, [r3, #0x4]
- mov r0, #0x0
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D0764:
- ldrb r0, [r9, #0x0]
- cmp r0, #0x0
- movne r0, r5
- moveq r0, r6
- ldrb r1, [r9, r0]!
- cmp r1, #0x0
- bne _020D05D4
-_020D0780:
- ldr r0, [sp, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- addne r0, r10, #0x20
- ldrne r3, [r10, #0x44]
- ldmneia r0, {r0-r2}
- stmneia r3, {r0-r2}
- movne r0, #0x0
- add sp, sp, #0x9c
- ldmia sp!, {r4-r11,lr}
- bx lr
-
- arm_func_start FSi_ReadDirCommand
-FSi_ReadDirCommand: ; 0x020D07AC
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0xc
- mov r5, r0
- ldr r4, [r5, #0x30]
- ldr r1, [r5, #0x8]
- add r0, sp, #0x4
- str r1, [sp, #0x4]
- ldr r3, [r5, #0x28]
- add r1, sp, #0x0
- mov r2, #0x1
- str r3, [sp, #0x8]
- bl FSi_ReadTable
-_020D07DC:
- cmp r0, #0x0
- addne sp, sp, #0xC
- ldmneia sp!, {r4-r5,lr}
- bxne lr
- ldrb r1, [sp]
- and r2, r1, #0x7F
- mov r1, r1, asr #0x7
- str r2, [r4, #0x10]
- and r1, r1, #0x1
- str r1, [r4, #0xC]
- ldr r2, [r4, #0x10]
- cmp r2, #0x0
- addeq sp, sp, #0xC
- moveq r0, #0x1
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- ldr r1, [r5, #0x34]
- cmp r1, #0x0
- bne _020D0858
- add r0, sp, #0x4
- add r1, r4, #0x14
- bl FSi_ReadTable
- cmp r0, #0x0
- addne sp, sp, #0xC
- ldmneia sp!, {r4-r5,lr}
- bxne lr
- ldr r1, [r4, #0x10]
- mov r2, #0x0
- add r1, r4, r1
- strb r2, [r1, #0x14]
- b _020D0864
-_020D0858:
- ldr r1, [sp, #0x8]
- add r1, r1, r2
- str r1, [sp, #0x8]
-_020D0864:
- ldr r1, [r4, #0xC]
- cmp r1, #0x0
- beq _020D08B8
- add r0, sp, #0x4
- add r1, sp, #0x2
- mov r2, #0x2
- bl FSi_ReadTable
- cmp r0, #0x0
- addne sp, sp, #0xC
- ldmneia sp!, {r4-r5,lr}
- bxne lr
- ldr r2, [r5, #0x8]
- ldr r1, _020D08E8
- str r2, [r4]
- ldrh r3, [sp, #0x2]
- mov r2, #0x0
- and r1, r3, r1
- strh r1, [r4, #0x4]
- strh r2, [r4, #0x6]
- str r2, [r4, #0x8]
- b _020D08D4
-_020D08B8:
- ldr r1, [r5, #0x8]
- str r1, [r4]
- ldrh r1, [r5, #0x26]
- str r1, [r4, #0x4]
- ldrh r1, [r5, #0x26]
- add r1, r1, #0x1
- strh r1, [r5, #0x26]
-_020D08D4:
- ldr r1, [sp, #0x8]
- str r1, [r5, #0x28]
- add sp, sp, #0xC
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D08E8: .word 0x00000FFF
-
- arm_func_start FSi_SeekDirCommand
-FSi_SeekDirCommand: ; 0x020D08EC
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x10
- mov r6, r0
- ldr r5, [r6, #0x8]
- add r4, r6, #0x30
- str r5, [sp, #0x8]
- ldrh r1, [r4, #0x4]
- ldr r2, [r5, #0x34]
- add r0, sp, #0x8
- add r3, r2, r1, lsl #0x3
- add r1, sp, #0x0
- mov r2, #0x8
- str r3, [sp, #0xc]
- bl FSi_ReadTable
- movs r3, r0
- bne _020D0978
- add r12, r6, #0x20
- ldmia r4, {r0-r2}
- stmia r12, {r0-r2}
- ldrh r0, [r4, #0x6]
- cmp r0, #0x0
- bne _020D0968
- ldr r0, [r4, #0x8]
- cmp r0, #0x0
- bne _020D0968
- ldrh r0, [sp, #0x4]
- strh r0, [r6, #0x26]
- ldr r1, [r5, #0x34]
- ldr r0, [sp, #0x0]
- add r0, r1, r0
- str r0, [r6, #0x28]
-_020D0968:
- ldrh r1, [sp, #0x6]
- ldr r0, _020D0988 ; =0x00000FFF
- and r0, r1, r0
- str r0, [r6, #0x2c]
-_020D0978:
- mov r0, r3
- add sp, sp, #0x10
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D0988: .word 0x00000FFF
-
- arm_func_start FSi_WriteFileCommand
-FSi_WriteFileCommand: ; 0x020D098C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r2, [r0, #0x2c]
- ldr r3, [r0, #0x38]
- ldr lr, [r0, #0x8]
- ldr r1, [r0, #0x30]
- add r12, r2, r3
- str r12, [r0, #0x2c]
- ldr r12, [lr, #0x4c]
- mov r0, lr
- blx r12
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FSi_ReadFileCommand
-FSi_ReadFileCommand: ; 0x020D09C4
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r2, [r0, #0x2c]
- ldr r3, [r0, #0x38]
- ldr lr, [r0, #0x8]
- ldr r1, [r0, #0x30]
- add r12, r2, r3
- str r12, [r0, #0x2c]
- ldr r12, [lr, #0x48]
- mov r0, lr
- blx r12
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FSi_SeekDirDirect
-FSi_SeekDirDirect: ; 0x020D09FC
- ldr r3, [r0, #0xc]
- mov r2, #0x0
- orr r3, r3, #0x4
- str r3, [r0, #0xc]
- ldr r3, [r0, #0x8]
- ldr ip, _020D0A2C ; =FSi_TranslateCommand
- str r3, [r0, #0x30]
- str r2, [r0, #0x38]
- strh r2, [r0, #0x36]
- strh r1, [r0, #0x34]
- mov r1, #0x2
- bx r12
- .balign 4
-_020D0A2C: .word FSi_TranslateCommand
-
- arm_func_start FSi_ReadTable
-FSi_ReadTable:
- stmdb sp!, {r4-r8,lr}
- mov r7, r0
- ldr r5, [r7, #0x0]
- mov r6, r2
- ldr r2, [r5, #0x1c]
- mov r0, r5
- orr r2, r2, #0x200
- str r2, [r5, #0x1c]
- ldr r2, [r7, #0x4]
- ldr r4, [r5, #0x50]
- mov r3, r6
- blx r4
- cmp r0, #0x0
- beq _020D0A7C
- cmp r0, #0x1
- beq _020D0A7C
- cmp r0, #0x6
- beq _020D0A8C
- b _020D0AC8
-_020D0A7C:
- ldr r1, [r5, #0x1c]
- bic r1, r1, #0x200
- str r1, [r5, #0x1c]
- b _020D0AC8
-_020D0A8C:
- bl OS_DisableInterrupts
- ldr r1, [r5, #0x1c]
- mov r4, r0
- ands r0, r1, #0x200
- beq _020D0AB8
- add r8, r5, #0xc
-_020D0AA4:
- mov r0, r8
- bl OS_SleepThread
- ldr r0, [r5, #0x1c]
- ands r0, r0, #0x200
- bne _020D0AA4
-_020D0AB8:
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r0, [r5, #0x24]
- ldr r0, [r0, #0x14]
-_020D0AC8:
- ldr r1, [r7, #0x4]
- add r1, r1, r6
- str r1, [r7, #0x4]
- ldmia sp!, {r4-r8,lr}
- bx lr
-
- arm_func_start FSi_StrNICmp
-FSi_StrNICmp: ; 0x020D0ADC
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- cmp r2, #0x0
- mov lr, #0x0
- bls _020D0B30
-_020D0AF0:
- ldrb r12, [r0, lr]
- ldrb r3, [r1, lr]
- sub r12, r12, #0x41
- cmp r12, #0x19
- sub r3, r3, #0x41
- addls r12, r12, #0x20
- cmp r3, #0x19
- addls r3, r3, #0x20
- cmp r12, r3
- addne sp, sp, #0x4
- subne r0, r12, r3
- ldmneia sp!, {lr}
- bxne lr
- add lr, lr, #0x1
- cmp lr, r2
- blo _020D0AF0
-_020D0B30:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FS_NotifyArchiveAsyncEnd
-FS_NotifyArchiveAsyncEnd: ; 0x020D0B40
- stmdb sp!, {r4-r6,lr}
- mov r4, r0
- ldr r0, [r4, #0x1c]
- mov r6, r1
- ands r0, r0, #0x100
- beq _020D0B8C
- ldr r2, [r4, #0x1c]
- ldr r0, [r4, #0x24]
- bic r2, r2, #0x100
- str r2, [r4, #0x1c]
- bl FSi_ReleaseCommand
- mov r0, r4
- bl FSi_NextCommand
-_020D0B74:
- cmp r0, #0x0
- ldmeqia sp!, {r4-r6,lr}
- bxeq lr
- bl FSi_ExecuteAsyncCommand
- ldmia sp!, {r4-r6,lr}
- bx lr
-_020D0B8C:
- ldr r5, [r4, #0x24]
- bl OS_DisableInterrupts
- str r6, [r5, #0x14]
- ldr r1, [r4, #0x1c]
- mov r5, r0
- bic r1, r1, #0x200
- add r0, r4, #0xc
- str r1, [r4, #0x1c]
- bl OS_WakeupThread
- mov r0, r5
- bl OS_RestoreInterrupts
- ldmia sp!, {r4-r6,lr}
- bx lr
-
- arm_func_start FS_SetArchiveProc
-FS_SetArchiveProc: ; 0x020D0BC0
- cmp r2, #0x0
- moveq r1, #0x0
- beq _020D0BD4
- cmp r1, #0x0
- moveq r2, #0x0
-_020D0BD4:
- str r1, [r0, #0x54]
- str r2, [r0, #0x58]
- bx lr
-
- arm_func_start FS_ResumeArchive
-FS_ResumeArchive:
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r4, r0
- mov r6, #0x0
- bl OS_DisableInterrupts
- ldr r1, [r4, #0x1c]
- mov r5, r0
- ands r0, r1, #0x8
- movne r0, #0x1
- moveq r0, r6
- cmp r0, #0x0
- moveq r7, #0x1
- movne r7, #0x0
- cmp r7, #0x0
- bne _020D0C34
- ldr r1, [r4, #0x1c]
- mov r0, r4
- bic r1, r1, #0x8
- str r1, [r4, #0x1c]
- bl FSi_NextCommand
- mov r6, r0
-_020D0C34:
- mov r0, r5
- bl OS_RestoreInterrupts
-_020D0C3C:
- cmp r6, #0x0
- beq _020D0C4C
- mov r0, r6
- bl FSi_ExecuteAsyncCommand
-_020D0C4C:
- mov r0, r7
- add sp, sp, #0x4
- ldmia sp!, {r4-r7, lr}
- bx lr
-
- arm_func_start FS_SuspendArchive
-FS_SuspendArchive: ; 0x020D0C5C
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r6, r0
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x1c]
- mov r4, r0
- ands r0, r1, #0x8
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- moveq r5, #0x1
- movne r5, #0x0
- cmp r5, #0x0
- beq _020D0CD4
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x10
- beq _020D0CC8
- ldr r0, [r6, #0x1c]
- orr r0, r0, #0x40
- str r0, [r6, #0x1c]
- add r7, r6, #0x14
-_020D0CB0:
- mov r0, r7
- bl OS_SleepThread
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x40
- bne _020D0CB0
- b _020D0CD4
-_020D0CC8:
- ldr r0, [r6, #0x1c]
- orr r0, r0, #0x8
- str r0, [r6, #0x1c]
-_020D0CD4:
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, r5
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-
- arm_func_start FS_UnloadArchiveTables
-FS_UnloadArchiveTables: ; 0x020D0CEC
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- mov r5, r0
- ldr r0, [r5, #0x1c]
- mov r4, #0x0
- ands r0, r0, #0x2
- movne r0, #0x1
- moveq r0, r4
- cmp r0, #0x0
- beq _020D0D74
- mov r0, r5
- bl FS_SuspendArchive
- ldr r1, [r5, #0x1c]
- ands r1, r1, #0x4
- movne r1, #0x1
- moveq r1, #0x0
- cmp r1, #0x0
- beq _020D0D64
- ldr r2, [r5, #0x1c]
- mov r1, #0x0
- bic r2, r2, #0x4
- str r2, [r5, #0x1c]
- ldr r4, [r5, #0x44]
- str r1, [r5, #0x44]
- ldr r1, [r5, #0x3c]
- str r1, [r5, #0x2c]
- ldr r1, [r5, #0x40]
- str r1, [r5, #0x34]
- ldr r1, [r5, #0x48]
- str r1, [r5, #0x50]
-_020D0D64:
- cmp r0, #0x0
- beq _020D0D74
- mov r0, r5
- bl FS_ResumeArchive
-_020D0D74:
- mov r0, r4
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
-
- arm_func_start FUN_020D0D84
-FUN_020D0D84: ; 0x020D0D84
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4c
- mov r7, r0
- ldr r3, [r7, #0x30]
- ldr r0, [r7, #0x38]
- mov r6, r1
- add r0, r3, r0
- add r0, r0, #0x20
- add r0, r0, #0x1f
- bic r5, r0, #0x1f
- cmp r5, r2
- bhi _020D0E9C
- add r1, r6, #0x1f
- add r0, sp, #0x4
- bic r4, r1, #0x1f
- bl FS_InitFile
- ldr r2, [r7, #0x2c]
- mvn r0, #0x0
- str r0, [sp, #0x0]
- ldr r3, [r7, #0x30]
- add r0, sp, #0x4
- mov r1, r7
- add r3, r2, r3
- bl FS_OpenFileDirect
-_020D0DE4:
- cmp r0, #0x0
- beq _020D0E1C
- ldr r2, [r7, #0x30]
- add r0, sp, #0x4
- mov r1, r4
- bl FS_ReadFile
- cmp r0, #0x0
- bge _020D0E14
- ldr r2, [r7, #0x30]
- mov r0, r4
- mov r1, #0x0
- bl MI_CpuFill8
-_020D0E14:
- add r0, sp, #0x4
- bl FS_CloseFile
-_020D0E1C:
- str r4, [r7, #0x2C]
- ldr ip, [r7, #0x30]
- ldr r2, [r7, #0x34]
- mvn r0, #0x0
- str r0, [sp]
- ldr r3, [r7, #0x38]
- add r0, sp, #0x4
- mov r1, r7
- add r3, r2, r3
- add r4, r4, ip
- bl FS_OpenFileDirect
- cmp r0, #0x0
- beq _020D0E80
- ldr r2, [r7, #0x38]
- add r0, sp, #0x4
- mov r1, r4
- bl FS_ReadFile
- cmp r0, #0x0
- bge _020D0E78
- ldr r2, [r7, #0x38]
- mov r0, r4
- mov r1, #0x0
- bl MI_CpuFill8
-_020D0E78:
- add r0, sp, #0x4
- bl FS_CloseFile
-_020D0E80:
- str r4, [r7, #0x34]
- ldr r0, _020D0EAC
- str r6, [r7, #0x44]
- str r0, [r7, #0x50]
- ldr r0, [r7, #0x1C]
- orr r0, r0, #0x4
- str r0, [r7, #0x1C]
-_020D0E9C:
- mov r0, r5
- add sp, sp, #0x4C
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D0EAC:
- .word FSi_ReadMemoryCore
-
- arm_func_start FUN_020D0EB0
-FUN_020D0EB0: ; 0x020D0EB0
- stmdb sp!, {r4-r8,lr}
- mov r5, r0
- bl OS_DisableInterrupts
- ldr r1, [r5, #0x1c]
- mov r4, r0
- ands r0, r1, #0x2
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- beq _020D0F64
- mov r0, r5
- ldr r1, [r5, #0x1c]
- bl FS_SuspendArchive
- ldr r1, [r5, #0x1c]
- mov r7, r0
- orr r0, r1, #0x80
- str r0, [r5, #0x1c]
- ldr r0, [r5, #0x24]
- cmp r0, #0x0
- beq _020D0F1C
- mov r6, #0x3
-_020D0F04:
- ldr r8, [r0, #0x4]
- mov r1, r6
- bl FSi_ReleaseCommand
- mov r0, r8
- cmp r8, #0x0
- bne _020D0F04
-_020D0F1C:
- mov r0, #0x0
- str r0, [r5, #0x24]
- cmp r7, #0x0
- beq _020D0F34
- mov r0, r5
- bl FS_ResumeArchive
-_020D0F34:
- mov r0, #0x0
- str r0, [r5, #0x28]
- str r0, [r5, #0x2c]
- str r0, [r5, #0x30]
- str r0, [r5, #0x34]
- str r0, [r5, #0x38]
- str r0, [r5, #0x40]
- ldr r0, [r5, #0x40]
- str r0, [r5, #0x3c]
- ldr r0, [r5, #0x1c]
- bic r0, r0, #0xa2
- str r0, [r5, #0x1c]
-_020D0F64:
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #0x1
- ldmia sp!, {r4-r8,lr}
- bx lr
-
- arm_func_start FS_LoadArchive
-FS_LoadArchive: ; 0x020D0F78
- str r1, [r0, #0x28]
- str r3, [r0, #0x30]
- str r2, [r0, #0x3c]
- ldr r1, [r0, #0x3c]
- ldr r2, [sp, #0x4]
- str r1, [r0, #0x2c]
- str r2, [r0, #0x38]
- ldr r1, [sp, #0x0]
- ldr r2, [sp, #0x8]
- str r1, [r0, #0x40]
- ldr r1, [r0, #0x40]
- cmp r2, #0x0
- str r1, [r0, #0x34]
- ldreq r2, _020D0FE8 ; =FSi_ReadMemCallback
- ldr r1, [sp, #0xc]
- str r2, [r0, #0x48]
- cmp r1, #0x0
- ldreq r1, _020D0FEC ; =FSi_WriteMemCallback
- str r1, [r0, #0x4c]
- ldr r2, [r0, #0x48]
- mov r1, #0x0
- str r2, [r0, #0x50]
- str r1, [r0, #0x44]
- ldr r1, [r0, #0x1c]
- orr r1, r1, #0x2
- str r1, [r0, #0x1c]
- mov r0, #0x1
- bx lr
- .balign 4
-_020D0FE8: .word FSi_ReadMemCallback
-_020D0FEC: .word FSi_WriteMemCallback
-
- arm_func_start FUN_020D0FF0
-FUN_020D0FF0: ; 0x020D0FF0
- stmdb sp!, {r4,lr}
- mov r4, r0
- ldr r0, [r4, #0x0]
- cmp r0, #0x0
- ldmeqia sp!, {r4,lr}
- bxeq lr
- bl OS_DisableInterrupts
- ldr r2, [r4, #0x4]
- mov r3, #0x0
- cmp r2, #0x0
- ldrne r1, [r4, #0x8]
- strne r1, [r2, #0x8]
- ldr r2, [r4, #0x8]
- cmp r2, #0x0
- ldrne r1, [r4, #0x4]
- strne r1, [r2, #0x4]
- str r3, [r4, #0x0]
- str r3, [r4, #0x8]
- ldr r1, [r4, #0x8]
- ldr r2, _020D1080 ; =0x021D53EC
- str r1, [r4, #0x4]
- ldr r1, [r4, #0x1c]
- bic r1, r1, #0x1
- str r1, [r4, #0x1c]
- ldr r1, [r2, #0x0]
- cmp r1, r4
- bne _020D1074
- ldr r1, _020D1084 ; =0x021D53E8
- str r3, [r2, #0x8]
- ldr r1, [r1, #0x0]
- strh r3, [r2, #0x6]
- str r1, [r2, #0x0]
- strh r3, [r2, #0x4]
-_020D1074:
- bl OS_RestoreInterrupts
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D1080: .word 0x021D53EC
-_020D1084: .word 0x021D53E8
-
- arm_func_start FS_RegisterArchiveName
-FS_RegisterArchiveName: ; 0x020D1088
- stmdb sp!, {r4-r8,lr}
- mov r6, r1
- mov r5, r2
- mov r7, r0
- mov r8, #0x0
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, r6
- mov r1, r5
- bl FS_FindArchive
-_020D10B0:
- cmp r0, #0x0
- bne _020D112C
- ldr r1, _020D1140
- ldr r2, [r1]
- cmp r2, #0x0
- bne _020D10E8
- ldr r0, _020D1144
- mov r2, r8
- str r7, [r1]
- str r7, [r0]
- str r2, [r0, #0x8]
- strh r2, [r0, #0x6]
- strh r2, [r0, #0x4]
- b _020D110C
-_020D10E8:
- ldr r0, [r2, #0x4]
- cmp r0, #0x0
- beq _020D1104
-_020D10F4:
- mov r2, r0
- ldr r0, [r0, #0x4]
- cmp r0, #0x0
- bne _020D10F4
-_020D1104:
- str r7, [r2, #0x4]
- str r2, [r7, #0x8]
-_020D110C:
- mov r0, r6
- mov r1, r5
- bl FSi_GetPackedName
- str r0, [r7]
- ldr r0, [r7, #0x1C]
- mov r8, #0x1
- orr r0, r0, #0x1
- str r0, [r7, #0x1C]
-_020D112C:
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, r8
- ldmia sp!, {r4-r8,lr}
- bx lr
-_020D1140: .word 0x021D53E8
-_020D1144: .word 0x021D53EC
-
- arm_func_start FS_FindArchive
-FS_FindArchive:
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- bl FSi_GetPackedName
- mov r5, r0
- bl OS_DisableInterrupts
- ldr r1, _020D1194 ; =0x021D53E8
- ldr r4, [r1, #0x0]
- b _020D116C
-_020D1168:
- ldr r4, [r4, #0x4]
-_020D116C:
- cmp r4, #0x0
- beq _020D1180
- ldr r1, [r4, #0x0]
- cmp r1, r5
- bne _020D1168
-_020D1180:
- bl OS_RestoreInterrupts
- mov r0, r4
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D1194: .word 0x021D53E8
-
- arm_func_start FS_InitArchive
-FS_InitArchive: ; 0x020D1198
- stmdb sp!, {r4,lr}
- mov r1, #0x0
- mov r2, #0x5c
- mov r4, r0
- bl MI_CpuFill8
- mov r1, #0x0
- str r1, [r4, #0x10]
- ldr r0, [r4, #0x10]
- str r0, [r4, #0xc]
- str r1, [r4, #0x18]
- ldr r0, [r4, #0x18]
- str r0, [r4, #0x14]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start FSi_SendCommand
-FSi_SendCommand:
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- ldr r6, [r7, #0x8]
- mov r2, #0x1
- str r1, [r7, #0x10]
- mov r0, #0x2
- str r0, [r7, #0x14]
- ldr r0, [r7, #0xc]
- mov r5, r2, lsl r1
- orr r0, r0, #0x1
- str r0, [r7, #0xc]
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x1c]
- mov r4, r0
- ands r0, r1, #0x80
- beq _020D1238
- mov r0, r7
- mov r1, #0x3
- bl FSi_ReleaseCommand
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- mov r0, #0x0
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D1238:
- ands r0, r5, #0x1fc
- ldrne r0, [r7, #0xc]
- add r2, r6, #0x20
- orrne r0, r0, #0x4
- strne r0, [r7, #0xc]
- ldr r1, [r7, #0x0]
- ldr r0, [r7, #0x4]
- cmp r1, #0x0
- strne r0, [r1, #0x4]
- cmp r0, #0x0
- strne r1, [r0, #0x0]
- ldr r0, [r2, #0x4]
- cmp r0, #0x0
- beq _020D1280
-_020D1270:
- mov r2, r0
- ldr r0, [r0, #0x4]
- cmp r0, #0x0
- bne _020D1270
-_020D1280:
- str r7, [r2, #0x4]
- str r2, [r7, #0x0]
- mov r1, #0x0
- str r1, [r7, #0x4]
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x8
- movne r1, #0x1
- cmp r1, #0x0
- bne _020D132C
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x10
- bne _020D132C
- ldr r1, [r6, #0x1c]
- mov r0, r4
- orr r1, r1, #0x10
- str r1, [r6, #0x1c]
- bl OS_RestoreInterrupts
- ldr r0, [r6, #0x58]
- ands r0, r0, #0x200
- beq _020D12E0
- ldr r2, [r6, #0x54]
- mov r0, r7
- mov r1, #0x9
- blx r2
-_020D12E0:
- bl OS_DisableInterrupts
- ldr r1, [r7, #0xc]
- orr r1, r1, #0x40
- str r1, [r7, #0xc]
- ldr r1, [r7, #0xc]
- ands r1, r1, #0x4
- movne r1, #0x1
- moveq r1, #0x0
- cmp r1, #0x0
- bne _020D1324
- bl OS_RestoreInterrupts
- mov r0, r7
- bl FSi_ExecuteAsyncCommand
- add sp, sp, #0x4
- mov r0, #0x1
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D1324:
- bl OS_RestoreInterrupts
- b _020D1378
-_020D132C:
- ldr r0, [r7, #0xc]
- ands r0, r0, #0x4
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- bne _020D135C
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- mov r0, #0x1
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D135C:
- add r0, r7, #0x18
- bl OS_SleepThread
- ldr r0, [r7, #0xc]
- ands r0, r0, #0x40
- beq _020D135C
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D1378:
- mov r0, r7
- bl FSi_ExecuteSyncCommand
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-
- arm_func_start FSi_ExecuteSyncCommand
-FSi_ExecuteSyncCommand: ; 0x020D138C
- stmdb sp!, {r4,lr}
- mov r4, r0
- ldr r1, [r4, #0x10]
- bl FSi_TranslateCommand
- mov r1, r0
- mov r0, r4
- bl FSi_ReleaseCommand
- ldr r0, [r4, #0x8]
- bl FSi_NextCommand
-_020D13B0:
- cmp r0, #0x0
- beq _020D13BC
- bl FSi_ExecuteAsyncCommand
-_020D13BC:
- ldr r0, [r4, #0x14]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start FSi_ExecuteAsyncCommand
-FSi_ExecuteAsyncCommand: ; 0x020D13D4
- stmdb sp!, {r4-r8,lr}
- movs r6, r0
- ldr r5, [r6, #0x8]
- ldmeqia sp!, {r4-r8,lr}
- bxeq lr
- mov r7, #0x0
- mov r8, #0x1
-_020D13F0:
- bl OS_DisableInterrupts
- ldr r1, [r6, #0xc]
- mov r4, r0
- orr r0, r1, #0x40
- str r0, [r6, #0xc]
- ldr r0, [r6, #0xc]
- ands r0, r0, #0x4
- movne r0, r8
- moveq r0, r7
- cmp r0, #0x0
- beq _020D1434
- add r0, r6, #0x18
- bl OS_WakeupThread
- mov r0, r4
- bl OS_RestoreInterrupts
- ldmia sp!, {r4-r8,lr}
- bx lr
-_020D1434:
- ldr r1, [r6, #0xc]
- mov r0, r4
- orr r1, r1, #0x8
- str r1, [r6, #0xc]
- bl OS_RestoreInterrupts
- ldr r1, [r6, #0x10]
- mov r0, r6
- bl FSi_TranslateCommand
- cmp r0, #0x6
- ldmeqia sp!, {r4-r8,lr}
- bxeq lr
- mov r0, r5
- bl FSi_NextCommand
- movs r6, r0
- bne _020D13F0
- ldmia sp!, {r4-r8,lr}
- bx lr
-
- arm_func_start FSi_NextCommand
-FSi_NextCommand:
- stmdb sp!, {r4-r9,lr}
- sub sp, sp, #0x4c
- mov r6, r0
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x1c]
- mov r5, r0
- ands r0, r1, #0x20
- beq _020D1500
- ldr r0, [r6, #0x1c]
- bic r0, r0, #0x20
- str r0, [r6, #0x1c]
- ldr r0, [r6, #0x24]
- cmp r0, #0x0
- beq _020D1500
- mov r8, #0x0
- mov r9, #0x1
- mov r7, #0x3
-_020D14BC:
- ldr r1, [r0, #0xc]
- ldr r4, [r0, #0x4]
- ands r1, r1, #0x2
- movne r1, r9
- moveq r1, r8
- cmp r1, #0x0
- beq _020D14F4
- ldr r1, [r6, #0x24]
- cmp r1, r0
- mov r1, r7
- streq r4, [r6, #0x24]
- bl FSi_ReleaseCommand
-_020D14EC:
- cmp r4, #0x0
- ldreq r4, [r6, #0x24]
-_020D14F4:
- mov r0, r4
- cmp r4, #0x0
- bne _020D14BC
-_020D1500:
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x40
- bne _020D15EC
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x8
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- bne _020D15EC
- ldr r4, [r6, #0x24]
- cmp r4, #0x0
- beq _020D15EC
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x10
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- moveq r7, #0x1
- movne r7, #0x0
- cmp r7, #0x0
- ldrne r0, [r6, #0x1c]
- orrne r0, r0, #0x10
- strne r0, [r6, #0x1c]
- mov r0, r5
- bl OS_RestoreInterrupts
-_020D1564:
- cmp r7, #0x0
- beq _020D1588
- ldr r0, [r6, #0x58]
- ands r0, r0, #0x200
- beq _020D1588
- ldr r2, [r6, #0x54]
- mov r0, r4
- mov r1, #0x9
- blx r2
-_020D1588:
- bl OS_DisableInterrupts
- ldr r1, [r4, #0xC]
- mov r5, r0
- orr r0, r1, #0x40
- str r0, [r4, #0xC]
- ldr r0, [r4, #0xC]
- ands r0, r0, #0x4
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- beq _020D15D4
- add r0, r4, #0x18
- bl OS_WakeupThread
- mov r0, r5
- bl OS_RestoreInterrupts
- add sp, sp, #0x4c
- mov r0, #0x0
- ldmia sp!, {r4-r9, lr}
- bx lr
-_020D15D4:
- mov r0, r5
- bl OS_RestoreInterrupts
- add sp, sp, #0x4c
- mov r0, r4
- ldmia sp!, {r4-r9, lr}
- bx lr
-_020D15EC:
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x10
- beq _020D162C
- ldr r0, [r6, #0x1c]
- bic r0, r0, #0x10
- str r0, [r6, #0x1c]
- ldr r0, [r6, #0x58]
- ands r0, r0, #0x400
- beq _020D162C
- add r0, sp, #0x0
- bl FS_InitFile
- str r6, [sp, #0x8]
- ldr r2, [r6, #0x54]
- add r0, sp, #0x0
- mov r1, #0xa
- blx r2
-_020D162C:
- ldr r0, [r6, #0x1c]
- ands r0, r0, #0x40
- beq _020D1658
- ldr r1, [r6, #0x1c]
- add r0, r6, #0x14
- bic r1, r1, #0x40
- str r1, [r6, #0x1c]
- ldr r1, [r6, #0x1c]
- orr r1, r1, #0x8
- str r1, [r6, #0x1c]
- bl OS_WakeupThread
-_020D1658:
- mov r0, r5
- bl OS_RestoreInterrupts
-_020D1660:
- mov r0, #0x0
- add sp, sp, #0x4c
- ldmia sp!, {r4-r9, lr}
- bx lr
-
- arm_func_start FSi_ReadMemoryCore
-FSi_ReadMemoryCore: ; 0x020D1670
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov r0, r2
- mov r2, r3
- bl MI_CpuCopy8
-_020D1684:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmfd sp!, {lr}
- bx lr
-
- arm_func_start FSi_WriteMemCallback
-FSi_WriteMemCallback: ; 0x020D1694
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r12, [r0, #0x28]
- mov r0, r1
- add r1, r12, r2
- mov r2, r3
- bl MI_CpuCopy8
-_020D16B0:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmfd sp!, {lr}
- bx lr
-
- arm_func_start FSi_ReadMemCallback
-FSi_ReadMemCallback: ; 0x020D16C0
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r0, [r0, #0x28]
- add r0, r0, r2
- mov r2, r3
- bl MI_CpuCopy8
-_020D16D8:
- mov r0, #0x0
- add sp, sp, #0x4
- ldmfd sp!, {lr}
- bx lr
-
- arm_func_start FSi_GetPackedName
-FSi_GetPackedName: ; 0x020D16E8
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- cmp r1, #0x3
- mov lr, #0x0
- bgt _020D173C
- mov r12, lr
- cmp r1, #0x0
- ble _020D173C
- mov r3, lr
-_020D170C:
- ldrb r2, [r0, r12]
- cmp r2, #0x0
- beq _020D173C
- sub r2, r2, #0x41
- cmp r2, #0x19
- addls r2, r2, #0x61
- addhi r2, r2, #0x41
- add r12, r12, #0x1
- orr lr, lr, r2, lsl r3
- cmp r12, r1
- add r3, r3, #0x8
- blt _020D170C
-_020D173C:
- mov r0, lr
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FS_ChangeDir
-FS_ChangeDir: ; 0x020D174C
- stmdb sp!, {r4,lr}
- sub sp, sp, #0x58
- mov r4, r0
- add r0, sp, #0xc
- bl FS_InitFile
- add r0, sp, #0xc
- add r3, sp, #0x0
- mov r1, r4
- mov r2, #0x0
- bl FSi_FindPath
-_020D1774:
- cmp r0, #0x0
- moveq r0, #0x0
- addne r0, sp, #0x0
- ldrne r3, _020D179C
- ldmneia r0, {r0, r1, r2}
- stmneia r3, {r0, r1, r2}
- movne r0, #0x1
- add sp, sp, #0x58
- ldmia sp!, {r4, lr}
- bx lr
-_020D179C: .word 0x021D53EC
-
- arm_func_start FS_SeekFile
-FS_SeekFile: ; 0x020D17A0
- cmp r2, #0x0
- beq _020D17BC
- cmp r2, #0x1
- beq _020D17C8
- cmp r2, #0x2
- beq _020D17D4
- b _020D17E0
-_020D17BC:
- ldr r2, [r0, #0x24]
- add r1, r1, r2
- b _020D17E8
-_020D17C8:
- ldr r2, [r0, #0x2c]
- add r1, r1, r2
- b _020D17E8
-_020D17D4:
- ldr r2, [r0, #0x28]
- add r1, r1, r2
- b _020D17E8
-_020D17E0:
- mov r0, #0x0
- bx lr
-_020D17E8:
- ldr r2, [r0, #0x24]
- cmp r1, r2
- movlt r1, r2
- ldr r2, [r0, #0x28]
- cmp r1, r2
- movgt r1, r2
- str r1, [r0, #0x2c]
- mov r0, #0x1
- bx lr
-
- arm_func_start FS_ReadFile
-FS_ReadFile: ; 0x020D180C
- ldr ip, _020D1818 ; =FUN_020D1AAC
- mov r3, #0x0
- bx r12
- .balign 4
-_020D1818: .word FUN_020D1AAC
-
- arm_func_start FS_ReadFileAsync
-FS_ReadFileAsync: ; 0x020D181C
- ldr ip, _020D1828 ; =FUN_020D1AAC
- mov r3, #0x1
- bx r12
- .balign 4
-_020D1828: .word FUN_020D1AAC
-
- arm_func_start FS_WaitAsync
-FS_WaitAsync: ; 0x020D182C
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r6, r0
- mov r5, #0x0
- bl OS_DisableInterrupts
- ldr r1, [r6, #0xc]
- mov r4, r0
- ands r0, r1, #0x1
- movne r0, #0x1
- moveq r0, r5
- cmp r0, #0x0
- beq _020D18BC
- ldr r0, [r6, #0xc]
- ands r0, r0, #0x44
- moveq r5, #0x1
- movne r5, #0x0
- cmp r5, #0x0
- beq _020D189C
- ldr r0, [r6, #0xc]
- orr r0, r0, #0x4
- str r0, [r6, #0xc]
- add r7, r6, #0x18
-_020D1884:
- mov r0, r7
- bl OS_SleepThread
- ldr r0, [r6, #0xc]
- ands r0, r0, #0x40
- beq _020D1884
- b _020D18BC
-_020D189C:
- add r0, r6, #0x18
- bl OS_SleepThread
- ldr r0, [r6, #0xc]
- ands r0, r0, #0x1
- movne r0, #0x1
- moveq r0, #0x0
- cmp r0, #0x0
- bne _020D189C
-_020D18BC:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D18C4:
- cmp r5, #0x0
- beq _020D18E0
- mov r0, r6
- bl FSi_ExecuteSyncCommand
- add sp, sp, #4
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D18E0:
- ldr r0, [r6, #0x14]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-
- arm_func_start FS_CloseFile
-FS_CloseFile: ; 0x020D18FC
- stmdb sp!, {r4,lr}
- mov r1, #0x8
- mov r4, r0
- bl FSi_SendCommand
-_020D190C:
- cmp r0, #0x0
- moveq r0, #0x0
- ldmeqia sp!, {r4,lr}
- bxeq lr
- mov r0, #0x0
- str r0, [r4, #0x8]
- mov r0, #0xE
- str r0, [r4, #0x10]
- ldr r1, [r4, #0xC]
- mov r0, #0x1
- bic r1, r1, #0x30
- str r1, [r4, #0xC]
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start FS_OpenFile
-FS_OpenFile: ; 0x020D1944
- stmdb sp!, {r4,lr}
- sub sp, sp, #0x8
- mov r4, r0
- add r0, sp, #0x0
- bl FS_ConvertPathToFileID
-_020D1958:
- cmp r0, #0x0
- beq _020D1984
- add r1, sp, #0x0
- mov r0, r4
- ldmia r1, {r1, r2}
- bl FS_OpenFileFast
- cmp r0, #0x0
- addne sp, sp, #0x8
- movne r0, #0x1
- ldmneia sp!, {r4, lr}
- bxne lr
-_020D1984:
- mov r0, #0x0
- add sp, sp, #0x8
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start FS_OpenFileFast
-FS_OpenFileFast:
- stmdb sp!, {r0-r3}
- stmdb sp!, {r4,lr}
- ldr r1, [sp, #0xc]
- mov r4, r0
- cmp r1, #0x0
- moveq r0, #0x0
- ldmeqia sp!, {r4,lr}
- addeq sp, sp, #0x10
- bxeq lr
- str r1, [r4, #0x8]
- ldr r3, [sp, #0xc]
- ldr r2, [sp, #0x10]
- mov r1, #0x6
- str r3, [r4, #0x30]
- str r2, [r4, #0x34]
- bl FSi_SendCommand
-_020D19D4:
- cmp r0, #0x0
- moveq r0, #0x0
- ldmeqia sp!, {r4, lr}
- addeq sp, sp, #0x10
- bxeq lr
- ldr r1, [r4, #0xC]
- mov r0, #0x1
- orr r1, r1, #0x10
- str r1, [r4, #0xC]
- ldr r1, [r4, #0xC]
- bic r1, r1, #0x20
- str r1, [r4, #0xC]
- ldmia sp!, {r4, lr}
- add sp, sp, #0x10
- bx lr
-
- arm_func_start FS_OpenFileDirect
-FS_OpenFileDirect:
- stmdb sp!, {r4,lr}
- mov r4, r0
- str r1, [r4, #0x8]
- ldr r12, [sp, #0x8]
- mov r1, #0x7
- str r12, [r4, #0x38]
- str r2, [r4, #0x30]
- str r3, [r4, #0x34]
- bl FSi_SendCommand
-_020D1A34:
- cmp r0, #0x0
- moveq r0, #0x0
- ldmeqia sp!, {r4, lr}
- bxeq lr
- ldr r1, [r4, #0xC]
- mov r0, #0x1
- orr r1, r1, #0x10
- str r1, [r4, #0xC]
- ldr r1, [r4, #0xC]
- bic r1, r1, #0x20
- str r1, [r4, #0xC]
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start FS_ConvertPathToFileID
-FS_ConvertPathToFileID:
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4c
- mov r5, r0
- add r0, sp, #0x0
- mov r4, r1
- bl FS_InitFile
-_020D1A80:
- add r0, sp, #0x0
- mov r1, r4
- mov r2, r5
- mov r3, #0x0
- bl FSi_FindPath
- cmp r0, #0x0
- movne r0, #0x1
- moveq r0, #0x0
- add sp, sp, #0x4C
- ldmia sp!, {r4-r5, lr}
- bx lr
-
- arm_func_start FUN_020D1AAC
-FUN_020D1AAC: ; 0x020D1AAC
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- ldr r4, [r7, #0x2c]
- ldr r0, [r7, #0x28]
- mov r6, r2
- str r1, [r7, #0x30]
- sub r0, r0, r4
- cmp r6, r0
- movgt r6, r0
- cmp r6, #0x0
- movlt r6, #0x0
- str r2, [r7, #0x34]
- mov r5, r3
- str r6, [r7, #0x38]
- cmp r5, #0x0
- ldreq r0, [r7, #0xc]
- mov r1, #0x0
- orreq r0, r0, #0x4
- streq r0, [r7, #0xc]
- mov r0, r7
- bl FSi_SendCommand
-_020D1B04:
- cmp r5, #0x0
- bne _020D1B24
- mov r0, r7
- bl FS_WaitAsync
- cmp r0, #0x0
- ldrne r0, [r7, #0x2C]
- subne r6, r0, r4
- mvneq r6, #0x0
-_020D1B24:
- mov r0, r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r7, lr}
- bx lr
-
- arm_func_start FSi_FindPath
-FSi_FindPath:
- stmdb sp!, {r4-r8,lr}
- sub sp, sp, #0x10
- mov r7, r1
- ldrb r1, [r7, #0x0]
- mov r8, r0
- mov r6, r2
- mov r5, r3
- cmp r1, #0x2f
- beq _020D1B60
- cmp r1, #0x5c
- bne _020D1B84
-_020D1B60:
- ldr r0, _020D1C90 ; =0x021D53EC
- mov r1, #0x0
- ldr r0, [r0, #0x0]
- strh r1, [sp, #0x4]
- str r0, [sp, #0x0]
- str r1, [sp, #0x8]
- strh r1, [sp, #0x6]
- add r7, r7, #0x1
- b _020D1C40
-_020D1B84:
- ldr r0, _020D1C90 ; =0x021D53EC
- add r3, sp, #0x0
- ldmia r0, {r0-r2}
- stmia r3, {r0-r2}
- mov r4, #0x0
-_020D1B98:
- ldrb r0, [r7, r4]
- cmp r0, #0x0
- beq _020D1C40
- cmp r0, #0x2f
- beq _020D1C40
- cmp r0, #0x5c
- beq _020D1C40
- cmp r0, #0x3a
- bne _020D1C34
- mov r0, r7
- mov r1, r4
- bl FS_FindArchive
-_020D1BC8:
- cmp r0, #0x0
- addeq sp, sp, #0x10
- moveq r0, #0x0
- ldmeqia sp!, {r4-r8,lr}
- bxeq lr
- ldr r1, [r0, #0x1C]
- ands r1, r1, #0x2
- movne r1, #0x1
- moveq r1, #0x0
- cmp r1, #0x0
- addeq sp, sp, #0x10
- moveq r0, #0x0
- ldmeqia sp!, {r4-r8,lr}
- bxeq lr
- mov r1, #0x0
- str r0, [sp]
- str r1, [sp, #0x8]
- strh r1, [sp, #0x6]
- strh r1, [sp, #0x4]
- add r0, r4, #0x1
- ldrb r0, [r7, r0]!
- cmp r0, #0x2f
- beq _020D1C2C
- cmp r0, #0x5c
- bne _020D1C40
-_020D1C2C:
- add r7, r7, #0x1
- b _020D1C40
-_020D1C34:
- add r4, r4, #0x1
- cmp r4, #0x3
- ble _020D1B98
-_020D1C40:
- ldr r1, [sp, #0x0]
- add r0, sp, #0x0
- str r1, [r8, #0x8]
- str r7, [r8, #0x3c]
- add r3, r8, #0x30
- ldmia r0, {r0-r2}
- stmia r3, {r0-r2}
- cmp r5, #0x0
- movne r0, #0x1
- strne r0, [r8, #0x40]
- strne r5, [r8, #0x44]
- moveq r0, #0x0
- streq r0, [r8, #0x40]
- mov r0, r8
- mov r1, #0x4
- streq r6, [r8, #0x44]
- bl FSi_SendCommand
- add sp, sp, #0x10
- ldmia sp!, {r4-r8,lr}
- bx lr
- .balign 4
-_020D1C90: .word 0x021D53EC
-
- arm_func_start FS_InitFile
-FS_InitFile:
- mov r3, #0x0
- str r3, [r0, #0x0]
- ldr r2, [r0, #0x0]
- mov r1, #0xe
- str r2, [r0, #0x4]
- str r3, [r0, #0x1c]
- ldr r2, [r0, #0x1c]
- str r2, [r0, #0x18]
- str r3, [r0, #0x8]
- str r1, [r0, #0x10]
- str r3, [r0, #0xc]
- bx lr
-
- arm_func_start FS_IsAvailable
-FS_IsAvailable: ; 0x020D1CC4
- ldr r0, _020D1CD0 ; =0x021D53F8
- ldr r0, [r0, #0x0]
- bx lr
- .balign 4
-_020D1CD0: .word 0x021D53F8
-
- arm_func_start FS_Init
-FS_Init: ; 0x020D1CD4
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r1, _020D1D0C ; =0x021D53F8
- ldr r2, [r1, #0x0]
- cmp r2, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- mov r2, #0x1
- str r2, [r1, #0x0]
- bl FSi_InitRom
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D1D0C: .word 0x021D53F8
-
- arm_func_start FS_TryLoadTable
-FS_TryLoadTable: ; 0x020D1D10
- ldr ip, _020D1D28 ; =FUN_020D0D84
- mov r3, r0
- mov r2, r1
- ldr r0, _020D1D2C ; =0x021D5414
- mov r1, r3
- bx r12
- .balign 4
-_020D1D28: .word FUN_020D0D84
-_020D1D2C: .word 0x021D5414
-
- arm_func_start FS_SetDefaultDMA
-FS_SetDefaultDMA: ; 0x020D1D30
- stmdb sp!, {r4-r6,lr}
- mov r6, r0
- bl OS_DisableInterrupts
- mov r5, r0
- ldr r1, _020D1D7C ; =0x021D5400
- ldr r0, _020D1D80 ; =0x021D5414
- ldr r4, [r1, #0x0]
- bl FS_SuspendArchive
- ldr r1, _020D1D7C ; =0x021D5400
- cmp r0, #0x0
- str r6, [r1, #0x0]
- beq _020D1D68
- ldr r0, _020D1D80 ; =0x021D5414
- bl FS_ResumeArchive
-_020D1D68:
- mov r0, r5
- bl OS_RestoreInterrupts
- mov r0, r4
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D1D7C: .word 0x021D5400
-_020D1D80: .word 0x021D5414
-
- arm_func_start FSi_InitRom
-FSi_InitRom: ; 0x020D1D84
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x14
- ldr r1, _020D1EE8 ; =0x021D5400
- str r0, [r1, #0x0]
- bl OS_GetLockID
- ldr r3, _020D1EEC ; =0x021D53FC
- ldr r2, _020D1EF0 ; =0x021D5404
- mov r12, #0x0
- ldr r1, _020D1EF4 ; =0x021D540C
- str r0, [r3, #0x0]
- str r12, [r2, #0x0]
- str r12, [r2, #0x4]
- str r12, [r1, #0x0]
- str r12, [r1, #0x4]
- bl CARD_Init
- ldr r0, _020D1EF8 ; =0x021D5414
- bl FS_InitArchive
- ldr r0, _020D1EF8 ; =0x021D5414
- ldr r1, _020D1EFC ; =0x02106830
- mov r2, #0x3
- bl FS_RegisterArchiveName
- ldr r0, _020D1F00 ; =0x027FFC40
- ldrh r0, [r0, #0x0]
- cmp r0, #0x2
- bne _020D1E4C
- ldr ip, _020D1EF0 ; =0x021D5404
- mvn r2, #0x0
- ldr r3, _020D1EF4 ; =0x021D540C
- mov lr, #0x0
- ldr r0, _020D1EF8 ; =0x021D5414
- ldr r1, _020D1F04 ; =FSi_EmptyArchiveProc
- str r2, [r12, #0x0]
- str lr, [r12, #0x4]
- str r2, [r3, #0x0]
- str lr, [r3, #0x4]
- bl FS_SetArchiveProc
- mov r1, #0x0
- str r1, [sp, #0x0]
- ldr r0, _020D1F08 ; =FSi_ReadDummyCallback
- str r1, [sp, #0x4]
- str r0, [sp, #0x8]
- ldr ip, _020D1F0C ; =FSi_WriteDummyCallback
- ldr r0, _020D1EF8 ; =0x021D5414
- mov r2, r1
- mov r3, r1
- str r12, [sp, #0xc]
- bl FS_LoadArchive
- add sp, sp, #0x14
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D1E4C:
- ldr r5, _020D1F10 ; =0x027FFE40
- ldr r0, _020D1EF8 ; =0x021D5414
- ldr r1, _020D1F14 ; =FSi_RomArchiveProc
- ldr r2, _020D1F18 ; =0x00000602
- ldr r4, _020D1F1C ; =0x027FFE48
- bl FS_SetArchiveProc
- ldr r1, [r5, #0x0]
- mvn r0, #0x0
- cmp r1, r0
- addeq sp, sp, #0x14
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- cmp r1, #0x0
- addeq sp, sp, #0x14
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- ldr r2, [r4, #0x0]
- cmp r2, r0
- addeq sp, sp, #0x14
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- cmp r2, #0x0
- addeq sp, sp, #0x14
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- str r1, [sp, #0x0]
- ldr r0, [r5, #0x4]
- ldr r1, _020D1F20 ; =FSi_ReadRomCallback
- str r0, [sp, #0x4]
- ldr r0, _020D1F0C ; =FSi_WriteDummyCallback
- str r1, [sp, #0x8]
- str r0, [sp, #0xc]
- ldr r3, [r4, #0x4]
- ldr r0, _020D1EF8 ; =0x021D5414
- mov r1, #0x0
- bl FS_LoadArchive
- add sp, sp, #0x14
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D1EE8: .word 0x021D5400
-_020D1EEC: .word 0x021D53FC
-_020D1EF0: .word 0x021D5404
-_020D1EF4: .word 0x021D540C
-_020D1EF8: .word 0x021D5414
-_020D1EFC: .word 0x02106830
-_020D1F00: .word 0x027FFC40
-_020D1F04: .word FSi_EmptyArchiveProc
-_020D1F08: .word FSi_ReadDummyCallback
-_020D1F0C: .word FSi_WriteDummyCallback
-_020D1F10: .word 0x027FFE40
-_020D1F14: .word FSi_RomArchiveProc
-_020D1F18: .word 0x00000602
-_020D1F1C: .word 0x027FFE48
-_020D1F20: .word FSi_ReadRomCallback
-
- arm_func_start FSi_EmptyArchiveProc
-FSi_EmptyArchiveProc: ; 0x020D1F24
- mov r0, #0x4
- bx lr
-
- arm_func_start FSi_ReadDummyCallback
-FSi_ReadDummyCallback: ; 0x020D1F2C
- mov r0, #0x1
- bx lr
-
- arm_func_start FSi_RomArchiveProc
-FSi_RomArchiveProc: ; 0x020D1F34
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- cmp r1, #0x1
- beq _020D1FA0
- cmp r1, #0x9
- beq _020D1F58
- cmp r1, #0xa
- beq _020D1F7C
- b _020D1FB0
-_020D1F58:
- ldr r0, _020D1FC0 ; =0x021D53FC
- ldr r0, [r0, #0x0]
- mov r0, r0, lsl #0x10
- mov r0, r0, lsr #0x10
- bl CARD_LockRom
- add sp, sp, #0x4
- mov r0, #0x0
- ldmia sp!, {lr}
- bx lr
-_020D1F7C:
- ldr r0, _020D1FC0 ; =0x021D53FC
- ldr r0, [r0, #0x0]
- mov r0, r0, lsl #0x10
- mov r0, r0, lsr #0x10
- bl CARD_UnlockRom
- add sp, sp, #0x4
- mov r0, #0x0
- ldmia sp!, {lr}
- bx lr
-_020D1FA0:
- add sp, sp, #0x4
- mov r0, #0x4
- ldmia sp!, {lr}
- bx lr
-_020D1FB0:
- mov r0, #0x8
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D1FC0: .word 0x021D53FC
-
- arm_func_start FSi_WriteDummyCallback
-FSi_WriteDummyCallback: ; 0x020D1FC4
- mov r0, #0x1
- bx lr
-
- arm_func_start FSi_ReadRomCallback
-FSi_ReadRomCallback: ; 0x020D1FCC
- stmdb sp!, {lr}
- sub sp, sp, #0xc
- ldr ip, _020D2010 ; =FSi_OnRomReadDone
- mov lr, r1
- str r12, [sp, #0x0]
- str r0, [sp, #0x4]
- mov r1, #0x1
- ldr r0, _020D2014 ; =0x021D5400
- str r1, [sp, #0x8]
- mov r1, r2
- ldr r0, [r0, #0x0]
- mov r2, lr
- bl CARDi_ReadRom
- mov r0, #0x6
- add sp, sp, #0xc
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D2010: .word FSi_OnRomReadDone
-_020D2014: .word 0x021D5400
-
- arm_func_start FSi_OnRomReadDone
-FSi_OnRomReadDone: ; 0x020D2018
- stmdb sp!, {r4,lr}
- mov r4, r0
- bl CARD_IsPulledOut
-_020D2024:
- cmp r0, #0x0
- movne r1, #0x5
- moveq r1, #0x0
- mov r0, r4
- bl FS_NotifyArchiveAsyncEnd
- ldmia sp!, {r4,lr}
- bx lr
-
-
- arm_func_start FS_UnloadOverlay
-FS_UnloadOverlay: ; 0x020D2040
- stmdb sp!, {lr}
- sub sp, sp, #0x2c
- mov r3, r0
- mov r2, r1
- add r0, sp, #0x0
- mov r1, r3
- bl FS_LoadOverlayInfo
-_020D205C:
- cmp r0, #0x0
- beq _020D2074
- add r0, sp, #0x0
- bl FS_UnloadOverlayImage
- cmp r0, #0x0
- bne _020D2084
-_020D2074:
- add sp, sp, #0x2c
- mov r0, #0x0
- ldmfd sp!, {lr}
- bx lr
-_020D2084:
- mov r0, #0x1
- add sp, sp, #0x2c
- ldmfd sp!, {lr}
- bx lr
-
- arm_func_start FS_LoadOverlay
-FS_LoadOverlay: ; 0x020D2094
- stmdb sp!, {lr}
- sub sp, sp, #0x2c
- mov r3, r0
- mov r2, r1
- add r0, sp, #0x0
- mov r1, r3
- bl FS_LoadOverlayInfo
-_020D20B0:
- cmp r0, #0x0
- beq _020D20C8
- add r0, sp, #0x0
- bl FS_LoadOverlayImage
- cmp r0, #0x0
- bne _020D20D8
-_020D20C8:
- add sp, sp, #0x2c
- mov r0, #0x0
- ldmfd sp!, {lr}
- bx lr
-_020D20D8:
- add r0, sp, #0x0
- bl FS_StartOverlay
- mov r0, #0x1
- add sp, sp, #0x2c
- ldmfd sp!, {lr}
- bx lr
-
- arm_func_start FS_UnloadOverlayImage
-FS_UnloadOverlayImage: ; 0x020D20F0
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl FS_EndOverlay
- mov r0, #0x1
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start FS_EndOverlay
-FS_EndOverlay: ; 0x020D210C
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- ldr r8, _020D220C ; =0x021D74C8
- mov r11, r0
- mov r9, #0x0
-_020D2120:
- ldr r1, [r11, #0x8]
- ldr r0, [r11, #0xc]
- ldr r5, [r11, #0x4]
- add r0, r1, r0
- mov r7, r9
- mov r6, r9
- add r4, r5, r0
- bl OS_DisableInterrupts
- ldr lr, [r8, #0x0]
- mov r10, r9
- mov r12, lr
- cmp lr, #0x0
- beq _020D21C4
-_020D2154:
- ldr r2, [r12, #0x8]
- ldr r3, [r12, #0x0]
- cmp r2, #0x0
- ldr r1, [r12, #0x4]
- bne _020D2178
- cmp r1, r5
- blo _020D2178
- cmp r1, r4
- blo _020D2188
-_020D2178:
- cmp r2, r5
- blo _020D21B4
- cmp r2, r4
- bhs _020D21B4
-_020D2188:
- cmp r6, #0x0
- strne r12, [r6, #0x0]
- moveq r7, r12
- cmp lr, r12
- streq r3, [r8, #0x0]
- moveq lr, r3
- str r9, [r12, #0x0]
- cmp r10, #0x0
- mov r6, r12
- strne r3, [r10, #0x0]
- b _020D21B8
-_020D21B4:
- mov r10, r12
-_020D21B8:
- mov r12, r3
- cmp r3, #0x0
- bne _020D2154
-_020D21C4:
- bl OS_RestoreInterrupts
-_020D21C8:
- cmp r7, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r11, lr}
- bxeq lr
-_020D21D8:
- ldr r1, [r7, #0x4]
- ldr r4, [r7]
- cmp r1, #0x0
- beq _020D21F0
- ldr r0, [r7, #0x8]
- blx r1
-_020D21F0:
- mov r7, r4
- cmp r4, #0x0
- bne _020D21D8
- b _020D2120
- add sp, sp, #0x4
- ldmia sp!, {r4-r11, lr}
- bx lr
-_020D220C: .word 0x021D74C8
-
- arm_func_start FS_StartOverlay
-FS_StartOverlay: ; 0x020D2210
- stmdb sp!, {r4-r6,lr}
- mov r5, r0
- bl FSi_GetOverlayBinarySize
- ldr r1, _020D2300 ; =0x027FFC40
- mov r4, r0
- ldrh r0, [r1, #0x0]
- cmp r0, #0x2
- bne _020D22A4
- ldrb r1, [r5, #0x1f]
- mov r0, #0x0
- ands r1, r1, #0x2
- beq _020D2280
- ldr r1, _020D2304 ; =0x02106F84
- ldr r3, _020D2308 ; =0x02106F84
- ldr r2, _020D230C ; =0x66666667
- sub r12, r1, r3
- smull r1, lr, r2, r12
- mov lr, lr, asr #0x3
- mov r1, r12, lsr #0x1f
- ldr r2, [r5, #0x0]
- add lr, r1, lr
- cmp r2, lr
- bhs _020D2280
- mov r0, #0x14
- mla r0, r2, r0, r3
- ldr r1, [r5, #0x4]
- mov r2, r4
- bl FSi_CompareDigest
-_020D2280:
- cmp r0, #0x0
- bne _020D22A4
- ldr r0, [r5, #0x4]
- mov r2, r4
- mov r1, #0x0
- bl MI_CpuFill8
- bl OS_Terminate
- ldmia sp!, {r4-r6,lr}
- bx lr
-_020D22A4:
- ldrb r0, [r5, #0x1f]
- ands r0, r0, #0x1
- beq _020D22BC
- ldr r0, [r5, #0x4]
- add r0, r0, r4
- bl MIi_UncompressBackward
-_020D22BC:
- ldr r0, [r5, #0x4]
- ldr r1, [r5, #0x8]
- bl DC_FlushRange
- ldr r6, [r5, #0x10]
- ldr r4, [r5, #0x14]
- cmp r6, r4
- ldmcsia sp!, {r4-r6,lr}
- bxcs lr
-_020D22DC:
- ldr r0, [r6, #0x0]
- cmp r0, #0x0
- beq _020D22EC
- blx r0
-_020D22EC:
- add r6, r6, #0x4
- cmp r6, r4
- blo _020D22DC
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D2300: .word 0x027FFC40
-_020D2304: .word 0x02106F84
-_020D2308: .word 0x02106F84
-_020D230C: .word 0x66666667
-
- arm_func_start FSi_CompareDigest
-FSi_CompareDigest:
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x58
- mov r4, r0
- mov r6, r1
- mov r5, r2
- add r0, sp, #0x4
- mov r1, #0x0
- mov r2, #0x14
- bl MI_CpuFill8
- ldr r0, _020D23AC ; =0x02106834
- ldr r1, _020D23B0 ; =0x02106838
- ldr r0, [r0, #0x0]
- ldr r2, [r1, #0x0]
- add r1, sp, #0x18
- bl MI_CpuCopy8
- ldr r3, _020D23B0 ; =0x02106838
- mov r1, r6
- ldr r12, [r3, #0x0]
- mov r2, r5
- add r0, sp, #0x4
- add r3, sp, #0x18
- str r12, [sp, #0x0]
- bl MATH_CalcHMACSHA1
- add r2, sp, #0x4
- mov r3, #0x0
-_020D2374:
- ldr r1, [r2, #0x0]
- ldr r0, [r4, r3]
- cmp r1, r0
- bne _020D2394
- add r3, r3, #0x4
- cmp r3, #0x14
- add r2, r2, #0x4
- blo _020D2374
-_020D2394:
- cmp r3, #0x14
- moveq r0, #0x1
- movne r0, #0x0
- add sp, sp, #0x58
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D23AC: .word 0x02106834
-_020D23B0: .word 0x02106838
-
- arm_func_start FS_LoadOverlayImage
-FS_LoadOverlayImage: ; 0x020D23B4
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x54
- mov r5, r0
- add r0, sp, #0x8
- bl FS_InitFile
-_020D23C8:
- add r0, sp, #0x0
- mov r1, r5
- bl FS_GetOverlayFileID
- add r1, sp, #0x0
- add r0, sp, #0x8
- ldmia r1, {r1, r2}
- bl FS_OpenFileFast
- cmp r0, #0x0
- addeq sp, sp, #0x54
- moveq r0, #0x0
- ldmeqia sp!, {r4-r5, lr}
- bxeq lr
- mov r0, r5
- bl FSi_GetOverlayBinarySize
- mov r4, r0
- mov r0, r5
- bl FS_ClearOverlayImage
- ldr r1, [r5, #0x4]
- add r0, sp, #0x8
- mov r2, r4
- bl FS_ReadFile
- cmp r4, r0
- beq _020D243C
- add r0, sp, #0x8
- bl FS_CloseFile
- add sp, sp, #0x54
- mov r0, #0x0
- ldmia sp!, {r4-r5, lr}
- bx lr
-_020D243C:
- add r0, sp, #0x8
- bl FS_CloseFile
- mov r0, #0x1
- add sp, sp, #0x54
- ldmia sp!, {r4-r5, lr}
- bx lr
-
- arm_func_start FS_LoadOverlayImageAsync
-FS_LoadOverlayImageAsync: ; 0x020D2454
- stmdb sp!, {r4-r6,lr}
- sub sp, sp, #0x8
- mov r5, r1
- mov r6, r0
- mov r0, r5
- bl FS_InitFile
-_020D246C:
- add r0, sp, #0x0
- mov r1, r6
- bl FS_GetOverlayFileID
- add r1, sp, #0x0
- mov r0, r5
- ldmia r1, {r1, r2}
- bl FS_OpenFileFast
- cmp r0, #0x0
- addeq sp, sp, #0x8
- moveq r0, #0x0
- ldmeqia sp!, {r4-r6, lr}
- bxeq lr
- mov r0, r6
- bl FSi_GetOverlayBinarySize
- mov r4, r0
- mov r0, r6
- bl FS_ClearOverlayImage
- ldr r1, [r6, #0x4]
- mov r0, r5
- mov r2, r4
- bl FS_ReadFileAsync
- cmp r4, r0
- addeq sp, sp, #0x8
- moveq r0, #0x1
- ldmeqia sp!, {r4-r6, lr}
- bxeq lr
- mov r0, r5
- bl FS_CloseFile
- mov r0, #0x0
- add sp, sp, #0x8
- ldmia sp!, {r4-r6, lr}
- bx lr
-
- arm_func_start FS_LoadOverlayInfo
-FS_LoadOverlayInfo:
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x64
- movs r4, r1
- mov r5, r0
- ldreq r0, _020D25EC ; =0x021D5404
- ldrne r0, _020D25F0 ; =0x021D540C
- ldr r3, [r0, #0x0]
- cmp r3, #0x0
- beq _020D25A8
- ldr r0, [r0, #0x4]
- mov r2, r2, lsl #0x5
- cmp r2, r0
- addcs sp, sp, #0x64
- movcs r0, #0x0
- ldmcsia sp!, {r4-r5,lr}
- bxcs lr
- add r0, r3, r2
- mov r1, r5
- mov r2, #0x20
- bl MI_CpuCopy8
- add r0, sp, #0x18
- str r4, [r5, #0x20]
- bl FS_InitFile
- add r0, sp, #0x10
- mov r1, r5
- bl FS_GetOverlayFileID
- add r1, sp, #0x10
- add r0, sp, #0x18
- ldmia r1, {r1-r2}
- bl FS_OpenFileFast
-_020D2564:
- cmp r0, #0x0
- addeq sp, sp, #0x64
- moveq r0, #0x0
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- ldr r1, [sp, #0x3c]
- add r0, sp, #0x18
- str r1, [r5, #0x24]
- ldr r2, [sp, #0x40]
- ldr r1, [sp, #0x3c]
- sub r1, r2, r1
- str r1, [r5, #0x28]
- bl FS_CloseFile
- add sp, sp, #0x64
- mov r0, #0x1
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D25A8:
- ldr r1, _020D25F4 ; =0x027FFE50
- ldr ip, _020D25F8 ; =0x027FFE58
- ldr r0, [r1, #0x0]
- ldr r3, _020D25FC ; =0x021D5414
- str r0, [sp, #0x0]
- ldr r1, [r1, #0x4]
- mov r0, r5
- str r1, [sp, #0x4]
- ldr r5, [r12, #0x0]
- mov r1, r4
- str r5, [sp, #0x8]
- ldr r4, [r12, #0x4]
- str r4, [sp, #0xc]
- bl FSi_LoadOverlayInfoCore
- add sp, sp, #0x64
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D25EC: .word 0x021D5404
-_020D25F0: .word 0x021D540C
-_020D25F4: .word 0x027FFE50
-_020D25F8: .word 0x027FFE58
-_020D25FC: .word 0x021D5414
-
- arm_func_start FSi_LoadOverlayInfoCore
-FSi_LoadOverlayInfoCore: ; 0x020D2600
- stmdb sp!, {r4-r9,lr}
- sub sp, sp, #0x54
- movs r9, r1
- ldreq r5, [sp, #0x74]
- ldreq r6, [sp, #0x70]
- ldrne r5, [sp, #0x7c]
- ldrne r6, [sp, #0x78]
- mov r7, r2, lsl #0x5
- cmp r7, r5
- mov r4, r0
- mov r8, r3
- addcs sp, sp, #0x54
- movcs r0, #0x0
- ldmcsia sp!, {r4-r9,lr}
- bxcs lr
- add r0, sp, #0xc
- bl FS_InitFile
- mvn r12, #0x0
- add r0, sp, #0xc
- mov r1, r8
- add r2, r6, r7
- add r3, r6, r5
- str r12, [sp, #0x0]
- bl FS_OpenFileDirect
-_020D2660:
- cmp r0, #0
- addeq sp, sp, #0x54
- moveq r0, #0
- ldmeqia sp!, {r4-r9, lr}
- bxeq lr
- add r0, sp, #12
- mov r1, r4
- mov r2, #32
- bl FS_ReadFile
- cmp r0, #32
- beq _020D26A4
- add r0, sp, #12
- bl FS_CloseFile
- add sp, sp, #0x54
- mov r0, #0x0
- ldmia sp!, {r4-r9, lr}
- bx lr
-_020D26A4:
- add r0, sp, #0xC
- bl FS_CloseFile
- add r0, sp, #0x4
- mov r1, r4
- str r9, [r4, #0x20]
- bl FS_GetOverlayFileID
- add r1, sp, #0x4
- add r0, sp, #0xC
- ldmia r1, {r1, r2}
- bl FS_OpenFileFast
- cmp r0, #0x0
- addeq sp, sp, #0x54
- moveq r0, #0x0
- ldmeqia sp!, {r4-r9, lr}
- bxeq lr
- ldr r1, [sp, #0x30]
- add r0, sp, #0xC
- str r1, [r4, #0x24]
- ldr r2, [sp, #0x34]
- ldr r1, [sp, #0x30]
- sub r1, r2, r1
- str r1, [r4, #0x28]
- bl FS_CloseFile
- mov r0, #0x1
- add sp, sp, #0x54
- ldmia sp!, {r4-r9, lr}
- bx lr
-
- arm_func_start FS_GetOverlayFileID
-FS_GetOverlayFileID: ; 0x020D2710
- sub sp, sp, #0x8
- ldr r2, _020D2734 ; =0x021D5414
- str r2, [sp, #0x0]
- ldr r1, [r1, #0x18]
- str r1, [sp, #0x4]
- str r2, [r0, #0x0]
- str r1, [r0, #0x4]
- add sp, sp, #0x8
- bx lr
- .balign 4
-_020D2734: .word 0x021D5414
-
- arm_func_start FS_ClearOverlayImage
-FS_ClearOverlayImage: ; 0x020D2738
- stmdb sp!, {r4-r6,lr}
- ldr r5, [r0, #0x8]
- ldr r1, [r0, #0xc]
- ldr r6, [r0, #0x4]
- add r4, r5, r1
- mov r0, r6
- mov r1, r4
- bl IC_InvalidateRange
- mov r0, r6
- mov r1, r4
- bl DC_InvalidateRange
- add r0, r6, r5
- sub r2, r4, r5
- mov r1, #0x0
- bl MI_CpuFill8
- ldmia sp!, {r4-r6,lr}
- bx lr
-
- arm_func_start FSi_GetOverlayBinarySize
-FSi_GetOverlayBinarySize: ; 0x020D277C
- ldrb r1, [r0, #0x1f]
- ands r1, r1, #0x1
- ldrne r0, [r0, #0x1c]
- movne r0, r0, lsl #0x8
- movne r0, r0, lsr #0x8
- ldreq r0, [r0, #0x8]
- bx lr
diff --git a/arm9/asm/unk_020023C0.s b/arm9/asm/unk_020023C0.s
index ef8f06bf..0e8dfbdf 100644
--- a/arm9/asm/unk_020023C0.s
+++ b/arm9/asm/unk_020023C0.s
@@ -7792,551 +7792,3 @@ _02005F36:
mov r0, #0x0
bx lr
.balign 4
-
- ; Code that handles overlays?
-
- thumb_func_start FreeOverlayAllocation
-FreeOverlayAllocation: ; 0x02005F3C
- push {r4, lr}
- add r4, r0, #0x0
- ldr r0, [r4, #0x4]
- cmp r0, #0x1
- beq _02005F4A
- bl ErrorHandling
-_02005F4A:
- ldr r1, [r4, #0x0]
- mov r0, #0x0
- blx FS_UnloadOverlay
- cmp r0, #0x1
- beq _02005F5A
- bl ErrorHandling
-_02005F5A:
- mov r0, #0x0
- str r0, [r4, #0x4]
- pop {r4, pc}
-
- thumb_func_start UnloadOverlayByID
-UnloadOverlayByID: ; 0x02005F60
- push {r4, lr}
- add r4, r0, #0x0
- bl GetOverlayLoadDestination
- bl GetLoadedOverlaysInRegion
- mov r2, #0x0
- add r3, r0, #0x0
-_02005F70:
- ldr r1, [r3, #0x4]
- cmp r1, #0x1
- bne _02005F86
- ldr r1, [r3, #0x0]
- cmp r4, r1
- bne _02005F86
- lsl r1, r2, #0x3
- add r0, r0, r1
- bl FreeOverlayAllocation
- pop {r4, pc}
-_02005F86:
- add r2, r2, #0x1
- add r3, #0x8
- cmp r2, #0x8
- blt _02005F70
- pop {r4, pc}
-
- thumb_func_start GetOverlayLoadDestination
-GetOverlayLoadDestination: ; 0x02005F90
- push {lr}
- sub sp, #0x2c
- add r2, r0, #0x0
- add r0, sp, #0x0
- mov r1, #0x0
- blx FS_LoadOverlayInfo
- cmp r0, #0x1
- beq _02005FA6
- bl ErrorHandling
-_02005FA6:
- mov r0, #0x2
- ldr r2, [sp, #0x4]
- lsl r0, r0, #0x18
- cmp r2, r0
- bhi _02005FBC
- lsr r0, r0, #0x1
- cmp r2, r0
- blo _02005FBC
- add sp, #0x2c
- mov r0, #0x1
- pop {pc}
-_02005FBC:
- mov r0, #0x1
- ldr r1, _02005FD8 ; =0x027E0000
- lsl r0, r0, #0xe
- add r0, r1, r0
- cmp r2, r0
- bhi _02005FD2
- cmp r2, r1
- blo _02005FD2
- add sp, #0x2c
- mov r0, #0x2
- pop {pc}
-_02005FD2:
- mov r0, #0x0
- add sp, #0x2c
- pop {pc}
- .balign 4
-_02005FD8: .word 0x027E0000
-
- thumb_func_start HandleLoadOverlay
-HandleLoadOverlay: ; 0x02005FDC
- push {r3-r7, lr}
- add r4, r1, #0x0
- mov r1, #0x0
- mvn r1, r1
- add r5, r0, #0x0
- str r1, [sp, #0x0]
- bl CanOverlayBeLoaded
- cmp r0, #0x0
- bne _02005FF4
- mov r0, #0x0
- pop {r3-r7, pc}
-_02005FF4:
- add r0, r5, #0x0
- bl GetOverlayLoadDestination
- add r7, r0, #0x0
- bl GetLoadedOverlaysInRegion
- add r3, r0, #0x0
- mov r6, #0x0
- add r1, r3, #0x0
-_02006006:
- ldr r0, [r1, #0x4]
- cmp r0, #0x0
- bne _02006018
- lsl r1, r6, #0x3
- add r2, r3, r1
- mov r0, #0x1
- str r0, [r2, #0x4]
- str r5, [r3, r1]
- b _02006020
-_02006018:
- add r6, r6, #0x1
- add r1, #0x8
- cmp r6, #0x8
- blt _02006006
-_02006020:
- cmp r6, #0x8
- blt _0200602C
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
-_0200602C:
- sub r6, r7, #0x1
- cmp r6, #0x1
- bhi _0200603C
- mov r0, #0x0
- mvn r0, r0
- blx FS_SetDefaultDMA
- str r0, [sp, #0x0]
-_0200603C:
- cmp r4, #0x0
- beq _0200604A
- cmp r4, #0x1
- beq _02006056
- cmp r4, #0x2
- beq _02006062
- b _0200606E
-_0200604A:
- mov r0, #0x0
- add r1, r5, #0x0
- bl LoadOverlayNormal
- add r4, r0, #0x0
- b _02006076
-_02006056:
- mov r0, #0x0
- add r1, r5, #0x0
- bl LoadOverlayNoInit
- add r4, r0, #0x0
- b _02006076
-_02006062:
- mov r0, #0x0
- add r1, r5, #0x0
- bl LoadOverlayNoInitAsync
- add r4, r0, #0x0
- b _02006076
-_0200606E:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
-_02006076:
- cmp r6, #0x1
- bhi _02006080
- ldr r0, [sp, #0x0]
- blx FS_SetDefaultDMA
-_02006080:
- cmp r4, #0x0
- bne _0200608C
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
-_0200608C:
- mov r0, #0x1
- pop {r3-r7, pc}
-
- thumb_func_start CanOverlayBeLoaded
-CanOverlayBeLoaded: ; 0x02006090
- push {r3-r7, lr}
- sub sp, #0x10
- add r1, sp, #0xc
- add r2, sp, #0x8
- add r4, r0, #0x0
- bl GetOverlayRamBounds
- cmp r0, #0x0
- bne _020060A8
- add sp, #0x10
- mov r0, #0x0
- pop {r3-r7, pc}
-_020060A8:
- add r0, r4, #0x0
- bl GetOverlayLoadDestination
- bl GetLoadedOverlaysInRegion
- add r5, r0, #0x0
- mov r4, #0x0
- add r6, sp, #0x4
- add r7, sp, #0x0
-_020060BA:
- ldr r0, [r5, #0x4]
- cmp r0, #0x1
- bne _020060FC
- ldr r0, [r5, #0x0]
- add r1, r6, #0x0
- add r2, r7, #0x0
- bl GetOverlayRamBounds
- cmp r0, #0x1
- bne _020060FC
- ldr r1, [sp, #0x4]
- ldr r2, [sp, #0xc]
- cmp r2, r1
- blo _020060DC
- ldr r0, [sp, #0x0]
- cmp r2, r0
- blo _020060F2
-_020060DC:
- ldr r3, [sp, #0x8]
- cmp r3, r1
- bls _020060E8
- ldr r0, [sp, #0x0]
- cmp r3, r0
- bls _020060F2
-_020060E8:
- cmp r2, r1
- bhi _020060FC
- ldr r0, [sp, #0x0]
- cmp r3, r0
- blo _020060FC
-_020060F2:
- bl ErrorHandling
- add sp, #0x10
- mov r0, #0x0
- pop {r3-r7, pc}
-_020060FC:
- add r4, r4, #0x1
- add r5, #0x8
- cmp r4, #0x8
- blt _020060BA
- mov r0, #0x1
- add sp, #0x10
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start GetLoadedOverlaysInRegion
-GetLoadedOverlaysInRegion: ; 0x0200610C
- cmp r0, #0x0
- beq _02006118
- cmp r0, #0x1
- beq _0200611C
- cmp r0, #0x2
- beq _02006120
-_02006118:
- ldr r0, _02006124 ; =0x021C45B0
- bx lr
-_0200611C:
- ldr r0, _02006128 ; =0x021C45F0
- bx lr
-_02006120:
- ldr r0, _0200612C ; =0x021C4630
- bx lr
- .balign 4
-_02006124: .word 0x021C45B0
-_02006128: .word 0x021C45F0
-_0200612C: .word 0x021C4630
-
- thumb_func_start GetOverlayRamBounds
-GetOverlayRamBounds: ; 0x02006130
- push {r4-r5, lr}
- sub sp, #0x2c
- add r3, r0, #0x0
- add r5, r1, #0x0
- add r4, r2, #0x0
- add r0, sp, #0x0
- mov r1, #0x0
- add r2, r3, #0x0
- blx FS_LoadOverlayInfo
- cmp r0, #0x0
- bne _02006152
- bl ErrorHandling
- add sp, #0x2c
- mov r0, #0x0
- pop {r4-r5, pc}
-_02006152:
- ldr r2, [sp, #0x4]
- str r2, [r5, #0x0]
- ldr r1, [sp, #0x8]
- ldr r0, [sp, #0xc]
- add r0, r1, r0
- add r0, r2, r0
- str r0, [r4, #0x0]
- mov r0, #0x1
- add sp, #0x2c
- pop {r4-r5, pc}
- .balign 4
-
- thumb_func_start LoadOverlayNormal
-LoadOverlayNormal: ; 0x02006168
- ldr r3, _0200616C ; =FS_LoadOverlay
- bx r3
- .balign 4
-_0200616C: .word FS_LoadOverlay
-
- thumb_func_start LoadOverlayNoInit
-LoadOverlayNoInit: ; 0x02006170
- push {lr}
- sub sp, #0x2c
- add r3, r0, #0x0
- add r2, r1, #0x0
- add r0, sp, #0x0
- add r1, r3, #0x0
- blx FS_LoadOverlayInfo
- cmp r0, #0x0
- bne _0200618A
- add sp, #0x2c
- mov r0, #0x0
- pop {pc}
-_0200618A:
- add r0, sp, #0x0
- blx FS_LoadOverlayImage
- cmp r0, #0x0
- bne _0200619A
- add sp, #0x2c
- mov r0, #0x0
- pop {pc}
-_0200619A:
- add r0, sp, #0x0
- blx FS_StartOverlay
- mov r0, #0x1
- add sp, #0x2c
- pop {pc}
- .balign 4
-
- thumb_func_start LoadOverlayNoInitAsync
-LoadOverlayNoInitAsync: ; 0x020061A8
- push {lr}
- sub sp, #0x74
- add r3, r0, #0x0
- add r2, r1, #0x0
- add r0, sp, #0x0
- add r1, r3, #0x0
- blx FS_LoadOverlayInfo
- cmp r0, #0x0
- bne _020061C2
- add sp, #0x74
- mov r0, #0x0
- pop {pc}
-_020061C2:
- add r0, sp, #0x2c
- blx FS_InitFile
- add r0, sp, #0x0
- add r1, sp, #0x2c
- blx FS_LoadOverlayImageAsync
- add r0, sp, #0x2c
- blx FS_WaitAsync
- add r0, sp, #0x2c
- blx FS_CloseFile
- add r0, sp, #0x0
- blx FS_StartOverlay
- mov r0, #0x1
- add sp, #0x74
- pop {pc}
-
- thumb_func_start FUN_020061E8
-FUN_020061E8: ; 0x020061E8
- push {r3-r7, lr}
- add r5, r1, #0x0
- add r6, r0, #0x0
- add r7, r2, #0x0
- cmp r5, #0x0
- beq _0200620C
- add r0, r3, #0x0
- bl FUN_02016998
- add r4, r0, #0x0
- bne _02006202
- mov r0, #0x0
- pop {r3-r7, pc}
-_02006202:
- mov r1, #0x0
- add r2, r5, #0x0
- blx Call_FillMemWithValue
- b _0200620E
-_0200620C:
- mov r4, #0x0
-_0200620E:
- add r0, r6, #0x0
- add r1, r4, #0x0
- add r2, r7, #0x0
- bl FUN_0200CA44
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start FUN_0200621C
-FUN_0200621C: ; 0x0200621C
- push {r4, lr}
- add r4, r0, #0x0
- bl FUN_0201B6C8
- cmp r0, #0x0
- beq _0200622C
- bl FUN_02016A18
-_0200622C:
- add r0, r4, #0x0
- bl FUN_0200CAB4
- pop {r4, pc}
-
- thumb_func_start FUN_02006234
-FUN_02006234: ; 0x02006234
- push {r3-r5, lr}
- add r5, r0, #0x0
- add r4, r1, #0x0
- add r0, r2, #0x0
- mov r1, #0x28
- bl FUN_02016998
- add r3, r0, #0x0
- add r2, r3, #0x0
- ldmia r5!, {r0-r1}
- stmia r2!, {r0-r1}
- ldmia r5!, {r0-r1}
- stmia r2!, {r0-r1}
- mov r0, #0x0
- str r0, [r3, #0x10]
- str r0, [r3, #0x14]
- str r4, [r3, #0x18]
- str r0, [r3, #0x1c]
- str r0, [r3, #0x20]
- str r0, [r3, #0x24]
- add r0, r3, #0x0
- pop {r3-r5, pc}
-
- thumb_func_start FUN_02006260
-FUN_02006260: ; 0x02006260
- ldr r3, _02006264 ; =FUN_02016A18
- bx r3
- .balign 4
-_02006264: .word FUN_02016A18
-
- thumb_func_start FUN_02006268
-FUN_02006268: ; 0x02006268
- push {r4, lr}
- add r4, r0, #0x0
- add r0, r2, #0x0
- bl FUN_02016998
- str r0, [r4, #0x1c]
- pop {r4, pc}
- .balign 4
-
- thumb_func_start FUN_02006278
-FUN_02006278: ; 0x02006278
- ldr r0, [r0, #0x1c]
- bx lr
-
- thumb_func_start FUN_0200627C
-FUN_0200627C: ; 0x0200627C
- push {r4, lr}
- add r4, r0, #0x0
- ldr r0, [r4, #0x1c]
- bl FUN_02016A18
- mov r0, #0x0
- str r0, [r4, #0x1c]
- pop {r4, pc}
-
- thumb_func_start FUN_0200628C
-FUN_0200628C: ; 0x0200628C
- ldr r0, [r0, #0x18]
- bx lr
-
- thumb_func_start FUN_02006290
-FUN_02006290: ; 0x02006290
- push {r4, lr}
- add r4, r0, #0x0
- ldr r1, [r4, #0x10]
- cmp r1, #0x3
- bhi _0200630E
- add r1, r1, r1
- add r1, pc
- ldrh r1, [r1, #0x6]
- lsl r1, r1, #0x10
- asr r1, r1, #0x10
- add pc, r1
-_020062A6: ; jump table (using 16-bit offset)
- .short _020062AE - _020062A6 - 2; case 0
- .short _020062C2 - _020062A6 - 2; case 1
- .short _020062DA - _020062A6 - 2; case 2
- .short _020062F0 - _020062A6 - 2; case 3
-_020062AE:
- mov r1, #0x0
- ldr r0, [r4, #0xc]
- mvn r1, r1
- cmp r0, r1
- beq _020062BE
- mov r1, #0x2
- bl HandleLoadOverlay
-_020062BE:
- mov r0, #0x1
- str r0, [r4, #0x10]
-_020062C2:
- add r1, r4, #0x0
- ldr r2, [r4, #0x0]
- add r0, r4, #0x0
- add r1, #0x14
- blx r2
- cmp r0, #0x1
- bne _0200630E
- mov r0, #0x2
- str r0, [r4, #0x10]
- mov r0, #0x0
- str r0, [r4, #0x14]
- b _0200630E
-_020062DA:
- add r1, r4, #0x0
- ldr r2, [r4, #0x4]
- add r1, #0x14
- blx r2
- cmp r0, #0x1
- bne _0200630E
- mov r0, #0x3
- str r0, [r4, #0x10]
- mov r0, #0x0
- str r0, [r4, #0x14]
- b _0200630E
-_020062F0:
- add r1, r4, #0x0
- ldr r2, [r4, #0x8]
- add r1, #0x14
- blx r2
- cmp r0, #0x1
- bne _0200630E
- mov r1, #0x0
- ldr r0, [r4, #0xc]
- mvn r1, r1
- cmp r0, r1
- beq _0200630A
- bl UnloadOverlayByID
-_0200630A:
- mov r0, #0x1
- pop {r4, pc}
-_0200630E:
- mov r0, #0x0
- pop {r4, pc}
- .balign 4
diff --git a/arm9/asm/unk_020061E8.s b/arm9/asm/unk_020061E8.s
new file mode 100644
index 00000000..3b8df8d6
--- /dev/null
+++ b/arm9/asm/unk_020061E8.s
@@ -0,0 +1,181 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ thumb_func_start FUN_020061E8
+FUN_020061E8: ; 0x020061E8
+ push {r3-r7, lr}
+ add r5, r1, #0x0
+ add r6, r0, #0x0
+ add r7, r2, #0x0
+ cmp r5, #0x0
+ beq _0200620C
+ add r0, r3, #0x0
+ bl FUN_02016998
+ add r4, r0, #0x0
+ bne _02006202
+ mov r0, #0x0
+ pop {r3-r7, pc}
+_02006202:
+ mov r1, #0x0
+ add r2, r5, #0x0
+ blx Call_FillMemWithValue
+ b _0200620E
+_0200620C:
+ mov r4, #0x0
+_0200620E:
+ add r0, r6, #0x0
+ add r1, r4, #0x0
+ add r2, r7, #0x0
+ bl FUN_0200CA44
+ pop {r3-r7, pc}
+ .balign 4
+
+ thumb_func_start FUN_0200621C
+FUN_0200621C: ; 0x0200621C
+ push {r4, lr}
+ add r4, r0, #0x0
+ bl FUN_0201B6C8
+ cmp r0, #0x0
+ beq _0200622C
+ bl FUN_02016A18
+_0200622C:
+ add r0, r4, #0x0
+ bl FUN_0200CAB4
+ pop {r4, pc}
+
+ thumb_func_start FUN_02006234
+FUN_02006234: ; 0x02006234
+ push {r3-r5, lr}
+ add r5, r0, #0x0
+ add r4, r1, #0x0
+ add r0, r2, #0x0
+ mov r1, #0x28
+ bl FUN_02016998
+ add r3, r0, #0x0
+ add r2, r3, #0x0
+ ldmia r5!, {r0-r1}
+ stmia r2!, {r0-r1}
+ ldmia r5!, {r0-r1}
+ stmia r2!, {r0-r1}
+ mov r0, #0x0
+ str r0, [r3, #0x10]
+ str r0, [r3, #0x14]
+ str r4, [r3, #0x18]
+ str r0, [r3, #0x1c]
+ str r0, [r3, #0x20]
+ str r0, [r3, #0x24]
+ add r0, r3, #0x0
+ pop {r3-r5, pc}
+
+ thumb_func_start FUN_02006260
+FUN_02006260: ; 0x02006260
+ ldr r3, _02006264 ; =FUN_02016A18
+ bx r3
+ .balign 4
+_02006264: .word FUN_02016A18
+
+ thumb_func_start FUN_02006268
+FUN_02006268: ; 0x02006268
+ push {r4, lr}
+ add r4, r0, #0x0
+ add r0, r2, #0x0
+ bl FUN_02016998
+ str r0, [r4, #0x1c]
+ pop {r4, pc}
+ .balign 4
+
+ thumb_func_start FUN_02006278
+FUN_02006278: ; 0x02006278
+ ldr r0, [r0, #0x1c]
+ bx lr
+
+ thumb_func_start FUN_0200627C
+FUN_0200627C: ; 0x0200627C
+ push {r4, lr}
+ add r4, r0, #0x0
+ ldr r0, [r4, #0x1c]
+ bl FUN_02016A18
+ mov r0, #0x0
+ str r0, [r4, #0x1c]
+ pop {r4, pc}
+
+ thumb_func_start FUN_0200628C
+FUN_0200628C: ; 0x0200628C
+ ldr r0, [r0, #0x18]
+ bx lr
+
+ thumb_func_start FUN_02006290
+FUN_02006290: ; 0x02006290
+ push {r4, lr}
+ add r4, r0, #0x0
+ ldr r1, [r4, #0x10]
+ cmp r1, #0x3
+ bhi _0200630E
+ add r1, r1, r1
+ add r1, pc
+ ldrh r1, [r1, #0x6]
+ lsl r1, r1, #0x10
+ asr r1, r1, #0x10
+ add pc, r1
+_020062A6: ; jump table (using 16-bit offset)
+ .short _020062AE - _020062A6 - 2; case 0
+ .short _020062C2 - _020062A6 - 2; case 1
+ .short _020062DA - _020062A6 - 2; case 2
+ .short _020062F0 - _020062A6 - 2; case 3
+_020062AE:
+ mov r1, #0x0
+ ldr r0, [r4, #0xc]
+ mvn r1, r1
+ cmp r0, r1
+ beq _020062BE
+ mov r1, #0x2
+ bl HandleLoadOverlay
+_020062BE:
+ mov r0, #0x1
+ str r0, [r4, #0x10]
+_020062C2:
+ add r1, r4, #0x0
+ ldr r2, [r4, #0x0]
+ add r0, r4, #0x0
+ add r1, #0x14
+ blx r2
+ cmp r0, #0x1
+ bne _0200630E
+ mov r0, #0x2
+ str r0, [r4, #0x10]
+ mov r0, #0x0
+ str r0, [r4, #0x14]
+ b _0200630E
+_020062DA:
+ add r1, r4, #0x0
+ ldr r2, [r4, #0x4]
+ add r1, #0x14
+ blx r2
+ cmp r0, #0x1
+ bne _0200630E
+ mov r0, #0x3
+ str r0, [r4, #0x10]
+ mov r0, #0x0
+ str r0, [r4, #0x14]
+ b _0200630E
+_020062F0:
+ add r1, r4, #0x0
+ ldr r2, [r4, #0x8]
+ add r1, #0x14
+ blx r2
+ cmp r0, #0x1
+ bne _0200630E
+ mov r1, #0x0
+ ldr r0, [r4, #0xc]
+ mvn r1, r1
+ cmp r0, r1
+ beq _0200630A
+ bl UnloadOverlayByID
+_0200630A:
+ mov r0, #0x1
+ pop {r4, pc}
+_0200630E:
+ mov r0, #0x0
+ pop {r4, pc}
+ .balign 4
diff --git a/arm9/global.inc b/arm9/global.inc
index ed81acc6..b74fe006 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -5111,6 +5111,15 @@
.extern MOD11_02249E58
.extern MOD11_0224B310
.extern MOD11_0224C12C
+.extern FSi_ExecuteSyncCommand
+.extern FSi_InitRom
+.extern FSi_SendCommand
+.extern FSi_TranslateCommand
+.extern FS_NotifyArchiveAsyncEnd
+.extern FS_ResumeArchive
+.extern FS_SuspendArchive
+.extern FS_ReadFileAsync
+.extern FSi_ReleaseCommand
.extern FX_DivS32
.extern G2x_ChangeBlendBrightness_
.extern GX_DisableBankForARM7
diff --git a/arm9/lib/include/CARD_rom.h b/arm9/lib/include/CARD_rom.h
new file mode 100644
index 00000000..327bc995
--- /dev/null
+++ b/arm9/lib/include/CARD_rom.h
@@ -0,0 +1,11 @@
+#ifndef NITRO_CARD_ROM_H_
+#define NITRO_CARD_ROM_H_
+
+typedef struct
+{
+ u32 offset;
+ u32 length;
+}
+CARDRomRegion;
+
+#endif //NITRO_CARD_ROM_H_
diff --git a/arm9/lib/include/FS_archive.h b/arm9/lib/include/FS_archive.h
new file mode 100644
index 00000000..66840b32
--- /dev/null
+++ b/arm9/lib/include/FS_archive.h
@@ -0,0 +1,113 @@
+#ifndef NITRO_FS_ARCHIVE_H_
+#define NITRO_FS_ARCHIVE_H_
+
+#include "nitro.h"
+
+#include "OS_thread.h"
+
+struct FSFile;
+struct FSArchive;
+
+#define FS_ARCHIVE_NAME_LEN_MAX 3
+
+#define FS_ARCHIVE_FLAG_REGISTER 0x00000001
+#define FS_ARCHIVE_FLAG_LOADED 0x00000002
+#define FS_ARCHIVE_FLAG_TABLE_LOAD 0x00000004
+#define FS_ARCHIVE_FLAG_SUSPEND 0x00000008
+#define FS_ARCHIVE_FLAG_RUNNING 0x00000010
+#define FS_ARCHIVE_FLAG_CANCELING 0x00000020
+#define FS_ARCHIVE_FLAG_SUSPENDING 0x00000040
+#define FS_ARCHIVE_FLAG_UNLOADING 0x00000080
+#define FS_ARCHIVE_FLAG_IS_ASYNC 0x00000100
+#define FS_ARCHIVE_FLAG_IS_SYNC 0x00000200
+
+typedef enum {
+ FS_COMMAND_ASYNC_BEGIN = 0,
+ FS_COMMAND_READFILE = FS_COMMAND_ASYNC_BEGIN,
+ FS_COMMAND_WRITEFILE,
+ FS_COMMAND_ASYNC_END,
+
+ FS_COMMAND_SYNC_BEGIN = FS_COMMAND_ASYNC_END,
+ FS_COMMAND_SEEKDIR = FS_COMMAND_SYNC_BEGIN,
+ FS_COMMAND_READDIR,
+ FS_COMMAND_FINDPATH,
+ FS_COMMAND_GETPATH,
+ FS_COMMAND_OPENFILEFAST,
+ FS_COMMAND_OPENFILEDIRECT,
+ FS_COMMAND_CLOSEFILE,
+ FS_COMMAND_SYNC_END,
+
+ FS_COMMAND_STATUS_BEGIN = FS_COMMAND_SYNC_END,
+ FS_COMMAND_ACTIVATE = FS_COMMAND_STATUS_BEGIN,
+ FS_COMMAND_IDLE,
+ FS_COMMAND_SUSPEND,
+ FS_COMMAND_RESUME,
+ FS_COMMAND_STATUS_END,
+
+ FS_COMMAND_INVALID
+} FSCommandType;
+
+typedef enum {
+ FS_RESULT_SUCCESS = 0,
+ FS_RESULT_FAILURE,
+ FS_RESULT_BUSY,
+ FS_RESULT_CANCELED,
+ FS_RESULT_CANCELLED = FS_RESULT_CANCELED, // SDK alias
+ FS_RESULT_UNSUPPORTED,
+ FS_RESULT_ERROR,
+ FS_RESULT_PROC_ASYNC,
+ FS_RESULT_PROC_DEFAULT,
+ FS_RESULT_PROC_UNKNOWN
+}
+FSResult;
+
+typedef FSResult (*FS_ARCHIVE_READ_FUNC) (struct FSArchive *p, void *dst, u32 pos, u32 size);
+typedef FSResult (*FS_ARCHIVE_WRITE_FUNC) (struct FSArchive *p, const void *src, u32 pos, u32 size);
+typedef FSResult (*FS_ARCHIVE_PROC_FUNC) (struct FSFile *, FSCommandType);
+
+typedef struct
+{
+ struct FSFile * prev;
+ struct FSFile * next;
+}
+FSFileLink;
+
+typedef struct FSArchive
+{
+ union
+ {
+ char ptr[4];
+ u32 pack;
+ } name;
+ struct FSArchive * prev;
+ struct FSArchive * next;
+ OSThreadQueue sync_q;
+ OSThreadQueue stat_q;
+ u32 flag;
+ FSFileLink list;
+ u32 base;
+ u32 fat;
+ u32 fat_size;
+ u32 fnt;
+ u32 fnt_size;
+ u32 fat_bak;
+ u32 fnt_bak;
+ void * load_mem;
+ FS_ARCHIVE_READ_FUNC read_func;
+ FS_ARCHIVE_WRITE_FUNC write_func;
+ FS_ARCHIVE_READ_FUNC table_func;
+ FS_ARCHIVE_PROC_FUNC proc;
+ u32 proc_flag;
+} FSArchive;
+
+FSArchive * const FS_FindArchive(const char * path, int offset);
+
+static inline BOOL FS_IsArchiveLoaded(volatile const FSArchive * p_arc)
+{
+ return (p_arc->flag & FS_ARCHIVE_FLAG_LOADED) ? TRUE : FALSE;
+}
+
+BOOL FSi_SendCommand(struct FSFile * file, FSCommandType command);
+BOOL FSi_ExecuteSyncCommand(struct FSFile * file);
+
+#endif //NITRO_FS_ARCHIVE_H_
diff --git a/arm9/lib/include/FS_file.h b/arm9/lib/include/FS_file.h
new file mode 100644
index 00000000..4871b660
--- /dev/null
+++ b/arm9/lib/include/FS_file.h
@@ -0,0 +1,179 @@
+#ifndef NITRO_FS_FILE_H_
+#define NITRO_FS_FILE_H_
+
+#include "nitro.h"
+
+#include "FS_archive.h"
+
+#define FS_FILE_STATUS_BUSY 0x00000001
+#define FS_FILE_STATUS_CANCEL 0x00000002
+#define FS_FILE_STATUS_SYNC 0x00000004
+#define FS_FILE_STATUS_ASYNC 0x00000008
+#define FS_FILE_STATUS_IS_FILE 0x00000010
+#define FS_FILE_STATUS_IS_DIR 0x00000020
+#define FS_FILE_STATUS_OPERATING 0x00000040
+
+typedef enum FSSeekFileMode
+{
+ FS_SEEK_SET = 0,
+ FS_SEEK_CUR,
+ FS_SEEK_END
+} FSSeekFileMode;
+
+struct FSFile;
+
+#define FS_DMA_NOT_USE ((u32)~0)
+
+typedef struct FSDirPos
+{
+ struct FSArchive *arc;
+ u16 own_id;
+ u16 index;
+ u32 pos;
+}
+FSDirPos;
+
+typedef struct FSFileID
+{
+ struct FSArchive *arc;
+ u32 file_id;
+}
+FSFileID;
+
+typedef struct
+{
+ union
+ {
+ FSFileID file_id;
+ FSDirPos dir_id;
+ };
+ u32 is_directory;
+ u32 name_len;
+ char name[128];
+}
+FSDirEntry;
+
+
+typedef struct
+{
+ FSDirPos pos;
+}
+FSSeekDirInfo;
+
+
+typedef struct
+{
+ FSDirEntry *p_entry;
+ BOOL skip_string;
+}
+FSReadDirInfo;
+
+
+typedef struct
+{
+ FSDirPos pos;
+ const char *path;
+ BOOL find_directory;
+ union
+ {
+ FSFileID *file;
+ FSDirPos *dir;
+ }
+ result;
+}
+FSFindPathInfo;
+
+
+typedef struct
+{
+ u8 *buf;
+ u32 buf_len;
+ u16 total_len;
+ u16 dir_id;
+}
+FSGetPathInfo;
+
+
+typedef struct
+{
+ FSFileID id;
+}
+FSOpenFileFastInfo;
+
+
+typedef struct
+{
+ u32 top;
+ u32 bottom;
+ u32 index;
+}
+FSOpenFileDirectInfo;
+
+
+typedef struct
+{
+ u32 reserved;
+}
+FSCloseFileInfo;
+
+
+typedef struct
+{
+ void *dst;
+ u32 len_org;
+ u32 len;
+}
+FSReadFileInfo;
+
+
+typedef struct
+{
+ const void *src;
+ u32 len_org;
+ u32 len;
+}
+FSWriteFileInfo;
+
+typedef struct FSFile
+{
+ FSFileLink link;
+ struct FSArchive *arc;
+ u32 stat;
+ FSCommandType command;
+ FSResult error;
+ OSThreadQueue queue[1];
+ union {
+ struct
+ {
+ u32 own_id;
+ u32 top;
+ u32 bottom;
+ u32 pos;
+ } file;
+ struct
+ {
+ FSDirPos pos;
+ u32 parent;
+ } dir;
+ } prop;
+
+ union {
+ FSReadFileInfo readfile;
+ FSWriteFileInfo writefile;
+
+ FSSeekDirInfo seekdir;
+ FSReadDirInfo readdir;
+ FSFindPathInfo findpath;
+ FSGetPathInfo getpath;
+ FSOpenFileFastInfo openfilefast;
+ FSOpenFileDirectInfo openfiledirect;
+ FSCloseFileInfo closefile;
+ } arg;
+}
+FSFile;
+
+u32 FS_SetDefaultDMA(u32 dma_no); // returns the previous selection
+void FS_InitFile(FSFile * p_file);
+BOOL FS_WaitAsync(FSFile * p_file);
+
+#endif //NITRO_FS_FILE_H_
diff --git a/arm9/lib/include/FS_overlay.h b/arm9/lib/include/FS_overlay.h
new file mode 100644
index 00000000..c2634509
--- /dev/null
+++ b/arm9/lib/include/FS_overlay.h
@@ -0,0 +1,41 @@
+#ifndef NITRO_FS_OVERLAY_H_
+#define NITRO_FS_OVERLAY_H_
+
+#include "nitro.h"
+#include "MI_exMemory.h"
+#include "FS_file.h"
+#include "CARD_rom.h"
+
+typedef u32 FSOverlayID;
+
+typedef void (*FSOverlayInitFunc) (void);
+
+typedef struct FSOverlayInfoHeader
+{
+ u32 id;
+ u8 *ram_address;
+ u32 ram_size;
+ u32 bss_size;
+ FSOverlayInitFunc *sinit_init;
+ FSOverlayInitFunc *sinit_init_end;
+ u32 file_id;
+ u32 compressed:24;
+ u32 flag:8;
+} FSOverlayInfoHeader;
+
+typedef struct FSOverlayInfo
+{
+ FSOverlayInfoHeader header;
+ MIProcessor target;
+ CARDRomRegion file_pos;
+} FSOverlayInfo;
+
+BOOL FS_LoadOverlayInfo(FSOverlayInfo *p_ovi, MIProcessor target, FSOverlayID id);
+BOOL FS_LoadOverlay(MIProcessor target, FSOverlayID id);
+BOOL FS_UnloadOverlay(MIProcessor target, FSOverlayID id);
+BOOL FS_LoadOverlayImage(FSOverlayInfo *p_ovi);
+void FS_StartOverlay(FSOverlayInfo *p_ovi);
+BOOL FS_LoadOverlayImageAsync(FSOverlayInfo *p_ovi, FSFile *p_file);
+void FS_CloseFile(FSFile *p_file);
+
+#endif //NITRO_FS_OVERLAY_H_
diff --git a/arm9/lib/include/FS_rom.h b/arm9/lib/include/FS_rom.h
new file mode 100644
index 00000000..fc62b579
--- /dev/null
+++ b/arm9/lib/include/FS_rom.h
@@ -0,0 +1,6 @@
+#ifndef NITRO_FS_ROM_H_
+#define NITRO_FS_ROM_H_
+
+void FSi_InitRom(u32 default_dma_no);
+
+#endif //NITRO_FS_ROM_H_
diff --git a/arm9/lib/include/MI_byteAccess.h b/arm9/lib/include/MI_byteAccess.h
new file mode 100644
index 00000000..10dae4c9
--- /dev/null
+++ b/arm9/lib/include/MI_byteAccess.h
@@ -0,0 +1,9 @@
+#ifndef NITRO_MI_BYTEACCESS_H_
+#define NITRO_MI_BYTEACCESS_H_
+
+static inline u8 MI_ReadByte(const void *address)
+{
+ return *(u8 *)address;
+}
+
+#endif //NITRO_MI_BYTEACCESS_H_
diff --git a/arm9/lib/include/MI_exMemory.h b/arm9/lib/include/MI_exMemory.h
new file mode 100644
index 00000000..4a8a10a8
--- /dev/null
+++ b/arm9/lib/include/MI_exMemory.h
@@ -0,0 +1,9 @@
+#ifndef NITRO_MI_EXMEMORY_H_
+#define NITRO_MI_EXMEMORY_H_
+
+typedef enum {
+ MI_PROCESSOR_ARM9 = 0,
+ MI_PROCESSOR_ARM7 = 1
+} MIProcessor;
+
+#endif //NITRO_MI_EXMEMORY_H_
diff --git a/arm9/lib/include/OS_system.h b/arm9/lib/include/OS_system.h
index 9a79c0d1..65c58f57 100644
--- a/arm9/lib/include/OS_system.h
+++ b/arm9/lib/include/OS_system.h
@@ -5,6 +5,7 @@
#ifndef POKEDIAMOND_OS_SYSTEM_H
#define POKEDIAMOND_OS_SYSTEM_H
+#include "function_target.h"
#include "consts.h"
#include "function_target.h"
diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h
index 4fb70bf7..8820a7a0 100644
--- a/arm9/lib/include/OS_thread.h
+++ b/arm9/lib/include/OS_thread.h
@@ -7,6 +7,14 @@
typedef struct _OSThread OSThread;
+struct _OSThreadQueue
+{
+ OSThread *head;
+ OSThread *tail;
+};
+
+typedef struct _OSThreadQueue OSThreadQueue;
+
typedef struct OSThreadInfo {
u16 isNeedRescheduling;
u16 irqDepth;
@@ -20,4 +28,10 @@ struct _OSThread
u8 padding[0x80]; //todo: not the correct size but idfk
};
+void OS_SleepThread(OSThreadQueue * queue);
+static inline void OS_InitThreadQueue(OSThreadQueue * queue)
+{
+ queue->head = queue->tail = NULL;
+}
+
#endif //POKEDIAMOND_OS_THREAD_H
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index 1f8f37f9..27255115 100644
--- a/arm9/lib/include/mmap.h
+++ b/arm9/lib/include/mmap.h
@@ -12,8 +12,10 @@ extern u32 SDK_AUTOLOAD_DTCM_START[];
#define HW_MAIN_MEM_SHARED_SIZE 0x00001000
#define HW_MAIN_MEM_DEBUGGER_OFFSET 0x00700000
+#define HW_ITCM_IMAGE 0x01000000
#define HW_ITCM 0x01FF8000
#define HW_ITCM_SIZE 0x00008000
+#define HW_ITCM_END (HW_ITCM + HW_ITCM_SIZE)
#define HW_WRAM 0x037F8000
diff --git a/arm9/lib/include/mmap_global.h b/arm9/lib/include/mmap_global.h
new file mode 100644
index 00000000..e657e46f
--- /dev/null
+++ b/arm9/lib/include/mmap_global.h
@@ -0,0 +1,4 @@
+#ifndef NITRO_MMAP_GLOBAL_H_
+#define NITRO_MMAP_GLOBAL_H_
+
+#endif //NITRO_MMAP_GLOBAL_H_
diff --git a/arm9/lib/src/FS_file.c b/arm9/lib/src/FS_file.c
new file mode 100644
index 00000000..8ca89af8
--- /dev/null
+++ b/arm9/lib/src/FS_file.c
@@ -0,0 +1,258 @@
+#include "nitro.h"
+#include "MI_byteAccess.h"
+#include "FS_rom.h"
+#include "FS_file.h"
+
+extern FSDirPos current_dir_pos;
+BOOL is_init = FALSE;
+
+static inline BOOL FSi_IsSlash(u32 c)
+{
+ return (c == '/') || (c == '\\');
+}
+
+static inline BOOL FS_IsBusy(volatile const FSFile * p_file)
+{
+ return p_file->stat & FS_FILE_STATUS_BUSY ? TRUE : FALSE;
+}
+
+static inline BOOL FS_IsSucceeded(volatile const FSFile * p_file)
+{
+ return p_file->error == FS_RESULT_SUCCESS ? TRUE : FALSE;
+}
+
+void FS_Init(u32 default_dma_no)
+{
+ if (!is_init)
+ {
+ is_init = TRUE;
+ FSi_InitRom(default_dma_no);
+ }
+}
+
+BOOL FS_IsAvailable(void)
+{
+ return is_init;
+}
+
+void FS_InitFile(FSFile * p_file)
+{
+ p_file->link.next = p_file->link.prev = NULL;
+ OS_InitThreadQueue(p_file->queue);
+ p_file->arc = NULL;
+ p_file->command = FS_COMMAND_INVALID;
+ p_file->stat = 0;
+}
+
+static BOOL FSi_FindPath(FSFile * p_dir, const char * path, FSFileID * p_file_id, FSDirPos * p_dir_pos)
+{
+ FSDirPos pos;
+ if (FSi_IsSlash(MI_ReadByte(path)))
+ {
+ pos.arc = current_dir_pos.arc;
+ pos.own_id = 0;
+ pos.pos = 0;
+ pos.index = 0;
+ path++;
+ }
+ else
+ {
+ int i;
+ pos = current_dir_pos;
+ for (i = 0; i <= FS_ARCHIVE_NAME_LEN_MAX; ++i)
+ {
+ u32 c = MI_ReadByte(path + i);
+ if (!c || FSi_IsSlash(c))
+ break;
+ else if (c == ':')
+ {
+ FSArchive * const p_arc = FS_FindArchive(path, i);
+ if (!p_arc)
+ {
+ return FALSE;
+ }
+ else if (!FS_IsArchiveLoaded(p_arc))
+ {
+ return FALSE;
+ }
+ pos.arc = p_arc;
+ pos.pos = 0;
+ pos.index = 0;
+ pos.own_id = 0;
+ path += i + 1;
+ if (FSi_IsSlash(MI_ReadByte(path)))
+ ++path;
+ break;
+ }
+ }
+ }
+ p_dir->arc = pos.arc;
+ p_dir->arg.findpath.path = path;
+ p_dir->arg.findpath.pos = pos;
+ if (p_dir_pos)
+ {
+ p_dir->arg.findpath.find_directory = TRUE;
+ p_dir->arg.findpath.result.dir = p_dir_pos;
+ }
+ else
+ {
+ p_dir->arg.findpath.find_directory = FALSE;
+ p_dir->arg.findpath.result.file = p_file_id;
+ }
+ return FSi_SendCommand(p_dir, FS_COMMAND_FINDPATH);
+}
+
+int FSi_ReadFileCore(FSFile * p_file, void * dst, s32 len, BOOL async)
+{
+ {
+ const s32 pos = (s32)p_file->prop.file.pos;
+ const s32 rest = (s32)p_file->prop.file.bottom - pos;
+ const u32 org = (u32)len;
+ if (len > rest)
+ len = rest;
+ if (len < 0)
+ len = 0;
+ p_file->arg.readfile.dst = dst;
+ p_file->arg.readfile.len_org = org;
+ p_file->arg.readfile.len = (u32)(len);
+ if (!async)
+ p_file->stat |= FS_FILE_STATUS_SYNC;
+ (void)FSi_SendCommand(p_file, FS_COMMAND_READFILE);
+ if (!async)
+ {
+ if (FS_WaitAsync(p_file))
+ len = (s32)p_file->prop.file.pos - pos;
+ else
+ len = -1;
+ }
+ }
+ return len;
+}
+
+BOOL FS_ConvertPathToFileID(FSFileID * p_file_id, const char * path)
+{
+ FSFile dir;
+ FS_InitFile(&dir);
+ if (!FSi_FindPath(&dir, path, p_file_id, NULL))
+ return FALSE;
+ return TRUE;
+}
+
+BOOL FS_OpenFileDirect(FSFile * p_file, FSArchive * p_arc, u32 image_top, u32 image_bottom, u32 file_index)
+{
+ p_file->arc = p_arc;
+ p_file->arg.openfiledirect.index = file_index;
+ p_file->arg.openfiledirect.top = image_top;
+ p_file->arg.openfiledirect.bottom = image_bottom;
+ if (!FSi_SendCommand(p_file, FS_COMMAND_OPENFILEDIRECT))
+ return FALSE;
+ p_file->stat |= FS_FILE_STATUS_IS_FILE;
+ p_file->stat &= ~FS_FILE_STATUS_IS_DIR;
+ return TRUE;
+}
+
+BOOL FS_OpenFileFast(FSFile * p_file, FSFileID file_id)
+{
+ if (!file_id.arc)
+ return FALSE;
+ p_file->arc = file_id.arc;
+ p_file->arg.openfilefast.id = file_id;
+ if (!FSi_SendCommand(p_file, FS_COMMAND_OPENFILEFAST))
+ return FALSE;
+ p_file->stat |= FS_FILE_STATUS_IS_FILE;
+ p_file->stat &= ~FS_FILE_STATUS_IS_DIR;
+ return TRUE;
+}
+
+BOOL FS_OpenFile(FSFile * p_file, const char * path)
+{
+ FSFileID file_id;
+ return FS_ConvertPathToFileID(&file_id, path) && FS_OpenFileFast(p_file, file_id);
+}
+
+BOOL FS_CloseFile(FSFile * p_file)
+{
+ if (!FSi_SendCommand(p_file, FS_COMMAND_CLOSEFILE))
+ return FALSE;
+ p_file->arc = NULL;
+ p_file->command = FS_COMMAND_INVALID;
+ p_file->stat &= ~(FS_FILE_STATUS_IS_FILE | FS_FILE_STATUS_IS_DIR);
+ return TRUE;
+}
+
+BOOL FS_WaitAsync(FSFile * p_file)
+{
+ BOOL is_owner = FALSE;
+ OSIntrMode bak_par = OS_DisableInterrupts();
+ if (FS_IsBusy(p_file))
+ {
+ is_owner = !(p_file->stat & (FS_FILE_STATUS_SYNC | FS_FILE_STATUS_OPERATING));
+ if (is_owner)
+ {
+ p_file->stat |= FS_FILE_STATUS_SYNC;
+ do
+ {
+ OS_SleepThread(p_file->queue);
+ } while (!(p_file->stat & FS_FILE_STATUS_OPERATING));
+ }
+ else
+ {
+ do
+ {
+ OS_SleepThread(p_file->queue);
+ } while (FS_IsBusy(p_file));
+ }
+ }
+ (void)OS_RestoreInterrupts(bak_par);
+ if (is_owner)
+ {
+ return FSi_ExecuteSyncCommand(p_file);
+ }
+
+ return FS_IsSucceeded(p_file);
+}
+
+int FS_ReadFileAsync(FSFile * p_file, void * dst, s32 len)
+{
+ return FSi_ReadFileCore(p_file, dst, len, TRUE);
+}
+
+int FS_ReadFile(FSFile * p_file, void * dst, s32 len)
+{
+ return FSi_ReadFileCore(p_file, dst, len, FALSE);
+}
+
+BOOL FS_SeekFile(FSFile * p_file, int offset, FSSeekFileMode origin)
+{
+ switch (origin)
+ {
+ case FS_SEEK_SET:
+ offset += p_file->prop.file.top;
+ break;
+ case FS_SEEK_CUR:
+ offset += p_file->prop.file.pos;
+ break;
+ case FS_SEEK_END:
+ offset += p_file->prop.file.bottom;
+ break;
+ default:
+ return FALSE;
+ }
+ if (offset < (s32)p_file->prop.file.top)
+ offset = (s32)p_file->prop.file.top;
+ if (offset > (s32)p_file->prop.file.bottom)
+ offset = (s32)p_file->prop.file.bottom;
+ p_file->prop.file.pos = offset;
+ return TRUE;
+}
+
+BOOL FS_ChangeDir(const char * path)
+{
+ FSDirPos pos;
+ FSFile dir;
+ FS_InitFile(&dir);
+ if (!FSi_FindPath(&dir, path, NULL, &pos))
+ return FALSE;
+ current_dir_pos = pos;
+ return TRUE;
+}
diff --git a/arm9/src/poke_overlay.c b/arm9/src/poke_overlay.c
new file mode 100644
index 00000000..9a81ea83
--- /dev/null
+++ b/arm9/src/poke_overlay.c
@@ -0,0 +1,234 @@
+#include "global.h"
+#include "nitro.h"
+#include "FS_file.h"
+#include "FS_overlay.h"
+
+#define OVERLAY_LOAD_WRAM 0
+#define OVERLAY_LOAD_ITCM 1
+#define OVERLAY_LOAD_DTCM 2
+
+extern void ErrorHandling(void);
+
+struct LoadedOverlay {
+ FSOverlayID id;
+ BOOL active;
+};
+
+extern struct LoadedOverlay gLoadedOverlays[3][8];
+
+struct LoadedOverlay* GetLoadedOverlaysInRegion(int);
+BOOL GetOverlayRamBounds(FSOverlayID, void**, void**);
+BOOL CanOverlayBeLoaded(FSOverlayID);
+int GetOverlayLoadDestination(FSOverlayID);
+BOOL LoadOverlayNormal(MIProcessor, FSOverlayID);
+BOOL LoadOverlayNoInit(MIProcessor, FSOverlayID);
+BOOL LoadOverlayNoInitAsync(MIProcessor, FSOverlayID);
+
+THUMB_FUNC void FreeOverlayAllocation(struct LoadedOverlay * loaded)
+{
+ if (loaded->active != TRUE)
+ ErrorHandling();
+ if (FS_UnloadOverlay(MI_PROCESSOR_ARM9, loaded->id) != TRUE)
+ ErrorHandling();
+ loaded->active = FALSE;
+}
+
+THUMB_FUNC void UnloadOverlayByID(FSOverlayID id)
+{
+ struct LoadedOverlay * loaded = GetLoadedOverlaysInRegion(GetOverlayLoadDestination(id));
+ int i;
+ for (i = 0; i < 8; i++)
+ {
+ if (loaded[i].active == TRUE && loaded[i].id == id)
+ {
+ FreeOverlayAllocation(&loaded[i]);
+ break;
+ }
+ }
+}
+
+THUMB_FUNC int GetOverlayLoadDestination(FSOverlayID id)
+{
+ FSOverlayInfo info;
+ u8 *end;
+ u8 *start;
+ if (FS_LoadOverlayInfo(&info, MI_PROCESSOR_ARM9, id) != TRUE)
+ ErrorHandling();
+ start = (u8 *)HW_ITCM_IMAGE;
+ end = (u8 *)HW_ITCM_END;
+ if (info.header.ram_address <= end && info.header.ram_address >= start)
+ return OVERLAY_LOAD_ITCM;
+ start = (u8 *)SDK_AUTOLOAD_DTCM_START;
+ end = start + HW_DTCM_SIZE;
+ if (info.header.ram_address <= end && info.header.ram_address >= start)
+ return OVERLAY_LOAD_DTCM;
+ return OVERLAY_LOAD_WRAM;
+}
+
+THUMB_FUNC BOOL HandleLoadOverlay(FSOverlayID id, int a1)
+{
+ u32 sp0 = FS_DMA_NOT_USE;
+ struct LoadedOverlay *r3;
+ int r7;
+ int r6;
+ BOOL result;
+
+ if (!CanOverlayBeLoaded(id))
+ return FALSE;
+ r7 = GetOverlayLoadDestination(id);
+ r3 = GetLoadedOverlaysInRegion(r7);
+ for (r6 = 0; r6 < 8; r6++)
+ {
+ if (!r3[r6].active)
+ {
+ struct LoadedOverlay * ovly;
+ ovly = &r3[r6];
+ ovly->active = TRUE;
+ ovly->id = id;
+ break;
+ }
+ }
+ if (r6 >= 8)
+ {
+ ErrorHandling();
+ return FALSE;
+ }
+ if (r7 == OVERLAY_LOAD_ITCM || r7 == OVERLAY_LOAD_DTCM)
+ {
+ sp0 = FS_SetDefaultDMA(FS_DMA_NOT_USE);
+ }
+ switch (a1)
+ {
+ case 0:
+ result = LoadOverlayNormal(MI_PROCESSOR_ARM9, id);
+ break;
+ case 1:
+ result = LoadOverlayNoInit(MI_PROCESSOR_ARM9, id);
+ break;
+ case 2:
+ result = LoadOverlayNoInitAsync(MI_PROCESSOR_ARM9, id);
+ break;
+ default:
+ ErrorHandling();
+ return FALSE;
+ }
+ if (r7 == OVERLAY_LOAD_ITCM || r7 == OVERLAY_LOAD_DTCM)
+ {
+ FS_SetDefaultDMA(sp0);
+ }
+ if (result == 0)
+ {
+ ErrorHandling();
+ return FALSE;
+ }
+ return TRUE;
+}
+
+THUMB_FUNC BOOL CanOverlayBeLoaded(FSOverlayID id)
+{
+ void *start, *end, *start2, *end2;
+ struct LoadedOverlay *r5;
+ int i;
+ if (!GetOverlayRamBounds(id, &start, &end))
+ return FALSE;
+ r5 = GetLoadedOverlaysInRegion(GetOverlayLoadDestination(id));
+ for (i = 0; i < 8; i++)
+ {
+ if (r5[i].active == TRUE && GetOverlayRamBounds(r5[i].id, &start2, &end2) == TRUE)
+ {
+ if ((start >= start2 && start < end2) || (end > start2 && end <= end2) || (start <= start2 && end >= end2))
+ {
+ ErrorHandling();
+ return FALSE;
+ }
+ }
+ }
+ return TRUE;
+}
+
+THUMB_FUNC struct LoadedOverlay* GetLoadedOverlaysInRegion(int a0)
+{
+ switch (a0)
+ {
+ case OVERLAY_LOAD_WRAM:
+ default:
+ return gLoadedOverlays[0];
+ case OVERLAY_LOAD_ITCM:
+ return gLoadedOverlays[1];
+ case OVERLAY_LOAD_DTCM:
+ return gLoadedOverlays[2];
+ }
+}
+
+THUMB_FUNC BOOL GetOverlayRamBounds(FSOverlayID id, void ** start, void ** end)
+{
+ FSOverlayInfo info;
+ if (!FS_LoadOverlayInfo(&info, MI_PROCESSOR_ARM9, id)) {
+ ErrorHandling();
+ return FALSE;
+ }
+ *start = (void *)info.header.ram_address;
+ *end = (char *)*start + (info.header.ram_size + info.header.bss_size);
+ return TRUE;
+}
+
+THUMB_FUNC BOOL LoadOverlayNormal(MIProcessor target, FSOverlayID id)
+{
+ return FS_LoadOverlay(target, id);
+}
+
+THUMB_FUNC BOOL LoadOverlayNoInit(MIProcessor target, FSOverlayID id)
+{
+ FSOverlayInfo info;
+ if (!FS_LoadOverlayInfo(&info, target, id))
+ return FALSE;
+ if (!FS_LoadOverlayImage(&info))
+ return FALSE;
+ FS_StartOverlay(&info);
+ return TRUE;
+}
+
+//THUMB_FUNC BOOL LoadOverlayNoInitAsync(MIProcessor target, FSOverlayID id)
+//{
+// FSOverlayInfo info;
+// FSFile file;
+// if (!FS_LoadOverlayInfo(&info, target, id))
+// return FALSE;
+// FS_InitFile(&file);
+// FS_LoadOverlayImageAsync(&info, &file);
+// FS_WaitAsync(&file);
+// FS_CloseFile(&file);
+// FS_StartOverlay(&info);
+// return TRUE;
+//}
+
+THUMB_FUNC asm BOOL LoadOverlayNoInitAsync(MIProcessor target, FSOverlayID id)
+{
+ push {lr}
+ sub sp, #0x74
+ add r3, r0, #0x0
+ add r2, r1, #0x0
+ add r0, sp, #0x0
+ add r1, r3, #0x0
+ bl FS_LoadOverlayInfo
+ cmp r0, #0x0
+ bne _020061C2
+ add sp, #0x74
+ mov r0, #0x0
+ pop {pc}
+_020061C2:
+ add r0, sp, #0x2c
+ bl FS_InitFile
+ add r0, sp, #0x0
+ add r1, sp, #0x2c
+ bl FS_LoadOverlayImageAsync
+ add r0, sp, #0x2c
+ bl FS_WaitAsync
+ add r0, sp, #0x2c
+ bl FS_CloseFile
+ add r0, sp, #0x0
+ bl FS_StartOverlay
+ mov r0, #0x1
+ add sp, #0x74
+ pop {pc}
+}
diff --git a/arm9/undefined_syms.txt b/arm9/undefined_syms.txt
index a76e7783..0b159a51 100644
--- a/arm9/undefined_syms.txt
+++ b/arm9/undefined_syms.txt
@@ -22,8 +22,11 @@ gBacklightTop_2 = 0x02106FA0;
gUnknown21C48B8 = 0x021C48B8;
gUnk021C4918 = 0x021C4918;
gUnk021C8C70 = 0x021C8C70;
+gLoadedOverlays = 0x021C45B0;
OSi_IrqCallbackInfo = 0x021D341C;
isInitialized = 0x021D347C;
+current_dir_pos = 0x021D53EC;
+is_init = 0x021D53F8;
OSi_StackForDestructor = 0x021D3480;
OSi_RescheduleCount = 0x021D3484;
OSi_ThreadIdCount = 0x021D3488;