diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-05-05 20:13:17 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-05-05 20:13:17 -0400 |
commit | 3c458e8b4893866639734a572a7d8e5ce6c7c1ce (patch) | |
tree | 52fccbceefc204ab6350c1a1412f167ea007fffe | |
parent | 6071299191b3386f1d266a25ec6b49af2c2beda5 (diff) |
Decompile GF funcs responsible for overlays
-rw-r--r-- | arm9/arm9.lcf | 2 | ||||
-rw-r--r-- | arm9/asm/unk_020023C0.s | 548 | ||||
-rw-r--r-- | arm9/asm/unk_020061E8.s | 181 | ||||
-rw-r--r-- | arm9/lib/include/CARD_rom.h | 11 | ||||
-rw-r--r-- | arm9/lib/include/FS_archive.h | 90 | ||||
-rw-r--r-- | arm9/lib/include/FS_file.h | 164 | ||||
-rw-r--r-- | arm9/lib/include/FS_overlay.h | 42 | ||||
-rw-r--r-- | arm9/lib/include/MI_exMemory.h | 9 | ||||
-rw-r--r-- | arm9/lib/include/OS_system.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_thread.h | 8 | ||||
-rw-r--r-- | arm9/lib/include/mmap.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/mmap_global.h | 4 | ||||
-rw-r--r-- | arm9/src/poke_overlay.c | 203 | ||||
-rw-r--r-- | arm9/undefined_syms.txt | 1 |
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; |