summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-05-05 20:13:17 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-05-05 20:13:17 -0400
commit3c458e8b4893866639734a572a7d8e5ce6c7c1ce (patch)
tree52fccbceefc204ab6350c1a1412f167ea007fffe
parent6071299191b3386f1d266a25ec6b49af2c2beda5 (diff)
Decompile GF funcs responsible for overlays
-rw-r--r--arm9/arm9.lcf2
-rw-r--r--arm9/asm/unk_020023C0.s548
-rw-r--r--arm9/asm/unk_020061E8.s181
-rw-r--r--arm9/lib/include/CARD_rom.h11
-rw-r--r--arm9/lib/include/FS_archive.h90
-rw-r--r--arm9/lib/include/FS_file.h164
-rw-r--r--arm9/lib/include/FS_overlay.h42
-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.h8
-rw-r--r--arm9/lib/include/mmap.h2
-rw-r--r--arm9/lib/include/mmap_global.h4
-rw-r--r--arm9/src/poke_overlay.c203
-rw-r--r--arm9/undefined_syms.txt1
14 files changed, 718 insertions, 548 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index c9ddc713..41382881 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)
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/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..65bb2ea1
--- /dev/null
+++ b/arm9/lib/include/FS_archive.h
@@ -0,0 +1,90 @@
+#ifndef NITRO_FS_ARCHIVE_H_
+#define NITRO_FS_ARCHIVE_H_
+
+#include "nitro.h"
+
+#include "OS_thread.h"
+
+struct FSFile;
+struct FSArchive;
+
+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;
+
+#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..08a698d0
--- /dev/null
+++ b/arm9/lib/include/FS_file.h
@@ -0,0 +1,164 @@
+#ifndef NITRO_FS_FILE_H_
+#define NITRO_FS_FILE_H_
+
+#include "nitro.h"
+
+#include "FS_archive.h"
+
+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];
+ u32 filler; // Figure out what this actually is
+ 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;
+ };
+}
+FSFile;
+
+u32 FS_SetDefaultDMA(u32 dma_no); // returns the previous selection
+void FS_InitFile(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..967169aa
--- /dev/null
+++ b/arm9/lib/include/FS_overlay.h
@@ -0,0 +1,42 @@
+#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_WaitAsync(FSFile *p_file);
+void FS_CloseFile(FSFile *p_file);
+
+#endif //NITRO_FS_OVERLAY_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 93903315..794e16d2 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"
typedef enum {
diff --git a/arm9/lib/include/OS_thread.h b/arm9/lib/include/OS_thread.h
index 4fb70bf7..207dac1b 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;
diff --git a/arm9/lib/include/mmap.h b/arm9/lib/include/mmap.h
index d94df843..56ae08c8 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/src/poke_overlay.c b/arm9/src/poke_overlay.c
new file mode 100644
index 00000000..105881d8
--- /dev/null
+++ b/arm9/src/poke_overlay.c
@@ -0,0 +1,203 @@
+#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;
+}
diff --git a/arm9/undefined_syms.txt b/arm9/undefined_syms.txt
index a76e7783..a2f736f8 100644
--- a/arm9/undefined_syms.txt
+++ b/arm9/undefined_syms.txt
@@ -22,6 +22,7 @@ gBacklightTop_2 = 0x02106FA0;
gUnknown21C48B8 = 0x021C48B8;
gUnk021C4918 = 0x021C4918;
gUnk021C8C70 = 0x021C8C70;
+gLoadedOverlays = 0x021C45B0;
OSi_IrqCallbackInfo = 0x021D341C;
isInitialized = 0x021D347C;
OSi_StackForDestructor = 0x021D3480;