summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCleverking2003 <30466983+Cleverking2003@users.noreply.github.com>2020-05-19 20:51:39 +0300
committerGitHub <noreply@github.com>2020-05-19 20:51:39 +0300
commit1a83cf6baaff836a7e309dd7d3b2bf841ab7ba4c (patch)
treedc335eeb815b2236516ea1c405cb1d26b0890f76
parent07c521e0fb29afac447846c52379fe6874c08a3e (diff)
parentf498725e917a761e42a6f93efdf239dde46dc245 (diff)
Merge pull request #96 from red031000/master
split librtc and libcard
-rw-r--r--arm9/arm9.lcf11
-rw-r--r--arm9/asm/CARD_backup.s358
-rw-r--r--arm9/asm/CARD_common.s311
-rw-r--r--arm9/asm/CARD_pullOut.s169
-rw-r--r--arm9/asm/CARD_request.s162
-rw-r--r--arm9/asm/CARD_rom.s582
-rw-r--r--arm9/asm/CARD_spi.s223
-rw-r--r--arm9/asm/RTC_convert.s320
-rw-r--r--arm9/asm/RTC_external.s (renamed from arm9/asm/librtc.s)367
-rw-r--r--arm9/asm/RTC_internal.s53
-rw-r--r--arm9/asm/libcard.s1784
-rw-r--r--arm9/global.inc16
12 files changed, 2204 insertions, 2152 deletions
diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf
index 5504c2dd..6ded2f28 100644
--- a/arm9/arm9.lcf
+++ b/arm9/arm9.lcf
@@ -218,8 +218,15 @@ SECTIONS {
SPI_tp.o (.text)
SPI_mic.o (.text)
SPI_pm.o (.text)
- librtc.o (.text)
- libcard.o (.text)
+ RTC_external.o (.text)
+ RTC_internal.o (.text)
+ RTC_convert.o (.text)
+ CARD_common.o (.text)
+ CARD_spi.o (.text)
+ CARD_backup.o (.text)
+ CARD_rom.o (.text)
+ CARD_request.o (.text)
+ CARD_pullOut.o (.text)
libwm.o (.text)
libctrdg.o (.text)
libmath.o (.text)
diff --git a/arm9/asm/CARD_backup.s b/arm9/asm/CARD_backup.s
new file mode 100644
index 00000000..889dcf6d
--- /dev/null
+++ b/arm9/asm/CARD_backup.s
@@ -0,0 +1,358 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARD_CancelBackupAsync
+CARD_CancelBackupAsync: ; 0x020D6D7C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl OS_DisableInterrupts
+ ldr r1, _020D6DA8 ; =0x021D55C0
+ ldr r2, [r1, #0x114]
+ orr r2, r2, #0x40
+ str r2, [r1, #0x114]
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D6DA8: .word 0x021D55C0
+
+ arm_func_start CARD_TryWaitBackupAsync
+CARD_TryWaitBackupAsync: ; 0x020D6DAC
+ ldr ip, _020D6DB4 ; =FUN_020D6714
+ bx r12
+ .balign 4
+_020D6DB4: .word FUN_020D6714
+
+ arm_func_start CARD_WaitBackupAsync
+CARD_WaitBackupAsync: ; 0x020D6DB8
+ ldr ip, _020D6DC0 ; =CARDi_WaitAsync
+ bx r12
+ .balign 4
+_020D6DC0: .word CARDi_WaitAsync
+
+ .extern _SDK_NintendoBackup
+
+ arm_func_start CARD_IdentifyBackup
+CARD_IdentifyBackup: ; 0x020D6DC4
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ ldr r0, _020D6F00 ; =_SDK_NintendoBackup
+ ldr r7, _020D6F04 ; =0x021D55C0
+ bl OSi_ReferSymbol
+_020D6DDC: ; 0x020D6DDC
+ cmp r5, #0x0
+ bne _020D6DE8
+ bl OS_Terminate
+_020D6DE8:
+ bl CARD_CheckEnabled
+ bl OS_DisableInterrupts
+ ldr r1, [r7, #0x114]
+ mov r4, r0
+ ands r0, r1, #0x4
+ beq _020D6E18
+ add r6, r7, #0x10c
+_020D6E04:
+ mov r0, r6
+ bl OS_SleepThread
+ ldr r0, [r7, #0x114]
+ ands r0, r0, #0x4
+ bne _020D6E04
+_020D6E18:
+ ldr r0, [r7, #0x114]
+ mov r1, #0x0
+ orr r0, r0, #0x4
+ str r0, [r7, #0x114]
+ str r1, [r7, #0x38]
+ mov r0, r4
+ str r1, [r7, #0x3c]
+ bl OS_RestoreInterrupts
+ mov r0, r5
+ bl CARDi_IdentifyBackupCore
+ ldr r0, _020D6F08 ; =0x021D3498
+ ldr r1, _020D6F04 ; =0x021D55C0
+ ldr r2, [r0, #0x4]
+ mov r0, r7
+ str r2, [r1, #0x104]
+ mov r1, #0x2
+ mov r2, #0x1
+ bl CARDi_Request
+_020D6E60: ; 0x020D6E60
+ ldr r0, [r7, #0x0]
+ mov r1, #0x0
+ str r1, [r0, #0xc]
+ ldr r0, [r7, #0x0]
+ add r1, r7, #0x120
+ str r1, [r0, #0x10]
+ ldr r1, [r7, #0x0]
+ mov r2, #0x1
+ mov r0, r7
+ str r2, [r1, #0x14]
+ mov r1, #0x6
+ bl CARDi_Request
+ ldr r6, [r7, #0x38]
+ ldr r5, [r7, #0x3c]
+ bl OS_DisableInterrupts
+ mov r4, r0
+ ldr r1, [r7, #0x114]
+ add r0, r7, #0x10c
+ bic r1, r1, #0x4c
+ str r1, [r7, #0x114]
+ bl OS_WakeupThread
+ ldr r0, [r7, #0x114]
+ ands r0, r0, #0x10
+ beq _020D6EC8
+ add r0, r7, #0x44
+ bl OS_WakeupThreadDirect
+_020D6EC8:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_020D6ED0: ; 0x020D6ED0
+ cmp r6, #0x0
+ beq _020D6EE0
+ mov r0, r5
+ blx r6
+_020D6EE0:
+ ldr r0, [r7, #0x0]
+ ldr r0, [r0, #0x0]
+ cmp r0, #0x0
+ moveq r0, #0x1
+ movne r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+ .balign 4
+_020D6F00: .word _SDK_NintendoBackup
+_020D6F04: .word 0x021D55C0
+_020D6F08: .word 0x021D3498
+
+ arm_func_start CARD_GetBackupSectorSize
+CARD_GetBackupSectorSize: ; 0x020D6F0C
+ ldr r0, _020D6F1C ; =0x021D55C0
+ ldr r0, [r0, #0x0]
+ ldr r0, [r0, #0x1c]
+ bx lr
+ .balign 4
+_020D6F1C: .word 0x021D55C0
+
+ arm_func_start CARDi_RequestStreamCommand
+CARDi_RequestStreamCommand: ; 0x020D6F20
+ stmdb sp!, {r4-r10,lr}
+ mov r10, r0
+ ldr r6, _020D7004 ; =0x021D55C0
+ ldr r0, _020D7008 ; =_SDK_NintendoBackup
+ mov r9, r1
+ mov r8, r2
+ mov r7, r3
+ bl OSi_ReferSymbol
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x114]
+ mov r5, r0
+ ands r0, r1, #0x4
+ beq _020D6F6C
+ add r4, r6, #0x10c
+_020D6F58:
+ mov r0, r4
+ bl OS_SleepThread
+ ldr r0, [r6, #0x114]
+ ands r0, r0, #0x4
+ bne _020D6F58
+_020D6F6C:
+ ldr r0, [r6, #0x114]
+ ldr r1, [sp, #0x20]
+ orr r0, r0, #0x4
+ str r0, [r6, #0x114]
+ str r7, [r6, #0x38]
+ mov r0, r5
+ str r1, [r6, #0x3c]
+ bl OS_RestoreInterrupts
+ str r10, [r6, #0x1c]
+ str r9, [r6, #0x20]
+ ldr r0, [sp, #0x24]
+ ldr r1, [sp, #0x28]
+ str r8, [r6, #0x24]
+ ldr r2, [sp, #0x2c]
+ str r1, [r6, #0x2c]
+ ldr r1, [sp, #0x30]
+ str r2, [r6, #0x30]
+ str r1, [r6, #0x34]
+ cmp r0, #0x0
+ beq _020D6FD0
+ ldr r0, _020D700C ; =CARDi_RequestStreamCommandCore
+ bl CARDi_SetTask
+ mov r0, #0x1
+ ldmia sp!, {r4-r10,lr}
+ bx lr
+_020D6FD0:
+ ldr r0, _020D7010 ; =0x021D3498
+ ldr r1, _020D7004 ; =0x021D55C0
+ ldr r2, [r0, #0x4]
+ mov r0, r6
+ str r2, [r1, #0x104]
+ bl CARDi_RequestStreamCommandCore
+_020D6FE8: ; 0x020D6FE8
+ ldr r0, [r6, #0x0]
+ ldr r0, [r0, #0x0]
+ cmp r0, #0x0
+ moveq r0, #0x1
+ movne r0, #0x0
+ ldmia sp!, {r4-r10,lr}
+ bx lr
+ .balign 4
+_020D7004: .word 0x021D55C0
+_020D7008: .word _SDK_NintendoBackup
+_020D700C: .word CARDi_RequestStreamCommandCore
+_020D7010: .word 0x021D3498
+
+ arm_func_start CARDi_RequestStreamCommandCore
+CARDi_RequestStreamCommandCore:
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ mov r9, r0
+ ldr r8, [r9, #0x2c]
+ ldr r0, _020D720C ; =_SDK_NintendoBackup
+ ldr r7, [r9, #0x34]
+ ldr r10, [r9, #0x30]
+ mov r6, #0x100
+ bl OSi_ReferSymbol
+ cmp r8, #0xb
+ bne _020D7048
+ bl CARD_GetBackupSectorSize
+ mov r6, r0
+_020D7048:
+ mov r0, #0x1
+ add r4, r9, #0x120
+ mov r11, #0x9
+ str r0, [sp, #0x0]
+_020D7058:
+ ldr r5, [r9, #0x24]
+ ldr r0, [r9, #0x0]
+ cmp r6, r5
+ movcc r5, r6
+ str r5, [r0, #0x14]
+ ldr r0, [r9, #0x114]
+ ands r0, r0, #0x40
+ beq _020D7094
+ ldr r0, [r9, #0x114]
+ mov r1, #0x7
+ bic r0, r0, #0x40
+ str r0, [r9, #0x114]
+ ldr r0, [r9, #0x0]
+ str r1, [r0, #0x0]
+ b _020D71A8
+_020D7094:
+ cmp r7, #0x3
+ addls pc, pc, r7, lsl #0x2
+ b _020D7124
+_020D70A0:
+ b _020D70B0
+_020D70A4:
+ b _020D70D4
+_020D70A8:
+ b _020D70D4
+_020D70AC:
+ b _020D710C
+_020D70B0:
+ mov r1, r5
+ add r0, r9, #0x120
+ bl DC_InvalidateRange
+ ldr r1, [r9, #0x1c]
+ ldr r0, [r9, #0x0]
+ str r1, [r0, #0xc]
+ ldr r0, [r9, #0x0]
+ str r4, [r0, #0x10]
+ b _020D7124
+_020D70D4:
+ ldr r0, [r9, #0x1c]
+ mov r1, r4
+ mov r2, r5
+ bl MI_CpuCopy8
+ mov r1, r5
+ add r0, r9, #0x120
+ bl DC_FlushRange
+ bl DC_WaitWriteBufferEmpty
+_020D70F4: ; 0x020D70F4
+ ldr r0, [r9, #0x0]
+ str r4, [r0, #0xc]
+ ldr r1, [r9, #0x20]
+ ldr r0, [r9, #0x0]
+ str r1, [r0, #0x10]
+ b _020D7124
+_020D710C:
+ ldr r1, [r9, #0x1c]
+ ldr r0, [r9, #0x0]
+ str r1, [r0, #0xc]
+ ldr r1, [r9, #0x20]
+ ldr r0, [r9, #0x0]
+ str r1, [r0, #0x10]
+_020D7124:
+ mov r0, r9
+ mov r1, r8
+ mov r2, r10
+ bl CARDi_Request
+_020D7134: ; 0x020D7134
+ cmp r0, #0x0
+ beq _020D71A8
+ cmp r7, #0x2
+ bne _020D7160
+ ldr r2, [sp, #0x0]
+ mov r0, r9
+ mov r1, r11
+ bl CARDi_Request
+_020D7154: ; 0x020D7154
+ cmp r0, #0x0
+ bne _020D7178
+ b _020D71A8
+_020D7160:
+ cmp r7, #0x0
+ bne _020D7178
+ ldr r1, [r9, #0x20]
+ mov r2, r5
+ add r0, r9, #0x120
+ bl MI_CpuCopy8
+_020D7178:
+ ldr r0, [r9, #0x1c]
+ add r0, r0, r5
+ str r0, [r9, #0x1c]
+ ldr r0, [r9, #0x20]
+ add r0, r0, r5
+ str r0, [r9, #0x20]
+ ldr r0, [r9, #0x24]
+ sub r0, r0, r5
+ str r0, [r9, #0x24]
+ ldr r0, [r9, #0x24]
+ cmp r0, #0x0
+ bne _020D7058
+_020D71A8:
+ ldr r6, [r9, #0x38]
+ ldr r5, [r9, #0x3c]
+ bl OS_DisableInterrupts
+ ldr r1, [r9, #0x114]
+ mov r4, r0
+ bic r0, r1, #0x4c
+ str r0, [r9, #0x114]
+ add r0, r9, #0x10c
+ bl OS_WakeupThread
+ ldr r0, [r9, #0x114]
+ ands r0, r0, #0x10
+ beq _020D71E0
+ add r0, r9, #0x44
+ bl OS_WakeupThreadDirect
+_020D71E0:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_020D71E8: ; 0x020D71E8
+ cmp r6, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r11,lr}
+ bxeq lr
+ mov r0, r5
+ blx r6
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_020D720C: .word _SDK_NintendoBackup
diff --git a/arm9/asm/CARD_common.s b/arm9/asm/CARD_common.s
new file mode 100644
index 00000000..3c33562d
--- /dev/null
+++ b/arm9/asm/CARD_common.s
@@ -0,0 +1,311 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARD_UnlockBackup
+CARD_UnlockBackup: ; 0x020D66A0
+ ldr ip, _020D66AC ; =CARDi_UnlockResource
+ mov r1, #0x2
+ bx r12
+ .balign 4
+_020D66AC: .word CARDi_UnlockResource
+
+ arm_func_start CARD_LockBackup
+CARD_LockBackup: ; 0x020D66B0
+ ldr ip, _020D66BC ; =CARDi_LockResource
+ mov r1, #0x2
+ bx r12
+ .balign 4
+_020D66BC: .word CARDi_LockResource
+
+ arm_func_start CARD_UnlockRom
+CARD_UnlockRom: ; 0x020D66C0
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ bl OS_UnlockCard
+ mov r0, r4
+ mov r1, #0x1
+ bl CARDi_UnlockResource
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start CARD_LockRom
+CARD_LockRom: ; 0x020D66E0
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ mov r1, #0x1
+ bl CARDi_LockResource
+ mov r0, r4
+ bl OS_TryLockCard
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start CARD_GetResultCode
+CARD_GetResultCode: ; 0x020D6700
+ ldr r0, _020D6710 ; =0x021D55C0
+ ldr r0, [r0, #0x0]
+ ldr r0, [r0, #0x0]
+ bx lr
+ .balign 4
+_020D6710: .word 0x021D55C0
+
+;CARDi_TryWaitAsync?
+ arm_func_start FUN_020D6714
+FUN_020D6714: ; 0x020D6714
+ ldr r0, _020D672C ; =0x021D55C0
+ ldr r0, [r0, #0x114]
+ ands r0, r0, #0x4
+ moveq r0, #0x1
+ movne r0, #0x0
+ bx lr
+ .balign 4
+_020D672C: .word 0x021D55C0
+
+ arm_func_start CARDi_WaitAsync
+CARDi_WaitAsync: ; 0x020D6730
+ stmdb sp!, {r4-r6,lr}
+ ldr r6, _020D6788 ; =0x021D55C0
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x114]
+ mov r5, r0
+ ands r0, r1, #0x4
+ beq _020D6764
+ add r4, r6, #0x10c
+_020D6750:
+ mov r0, r4
+ bl OS_SleepThread
+ ldr r0, [r6, #0x114]
+ ands r0, r0, #0x4
+ bne _020D6750
+_020D6764:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_020D676C: ; 0x020D676C
+ ldr r0, [r6, #0x0]
+ ldr r0, [r0, #0x0]
+ cmp r0, #0x0
+ moveq r0, #0x1
+ movne r0, #0x0
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D6788: .word 0x021D55C0
+
+ arm_func_start CARD_Enable
+CARD_Enable: ; 0x020D678C
+ ldr r1, _020D6798 ; =0x021D555C
+ str r0, [r1, #0x0]
+ bx lr
+ .balign 4
+_020D6798: .word 0x021D555C
+
+ arm_func_start CARD_CheckEnabled
+CARD_CheckEnabled: ; 0x020D679C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl CARD_IsEnabled
+_020D67A8: ; 0x020D67A8
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ bl OS_Terminate
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start CARD_IsEnabled
+CARD_IsEnabled:
+ ldr r0, _020D67D4 ; =0x021D555C
+ ldr r0, [r0, #0x0]
+ bx lr
+ .balign 4
+_020D67D4: .word 0x021D555C
+
+ arm_func_start CARDi_InitCommon
+CARDi_InitCommon: ; 0x020D67D8
+ stmdb sp!, {r4,lr}
+ sub sp, sp, #0x8
+ ldr r4, _020D68B8 ; =0x021D55C0
+ ldr r1, _020D68BC ; =0x021D5560
+ mvn r2, #0x2
+ mov r0, #0x0
+ str r2, [r4, #0x8]
+ mov r2, #0x60
+ str r0, [r4, #0xc]
+ str r0, [r4, #0x18]
+ str r1, [r4, #0x0]
+ bl MIi_CpuClearFast
+ ldr r0, _020D68BC ; =0x021D5560
+ mov r1, #0x60
+ bl DC_FlushRange
+ ldr r0, _020D68C0 ; =0x027FFC40
+ ldrh r0, [r0, #0x0]
+ cmp r0, #0x2
+ beq _020D6834
+ ldr r0, _020D68C4 ; =0x027FFE00
+ ldr r1, _020D68C8 ; =0x027FFA80
+ mov r2, #0x160
+ bl MI_CpuCopy8
+_020D6834:
+ mov r2, #0x0
+ str r2, [r4, #0x14]
+ ldr r0, [r4, #0x14]
+ mov r1, #0x4
+ str r0, [r4, #0x10]
+ str r2, [r4, #0x110]
+ ldr r3, [r4, #0x110]
+ mov r0, #0x400
+ str r3, [r4, #0x10c]
+ str r1, [r4, #0x108]
+ str r0, [sp, #0x0]
+ ldr r12, [r4, #0x108]
+ ldr r1, _020D68CC ; =CARDi_TaskThread
+ ldr r3, _020D68D0 ; =0x021D5BE0
+ add r0, r4, #0x44
+ str r12, [sp, #0x4]
+ bl OS_CreateThread
+ add r0, r4, #0x44
+ bl OS_WakeupThreadDirect
+ ldr r1, _020D68D4 ; =CARDi_OnFifoRecv
+ mov r0, #0xb
+ bl PXI_SetFifoRecvCallback
+ ldr r0, _020D68C0 ; =0x027FFC40
+ ldrh r0, [r0, #0x0]
+ cmp r0, #0x2
+ addeq sp, sp, #0x8
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ mov r0, #0x1
+ bl CARD_Enable
+ add sp, sp, #0x8
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020D68B8: .word 0x021D55C0
+_020D68BC: .word 0x021D5560
+_020D68C0: .word 0x027FFC40
+_020D68C4: .word 0x027FFE00
+_020D68C8: .word 0x027FFA80
+_020D68CC: .word CARDi_TaskThread
+_020D68D0: .word 0x021D5BE0
+_020D68D4: .word CARDi_OnFifoRecv
+
+ arm_func_start CARDi_UnlockResource
+CARDi_UnlockResource: ; 0x020D68D8
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ ldr r5, _020D6978 ; =0x021D55C0
+ mov r7, r0
+ mov r6, r1
+ bl OS_DisableInterrupts
+ mov r1, r5
+ mov r4, r0
+ ldr r0, [r1, #0x8]
+ cmp r0, r7
+ bne _020D6910
+ ldr r0, [r5, #0xc]
+ cmp r0, #0x0
+ bne _020D6918
+_020D6910:
+ bl OS_Terminate
+ b _020D6958
+_020D6918:
+ ldr r0, [r5, #0x18]
+ cmp r0, r6
+ beq _020D6928
+ bl OS_Terminate
+_020D6928:
+ ldr r0, [r5, #0xc]
+ sub r0, r0, #0x1
+ str r0, [r5, #0xc]
+ ldr r0, [r5, #0xc]
+ cmp r0, #0x0
+ bne _020D6958
+ mvn r0, #0x2
+ str r0, [r5, #0x8]
+ mov r1, #0x0
+ add r0, r5, #0x10
+ str r1, [r5, #0x18]
+ bl OS_WakeupThread
+_020D6958:
+ ldr r1, [r5, #0x0]
+ mov r2, #0x0
+ mov r0, r4
+ str r2, [r1, #0x0]
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+ .balign 4
+_020D6978: .word 0x021D55C0
+
+ arm_func_start CARDi_LockResource
+CARDi_LockResource: ; 0x020D697C
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x4
+ ldr r5, _020D6A14 ; =0x021D55C0
+ mov r7, r0
+ mov r6, r1
+ bl OS_DisableInterrupts
+ ldr r1, [r5, #0x8]
+ mov r4, r0
+ cmp r1, r7
+ bne _020D69B8
+ ldr r0, [r5, #0x18]
+ cmp r0, r6
+ beq _020D69E8
+ bl OS_Terminate
+ b _020D69E8
+_020D69B8:
+ ldr r0, [r5, #0x8]
+ mvn r8, #0x2
+ cmp r0, r8
+ beq _020D69E0
+ add r9, r5, #0x10
+_020D69CC:
+ mov r0, r9
+ bl OS_SleepThread
+ ldr r0, [r5, #0x8]
+ cmp r0, r8
+ bne _020D69CC
+_020D69E0:
+ str r7, [r5, #0x8]
+ str r6, [r5, #0x18]
+_020D69E8:
+ ldr r1, [r5, #0xc]
+ mov r0, r4
+ add r1, r1, #0x1
+ str r1, [r5, #0xc]
+ ldr r1, [r5, #0x0]
+ mov r2, #0x0
+ str r2, [r1, #0x0]
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r9,lr}
+ bx lr
+ .balign 4
+_020D6A14: .word 0x021D55C0
+
+ arm_func_start CARDi_SetTask
+CARDi_SetTask: ; 0x020D6A18
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r4, _020D6A5C ; =0x021D55C0
+ mov r5, r0
+ ldr r1, [r4, #0x108]
+ add r0, r4, #0x44
+ bl OS_SetThreadPriority
+ add r0, r4, #0x44
+ str r0, [r4, #0x104]
+ str r5, [r4, #0x40]
+ ldr r1, [r4, #0x114]
+ orr r1, r1, #0x8
+ str r1, [r4, #0x114]
+ bl OS_WakeupThreadDirect
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D6A5C: .word 0x021D55C0
diff --git a/arm9/asm/CARD_pullOut.s b/arm9/asm/CARD_pullOut.s
new file mode 100644
index 00000000..662ef075
--- /dev/null
+++ b/arm9/asm/CARD_pullOut.s
@@ -0,0 +1,169 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARDi_SendtoPxi
+CARDi_SendtoPxi: ; 0x020D7BCC
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r7, r0
+ mov r6, r1
+ mov r1, r7
+ mov r0, #0xe
+ mov r2, #0x0
+ bl PXI_SendWordByFifo
+_020D7BEC: ; 0x020D7BEC
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r7,lr}
+ bxeq lr
+ mov r5, #0xe
+ mov r4, #0x0
+_020D7C04:
+ mov r0, r6
+ bl SVC_WaitByLoop
+ mov r0, r5
+ mov r1, r7
+ mov r2, r4
+ bl PXI_SendWordByFifo
+_020D7C1C: ; 0x020D7C1C
+ cmp r0, #0x0
+ bne _020D7C04
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+
+ arm_func_start CARDi_CheckPulledOutCore
+CARDi_CheckPulledOutCore:
+ stmdb sp!, {r4,lr}
+ sub sp, sp, #0x8
+ ldr r1, _020D7C94 ; =0x027FFC10
+ ldrh r1, [r1, #0x0]
+ cmp r1, #0x0
+ ldreq r1, _020D7C98 ; =0x027FF800
+ ldrne r1, _020D7C9C ; =0x027FFC00
+ ldr r1, [r1, #0x0]
+ str r1, [sp, #0x0]
+ ldr r1, [sp, #0x0]
+ cmp r0, r1
+ addeq sp, sp, #0x8
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, #0xe
+ mov r1, #0x11
+ mov r2, #0x0
+ bl CARDi_PulledOutCallback
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x8
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020D7C94: .word 0x027FFC10
+_020D7C98: .word 0x027FF800
+_020D7C9C: .word 0x027FFC00
+
+ arm_func_start CARD_TerminateForPulledOut
+CARD_TerminateForPulledOut: ; 0x020D7CA0
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r0, _020D7D10 ; =0x027FFFA8
+ mov r5, #0x1
+ ldrh r0, [r0, #0x0]
+ and r0, r0, #0x8000
+ movs r0, r0, asr #0xf
+ beq _020D7CEC
+ bl PM_ForceToPowerOff
+ cmp r0, #0x4
+ bne _020D7CE4
+ ldr r4, _020D7D14 ; =0x000A3A47
+_020D7CD0:
+ mov r0, r4
+ bl OS_SpinWait
+ bl PM_ForceToPowerOff
+ cmp r0, #0x4
+ beq _020D7CD0
+_020D7CE4:
+ cmp r0, #0x0
+ moveq r5, #0x0
+_020D7CEC:
+ cmp r5, #0x0
+ beq _020D7D00
+ mov r0, #0x1
+ mov r1, r0
+ bl CARDi_SendtoPxi
+_020D7D00:
+ bl OS_Terminate
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D7D10: .word 0x027FFFA8
+_020D7D14: .word 0x000A3A47
+
+ arm_func_start CARD_IsPulledOut
+CARD_IsPulledOut: ; 0x020D7D18
+ ldr r0, _020D7D24 ; =0x021D5E20
+ ldr r0, [r0, #0x0]
+ bx lr
+ .balign 4
+_020D7D24: .word 0x021D5E20
+
+ arm_func_start CARDi_PulledOutCallback
+CARDi_PulledOutCallback: ; 0x020D7D28
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ and r0, r1, #0x3f
+ cmp r0, #0x11
+ bne _020D7D90
+ ldr r2, _020D7DA0 ; =0x021D5E20
+ ldr r0, [r2, #0x0]
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ ldr r1, _020D7DA4 ; =0x021D5E24
+ mov r0, #0x1
+ ldr r1, [r1, #0x0]
+ str r0, [r2, #0x0]
+ cmp r1, #0x0
+ beq _020D7D70
+ blx r1
+_020D7D70:
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {lr}
+ bxeq lr
+ bl CARD_TerminateForPulledOut
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+_020D7D90:
+ bl OS_Terminate
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D7DA0: .word 0x021D5E20
+_020D7DA4: .word 0x021D5E24
+
+ arm_func_start CARD_InitPulledOutCallback
+CARD_InitPulledOutCallback: ; 0x020D7DA8
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl PXI_Init
+ ldr r1, _020D7DD8 ; =CARDi_PulledOutCallback
+ mov r0, #0xe
+ bl PXI_SetFifoRecvCallback
+ ldr r0, _020D7DDC ; =0x021D5E24
+ mov r1, #0x0
+ str r1, [r0, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D7DD8: .word CARDi_PulledOutCallback
+_020D7DDC: .word 0x021D5E24
diff --git a/arm9/asm/CARD_request.s b/arm9/asm/CARD_request.s
new file mode 100644
index 00000000..bb9c32a9
--- /dev/null
+++ b/arm9/asm/CARD_request.s
@@ -0,0 +1,162 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARDi_Request
+CARDi_Request:
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ mov r6, r0
+ ldr r0, [r6, #0x114]
+ mov r5, r1
+ mov r4, r2
+ ands r0, r0, #0x2
+ bne _020D7A44
+ ldr r1, [r6, #0x114]
+ mov r0, #0xb
+ orr r2, r1, #0x2
+ mov r1, #0x1
+ str r2, [r6, #0x114]
+ bl PXI_IsCallbackReady
+_020D7A04: ; 0x020D7A04
+ cmp r0, #0x0
+ bne _020D7A34
+ mov r9, #0x64
+ mov r8, #0xb
+ mov r7, #0x1
+_020D7A18:
+ mov r0, r9
+ bl OS_SpinWait
+ mov r0, r8
+ mov r1, r7
+ bl PXI_IsCallbackReady
+_020D7A2C: ; 0x020D7A2C
+ cmp r0, #0x0
+ beq _020D7A18
+_020D7A34:
+ mov r0, r6
+ mov r1, #0x0
+ mov r2, #0x1
+ bl CARDi_Request
+_020D7A44:
+ ldr r0, [r6, #0x0]
+ mov r1, #0x60
+ bl DC_FlushRange
+ bl DC_WaitWriteBufferEmpty
+ mov r9, #0xb
+ mov r8, #0x1
+ mov r7, #0x0
+ mov r11, #0x60
+_020D7A64:
+ str r5, [r6, #0x4]
+ ldr r0, [r6, #0x114]
+ orr r0, r0, #0x20
+ str r0, [r6, #0x114]
+_020D7A74:
+ mov r0, r9
+ mov r1, r5
+ mov r2, r8
+ bl PXI_SendWordByFifo
+_020D7A84: ; 0x020D7A84
+ cmp r0, #0x0
+ blt _020D7A74
+ cmp r5, #0x0
+ bne _020D7AB0
+ ldr r10, [r6, #0x0]
+_020D7A98:
+ mov r0, r9
+ mov r1, r10
+ mov r2, r8
+ bl PXI_SendWordByFifo
+_020D7AA8: ; 0x020D7AA8
+ cmp r0, #0x0
+ blt _020D7A98
+_020D7AB0:
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x114]
+ mov r10, r0
+ ands r0, r1, #0x20
+ beq _020D7AD8
+_020D7AC4:
+ mov r0, r7
+ bl OS_SleepThread
+ ldr r0, [r6, #0x114]
+ ands r0, r0, #0x20
+ bne _020D7AC4
+_020D7AD8:
+ mov r0, r10
+ bl OS_RestoreInterrupts
+_020D7AE0: ; 0x020D7AE0
+ ldr r0, [r6, #0x0]
+ mov r1, r11
+ bl DC_InvalidateRange
+_020D7AEC: ; 0x020D7AEC
+ ldr r0, [r6, #0x0]
+ ldr r0, [r0, #0x0]
+ cmp r0, #0x4
+ bne _020D7B08
+ sub r4, r4, #0x1
+ cmp r4, #0x0
+ bgt _020D7A64
+_020D7B08:
+ cmp r0, #0x0
+ moveq r0, #0x1
+ movne r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+
+ arm_func_start CARDi_TaskThread
+CARDi_TaskThread: ; 0x020D7B20
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ ldr r5, _020D7B78 ; =0x021D55C0
+ mov r6, #0x0
+ add r7, r5, #0x44
+_020D7B34:
+ bl OS_DisableInterrupts
+ ldr r1, [r5, #0x114]
+ mov r4, r0
+ ands r0, r1, #0x8
+ bne _020D7B60
+_020D7B48:
+ mov r0, r6
+ str r7, [r5, #0x104]
+ bl OS_SleepThread
+ ldr r0, [r5, #0x114]
+ ands r0, r0, #0x8
+ beq _020D7B48
+_020D7B60:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ ldr r1, [r5, #0x40]
+ mov r0, r5
+ blx r1
+ b _020D7B34
+ .balign 4
+_020D7B78: .word 0x021D55C0
+
+ arm_func_start CARDi_OnFifoRecv
+CARDi_OnFifoRecv: ; 0x020D7B7C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r0, #0xb
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ cmp r2, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {lr}
+ bxeq lr
+ ldr r1, _020D7BC8 ; =0x021D55C0
+ ldr r0, [r1, #0x114]
+ bic r0, r0, #0x20
+ str r0, [r1, #0x114]
+ ldr r0, [r1, #0x104]
+ bl OS_WakeupThreadDirect
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D7BC8: .word 0x021D55C0
diff --git a/arm9/asm/CARD_rom.s b/arm9/asm/CARD_rom.s
new file mode 100644
index 00000000..0f38e283
--- /dev/null
+++ b/arm9/asm/CARD_rom.s
@@ -0,0 +1,582 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARDi_GetRomAccessor
+CARDi_GetRomAccessor: ; 0x020D7210
+ ldr r0, _020D7218 ; =CARDi_ReadCard
+ bx lr
+ .balign 4
+_020D7218: .word CARDi_ReadCard
+
+ arm_func_start CARD_WaitRomAsync
+CARD_WaitRomAsync: ; 0x020D721C
+ ldr ip, _020D7224 ; =CARDi_WaitAsync
+ bx r12
+ .balign 4
+_020D7224: .word CARDi_WaitAsync
+
+ arm_func_start CARD_Init
+CARD_Init: ; 0x020D7228
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr ip, _020D72A0 ; =0x021D55C0
+ ldr r0, [r12, #0x114]
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ mov r0, #0x1
+ str r0, [r12, #0x114]
+ mov r3, #0x0
+ str r3, [r12, #0x24]
+ ldr r0, [r12, #0x24]
+ mvn r1, #0x0
+ str r0, [r12, #0x20]
+ ldr r2, [r12, #0x20]
+ ldr r0, _020D72A4 ; =0x021D5BE0
+ str r2, [r12, #0x1c]
+ str r1, [r12, #0x28]
+ str r3, [r12, #0x38]
+ str r3, [r12, #0x3c]
+ str r3, [r0, #0x0]
+ bl CARDi_InitCommon
+ bl CARDi_GetRomAccessor
+ ldr r1, _020D72A8 ; =0x021D5C00
+ str r0, [r1, #0x0]
+ bl CARD_InitPulledOutCallback
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D72A0: .word 0x021D55C0
+_020D72A4: .word 0x021D5BE0
+_020D72A8: .word 0x021D5C00
+
+ arm_func_start CARDi_ReadRom
+CARDi_ReadRom: ; 0x020D72AC
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ ldr r6, _020D73C0 ; =0x021D55C0
+ mov r10, r0
+ mov r9, r1
+ mov r8, r2
+ mov r7, r3
+ ldr fp, _020D73C4 ; =0x021D5C00
+ bl CARD_CheckEnabled
+ bl OS_DisableInterrupts
+ ldr r1, [r6, #0x114]
+ mov r5, r0
+ ands r0, r1, #0x4
+ beq _020D72FC
+ add r4, r6, #0x10c
+_020D72E8:
+ mov r0, r4
+ bl OS_SleepThread
+ ldr r0, [r6, #0x114]
+ ands r0, r0, #0x4
+ bne _020D72E8
+_020D72FC:
+ ldr r1, [r6, #0x114]
+ ldr r0, [sp, #0x28]
+ orr r1, r1, #0x4
+ str r1, [r6, #0x114]
+ ldr r1, [sp, #0x2c]
+ str r0, [r6, #0x38]
+ mov r0, r5
+ str r1, [r6, #0x3c]
+ bl OS_RestoreInterrupts
+ ldr r0, _020D73C8 ; =0x021D5BE0
+ str r10, [r6, #0x28]
+ ldr r0, [r0, #0x0]
+ cmp r10, #0x3
+ add r0, r9, r0
+ str r0, [r6, #0x1c]
+ str r8, [r6, #0x20]
+ str r7, [r6, #0x24]
+ bhi _020D734C
+ mov r0, r10
+ bl MI_StopDma
+_020D734C:
+ mov r0, r11
+ bl CARDi_TryReadCardDma
+_020D7354: ; 0x020D7354
+ cmp r0, #0x0
+ beq _020D7380
+ ldr r0, [sp, #0x30]
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {r4-r11,lr}
+ bxne lr
+ bl CARD_WaitRomAsync
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+_020D7380:
+ ldr r0, [sp, #0x30]
+ cmp r0, #0x0
+ beq _020D73A0
+ ldr r0, _020D73CC ; =CARDi_ReadRomSyncCore
+ bl CARDi_SetTask
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+_020D73A0:
+ ldr r1, _020D73D0 ; =0x021D3498
+ mov r0, r6
+ ldr r1, [r1, #0x4]
+ str r1, [r6, #0x104]
+ bl CARDi_ReadRomSyncCore
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_020D73C0: .word 0x021D55C0
+_020D73C4: .word 0x021D5C00
+_020D73C8: .word 0x021D5BE0
+_020D73CC: .word CARDi_ReadRomSyncCore
+_020D73D0: .word 0x021D3498
+
+ arm_func_start CARDi_ReadRomSyncCore
+CARDi_ReadRomSyncCore: ; 0x020D73D4
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ ldr r4, _020D7478 ; =0x021D5C00
+ mov r0, r4
+ bl CARDi_ReadFromCache
+_020D73E8: ; 0x020D73E8
+ cmp r0, #0x0
+ beq _020D73FC
+ ldr r1, [r4, #0x0]
+ mov r0, r4
+ blx r1
+_020D73FC:
+ ldr r7, _020D747C ; =0x021D55C0
+ bl CARDi_ReadRomIDCore
+ bl CARDi_CheckPulledOutCore
+_020D7408: ; 0x020D7408
+ ldr r0, [r7, #0x0]
+ mov r1, #0x0
+ str r1, [r0, #0x0]
+ ldr r6, [r7, #0x38]
+ ldr r5, [r7, #0x3c]
+ bl OS_DisableInterrupts
+ ldr r1, [r7, #0x114]
+ mov r4, r0
+ bic r0, r1, #0x4c
+ str r0, [r7, #0x114]
+ add r0, r7, #0x10c
+ bl OS_WakeupThread
+ ldr r0, [r7, #0x114]
+ ands r0, r0, #0x10
+ beq _020D744C
+ add r0, r7, #0x44
+ bl OS_WakeupThreadDirect
+_020D744C:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_020D7454: ; 0x020D7454
+ cmp r6, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r7,lr}
+ bxeq lr
+ mov r0, r5
+ blx r6
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+ .balign 4
+_020D7478: .word 0x021D5C00
+_020D747C: .word 0x021D55C0
+
+ arm_func_start CARDi_ReadRomIDCore
+CARDi_ReadRomIDCore: ; 0x020D7480
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r0, #0xb8000000
+ mov r1, #0x0
+ bl CARDi_SetRomOp
+ ldr r1, _020D74DC ; =0x02106A50
+ mov r0, #0x2000
+ ldr r1, [r1, #0x0]
+ rsb r0, r0, #0x0
+ ldr r2, [r1, #0x60]
+ ldr r1, _020D74E0 ; =0x040001A4
+ bic r2, r2, #0x7000000
+ orr r2, r2, #0xa7000000
+ and r0, r2, r0
+ str r0, [r1, #0x0]
+_020D74BC:
+ ldr r0, [r1, #0x0]
+ ands r0, r0, #0x800000
+ beq _020D74BC
+ ldr r0, _020D74E4 ; =0x04100010
+ ldr r0, [r0, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020D74DC: .word 0x02106A50
+_020D74E0: .word 0x040001A4
+_020D74E4: .word 0x04100010
+
+ arm_func_start CARDi_ReadCard
+CARDi_ReadCard: ; 0x020D74E8
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ mov r10, r0
+ ldr sb, _020D75DC ; =0x021D55C0
+ add r7, r10, #0x20
+ ldr r5, _020D75E0 ; =0x04100010
+ ldr r6, _020D75E4 ; =0x040001A4
+ mov r11, #0x0
+ mov r0, #0x200
+ rsb r4, r0, #0x0
+_020D7510:
+ ldr r0, [r9, #0x1c]
+ and r1, r0, r4
+ cmp r1, r0
+ bne _020D7538
+ ldr r8, [r9, #0x20]
+ ands r0, r8, #0x3
+ bne _020D7538
+ ldr r0, [r9, #0x24]
+ cmp r0, #0x200
+ bhs _020D7540
+_020D7538:
+ mov r8, r7
+ str r1, [r10, #0x8]
+_020D7540:
+ mov r0, r1, lsr #0x8
+ orr r0, r0, #0xb7000000
+ mov r1, r1, lsl #0x18
+ bl CARDi_SetRomOp
+ ldr r1, [r10, #0x4]
+ mov r0, r11
+ str r1, [r6, #0x0]
+_020D755C:
+ ldr r2, [r6, #0x0]
+ ands r1, r2, #0x800000
+ beq _020D7578
+ ldr r1, [r5, #0x0]
+ cmp r0, #0x200
+ strcc r1, [r8, r0, lsl #0x2]
+ addcc r0, r0, #0x1
+_020D7578:
+ ands r1, r2, #0x80000000
+ bne _020D755C
+ ldr r0, [r9, #0x20]
+ cmp r8, r0
+ bne _020D75C0
+ ldr r2, [r9, #0x1c]
+ ldr r1, [r9, #0x20]
+ ldr r0, [r9, #0x24]
+ add r2, r2, #0x200
+ add r1, r1, #0x200
+ subs r0, r0, #0x200
+ str r2, [r9, #0x1c]
+ str r1, [r9, #0x20]
+ str r0, [r9, #0x24]
+ bne _020D7510
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+_020D75C0:
+ mov r0, r10
+ bl CARDi_ReadFromCache
+_020D75C8: ; 0x020D75C8
+ cmp r0, #0x0
+ bne _020D7510
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_020D75DC: .word 0x021D55C0
+_020D75E0: .word 0x04100010
+_020D75E4: .word 0x040001A4
+
+ arm_func_start CARDi_TryReadCardDma
+CARDi_TryReadCardDma:
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ ldr fp, _020D7748 ; =0x021D55C0
+ mov r7, #0x0
+ ldr r9, [r11, #0x20]
+ mov r10, r0
+ mov r6, r7
+ mov r5, r7
+ mov r1, r7
+ ands r4, r9, #0x1f
+ ldr r8, [r11, #0x24]
+ bne _020D7624
+ ldr r0, [r11, #0x28]
+ cmp r0, #0x3
+ movls r1, #0x1
+_020D7624:
+ cmp r1, #0x0
+ beq _020D7678
+ bl OS_GetDTCMAddress
+ ldr r1, _020D774C ; =0x01FF8000
+ add r2, r9, r8
+ cmp r2, r1
+ mov r3, #0x1
+ mov r1, #0x0
+ bls _020D7650
+ cmp r9, #0x2000000
+ movcc r1, r3
+_020D7650:
+ cmp r1, #0x0
+ bne _020D7670
+ cmp r0, r2
+ bhs _020D766C
+ add r0, r0, #0x4000
+ cmp r0, r9
+ bhi _020D7670
+_020D766C:
+ mov r3, #0x0
+_020D7670:
+ cmp r3, #0x0
+ moveq r5, #0x1
+_020D7678:
+ cmp r5, #0x0
+ beq _020D7694
+ ldr r1, [r11, #0x1c]
+ ldr r0, _020D7750 ; =0x000001FF
+ orr r1, r1, r8
+ ands r0, r1, r0
+ moveq r6, #0x1
+_020D7694:
+ cmp r6, #0x0
+ beq _020D76A4
+ cmp r8, #0x0
+ movne r7, #0x1
+_020D76A4:
+ ldr r0, _020D7754 ; =0x02106A50
+ cmp r7, #0x0
+ ldr r0, [r0, #0x0]
+ ldr r0, [r0, #0x60]
+ bic r0, r0, #0x7000000
+ orr r0, r0, #0xa1000000
+ str r0, [r10, #0x4]
+ beq _020D7738
+ bl OS_DisableInterrupts
+ mov r5, r0
+ mov r0, r9
+ mov r1, r8
+ bl IC_InvalidateRange
+_020D76D8: ; 0x020D76D8
+ cmp r4, #0x0
+ beq _020D7700
+ sub r9, r9, r4
+ mov r0, r9
+ mov r1, #0x20
+ bl DC_StoreRange
+ add r0, r9, r8
+ mov r1, #0x20
+ bl DC_StoreRange
+ add r8, r8, #0x20
+_020D7700:
+ mov r0, r9
+ mov r1, r8
+ bl DC_InvalidateRange
+ bl DC_WaitWriteBufferEmpty
+ ldr r1, _020D7758 ; =CARDi_OnReadCard
+ mov r0, #0x80000
+ bl OS_SetIrqFunction
+ mov r0, #0x80000
+ bl OS_ResetRequestIrqMask
+ mov r0, #0x80000
+ bl OS_EnableIrqMask
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ bl CARDi_SetCardDma
+_020D7738:
+ mov r0, r7
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_020D7748: .word cardi_common
+_020D774C: .word 0x01FF8000
+_020D7750: .word 0x000001FF
+_020D7754: .word 0x02106A50
+_020D7758: .word CARDi_OnReadCard
+
+ arm_func_start CARDi_OnReadCard
+CARDi_OnReadCard: ; 0x020D775C
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ ldr r0, _020D7838 ; =0x021D55C0
+ ldr r0, [r0, #0x28]
+ bl MI_StopDma
+ ldr r0, _020D7838 ; =0x021D55C0
+ ldr r3, [r0, #0x1c]
+ ldr r2, [r0, #0x20]
+ ldr r1, [r0, #0x24]
+ add r3, r3, #0x200
+ add r2, r2, #0x200
+ subs r1, r1, #0x200
+ str r3, [r0, #0x1c]
+ str r2, [r0, #0x20]
+ str r1, [r0, #0x24]
+ bne _020D7828
+ mov r0, #0x80000
+ bl OS_DisableIrqMask
+ mov r0, #0x80000
+ bl OS_ResetRequestIrqMask
+ ldr r7, _020D7838 ; =0x021D55C0
+ bl CARDi_ReadRomIDCore
+ bl CARDi_CheckPulledOutCore
+_020D77B8: ; 0x020D77B8
+ ldr r0, [r7, #0x0]
+ mov r1, #0x0
+ str r1, [r0, #0x0]
+ ldr r6, [r7, #0x38]
+ ldr r5, [r7, #0x3c]
+ bl OS_DisableInterrupts
+ ldr r1, [r7, #0x114]
+ mov r4, r0
+ bic r0, r1, #0x4c
+ str r0, [r7, #0x114]
+ add r0, r7, #0x10c
+ bl OS_WakeupThread
+ ldr r0, [r7, #0x114]
+ ands r0, r0, #0x10
+ beq _020D77FC
+ add r0, r7, #0x44
+ bl OS_WakeupThreadDirect
+_020D77FC:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+_020D7804: ; 0x020D7804
+ cmp r6, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r7,lr}
+ bxeq lr
+ mov r0, r5
+ blx r6
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+_020D7828:
+ bl CARDi_SetCardDma
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+ .balign 4
+_020D7838: .word 0x021D55C0
+
+ arm_func_start CARDi_SetCardDma
+CARDi_SetCardDma: ; 0x020D783C
+ stmdb sp!, {r4,lr}
+ ldr r4, _020D7884 ; =0x021D55C0
+ ldr r1, _020D7888 ; =0x04100010
+ ldr r0, [r4, #0x28]
+ ldr r2, [r4, #0x20]
+ mov r3, #0x200
+ bl MIi_CardDmaCopy32
+ ldr r1, [r4, #0x1c]
+ mov r0, r1, lsr #0x8
+ orr r0, r0, #0xb7000000
+ mov r1, r1, lsl #0x18
+ bl CARDi_SetRomOp
+ ldr r0, _020D788C ; =0x021D5C00
+ ldr r1, _020D7890 ; =0x040001A4
+ ldr r0, [r0, #0x4]
+ str r0, [r1, #0x0]
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020D7884: .word 0x021D55C0
+_020D7888: .word 0x04100010
+_020D788C: .word 0x021D5C00
+_020D7890: .word 0x040001A4
+
+ arm_func_start CARDi_SetRomOp
+CARDi_SetRomOp: ; 0x020D7894
+ ldr r3, _020D790C ; =0x040001A4
+_020D7898:
+ ldr r2, [r3, #0x0]
+ ands r2, r2, #0x80000000
+ bne _020D7898
+ ldr r3, _020D7910 ; =0x040001A1
+ mov r12, #0xc0
+ ldr r2, _020D7914 ; =0x040001A8
+ strb r12, [r3, #0x0]
+ mov r12, r0, lsr #0x18
+ ldr r3, _020D7918 ; =0x040001A9
+ strb r12, [r2, #0x0]
+ mov r12, r0, lsr #0x10
+ ldr r2, _020D791C ; =0x040001AA
+ strb r12, [r3, #0x0]
+ mov r12, r0, lsr #0x8
+ ldr r3, _020D7920 ; =0x040001AB
+ strb r12, [r2, #0x0]
+ ldr r2, _020D7924 ; =0x040001AC
+ strb r0, [r3, #0x0]
+ mov r3, r1, lsr #0x18
+ ldr r0, _020D7928 ; =0x040001AD
+ strb r3, [r2, #0x0]
+ mov r3, r1, lsr #0x10
+ ldr r2, _020D792C ; =0x040001AE
+ strb r3, [r0, #0x0]
+ mov r3, r1, lsr #0x8
+ ldr r0, _020D7930 ; =0x040001AF
+ strb r3, [r2, #0x0]
+ strb r1, [r0, #0x0]
+ bx lr
+ .balign 4
+_020D790C: .word 0x040001A4
+_020D7910: .word 0x040001A1
+_020D7914: .word 0x040001A8
+_020D7918: .word 0x040001A9
+_020D791C: .word 0x040001AA
+_020D7920: .word 0x040001AB
+_020D7924: .word 0x040001AC
+_020D7928: .word 0x040001AD
+_020D792C: .word 0x040001AE
+_020D7930: .word 0x040001AF
+
+ arm_func_start CARDi_ReadFromCache
+CARDi_ReadFromCache:
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r5, _020D79C8 ; =0x021D55C0
+ mov r1, #0x200
+ ldr r3, [r5, #0x1c]
+ rsb r1, r1, #0x0
+ ldr r2, [r0, #0x8]
+ and r3, r3, r1
+ cmp r3, r2
+ bne _020D79AC
+ ldr r2, [r5, #0x1c]
+ ldr r1, [r5, #0x24]
+ sub r3, r2, r3
+ rsb r4, r3, #0x200
+ cmp r4, r1
+ movhi r4, r1
+ add r0, r0, #0x20
+ ldr r1, [r5, #0x20]
+ mov r2, r4
+ add r0, r0, r3
+ bl MI_CpuCopy8
+ ldr r0, [r5, #0x1c]
+ add r0, r0, r4
+ str r0, [r5, #0x1c]
+ ldr r0, [r5, #0x20]
+ add r0, r0, r4
+ str r0, [r5, #0x20]
+ ldr r0, [r5, #0x24]
+ sub r0, r0, r4
+ str r0, [r5, #0x24]
+_020D79AC:
+ ldr r0, [r5, #0x24]
+ cmp r0, #0x0
+ movne r0, #0x1
+ moveq r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D79C8: .word 0x021D55C0
diff --git a/arm9/asm/CARD_spi.s b/arm9/asm/CARD_spi.s
new file mode 100644
index 00000000..3feb1a1f
--- /dev/null
+++ b/arm9/asm/CARD_spi.s
@@ -0,0 +1,223 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start CARDi_IdentifyBackupCore
+CARDi_IdentifyBackupCore: ; 0x020D6A60
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r1, _020D6D60 ; =0x021D55C0
+ mov r5, r0
+ ldr r4, [r1, #0x0]
+ mov r1, #0x0
+ add r0, r4, #0x18
+ mov r2, #0x48
+ bl MI_CpuFill8
+_020D6A84: ; 0x020D6A84
+ cmp r5, #0x0
+ str r5, [r4, #0x4]
+ mov r0, #0x3f
+ addeq sp, sp, #0x4
+ str r0, [r4, #0x4c]
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ mov r0, r5, asr #0x8
+ and r0, r0, #0xff
+ mov r2, #0x1
+ mov r3, r2, lsl r0
+ and r1, r5, #0xff
+ str r3, [r4, #0x18]
+ mov r0, #0xff
+ strb r0, [r4, #0x48]
+ cmp r1, #0x1
+ bne _020D6B80
+ cmp r3, #0x200
+ beq _020D6AE4
+ cmp r3, #0x2000
+ beq _020D6B04
+ cmp r3, #0x10000
+ beq _020D6B28
+ b _020D6D38
+_020D6AE4:
+ mov r0, #0x10
+ str r0, [r4, #0x20]
+ str r2, [r4, #0x24]
+ mov r0, #0x5
+ str r0, [r4, #0x28]
+ mov r0, #0xf0
+ strb r0, [r4, #0x48]
+ b _020D6B48
+_020D6B04:
+ mov r0, #0x20
+ str r0, [r4, #0x20]
+ mov r0, #0x2
+ str r0, [r4, #0x24]
+ mov r0, #0x5
+ str r0, [r4, #0x28]
+ mov r0, #0x0
+ strb r0, [r4, #0x48]
+ b _020D6B48
+_020D6B28:
+ mov r0, #0x80
+ str r0, [r4, #0x20]
+ mov r0, #0x2
+ str r0, [r4, #0x24]
+ mov r0, #0xa
+ str r0, [r4, #0x28]
+ mov r0, #0x0
+ strb r0, [r4, #0x48]
+_020D6B48:
+ ldr r0, [r4, #0x20]
+ add sp, sp, #0x4
+ str r0, [r4, #0x1c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x40
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x100
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x200
+ str r0, [r4, #0x4c]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D6B80:
+ cmp r1, #0x2
+ bne _020D6CD8
+ cmp r3, #0x100000
+ bhi _020D6BB8
+ cmp r3, #0x100000
+ bhs _020D6BD8
+ cmp r3, #0x40000
+ bhi _020D6BAC
+ cmp r3, #0x40000
+ beq _020D6BD8
+ b _020D6D38
+_020D6BAC:
+ cmp r3, #0x80000
+ beq _020D6BD8
+ b _020D6D38
+_020D6BB8:
+ cmp r3, #0x200000
+ bhi _020D6BCC
+ cmp r3, #0x200000
+ beq _020D6C10
+ b _020D6D38
+_020D6BCC:
+ cmp r3, #0x800000
+ beq _020D6C48
+ b _020D6D38
+_020D6BD8:
+ mov r0, #0x19
+ str r0, [r4, #0x2c]
+ mov r1, #0x12c
+ str r1, [r4, #0x30]
+ ldr r0, _020D6D64 ; =0x00001388
+ str r1, [r4, #0x44]
+ str r0, [r4, #0x3c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x80
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x400
+ str r0, [r4, #0x4c]
+ b _020D6C7C
+_020D6C10:
+ mov r1, #0x3e8
+ ldr r0, _020D6D68 ; =0x00000BB8
+ str r1, [r4, #0x3c]
+ ldr r1, _020D6D6C ; =0x00004268
+ str r0, [r4, #0x40]
+ ldr r0, _020D6D70 ; =0x00009C40
+ str r1, [r4, #0x34]
+ str r0, [r4, #0x38]
+ mov r0, #0x0
+ strb r0, [r4, #0x48]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x1000
+ str r0, [r4, #0x4c]
+ b _020D6C7C
+_020D6C48:
+ mov r1, #0x3e8
+ ldr r0, _020D6D68 ; =0x00000BB8
+ str r1, [r4, #0x3c]
+ ldr r1, _020D6D74 ; =0x000109A0
+ str r0, [r4, #0x40]
+ ldr r0, _020D6D78 ; =0x00027100
+ str r1, [r4, #0x34]
+ str r0, [r4, #0x38]
+ mov r0, #0x0
+ strb r0, [r4, #0x48]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x1000
+ str r0, [r4, #0x4c]
+_020D6C7C:
+ mov r0, #0x10000
+ str r0, [r4, #0x1c]
+ mov r0, #0x100
+ str r0, [r4, #0x20]
+ mov r0, #0x3
+ str r0, [r4, #0x24]
+ mov r0, #0x5
+ str r0, [r4, #0x28]
+ ldr r0, [r4, #0x4c]
+ add sp, sp, #0x4
+ orr r0, r0, #0x40
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x100
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x200
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x800
+ str r0, [r4, #0x4c]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D6CD8:
+ cmp r1, #0x3
+ bne _020D6D38
+ cmp r3, #0x2000
+ beq _020D6CF0
+ cmp r3, #0x8000
+ bne _020D6D38
+_020D6CF0:
+ str r3, [r4, #0x20]
+ str r3, [r4, #0x1c]
+ mov r0, #0x2
+ str r0, [r4, #0x24]
+ mov r0, #0x0
+ strb r0, [r4, #0x48]
+ ldr r0, [r4, #0x4c]
+ add sp, sp, #0x4
+ orr r0, r0, #0x40
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x100
+ str r0, [r4, #0x4c]
+ ldr r0, [r4, #0x4c]
+ orr r0, r0, #0x200
+ str r0, [r4, #0x4c]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020D6D38:
+ mov r1, #0x0
+ str r1, [r4, #0x4]
+ str r1, [r4, #0x18]
+ ldr r0, _020D6D60 ; =0x021D55C0
+ mov r1, #0x3
+ ldr r0, [r0, #0x0]
+ str r1, [r0, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D6D60: .word 0x021D55C0
+_020D6D64: .word 0x00001388
+_020D6D68: .word 0x00000BB8
+_020D6D6C: .word 0x00004268
+_020D6D70: .word 0x00009C40
+_020D6D74: .word 0x000109A0
+_020D6D78: .word 0x00027100
diff --git a/arm9/asm/RTC_convert.s b/arm9/asm/RTC_convert.s
new file mode 100644
index 00000000..a31a349b
--- /dev/null
+++ b/arm9/asm/RTC_convert.s
@@ -0,0 +1,320 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start RTC_GetDayOfWeek
+RTC_GetDayOfWeek: ; 0x020D6248
+ stmdb sp!, {r4-r6,lr}
+ ldr r1, [r0, #0x4]
+ ldr r2, [r0, #0x0]
+ sub r3, r1, #0x2
+ cmp r3, #0x1
+ add lr, r2, #0x7d0
+ ldr r4, _020D630C ; =0x51EB851F
+ sublt lr, lr, #0x1
+ ldr r12, [r0, #0x8]
+ smull r0, r2, r4, lr
+ addlt r3, r3, #0xc
+ mov r1, #0x1a
+ mul r0, r3, r1
+ smull r1, r3, r4, lr
+ ldr r5, _020D6310 ; =0x66666667
+ sub r0, r0, #0x2
+ smull r4, r1, r5, r0
+ mov r4, lr, lsr #0x1f
+ mov r2, r2, asr #0x5
+ mov r3, r3, asr #0x5
+ add r3, r4, r3
+ ldr r5, _020D6314 ; =0x00000064
+ add r2, r4, r2
+ smull r2, r4, r5, r2
+ sub r2, lr, r2
+ mov r1, r1, asr #0x2
+ mov r0, r0, lsr #0x1f
+ add r1, r0, r1
+ mov r4, r2, asr #0x1
+ add r0, r12, r1
+ add r1, r2, r4, lsr #0x1e
+ add r2, r2, r0
+ mov r6, r3, asr #0x1
+ add r0, r3, r6, lsr #0x1e
+ add r1, r2, r1, asr #0x2
+ add r1, r1, r0, asr #0x2
+ mov r0, #0x5
+ mla r4, r3, r0, r1
+ ldr r3, _020D6318 ; =0x92492493
+ mov r1, r4, lsr #0x1f
+ smull r2, r0, r3, r4
+ add r0, r4, r0
+ mov r0, r0, asr #0x2
+ ldr r2, _020D631C ; =0x00000007
+ add r0, r1, r0
+ smull r0, r1, r2, r0
+ sub r0, r4, r0
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D630C: .word 0x51EB851F
+_020D6310: .word 0x66666667
+_020D6314: .word 0x00000064
+_020D6318: .word 0x92492493
+_020D631C: .word 0x00000007
+
+ arm_func_start RTC_ConvertSecondToDateTime
+RTC_ConvertSecondToDateTime: ; 0x020D6320
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r5, r2
+ mov r12, #0x0
+ mov r4, r3
+ subs r2, r5, r12
+ sbcs r2, r4, r12
+ mov r7, r0
+ mov r6, r1
+ movlt r5, r12
+ movlt r4, r12
+ blt _020D6364
+ ldr r1, _020D63B0 ; =0xBC19137F
+ subs r0, r1, r5
+ sbcs r0, r12, r4
+ movlt r5, r1
+ movlt r4, r12
+_020D6364:
+ ldr r2, _020D63B4 ; =0x00015180
+ mov r0, r5
+ mov r1, r4
+ mov r3, #0x0
+ bl _ll_mod
+ mov r1, r0
+ mov r0, r6
+ bl RTCi_ConvertSecondToTime
+ ldr r2, _020D63B4 ; =0x00015180
+ mov r0, r5
+ mov r1, r4
+ mov r3, #0x0
+ bl _ll_sdiv
+ mov r1, r0
+ mov r0, r7
+ bl RTC_ConvertDayToDate
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+ .balign 4
+_020D63B0: .word 0xBC19137F
+_020D63B4: .word 0x00015180
+
+ arm_func_start RTCi_ConvertSecondToTime
+RTCi_ConvertSecondToTime: ; 0x020D63B8
+ stmdb sp!, {r4-r6,lr}
+ ldr r2, _020D6448 ; =0x0001517F
+ cmp r1, #0x0
+ movlt r1, #0x0
+ cmp r1, r2
+ ldr ip, _020D644C ; =0x88888889
+ movgt r1, r2
+ smull r2, r3, r12, r1
+ smull r2, lr, r12, r1
+ ldr r5, _020D6450 ; =0x91A2B3C5
+ add r3, r1, r3
+ smull r4, r2, r5, r1
+ mov r5, r1, lsr #0x1f
+ mov r3, r3, asr #0x5
+ add r3, r5, r3
+ smull r4, r6, r12, r3
+ add lr, r1, lr
+ mov lr, lr, asr #0x5
+ add r6, r3, r6
+ add r2, r1, r2
+ ldr r4, _020D6454 ; =0x0000003C
+ add lr, r5, lr
+ smull r12, lr, r4, lr
+ sub lr, r1, r12
+ mov r2, r2, asr #0xb
+ mov r6, r6, asr #0x5
+ mov r1, r3, lsr #0x1f
+ add r6, r1, r6
+ smull r1, r12, r4, r6
+ str lr, [r0, #0x8]
+ sub r6, r3, r1
+ str r6, [r0, #0x4]
+ add r2, r5, r2
+ str r2, [r0, #0x0]
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020D6448: .word 0x0001517F
+_020D644C: .word 0x88888889
+_020D6450: .word 0x91A2B3C5
+_020D6454: .word 0x0000003C
+
+ arm_func_start RTC_ConvertDayToDate
+RTC_ConvertDayToDate: ; 0x020D6458
+ stmdb sp!, {r4,lr}
+ ldr r2, _020D6560 ; =0x00008EAC
+ cmp r1, #0x0
+ movlt r1, #0x0
+ cmp r1, r2
+ movgt r1, r2
+ ldr r3, _020D6564 ; =0x92492493
+ add lr, r1, #0x6
+ smull r2, r4, r3, lr
+ add r4, lr, r4
+ mov r4, r4, asr #0x2
+ mov r2, lr, lsr #0x1f
+ ldr ip, _020D6568 ; =0x00000007
+ add r4, r2, r4
+ smull r2, r3, r12, r4
+ sub r4, lr, r2
+ ldr r2, _020D656C ; =0x0000016D
+ ldr r3, _020D6570 ; =0x0000016E
+ str r4, [r0, #0xc]
+ mov lr, #0x0
+_020D64A8:
+ ands r12, lr, #0x3
+ moveq r12, r3
+ movne r12, r2
+ mov r4, r1
+ subs r1, r1, r12
+ movmi r1, r4
+ bmi _020D64D0
+ add lr, lr, #0x1
+ cmp lr, #0x63
+ blo _020D64A8
+_020D64D0:
+ ldr r2, _020D656C ; =0x0000016D
+ str lr, [r0, #0x0]
+ cmp r1, r2
+ movgt r1, r2
+ ands r2, lr, #0x3
+ bne _020D6518
+ cmp r1, #0x3c
+ bge _020D6514
+ cmp r1, #0x1f
+ movlt r2, #0x1
+ subge r1, r1, #0x1f
+ movge r2, #0x2
+ str r2, [r0, #0x4]
+ add r1, r1, #0x1
+ str r1, [r0, #0x8]
+ ldmia sp!, {r4,lr}
+ bx lr
+_020D6514:
+ sub r1, r1, #0x1
+_020D6518:
+ ldr r3, _020D6574 ; =0x02106A20
+ mov r4, #0xb
+_020D6520:
+ ldr r2, [r3, r4, lsl #0x2]
+ mov r12, r4, lsl #0x2
+ cmp r1, r2
+ blt _020D6550
+ add r2, r4, #0x1
+ str r2, [r0, #0x4]
+ ldr r2, [r3, r12]
+ sub r1, r1, r2
+ add r1, r1, #0x1
+ str r1, [r0, #0x8]
+ ldmia sp!, {r4,lr}
+ bx lr
+_020D6550:
+ subs r4, r4, #0x1
+ bpl _020D6520
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020D6560: .word 0x00008EAC
+_020D6564: .word 0x92492493
+_020D6568: .word 0x00000007
+_020D656C: .word 0x0000016D
+_020D6570: .word 0x0000016E
+_020D6574: .word 0x02106A20
+
+ arm_func_start RTC_ConvertDateTimeToSecond
+RTC_ConvertDateTimeToSecond: ; 0x020D6578
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r1
+ bl RTC_ConvertDateToDay
+ mov r4, r0
+ mvn r0, #0x0
+ cmp r4, r0
+ addeq sp, sp, #0x4
+ moveq r1, r0
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ mov r0, r5
+ bl RTCi_ConvertTimeToSecond
+ mvn r2, #0x0
+ cmp r0, r2
+ moveq r1, r2
+ beq _020D65DC
+ ldr r1, _020D65EC ; =0x00015180
+ mov r2, #0x0
+ umull r12, r3, r4, r1
+ mla r3, r4, r2, r3
+ mov r2, r4, asr #0x1f
+ mla r3, r2, r1, r3
+ adds r2, r0, r12
+ adc r1, r3, r0, asr #0x1f
+_020D65DC:
+ mov r0, r2
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_020D65EC: .word 0x00015180
+
+ arm_func_start RTCi_ConvertTimeToSecond
+RTCi_ConvertTimeToSecond: ; 0x020D65F0
+ ldr r3, [r0, #0x4]
+ ldr r2, [r0, #0x0]
+ mov r1, #0x3c
+ mla r3, r2, r1, r3
+ ldr r0, [r0, #0x8]
+ mla r0, r3, r1, r0
+ bx lr
+
+ arm_func_start RTC_ConvertDateToDay
+RTC_ConvertDateToDay: ; 0x020D660C
+ ldr r3, [r0, #0x0]
+ cmp r3, #0x64
+ bhs _020D665C
+ ldr r2, [r0, #0x4]
+ cmp r2, #0x1
+ blo _020D665C
+ cmp r2, #0xc
+ bhi _020D665C
+ ldr r1, [r0, #0x8]
+ cmp r1, #0x1
+ blo _020D665C
+ cmp r1, #0x1f
+ bhi _020D665C
+ ldr r0, [r0, #0xc]
+ cmp r0, #0x7
+ bge _020D665C
+ cmp r2, #0x1
+ blo _020D665C
+ cmp r2, #0xc
+ bls _020D6664
+_020D665C:
+ mvn r0, #0x0
+ bx lr
+_020D6664:
+ ldr r0, _020D6698 ; =0x02106A1C
+ sub r1, r1, #0x1
+ ldr r0, [r0, r2, lsl #0x2]
+ cmp r2, #0x3
+ add r2, r1, r0
+ blo _020D6684
+ ands r0, r3, #0x3
+ addeq r2, r2, #0x1
+_020D6684:
+ ldr r0, _020D669C ; =0x0000016D
+ add r1, r3, #0x3
+ mla r0, r3, r0, r2
+ add r0, r0, r1, lsr #0x2
+ bx lr
+ .balign 4
+_020D6698: .word 0x02106A1C
+_020D669C: .word 0x0000016D
diff --git a/arm9/asm/librtc.s b/arm9/asm/RTC_external.s
index 8116f8de..cf9db8aa 100644
--- a/arm9/asm/librtc.s
+++ b/arm9/asm/RTC_external.s
@@ -1,7 +1,7 @@
.include "asm/macros.inc"
.include "global.inc"
- .text
+ .text
arm_func_start RtcWaitBusy
RtcWaitBusy: ; 0x020D5914
@@ -661,368 +661,3 @@ _020D61A8: ; 0x020D61A8
_020D61C8: .word 0x021D5534
_020D61CC: .word 0x021D5538
_020D61D0: .word RtcCommonCallback
-
- arm_func_start FUN_020D61D4
-FUN_020D61D4: ; 0x020D61D4
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov r0, r0, lsl #0x8
- and r1, r0, #0x7f00
- mov r0, #0x5
- mov r2, #0x0
- bl PXI_SendWordByFifo
-_020D61F0: ; 0x020D61F0
- cmp r0, #0x0
- movge r0, #0x1
- movlt r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start RTCi_WriteRawStatus2Async
-RTCi_WriteRawStatus2Async:
- ldr ip, _020D6214 ; =FUN_020D61D4
- mov r0, #0x27
- bx r12
- .balign 4
-_020D6214: .word FUN_020D61D4
-
- arm_func_start RTCi_ReadRawTimeAsync
-RTCi_ReadRawTimeAsync:
- ldr ip, _020D6224 ; =FUN_020D61D4
- mov r0, #0x12
- bx r12
- .balign 4
-_020D6224: .word FUN_020D61D4
-
- arm_func_start RTCi_ReadRawDateAsync
-RTCi_ReadRawDateAsync:
- ldr ip, _020D6234 ; =FUN_020D61D4
- mov r0, #0x11
- bx r12
- .balign 4
-_020D6234: .word FUN_020D61D4
-
- arm_func_start RTCi_ReadRawDateTimeAsync
-RTCi_ReadRawDateTimeAsync:
- ldr ip, _020D6244 ; =FUN_020D61D4
- mov r0, #0x10
- bx r12
- .balign 4
-_020D6244: .word FUN_020D61D4
-
- arm_func_start RTC_GetDayOfWeek
-RTC_GetDayOfWeek: ; 0x020D6248
- stmdb sp!, {r4-r6,lr}
- ldr r1, [r0, #0x4]
- ldr r2, [r0, #0x0]
- sub r3, r1, #0x2
- cmp r3, #0x1
- add lr, r2, #0x7d0
- ldr r4, _020D630C ; =0x51EB851F
- sublt lr, lr, #0x1
- ldr r12, [r0, #0x8]
- smull r0, r2, r4, lr
- addlt r3, r3, #0xc
- mov r1, #0x1a
- mul r0, r3, r1
- smull r1, r3, r4, lr
- ldr r5, _020D6310 ; =0x66666667
- sub r0, r0, #0x2
- smull r4, r1, r5, r0
- mov r4, lr, lsr #0x1f
- mov r2, r2, asr #0x5
- mov r3, r3, asr #0x5
- add r3, r4, r3
- ldr r5, _020D6314 ; =0x00000064
- add r2, r4, r2
- smull r2, r4, r5, r2
- sub r2, lr, r2
- mov r1, r1, asr #0x2
- mov r0, r0, lsr #0x1f
- add r1, r0, r1
- mov r4, r2, asr #0x1
- add r0, r12, r1
- add r1, r2, r4, lsr #0x1e
- add r2, r2, r0
- mov r6, r3, asr #0x1
- add r0, r3, r6, lsr #0x1e
- add r1, r2, r1, asr #0x2
- add r1, r1, r0, asr #0x2
- mov r0, #0x5
- mla r4, r3, r0, r1
- ldr r3, _020D6318 ; =0x92492493
- mov r1, r4, lsr #0x1f
- smull r2, r0, r3, r4
- add r0, r4, r0
- mov r0, r0, asr #0x2
- ldr r2, _020D631C ; =0x00000007
- add r0, r1, r0
- smull r0, r1, r2, r0
- sub r0, r4, r0
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D630C: .word 0x51EB851F
-_020D6310: .word 0x66666667
-_020D6314: .word 0x00000064
-_020D6318: .word 0x92492493
-_020D631C: .word 0x00000007
-
- arm_func_start RTC_ConvertSecondToDateTime
-RTC_ConvertSecondToDateTime: ; 0x020D6320
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r5, r2
- mov r12, #0x0
- mov r4, r3
- subs r2, r5, r12
- sbcs r2, r4, r12
- mov r7, r0
- mov r6, r1
- movlt r5, r12
- movlt r4, r12
- blt _020D6364
- ldr r1, _020D63B0 ; =0xBC19137F
- subs r0, r1, r5
- sbcs r0, r12, r4
- movlt r5, r1
- movlt r4, r12
-_020D6364:
- ldr r2, _020D63B4 ; =0x00015180
- mov r0, r5
- mov r1, r4
- mov r3, #0x0
- bl _ll_mod
- mov r1, r0
- mov r0, r6
- bl RTCi_ConvertSecondToTime
- ldr r2, _020D63B4 ; =0x00015180
- mov r0, r5
- mov r1, r4
- mov r3, #0x0
- bl _ll_sdiv
- mov r1, r0
- mov r0, r7
- bl RTC_ConvertDayToDate
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D63B0: .word 0xBC19137F
-_020D63B4: .word 0x00015180
-
- arm_func_start RTCi_ConvertSecondToTime
-RTCi_ConvertSecondToTime: ; 0x020D63B8
- stmdb sp!, {r4-r6,lr}
- ldr r2, _020D6448 ; =0x0001517F
- cmp r1, #0x0
- movlt r1, #0x0
- cmp r1, r2
- ldr ip, _020D644C ; =0x88888889
- movgt r1, r2
- smull r2, r3, r12, r1
- smull r2, lr, r12, r1
- ldr r5, _020D6450 ; =0x91A2B3C5
- add r3, r1, r3
- smull r4, r2, r5, r1
- mov r5, r1, lsr #0x1f
- mov r3, r3, asr #0x5
- add r3, r5, r3
- smull r4, r6, r12, r3
- add lr, r1, lr
- mov lr, lr, asr #0x5
- add r6, r3, r6
- add r2, r1, r2
- ldr r4, _020D6454 ; =0x0000003C
- add lr, r5, lr
- smull r12, lr, r4, lr
- sub lr, r1, r12
- mov r2, r2, asr #0xb
- mov r6, r6, asr #0x5
- mov r1, r3, lsr #0x1f
- add r6, r1, r6
- smull r1, r12, r4, r6
- str lr, [r0, #0x8]
- sub r6, r3, r1
- str r6, [r0, #0x4]
- add r2, r5, r2
- str r2, [r0, #0x0]
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D6448: .word 0x0001517F
-_020D644C: .word 0x88888889
-_020D6450: .word 0x91A2B3C5
-_020D6454: .word 0x0000003C
-
- arm_func_start RTC_ConvertDayToDate
-RTC_ConvertDayToDate: ; 0x020D6458
- stmdb sp!, {r4,lr}
- ldr r2, _020D6560 ; =0x00008EAC
- cmp r1, #0x0
- movlt r1, #0x0
- cmp r1, r2
- movgt r1, r2
- ldr r3, _020D6564 ; =0x92492493
- add lr, r1, #0x6
- smull r2, r4, r3, lr
- add r4, lr, r4
- mov r4, r4, asr #0x2
- mov r2, lr, lsr #0x1f
- ldr ip, _020D6568 ; =0x00000007
- add r4, r2, r4
- smull r2, r3, r12, r4
- sub r4, lr, r2
- ldr r2, _020D656C ; =0x0000016D
- ldr r3, _020D6570 ; =0x0000016E
- str r4, [r0, #0xc]
- mov lr, #0x0
-_020D64A8:
- ands r12, lr, #0x3
- moveq r12, r3
- movne r12, r2
- mov r4, r1
- subs r1, r1, r12
- movmi r1, r4
- bmi _020D64D0
- add lr, lr, #0x1
- cmp lr, #0x63
- blo _020D64A8
-_020D64D0:
- ldr r2, _020D656C ; =0x0000016D
- str lr, [r0, #0x0]
- cmp r1, r2
- movgt r1, r2
- ands r2, lr, #0x3
- bne _020D6518
- cmp r1, #0x3c
- bge _020D6514
- cmp r1, #0x1f
- movlt r2, #0x1
- subge r1, r1, #0x1f
- movge r2, #0x2
- str r2, [r0, #0x4]
- add r1, r1, #0x1
- str r1, [r0, #0x8]
- ldmia sp!, {r4,lr}
- bx lr
-_020D6514:
- sub r1, r1, #0x1
-_020D6518:
- ldr r3, _020D6574 ; =0x02106A20
- mov r4, #0xb
-_020D6520:
- ldr r2, [r3, r4, lsl #0x2]
- mov r12, r4, lsl #0x2
- cmp r1, r2
- blt _020D6550
- add r2, r4, #0x1
- str r2, [r0, #0x4]
- ldr r2, [r3, r12]
- sub r1, r1, r2
- add r1, r1, #0x1
- str r1, [r0, #0x8]
- ldmia sp!, {r4,lr}
- bx lr
-_020D6550:
- subs r4, r4, #0x1
- bpl _020D6520
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D6560: .word 0x00008EAC
-_020D6564: .word 0x92492493
-_020D6568: .word 0x00000007
-_020D656C: .word 0x0000016D
-_020D6570: .word 0x0000016E
-_020D6574: .word 0x02106A20
-
- arm_func_start RTC_ConvertDateTimeToSecond
-RTC_ConvertDateTimeToSecond: ; 0x020D6578
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- mov r5, r1
- bl RTC_ConvertDateToDay
- mov r4, r0
- mvn r0, #0x0
- cmp r4, r0
- addeq sp, sp, #0x4
- moveq r1, r0
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- mov r0, r5
- bl RTCi_ConvertTimeToSecond
- mvn r2, #0x0
- cmp r0, r2
- moveq r1, r2
- beq _020D65DC
- ldr r1, _020D65EC ; =0x00015180
- mov r2, #0x0
- umull r12, r3, r4, r1
- mla r3, r4, r2, r3
- mov r2, r4, asr #0x1f
- mla r3, r2, r1, r3
- adds r2, r0, r12
- adc r1, r3, r0, asr #0x1f
-_020D65DC:
- mov r0, r2
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D65EC: .word 0x00015180
-
- arm_func_start RTCi_ConvertTimeToSecond
-RTCi_ConvertTimeToSecond: ; 0x020D65F0
- ldr r3, [r0, #0x4]
- ldr r2, [r0, #0x0]
- mov r1, #0x3c
- mla r3, r2, r1, r3
- ldr r0, [r0, #0x8]
- mla r0, r3, r1, r0
- bx lr
-
- arm_func_start RTC_ConvertDateToDay
-RTC_ConvertDateToDay: ; 0x020D660C
- ldr r3, [r0, #0x0]
- cmp r3, #0x64
- bhs _020D665C
- ldr r2, [r0, #0x4]
- cmp r2, #0x1
- blo _020D665C
- cmp r2, #0xc
- bhi _020D665C
- ldr r1, [r0, #0x8]
- cmp r1, #0x1
- blo _020D665C
- cmp r1, #0x1f
- bhi _020D665C
- ldr r0, [r0, #0xc]
- cmp r0, #0x7
- bge _020D665C
- cmp r2, #0x1
- blo _020D665C
- cmp r2, #0xc
- bls _020D6664
-_020D665C:
- mvn r0, #0x0
- bx lr
-_020D6664:
- ldr r0, _020D6698 ; =0x02106A1C
- sub r1, r1, #0x1
- ldr r0, [r0, r2, lsl #0x2]
- cmp r2, #0x3
- add r2, r1, r0
- blo _020D6684
- ands r0, r3, #0x3
- addeq r2, r2, #0x1
-_020D6684:
- ldr r0, _020D669C ; =0x0000016D
- add r1, r3, #0x3
- mla r0, r3, r0, r2
- add r0, r0, r1, lsr #0x2
- bx lr
- .balign 4
-_020D6698: .word 0x02106A1C
-_020D669C: .word 0x0000016D
diff --git a/arm9/asm/RTC_internal.s b/arm9/asm/RTC_internal.s
new file mode 100644
index 00000000..408b630c
--- /dev/null
+++ b/arm9/asm/RTC_internal.s
@@ -0,0 +1,53 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start RtcSendPxiCommand
+RtcSendPxiCommand: ; 0x020D61D4
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r0, r0, lsl #0x8
+ and r1, r0, #0x7f00
+ mov r0, #0x5
+ mov r2, #0x0
+ bl PXI_SendWordByFifo
+_020D61F0: ; 0x020D61F0
+ cmp r0, #0x0
+ movge r0, #0x1
+ movlt r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start RTCi_WriteRawStatus2Async
+RTCi_WriteRawStatus2Async:
+ ldr ip, _020D6214 ; =RtcSendPxiCommand
+ mov r0, #0x27
+ bx r12
+ .balign 4
+_020D6214: .word RtcSendPxiCommand
+
+ arm_func_start RTCi_ReadRawTimeAsync
+RTCi_ReadRawTimeAsync:
+ ldr ip, _020D6224 ; =RtcSendPxiCommand
+ mov r0, #0x12
+ bx r12
+ .balign 4
+_020D6224: .word RtcSendPxiCommand
+
+ arm_func_start RTCi_ReadRawDateAsync
+RTCi_ReadRawDateAsync:
+ ldr ip, _020D6234 ; =RtcSendPxiCommand
+ mov r0, #0x11
+ bx r12
+ .balign 4
+_020D6234: .word RtcSendPxiCommand
+
+ arm_func_start RTCi_ReadRawDateTimeAsync
+RTCi_ReadRawDateTimeAsync:
+ ldr ip, _020D6244 ; =RtcSendPxiCommand
+ mov r0, #0x10
+ bx r12
+ .balign 4
+_020D6244: .word RtcSendPxiCommand
diff --git a/arm9/asm/libcard.s b/arm9/asm/libcard.s
deleted file mode 100644
index 1eb74e0d..00000000
--- a/arm9/asm/libcard.s
+++ /dev/null
@@ -1,1784 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start CARD_UnlockBackup
-CARD_UnlockBackup: ; 0x020D66A0
- ldr ip, _020D66AC ; =CARDi_UnlockResource
- mov r1, #0x2
- bx r12
- .balign 4
-_020D66AC: .word CARDi_UnlockResource
-
- arm_func_start CARD_LockBackup
-CARD_LockBackup: ; 0x020D66B0
- ldr ip, _020D66BC ; =CARDi_LockResource
- mov r1, #0x2
- bx r12
- .balign 4
-_020D66BC: .word CARDi_LockResource
-
- arm_func_start CARD_UnlockRom
-CARD_UnlockRom: ; 0x020D66C0
- stmdb sp!, {r4,lr}
- mov r4, r0
- bl OS_UnlockCard
- mov r0, r4
- mov r1, #0x1
- bl CARDi_UnlockResource
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start CARD_LockRom
-CARD_LockRom: ; 0x020D66E0
- stmdb sp!, {r4,lr}
- mov r4, r0
- mov r1, #0x1
- bl CARDi_LockResource
- mov r0, r4
- bl OS_TryLockCard
- ldmia sp!, {r4,lr}
- bx lr
-
- arm_func_start CARD_GetResultCode
-CARD_GetResultCode: ; 0x020D6700
- ldr r0, _020D6710 ; =0x021D55C0
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x0]
- bx lr
- .balign 4
-_020D6710: .word 0x021D55C0
-
- arm_func_start FUN_020D6714
-FUN_020D6714: ; 0x020D6714
- ldr r0, _020D672C ; =0x021D55C0
- ldr r0, [r0, #0x114]
- ands r0, r0, #0x4
- moveq r0, #0x1
- movne r0, #0x0
- bx lr
- .balign 4
-_020D672C: .word 0x021D55C0
-
- arm_func_start CARDi_WaitAsync
-CARDi_WaitAsync: ; 0x020D6730
- stmdb sp!, {r4-r6,lr}
- ldr r6, _020D6788 ; =0x021D55C0
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r5, r0
- ands r0, r1, #0x4
- beq _020D6764
- add r4, r6, #0x10c
-_020D6750:
- mov r0, r4
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x4
- bne _020D6750
-_020D6764:
- mov r0, r5
- bl OS_RestoreInterrupts
-_020D676C: ; 0x020D676C
- ldr r0, [r6, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- ldmia sp!, {r4-r6,lr}
- bx lr
- .balign 4
-_020D6788: .word 0x021D55C0
-
- arm_func_start CARD_Enable
-CARD_Enable: ; 0x020D678C
- ldr r1, _020D6798 ; =0x021D555C
- str r0, [r1, #0x0]
- bx lr
- .balign 4
-_020D6798: .word 0x021D555C
-
- arm_func_start CARD_CheckEnabled
-CARD_CheckEnabled: ; 0x020D679C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl CARD_IsEnabled
-_020D67A8: ; 0x020D67A8
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- bl OS_Terminate
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start CARD_IsEnabled
-CARD_IsEnabled:
- ldr r0, _020D67D4 ; =0x021D555C
- ldr r0, [r0, #0x0]
- bx lr
- .balign 4
-_020D67D4: .word 0x021D555C
-
- arm_func_start CARDi_InitCommon
-CARDi_InitCommon: ; 0x020D67D8
- stmdb sp!, {r4,lr}
- sub sp, sp, #0x8
- ldr r4, _020D68B8 ; =0x021D55C0
- ldr r1, _020D68BC ; =0x021D5560
- mvn r2, #0x2
- mov r0, #0x0
- str r2, [r4, #0x8]
- mov r2, #0x60
- str r0, [r4, #0xc]
- str r0, [r4, #0x18]
- str r1, [r4, #0x0]
- bl MIi_CpuClearFast
- ldr r0, _020D68BC ; =0x021D5560
- mov r1, #0x60
- bl DC_FlushRange
- ldr r0, _020D68C0 ; =0x027FFC40
- ldrh r0, [r0, #0x0]
- cmp r0, #0x2
- beq _020D6834
- ldr r0, _020D68C4 ; =0x027FFE00
- ldr r1, _020D68C8 ; =0x027FFA80
- mov r2, #0x160
- bl MI_CpuCopy8
-_020D6834:
- mov r2, #0x0
- str r2, [r4, #0x14]
- ldr r0, [r4, #0x14]
- mov r1, #0x4
- str r0, [r4, #0x10]
- str r2, [r4, #0x110]
- ldr r3, [r4, #0x110]
- mov r0, #0x400
- str r3, [r4, #0x10c]
- str r1, [r4, #0x108]
- str r0, [sp, #0x0]
- ldr r12, [r4, #0x108]
- ldr r1, _020D68CC ; =CARDi_TaskThread
- ldr r3, _020D68D0 ; =0x021D5BE0
- add r0, r4, #0x44
- str r12, [sp, #0x4]
- bl OS_CreateThread
- add r0, r4, #0x44
- bl OS_WakeupThreadDirect
- ldr r1, _020D68D4 ; =CARDi_OnFifoRecv
- mov r0, #0xb
- bl PXI_SetFifoRecvCallback
- ldr r0, _020D68C0 ; =0x027FFC40
- ldrh r0, [r0, #0x0]
- cmp r0, #0x2
- addeq sp, sp, #0x8
- ldmeqia sp!, {r4,lr}
- bxeq lr
- mov r0, #0x1
- bl CARD_Enable
- add sp, sp, #0x8
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D68B8: .word 0x021D55C0
-_020D68BC: .word 0x021D5560
-_020D68C0: .word 0x027FFC40
-_020D68C4: .word 0x027FFE00
-_020D68C8: .word 0x027FFA80
-_020D68CC: .word CARDi_TaskThread
-_020D68D0: .word 0x021D5BE0
-_020D68D4: .word CARDi_OnFifoRecv
-
- arm_func_start CARDi_UnlockResource
-CARDi_UnlockResource: ; 0x020D68D8
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r5, _020D6978 ; =0x021D55C0
- mov r7, r0
- mov r6, r1
- bl OS_DisableInterrupts
- mov r1, r5
- mov r4, r0
- ldr r0, [r1, #0x8]
- cmp r0, r7
- bne _020D6910
- ldr r0, [r5, #0xc]
- cmp r0, #0x0
- bne _020D6918
-_020D6910:
- bl OS_Terminate
- b _020D6958
-_020D6918:
- ldr r0, [r5, #0x18]
- cmp r0, r6
- beq _020D6928
- bl OS_Terminate
-_020D6928:
- ldr r0, [r5, #0xc]
- sub r0, r0, #0x1
- str r0, [r5, #0xc]
- ldr r0, [r5, #0xc]
- cmp r0, #0x0
- bne _020D6958
- mvn r0, #0x2
- str r0, [r5, #0x8]
- mov r1, #0x0
- add r0, r5, #0x10
- str r1, [r5, #0x18]
- bl OS_WakeupThread
-_020D6958:
- ldr r1, [r5, #0x0]
- mov r2, #0x0
- mov r0, r4
- str r2, [r1, #0x0]
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D6978: .word 0x021D55C0
-
- arm_func_start CARDi_LockResource
-CARDi_LockResource: ; 0x020D697C
- stmdb sp!, {r4-r9,lr}
- sub sp, sp, #0x4
- ldr r5, _020D6A14 ; =0x021D55C0
- mov r7, r0
- mov r6, r1
- bl OS_DisableInterrupts
- ldr r1, [r5, #0x8]
- mov r4, r0
- cmp r1, r7
- bne _020D69B8
- ldr r0, [r5, #0x18]
- cmp r0, r6
- beq _020D69E8
- bl OS_Terminate
- b _020D69E8
-_020D69B8:
- ldr r0, [r5, #0x8]
- mvn r8, #0x2
- cmp r0, r8
- beq _020D69E0
- add r9, r5, #0x10
-_020D69CC:
- mov r0, r9
- bl OS_SleepThread
- ldr r0, [r5, #0x8]
- cmp r0, r8
- bne _020D69CC
-_020D69E0:
- str r7, [r5, #0x8]
- str r6, [r5, #0x18]
-_020D69E8:
- ldr r1, [r5, #0xc]
- mov r0, r4
- add r1, r1, #0x1
- str r1, [r5, #0xc]
- ldr r1, [r5, #0x0]
- mov r2, #0x0
- str r2, [r1, #0x0]
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {r4-r9,lr}
- bx lr
- .balign 4
-_020D6A14: .word 0x021D55C0
-
- arm_func_start CARDi_SetTask
-CARDi_SetTask: ; 0x020D6A18
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r4, _020D6A5C ; =0x021D55C0
- mov r5, r0
- ldr r1, [r4, #0x108]
- add r0, r4, #0x44
- bl OS_SetThreadPriority
- add r0, r4, #0x44
- str r0, [r4, #0x104]
- str r5, [r4, #0x40]
- ldr r1, [r4, #0x114]
- orr r1, r1, #0x8
- str r1, [r4, #0x114]
- bl OS_WakeupThreadDirect
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D6A5C: .word 0x021D55C0
-
- arm_func_start FUN_020D6A60
-FUN_020D6A60: ; 0x020D6A60
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r1, _020D6D60 ; =0x021D55C0
- mov r5, r0
- ldr r4, [r1, #0x0]
- mov r1, #0x0
- add r0, r4, #0x18
- mov r2, #0x48
- bl MI_CpuFill8
-_020D6A84: ; 0x020D6A84
- cmp r5, #0x0
- str r5, [r4, #0x4]
- mov r0, #0x3f
- addeq sp, sp, #0x4
- str r0, [r4, #0x4c]
- ldmeqia sp!, {r4-r5,lr}
- bxeq lr
- mov r0, r5, asr #0x8
- and r0, r0, #0xff
- mov r2, #0x1
- mov r3, r2, lsl r0
- and r1, r5, #0xff
- str r3, [r4, #0x18]
- mov r0, #0xff
- strb r0, [r4, #0x48]
- cmp r1, #0x1
- bne _020D6B80
- cmp r3, #0x200
- beq _020D6AE4
- cmp r3, #0x2000
- beq _020D6B04
- cmp r3, #0x10000
- beq _020D6B28
- b _020D6D38
-_020D6AE4:
- mov r0, #0x10
- str r0, [r4, #0x20]
- str r2, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- mov r0, #0xf0
- strb r0, [r4, #0x48]
- b _020D6B48
-_020D6B04:
- mov r0, #0x20
- str r0, [r4, #0x20]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- b _020D6B48
-_020D6B28:
- mov r0, #0x80
- str r0, [r4, #0x20]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0xa
- str r0, [r4, #0x28]
- mov r0, #0x0
- strb r0, [r4, #0x48]
-_020D6B48:
- ldr r0, [r4, #0x20]
- add sp, sp, #0x4
- str r0, [r4, #0x1c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6B80:
- cmp r1, #0x2
- bne _020D6CD8
- cmp r3, #0x100000
- bhi _020D6BB8
- cmp r3, #0x100000
- bhs _020D6BD8
- cmp r3, #0x40000
- bhi _020D6BAC
- cmp r3, #0x40000
- beq _020D6BD8
- b _020D6D38
-_020D6BAC:
- cmp r3, #0x80000
- beq _020D6BD8
- b _020D6D38
-_020D6BB8:
- cmp r3, #0x200000
- bhi _020D6BCC
- cmp r3, #0x200000
- beq _020D6C10
- b _020D6D38
-_020D6BCC:
- cmp r3, #0x800000
- beq _020D6C48
- b _020D6D38
-_020D6BD8:
- mov r0, #0x19
- str r0, [r4, #0x2c]
- mov r1, #0x12c
- str r1, [r4, #0x30]
- ldr r0, _020D6D64 ; =0x00001388
- str r1, [r4, #0x44]
- str r0, [r4, #0x3c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x80
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x400
- str r0, [r4, #0x4c]
- b _020D6C7C
-_020D6C10:
- mov r1, #0x3e8
- ldr r0, _020D6D68 ; =0x00000BB8
- str r1, [r4, #0x3c]
- ldr r1, _020D6D6C ; =0x00004268
- str r0, [r4, #0x40]
- ldr r0, _020D6D70 ; =0x00009C40
- str r1, [r4, #0x34]
- str r0, [r4, #0x38]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x1000
- str r0, [r4, #0x4c]
- b _020D6C7C
-_020D6C48:
- mov r1, #0x3e8
- ldr r0, _020D6D68 ; =0x00000BB8
- str r1, [r4, #0x3c]
- ldr r1, _020D6D74 ; =0x000109A0
- str r0, [r4, #0x40]
- ldr r0, _020D6D78 ; =0x00027100
- str r1, [r4, #0x34]
- str r0, [r4, #0x38]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x1000
- str r0, [r4, #0x4c]
-_020D6C7C:
- mov r0, #0x10000
- str r0, [r4, #0x1c]
- mov r0, #0x100
- str r0, [r4, #0x20]
- mov r0, #0x3
- str r0, [r4, #0x24]
- mov r0, #0x5
- str r0, [r4, #0x28]
- ldr r0, [r4, #0x4c]
- add sp, sp, #0x4
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x800
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6CD8:
- cmp r1, #0x3
- bne _020D6D38
- cmp r3, #0x2000
- beq _020D6CF0
- cmp r3, #0x8000
- bne _020D6D38
-_020D6CF0:
- str r3, [r4, #0x20]
- str r3, [r4, #0x1c]
- mov r0, #0x2
- str r0, [r4, #0x24]
- mov r0, #0x0
- strb r0, [r4, #0x48]
- ldr r0, [r4, #0x4c]
- add sp, sp, #0x4
- orr r0, r0, #0x40
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x100
- str r0, [r4, #0x4c]
- ldr r0, [r4, #0x4c]
- orr r0, r0, #0x200
- str r0, [r4, #0x4c]
- ldmia sp!, {r4-r5,lr}
- bx lr
-_020D6D38:
- mov r1, #0x0
- str r1, [r4, #0x4]
- str r1, [r4, #0x18]
- ldr r0, _020D6D60 ; =0x021D55C0
- mov r1, #0x3
- ldr r0, [r0, #0x0]
- str r1, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D6D60: .word 0x021D55C0
-_020D6D64: .word 0x00001388
-_020D6D68: .word 0x00000BB8
-_020D6D6C: .word 0x00004268
-_020D6D70: .word 0x00009C40
-_020D6D74: .word 0x000109A0
-_020D6D78: .word 0x00027100
-
- arm_func_start CARD_CancelBackupAsync
-CARD_CancelBackupAsync: ; 0x020D6D7C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl OS_DisableInterrupts
- ldr r1, _020D6DA8 ; =0x021D55C0
- ldr r2, [r1, #0x114]
- orr r2, r2, #0x40
- str r2, [r1, #0x114]
- bl OS_RestoreInterrupts
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D6DA8: .word 0x021D55C0
-
- arm_func_start CARD_TryWaitBackupAsync
-CARD_TryWaitBackupAsync: ; 0x020D6DAC
- ldr ip, _020D6DB4 ; =FUN_020D6714
- bx r12
- .balign 4
-_020D6DB4: .word FUN_020D6714
-
- arm_func_start CARD_WaitBackupAsync
-CARD_WaitBackupAsync: ; 0x020D6DB8
- ldr ip, _020D6DC0 ; =CARDi_WaitAsync
- bx r12
- .balign 4
-_020D6DC0: .word CARDi_WaitAsync
-
- .extern _SDK_NintendoBackup
-
- arm_func_start CARD_IdentifyBackup
-CARD_IdentifyBackup: ; 0x020D6DC4
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r5, r0
- ldr r0, _020D6F00 ; =_SDK_NintendoBackup
- ldr r7, _020D6F04 ; =0x021D55C0
- bl OSi_ReferSymbol
-_020D6DDC: ; 0x020D6DDC
- cmp r5, #0x0
- bne _020D6DE8
- bl OS_Terminate
-_020D6DE8:
- bl CARD_CheckEnabled
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- ands r0, r1, #0x4
- beq _020D6E18
- add r6, r7, #0x10c
-_020D6E04:
- mov r0, r6
- bl OS_SleepThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x4
- bne _020D6E04
-_020D6E18:
- ldr r0, [r7, #0x114]
- mov r1, #0x0
- orr r0, r0, #0x4
- str r0, [r7, #0x114]
- str r1, [r7, #0x38]
- mov r0, r4
- str r1, [r7, #0x3c]
- bl OS_RestoreInterrupts
- mov r0, r5
- bl FUN_020D6A60
- ldr r0, _020D6F08 ; =0x021D3498
- ldr r1, _020D6F04 ; =0x021D55C0
- ldr r2, [r0, #0x4]
- mov r0, r7
- str r2, [r1, #0x104]
- mov r1, #0x2
- mov r2, #0x1
- bl CARDi_Request
-_020D6E60: ; 0x020D6E60
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0xc]
- ldr r0, [r7, #0x0]
- add r1, r7, #0x120
- str r1, [r0, #0x10]
- ldr r1, [r7, #0x0]
- mov r2, #0x1
- mov r0, r7
- str r2, [r1, #0x14]
- mov r1, #0x6
- bl CARDi_Request
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- mov r4, r0
- ldr r1, [r7, #0x114]
- add r0, r7, #0x10c
- bic r1, r1, #0x4c
- str r1, [r7, #0x114]
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D6EC8
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D6EC8:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D6ED0: ; 0x020D6ED0
- cmp r6, #0x0
- beq _020D6EE0
- mov r0, r5
- blx r6
-_020D6EE0:
- ldr r0, [r7, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D6F00: .word _SDK_NintendoBackup
-_020D6F04: .word 0x021D55C0
-_020D6F08: .word 0x021D3498
-
- arm_func_start CARD_GetBackupSectorSize
-CARD_GetBackupSectorSize: ; 0x020D6F0C
- ldr r0, _020D6F1C ; =0x021D55C0
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x1c]
- bx lr
- .balign 4
-_020D6F1C: .word 0x021D55C0
-
- arm_func_start CARDi_RequestStreamCommand
-CARDi_RequestStreamCommand: ; 0x020D6F20
- stmdb sp!, {r4-r10,lr}
- mov r10, r0
- ldr r6, _020D7004 ; =0x021D55C0
- ldr r0, _020D7008 ; =_SDK_NintendoBackup
- mov r9, r1
- mov r8, r2
- mov r7, r3
- bl OSi_ReferSymbol
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r5, r0
- ands r0, r1, #0x4
- beq _020D6F6C
- add r4, r6, #0x10c
-_020D6F58:
- mov r0, r4
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x4
- bne _020D6F58
-_020D6F6C:
- ldr r0, [r6, #0x114]
- ldr r1, [sp, #0x20]
- orr r0, r0, #0x4
- str r0, [r6, #0x114]
- str r7, [r6, #0x38]
- mov r0, r5
- str r1, [r6, #0x3c]
- bl OS_RestoreInterrupts
- str r10, [r6, #0x1c]
- str r9, [r6, #0x20]
- ldr r0, [sp, #0x24]
- ldr r1, [sp, #0x28]
- str r8, [r6, #0x24]
- ldr r2, [sp, #0x2c]
- str r1, [r6, #0x2c]
- ldr r1, [sp, #0x30]
- str r2, [r6, #0x30]
- str r1, [r6, #0x34]
- cmp r0, #0x0
- beq _020D6FD0
- ldr r0, _020D700C ; =CARDi_RequestStreamCommandCore
- bl CARDi_SetTask
- mov r0, #0x1
- ldmia sp!, {r4-r10,lr}
- bx lr
-_020D6FD0:
- ldr r0, _020D7010 ; =0x021D3498
- ldr r1, _020D7004 ; =0x021D55C0
- ldr r2, [r0, #0x4]
- mov r0, r6
- str r2, [r1, #0x104]
- bl CARDi_RequestStreamCommandCore
-_020D6FE8: ; 0x020D6FE8
- ldr r0, [r6, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- ldmia sp!, {r4-r10,lr}
- bx lr
- .balign 4
-_020D7004: .word 0x021D55C0
-_020D7008: .word _SDK_NintendoBackup
-_020D700C: .word CARDi_RequestStreamCommandCore
-_020D7010: .word 0x021D3498
-
- arm_func_start CARDi_RequestStreamCommandCore
-CARDi_RequestStreamCommandCore:
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- mov r9, r0
- ldr r8, [r9, #0x2c]
- ldr r0, _020D720C ; =_SDK_NintendoBackup
- ldr r7, [r9, #0x34]
- ldr r10, [r9, #0x30]
- mov r6, #0x100
- bl OSi_ReferSymbol
- cmp r8, #0xb
- bne _020D7048
- bl CARD_GetBackupSectorSize
- mov r6, r0
-_020D7048:
- mov r0, #0x1
- add r4, r9, #0x120
- mov r11, #0x9
- str r0, [sp, #0x0]
-_020D7058:
- ldr r5, [r9, #0x24]
- ldr r0, [r9, #0x0]
- cmp r6, r5
- movcc r5, r6
- str r5, [r0, #0x14]
- ldr r0, [r9, #0x114]
- ands r0, r0, #0x40
- beq _020D7094
- ldr r0, [r9, #0x114]
- mov r1, #0x7
- bic r0, r0, #0x40
- str r0, [r9, #0x114]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x0]
- b _020D71A8
-_020D7094:
- cmp r7, #0x3
- addls pc, pc, r7, lsl #0x2
- b _020D7124
-_020D70A0:
- b _020D70B0
-_020D70A4:
- b _020D70D4
-_020D70A8:
- b _020D70D4
-_020D70AC:
- b _020D710C
-_020D70B0:
- mov r1, r5
- add r0, r9, #0x120
- bl DC_InvalidateRange
- ldr r1, [r9, #0x1c]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0xc]
- ldr r0, [r9, #0x0]
- str r4, [r0, #0x10]
- b _020D7124
-_020D70D4:
- ldr r0, [r9, #0x1c]
- mov r1, r4
- mov r2, r5
- bl MI_CpuCopy8
- mov r1, r5
- add r0, r9, #0x120
- bl DC_FlushRange
- bl DC_WaitWriteBufferEmpty
-_020D70F4: ; 0x020D70F4
- ldr r0, [r9, #0x0]
- str r4, [r0, #0xc]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x10]
- b _020D7124
-_020D710C:
- ldr r1, [r9, #0x1c]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0xc]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x0]
- str r1, [r0, #0x10]
-_020D7124:
- mov r0, r9
- mov r1, r8
- mov r2, r10
- bl CARDi_Request
-_020D7134: ; 0x020D7134
- cmp r0, #0x0
- beq _020D71A8
- cmp r7, #0x2
- bne _020D7160
- ldr r2, [sp, #0x0]
- mov r0, r9
- mov r1, r11
- bl CARDi_Request
-_020D7154: ; 0x020D7154
- cmp r0, #0x0
- bne _020D7178
- b _020D71A8
-_020D7160:
- cmp r7, #0x0
- bne _020D7178
- ldr r1, [r9, #0x20]
- mov r2, r5
- add r0, r9, #0x120
- bl MI_CpuCopy8
-_020D7178:
- ldr r0, [r9, #0x1c]
- add r0, r0, r5
- str r0, [r9, #0x1c]
- ldr r0, [r9, #0x20]
- add r0, r0, r5
- str r0, [r9, #0x20]
- ldr r0, [r9, #0x24]
- sub r0, r0, r5
- str r0, [r9, #0x24]
- ldr r0, [r9, #0x24]
- cmp r0, #0x0
- bne _020D7058
-_020D71A8:
- ldr r6, [r9, #0x38]
- ldr r5, [r9, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r9, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r9, #0x114]
- add r0, r9, #0x10c
- bl OS_WakeupThread
- ldr r0, [r9, #0x114]
- ands r0, r0, #0x10
- beq _020D71E0
- add r0, r9, #0x44
- bl OS_WakeupThreadDirect
-_020D71E0:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D71E8: ; 0x020D71E8
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r11,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D720C: .word _SDK_NintendoBackup
-
- arm_func_start CARDi_GetRomAccessor
-CARDi_GetRomAccessor: ; 0x020D7210
- ldr r0, _020D7218 ; =CARDi_ReadCard
- bx lr
- .balign 4
-_020D7218: .word CARDi_ReadCard
-
- arm_func_start CARD_WaitRomAsync
-CARD_WaitRomAsync: ; 0x020D721C
- ldr ip, _020D7224 ; =CARDi_WaitAsync
- bx r12
- .balign 4
-_020D7224: .word CARDi_WaitAsync
-
- arm_func_start CARD_Init
-CARD_Init: ; 0x020D7228
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr ip, _020D72A0 ; =0x021D55C0
- ldr r0, [r12, #0x114]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- mov r0, #0x1
- str r0, [r12, #0x114]
- mov r3, #0x0
- str r3, [r12, #0x24]
- ldr r0, [r12, #0x24]
- mvn r1, #0x0
- str r0, [r12, #0x20]
- ldr r2, [r12, #0x20]
- ldr r0, _020D72A4 ; =0x021D5BE0
- str r2, [r12, #0x1c]
- str r1, [r12, #0x28]
- str r3, [r12, #0x38]
- str r3, [r12, #0x3c]
- str r3, [r0, #0x0]
- bl CARDi_InitCommon
- bl CARDi_GetRomAccessor
- ldr r1, _020D72A8 ; =0x021D5C00
- str r0, [r1, #0x0]
- bl CARD_InitPulledOutCallback
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D72A0: .word 0x021D55C0
-_020D72A4: .word 0x021D5BE0
-_020D72A8: .word 0x021D5C00
-
- arm_func_start CARDi_ReadRom
-CARDi_ReadRom: ; 0x020D72AC
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- ldr r6, _020D73C0 ; =0x021D55C0
- mov r10, r0
- mov r9, r1
- mov r8, r2
- mov r7, r3
- ldr fp, _020D73C4 ; =0x021D5C00
- bl CARD_CheckEnabled
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r5, r0
- ands r0, r1, #0x4
- beq _020D72FC
- add r4, r6, #0x10c
-_020D72E8:
- mov r0, r4
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x4
- bne _020D72E8
-_020D72FC:
- ldr r1, [r6, #0x114]
- ldr r0, [sp, #0x28]
- orr r1, r1, #0x4
- str r1, [r6, #0x114]
- ldr r1, [sp, #0x2c]
- str r0, [r6, #0x38]
- mov r0, r5
- str r1, [r6, #0x3c]
- bl OS_RestoreInterrupts
- ldr r0, _020D73C8 ; =0x021D5BE0
- str r10, [r6, #0x28]
- ldr r0, [r0, #0x0]
- cmp r10, #0x3
- add r0, r9, r0
- str r0, [r6, #0x1c]
- str r8, [r6, #0x20]
- str r7, [r6, #0x24]
- bhi _020D734C
- mov r0, r10
- bl MI_StopDma
-_020D734C:
- mov r0, r11
- bl CARDi_TryReadCardDma
-_020D7354: ; 0x020D7354
- cmp r0, #0x0
- beq _020D7380
- ldr r0, [sp, #0x30]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {r4-r11,lr}
- bxne lr
- bl CARD_WaitRomAsync
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D7380:
- ldr r0, [sp, #0x30]
- cmp r0, #0x0
- beq _020D73A0
- ldr r0, _020D73CC ; =CARDi_ReadRomSyncCore
- bl CARDi_SetTask
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D73A0:
- ldr r1, _020D73D0 ; =0x021D3498
- mov r0, r6
- ldr r1, [r1, #0x4]
- str r1, [r6, #0x104]
- bl CARDi_ReadRomSyncCore
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D73C0: .word 0x021D55C0
-_020D73C4: .word 0x021D5C00
-_020D73C8: .word 0x021D5BE0
-_020D73CC: .word CARDi_ReadRomSyncCore
-_020D73D0: .word 0x021D3498
-
- arm_func_start CARDi_ReadRomSyncCore
-CARDi_ReadRomSyncCore: ; 0x020D73D4
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r4, _020D7478 ; =0x021D5C00
- mov r0, r4
- bl CARDi_ReadFromCache
-_020D73E8: ; 0x020D73E8
- cmp r0, #0x0
- beq _020D73FC
- ldr r1, [r4, #0x0]
- mov r0, r4
- blx r1
-_020D73FC:
- ldr r7, _020D747C ; =0x021D55C0
- bl CARDi_ReadRomIDCore
- bl CARDi_CheckPulledOutCore
-_020D7408: ; 0x020D7408
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0x0]
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r7, #0x114]
- add r0, r7, #0x10c
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D744C
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D744C:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D7454: ; 0x020D7454
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D7478: .word 0x021D5C00
-_020D747C: .word 0x021D55C0
-
- arm_func_start CARDi_ReadRomIDCore
-CARDi_ReadRomIDCore: ; 0x020D7480
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- mov r0, #0xb8000000
- mov r1, #0x0
- bl CARDi_SetRomOp
- ldr r1, _020D74DC ; =0x02106A50
- mov r0, #0x2000
- ldr r1, [r1, #0x0]
- rsb r0, r0, #0x0
- ldr r2, [r1, #0x60]
- ldr r1, _020D74E0 ; =0x040001A4
- bic r2, r2, #0x7000000
- orr r2, r2, #0xa7000000
- and r0, r2, r0
- str r0, [r1, #0x0]
-_020D74BC:
- ldr r0, [r1, #0x0]
- ands r0, r0, #0x800000
- beq _020D74BC
- ldr r0, _020D74E4 ; =0x04100010
- ldr r0, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D74DC: .word 0x02106A50
-_020D74E0: .word 0x040001A4
-_020D74E4: .word 0x04100010
-
- arm_func_start CARDi_ReadCard
-CARDi_ReadCard: ; 0x020D74E8
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- mov r10, r0
- ldr sb, _020D75DC ; =0x021D55C0
- add r7, r10, #0x20
- ldr r5, _020D75E0 ; =0x04100010
- ldr r6, _020D75E4 ; =0x040001A4
- mov r11, #0x0
- mov r0, #0x200
- rsb r4, r0, #0x0
-_020D7510:
- ldr r0, [r9, #0x1c]
- and r1, r0, r4
- cmp r1, r0
- bne _020D7538
- ldr r8, [r9, #0x20]
- ands r0, r8, #0x3
- bne _020D7538
- ldr r0, [r9, #0x24]
- cmp r0, #0x200
- bhs _020D7540
-_020D7538:
- mov r8, r7
- str r1, [r10, #0x8]
-_020D7540:
- mov r0, r1, lsr #0x8
- orr r0, r0, #0xb7000000
- mov r1, r1, lsl #0x18
- bl CARDi_SetRomOp
- ldr r1, [r10, #0x4]
- mov r0, r11
- str r1, [r6, #0x0]
-_020D755C:
- ldr r2, [r6, #0x0]
- ands r1, r2, #0x800000
- beq _020D7578
- ldr r1, [r5, #0x0]
- cmp r0, #0x200
- strcc r1, [r8, r0, lsl #0x2]
- addcc r0, r0, #0x1
-_020D7578:
- ands r1, r2, #0x80000000
- bne _020D755C
- ldr r0, [r9, #0x20]
- cmp r8, r0
- bne _020D75C0
- ldr r2, [r9, #0x1c]
- ldr r1, [r9, #0x20]
- ldr r0, [r9, #0x24]
- add r2, r2, #0x200
- add r1, r1, #0x200
- subs r0, r0, #0x200
- str r2, [r9, #0x1c]
- str r1, [r9, #0x20]
- str r0, [r9, #0x24]
- bne _020D7510
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-_020D75C0:
- mov r0, r10
- bl CARDi_ReadFromCache
-_020D75C8: ; 0x020D75C8
- cmp r0, #0x0
- bne _020D7510
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D75DC: .word 0x021D55C0
-_020D75E0: .word 0x04100010
-_020D75E4: .word 0x040001A4
-
- arm_func_start CARDi_TryReadCardDma
-CARDi_TryReadCardDma:
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- ldr fp, _020D7748 ; =0x021D55C0
- mov r7, #0x0
- ldr r9, [r11, #0x20]
- mov r10, r0
- mov r6, r7
- mov r5, r7
- mov r1, r7
- ands r4, r9, #0x1f
- ldr r8, [r11, #0x24]
- bne _020D7624
- ldr r0, [r11, #0x28]
- cmp r0, #0x3
- movls r1, #0x1
-_020D7624:
- cmp r1, #0x0
- beq _020D7678
- bl OS_GetDTCMAddress
- ldr r1, _020D774C ; =0x01FF8000
- add r2, r9, r8
- cmp r2, r1
- mov r3, #0x1
- mov r1, #0x0
- bls _020D7650
- cmp r9, #0x2000000
- movcc r1, r3
-_020D7650:
- cmp r1, #0x0
- bne _020D7670
- cmp r0, r2
- bhs _020D766C
- add r0, r0, #0x4000
- cmp r0, r9
- bhi _020D7670
-_020D766C:
- mov r3, #0x0
-_020D7670:
- cmp r3, #0x0
- moveq r5, #0x1
-_020D7678:
- cmp r5, #0x0
- beq _020D7694
- ldr r1, [r11, #0x1c]
- ldr r0, _020D7750 ; =0x000001FF
- orr r1, r1, r8
- ands r0, r1, r0
- moveq r6, #0x1
-_020D7694:
- cmp r6, #0x0
- beq _020D76A4
- cmp r8, #0x0
- movne r7, #0x1
-_020D76A4:
- ldr r0, _020D7754 ; =0x02106A50
- cmp r7, #0x0
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x60]
- bic r0, r0, #0x7000000
- orr r0, r0, #0xa1000000
- str r0, [r10, #0x4]
- beq _020D7738
- bl OS_DisableInterrupts
- mov r5, r0
- mov r0, r9
- mov r1, r8
- bl IC_InvalidateRange
-_020D76D8: ; 0x020D76D8
- cmp r4, #0x0
- beq _020D7700
- sub r9, r9, r4
- mov r0, r9
- mov r1, #0x20
- bl DC_StoreRange
- add r0, r9, r8
- mov r1, #0x20
- bl DC_StoreRange
- add r8, r8, #0x20
-_020D7700:
- mov r0, r9
- mov r1, r8
- bl DC_InvalidateRange
- bl DC_WaitWriteBufferEmpty
- ldr r1, _020D7758 ; =CARDi_OnReadCard
- mov r0, #0x80000
- bl OS_SetIrqFunction
- mov r0, #0x80000
- bl OS_ResetRequestIrqMask
- mov r0, #0x80000
- bl OS_EnableIrqMask
- mov r0, r5
- bl OS_RestoreInterrupts
- bl CARDi_SetCardDma
-_020D7738:
- mov r0, r7
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
- .balign 4
-_020D7748: .word cardi_common
-_020D774C: .word 0x01FF8000
-_020D7750: .word 0x000001FF
-_020D7754: .word 0x02106A50
-_020D7758: .word CARDi_OnReadCard
-
- arm_func_start CARDi_OnReadCard
-CARDi_OnReadCard: ; 0x020D775C
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r0, _020D7838 ; =0x021D55C0
- ldr r0, [r0, #0x28]
- bl MI_StopDma
- ldr r0, _020D7838 ; =0x021D55C0
- ldr r3, [r0, #0x1c]
- ldr r2, [r0, #0x20]
- ldr r1, [r0, #0x24]
- add r3, r3, #0x200
- add r2, r2, #0x200
- subs r1, r1, #0x200
- str r3, [r0, #0x1c]
- str r2, [r0, #0x20]
- str r1, [r0, #0x24]
- bne _020D7828
- mov r0, #0x80000
- bl OS_DisableIrqMask
- mov r0, #0x80000
- bl OS_ResetRequestIrqMask
- ldr r7, _020D7838 ; =0x021D55C0
- bl CARDi_ReadRomIDCore
- bl CARDi_CheckPulledOutCore
-_020D77B8: ; 0x020D77B8
- ldr r0, [r7, #0x0]
- mov r1, #0x0
- str r1, [r0, #0x0]
- ldr r6, [r7, #0x38]
- ldr r5, [r7, #0x3c]
- bl OS_DisableInterrupts
- ldr r1, [r7, #0x114]
- mov r4, r0
- bic r0, r1, #0x4c
- str r0, [r7, #0x114]
- add r0, r7, #0x10c
- bl OS_WakeupThread
- ldr r0, [r7, #0x114]
- ands r0, r0, #0x10
- beq _020D77FC
- add r0, r7, #0x44
- bl OS_WakeupThreadDirect
-_020D77FC:
- mov r0, r4
- bl OS_RestoreInterrupts
-_020D7804: ; 0x020D7804
- cmp r6, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r0, r5
- blx r6
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-_020D7828:
- bl CARDi_SetCardDma
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
- .balign 4
-_020D7838: .word 0x021D55C0
-
- arm_func_start CARDi_SetCardDma
-CARDi_SetCardDma: ; 0x020D783C
- stmdb sp!, {r4,lr}
- ldr r4, _020D7884 ; =0x021D55C0
- ldr r1, _020D7888 ; =0x04100010
- ldr r0, [r4, #0x28]
- ldr r2, [r4, #0x20]
- mov r3, #0x200
- bl MIi_CardDmaCopy32
- ldr r1, [r4, #0x1c]
- mov r0, r1, lsr #0x8
- orr r0, r0, #0xb7000000
- mov r1, r1, lsl #0x18
- bl CARDi_SetRomOp
- ldr r0, _020D788C ; =0x021D5C00
- ldr r1, _020D7890 ; =0x040001A4
- ldr r0, [r0, #0x4]
- str r0, [r1, #0x0]
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D7884: .word 0x021D55C0
-_020D7888: .word 0x04100010
-_020D788C: .word 0x021D5C00
-_020D7890: .word 0x040001A4
-
- arm_func_start CARDi_SetRomOp
-CARDi_SetRomOp: ; 0x020D7894
- ldr r3, _020D790C ; =0x040001A4
-_020D7898:
- ldr r2, [r3, #0x0]
- ands r2, r2, #0x80000000
- bne _020D7898
- ldr r3, _020D7910 ; =0x040001A1
- mov r12, #0xc0
- ldr r2, _020D7914 ; =0x040001A8
- strb r12, [r3, #0x0]
- mov r12, r0, lsr #0x18
- ldr r3, _020D7918 ; =0x040001A9
- strb r12, [r2, #0x0]
- mov r12, r0, lsr #0x10
- ldr r2, _020D791C ; =0x040001AA
- strb r12, [r3, #0x0]
- mov r12, r0, lsr #0x8
- ldr r3, _020D7920 ; =0x040001AB
- strb r12, [r2, #0x0]
- ldr r2, _020D7924 ; =0x040001AC
- strb r0, [r3, #0x0]
- mov r3, r1, lsr #0x18
- ldr r0, _020D7928 ; =0x040001AD
- strb r3, [r2, #0x0]
- mov r3, r1, lsr #0x10
- ldr r2, _020D792C ; =0x040001AE
- strb r3, [r0, #0x0]
- mov r3, r1, lsr #0x8
- ldr r0, _020D7930 ; =0x040001AF
- strb r3, [r2, #0x0]
- strb r1, [r0, #0x0]
- bx lr
- .balign 4
-_020D790C: .word 0x040001A4
-_020D7910: .word 0x040001A1
-_020D7914: .word 0x040001A8
-_020D7918: .word 0x040001A9
-_020D791C: .word 0x040001AA
-_020D7920: .word 0x040001AB
-_020D7924: .word 0x040001AC
-_020D7928: .word 0x040001AD
-_020D792C: .word 0x040001AE
-_020D7930: .word 0x040001AF
-
- arm_func_start CARDi_ReadFromCache
-CARDi_ReadFromCache:
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r5, _020D79C8 ; =0x021D55C0
- mov r1, #0x200
- ldr r3, [r5, #0x1c]
- rsb r1, r1, #0x0
- ldr r2, [r0, #0x8]
- and r3, r3, r1
- cmp r3, r2
- bne _020D79AC
- ldr r2, [r5, #0x1c]
- ldr r1, [r5, #0x24]
- sub r3, r2, r3
- rsb r4, r3, #0x200
- cmp r4, r1
- movhi r4, r1
- add r0, r0, #0x20
- ldr r1, [r5, #0x20]
- mov r2, r4
- add r0, r0, r3
- bl MI_CpuCopy8
- ldr r0, [r5, #0x1c]
- add r0, r0, r4
- str r0, [r5, #0x1c]
- ldr r0, [r5, #0x20]
- add r0, r0, r4
- str r0, [r5, #0x20]
- ldr r0, [r5, #0x24]
- sub r0, r0, r4
- str r0, [r5, #0x24]
-_020D79AC:
- ldr r0, [r5, #0x24]
- cmp r0, #0x0
- movne r0, #0x1
- moveq r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D79C8: .word 0x021D55C0
-
- arm_func_start CARDi_Request
-CARDi_Request:
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- mov r6, r0
- ldr r0, [r6, #0x114]
- mov r5, r1
- mov r4, r2
- ands r0, r0, #0x2
- bne _020D7A44
- ldr r1, [r6, #0x114]
- mov r0, #0xb
- orr r2, r1, #0x2
- mov r1, #0x1
- str r2, [r6, #0x114]
- bl PXI_IsCallbackReady
-_020D7A04: ; 0x020D7A04
- cmp r0, #0x0
- bne _020D7A34
- mov r9, #0x64
- mov r8, #0xb
- mov r7, #0x1
-_020D7A18:
- mov r0, r9
- bl OS_SpinWait
- mov r0, r8
- mov r1, r7
- bl PXI_IsCallbackReady
-_020D7A2C: ; 0x020D7A2C
- cmp r0, #0x0
- beq _020D7A18
-_020D7A34:
- mov r0, r6
- mov r1, #0x0
- mov r2, #0x1
- bl CARDi_Request
-_020D7A44:
- ldr r0, [r6, #0x0]
- mov r1, #0x60
- bl DC_FlushRange
- bl DC_WaitWriteBufferEmpty
- mov r9, #0xb
- mov r8, #0x1
- mov r7, #0x0
- mov r11, #0x60
-_020D7A64:
- str r5, [r6, #0x4]
- ldr r0, [r6, #0x114]
- orr r0, r0, #0x20
- str r0, [r6, #0x114]
-_020D7A74:
- mov r0, r9
- mov r1, r5
- mov r2, r8
- bl PXI_SendWordByFifo
-_020D7A84: ; 0x020D7A84
- cmp r0, #0x0
- blt _020D7A74
- cmp r5, #0x0
- bne _020D7AB0
- ldr r10, [r6, #0x0]
-_020D7A98:
- mov r0, r9
- mov r1, r10
- mov r2, r8
- bl PXI_SendWordByFifo
-_020D7AA8: ; 0x020D7AA8
- cmp r0, #0x0
- blt _020D7A98
-_020D7AB0:
- bl OS_DisableInterrupts
- ldr r1, [r6, #0x114]
- mov r10, r0
- ands r0, r1, #0x20
- beq _020D7AD8
-_020D7AC4:
- mov r0, r7
- bl OS_SleepThread
- ldr r0, [r6, #0x114]
- ands r0, r0, #0x20
- bne _020D7AC4
-_020D7AD8:
- mov r0, r10
- bl OS_RestoreInterrupts
-_020D7AE0: ; 0x020D7AE0
- ldr r0, [r6, #0x0]
- mov r1, r11
- bl DC_InvalidateRange
-_020D7AEC: ; 0x020D7AEC
- ldr r0, [r6, #0x0]
- ldr r0, [r0, #0x0]
- cmp r0, #0x4
- bne _020D7B08
- sub r4, r4, #0x1
- cmp r4, #0x0
- bgt _020D7A64
-_020D7B08:
- cmp r0, #0x0
- moveq r0, #0x1
- movne r0, #0x0
- add sp, sp, #0x4
- ldmia sp!, {r4-r11,lr}
- bx lr
-
- arm_func_start CARDi_TaskThread
-CARDi_TaskThread: ; 0x020D7B20
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- ldr r5, _020D7B78 ; =0x021D55C0
- mov r6, #0x0
- add r7, r5, #0x44
-_020D7B34:
- bl OS_DisableInterrupts
- ldr r1, [r5, #0x114]
- mov r4, r0
- ands r0, r1, #0x8
- bne _020D7B60
-_020D7B48:
- mov r0, r6
- str r7, [r5, #0x104]
- bl OS_SleepThread
- ldr r0, [r5, #0x114]
- ands r0, r0, #0x8
- beq _020D7B48
-_020D7B60:
- mov r0, r4
- bl OS_RestoreInterrupts
- ldr r1, [r5, #0x40]
- mov r0, r5
- blx r1
- b _020D7B34
- .balign 4
-_020D7B78: .word 0x021D55C0
-
- arm_func_start CARDi_OnFifoRecv
-CARDi_OnFifoRecv: ; 0x020D7B7C
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- cmp r0, #0xb
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- cmp r2, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {lr}
- bxeq lr
- ldr r1, _020D7BC8 ; =0x021D55C0
- ldr r0, [r1, #0x114]
- bic r0, r0, #0x20
- str r0, [r1, #0x114]
- ldr r0, [r1, #0x104]
- bl OS_WakeupThreadDirect
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D7BC8: .word 0x021D55C0
-
- arm_func_start CARDi_SendtoPxi
-CARDi_SendtoPxi: ; 0x020D7BCC
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r6, r1
- mov r1, r7
- mov r0, #0xe
- mov r2, #0x0
- bl PXI_SendWordByFifo
-_020D7BEC: ; 0x020D7BEC
- cmp r0, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {r4-r7,lr}
- bxeq lr
- mov r5, #0xe
- mov r4, #0x0
-_020D7C04:
- mov r0, r6
- bl SVC_WaitByLoop
- mov r0, r5
- mov r1, r7
- mov r2, r4
- bl PXI_SendWordByFifo
-_020D7C1C: ; 0x020D7C1C
- cmp r0, #0x0
- bne _020D7C04
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
-
- arm_func_start CARDi_CheckPulledOutCore
-CARDi_CheckPulledOutCore:
- stmdb sp!, {r4,lr}
- sub sp, sp, #0x8
- ldr r1, _020D7C94 ; =0x027FFC10
- ldrh r1, [r1, #0x0]
- cmp r1, #0x0
- ldreq r1, _020D7C98 ; =0x027FF800
- ldrne r1, _020D7C9C ; =0x027FFC00
- ldr r1, [r1, #0x0]
- str r1, [sp, #0x0]
- ldr r1, [sp, #0x0]
- cmp r0, r1
- addeq sp, sp, #0x8
- ldmeqia sp!, {r4,lr}
- bxeq lr
- bl OS_DisableInterrupts
- mov r4, r0
- mov r0, #0xe
- mov r1, #0x11
- mov r2, #0x0
- bl CARDi_PulledOutCallback
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #0x8
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020D7C94: .word 0x027FFC10
-_020D7C98: .word 0x027FF800
-_020D7C9C: .word 0x027FFC00
-
- arm_func_start CARD_TerminateForPulledOut
-CARD_TerminateForPulledOut: ; 0x020D7CA0
- stmdb sp!, {r4-r5,lr}
- sub sp, sp, #0x4
- ldr r0, _020D7D10 ; =0x027FFFA8
- mov r5, #0x1
- ldrh r0, [r0, #0x0]
- and r0, r0, #0x8000
- movs r0, r0, asr #0xf
- beq _020D7CEC
- bl PM_ForceToPowerOff
- cmp r0, #0x4
- bne _020D7CE4
- ldr r4, _020D7D14 ; =0x000A3A47
-_020D7CD0:
- mov r0, r4
- bl OS_SpinWait
- bl PM_ForceToPowerOff
- cmp r0, #0x4
- beq _020D7CD0
-_020D7CE4:
- cmp r0, #0x0
- moveq r5, #0x0
-_020D7CEC:
- cmp r5, #0x0
- beq _020D7D00
- mov r0, #0x1
- mov r1, r0
- bl CARDi_SendtoPxi
-_020D7D00:
- bl OS_Terminate
- add sp, sp, #0x4
- ldmia sp!, {r4-r5,lr}
- bx lr
- .balign 4
-_020D7D10: .word 0x027FFFA8
-_020D7D14: .word 0x000A3A47
-
- arm_func_start CARD_IsPulledOut
-CARD_IsPulledOut: ; 0x020D7D18
- ldr r0, _020D7D24 ; =0x021D5E20
- ldr r0, [r0, #0x0]
- bx lr
- .balign 4
-_020D7D24: .word 0x021D5E20
-
- arm_func_start CARDi_PulledOutCallback
-CARDi_PulledOutCallback: ; 0x020D7D28
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- and r0, r1, #0x3f
- cmp r0, #0x11
- bne _020D7D90
- ldr r2, _020D7DA0 ; =0x021D5E20
- ldr r0, [r2, #0x0]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- ldr r1, _020D7DA4 ; =0x021D5E24
- mov r0, #0x1
- ldr r1, [r1, #0x0]
- str r0, [r2, #0x0]
- cmp r1, #0x0
- beq _020D7D70
- blx r1
-_020D7D70:
- cmp r0, #0x0
- addeq sp, sp, #0x4
- ldmeqia sp!, {lr}
- bxeq lr
- bl CARD_TerminateForPulledOut
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
-_020D7D90:
- bl OS_Terminate
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D7DA0: .word 0x021D5E20
-_020D7DA4: .word 0x021D5E24
-
- arm_func_start CARD_InitPulledOutCallback
-CARD_InitPulledOutCallback: ; 0x020D7DA8
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- bl PXI_Init
- ldr r1, _020D7DD8 ; =CARDi_PulledOutCallback
- mov r0, #0xe
- bl PXI_SetFifoRecvCallback
- ldr r0, _020D7DDC ; =0x021D5E24
- mov r1, #0x0
- str r1, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020D7DD8: .word CARDi_PulledOutCallback
-_020D7DDC: .word 0x021D5E24
diff --git a/arm9/global.inc b/arm9/global.inc
index e418ef78..0f1b50e2 100644
--- a/arm9/global.inc
+++ b/arm9/global.inc
@@ -1,7 +1,9 @@
.extern CARD_CancelBackupAsync
+.extern CARD_CheckEnabled
.extern CARD_GetResultCode
.extern CARD_IdentifyBackup
.extern CARD_Init
+.extern CARD_InitPulledOutCallback
.extern CARD_IsPulledOut
.extern CARD_LockBackup
.extern CARD_LockRom
@@ -9,8 +11,16 @@
.extern CARD_UnlockBackup
.extern CARD_UnlockRom
.extern CARD_WaitBackupAsync
+.extern CARDi_CheckPulledOutCore
+.extern CARDi_IdentifyBackupCore
+.extern CARDi_InitCommon
+.extern CARDi_OnFifoRecv
.extern CARDi_ReadRom
+.extern CARDi_Request
.extern CARDi_RequestStreamCommand
+.extern CARDi_SetTask
+.extern CARDi_TaskThread
+.extern CARDi_WaitAsync
.extern CP_RestoreContext
.extern CP_SaveContext
.extern CTRDG_Init
@@ -2651,6 +2661,7 @@
.extern FUN_020C1F54
.extern FUN_020C1FA4
.extern FUN_020C1FF0
+.extern FUN_020D6714
.extern FUN_02013EA8
.extern FUN_02013EC4
.extern FUN_0200A06C
@@ -3679,8 +3690,13 @@
.extern RTC_ConvertSecondToDateTime
.extern RTC_GetDate
.extern RTC_GetDateTimeAsync
+.extern RTC_GetDayOfWeek
.extern RTC_GetTime
.extern RTC_Init
+.extern RTCi_ReadRawDateAsync
+.extern RTCi_ReadRawDateTimeAsync
+.extern RTCi_ReadRawTimeAsync
+.extern RTCi_WriteRawStatus2Async
.extern RunScriptCommand
.extern SDK_AUTOLOAD_DTCM_END
.extern SDK_AUTOLOAD_DTCM_START