summaryrefslogtreecommitdiff
path: root/arm9/asm/libcard.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/libcard.s')
-rw-r--r--arm9/asm/libcard.s1782
1 files changed, 1782 insertions, 0 deletions
diff --git a/arm9/asm/libcard.s b/arm9/asm/libcard.s
new file mode 100644
index 00000000..664e85f5
--- /dev/null
+++ b/arm9/asm/libcard.s
@@ -0,0 +1,1782 @@
+ .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
+
+ arm_func_start CARD_IdentifyBackup
+CARD_IdentifyBackup: ; 0x020D6DC4
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ ldr r0, _020D6F00 ; =0x02000C3C
+ 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 0x02000C3C
+_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 ; =0x02000C3C
+ 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 0x02000C3C
+_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 ; =0x02000C3C
+ 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 0x02000C3C
+
+ 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
+ blx 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