diff options
Diffstat (limited to 'arm7/asm/CARD_thread.s')
-rw-r--r-- | arm7/asm/CARD_thread.s | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/arm7/asm/CARD_thread.s b/arm7/asm/CARD_thread.s new file mode 100644 index 00000000..fba1cf76 --- /dev/null +++ b/arm7/asm/CARD_thread.s @@ -0,0 +1,156 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start CARDi_TaskThread +CARDi_TaskThread: ; 0x03800B20 + stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} + sub sp, sp, #4 + ldr r9, _03800D28 ; =cardi_common + add r5, r9, #72 ; 0x48 + mov r8, #0 + add r7, r9, #252 ; 0xfc + mov r6, #1 + mov r4, #3 + mov fp, #11 +_03800B44: + mov sl, r8 + bl OS_DisableInterrupts + str r0, [sp] +_03800B50: + ldr r0, [r9, #252] ; 0xfc + ands r0, r0, #4 + bne _03800B88 + ldr r0, [r9, #252] ; 0xfc + ands r0, r0, #16 + beq _03800B94 + ldr r0, [r7] + orr r0, r0, #4 + str r0, [r7] + ldr r0, [r7] + bic r0, r0, #16 + str r0, [r7] + mov sl, r6 + b _03800BA4 +_03800B88: + ldr r0, [r9, #252] ; 0xfc + ands r0, r0, #8 + bne _03800BA4 +_03800B94: + str r5, [r9, #236] ; 0xec + mov r0, r8 + bl OS_SleepThread + b _03800B50 +_03800BA4: + ldr r0, [sp] + bl OS_RestoreInterrupts + cmp sl, #0 + beq _03800D14 + ldr r0, [r9] + str r8, [r0] + ldr r2, [r9] + ldr r1, [r2, #76] ; 0x4c + ldr r0, [r9, #4] + mov r0, r6, lsl r0 + ands r0, r1, r0 + streq r4, [r2] + ldr r0, [r9, #4] + cmp r0, #12 + addls pc, pc, r0, lsl #2 + b _03800CB8 + b _03800CC0 + b _03800CC0 + b _03800C18 + b _03800C20 + b _03800C30 + b _03800CB8 + b _03800C3C + b _03800C54 + b _03800C6C + b _03800C84 + b _03800CB8 + b _03800C9C + b _03800CB0 +_03800C18: + bl CARDi_InitStatusRegister + b _03800CC0 +_03800C20: + bl CARDi_ReadRomIDCore + ldr r1, [r9] + str r0, [r1, #8] + b _03800CC0 +_03800C30: + ldr r0, [r9] + str r4, [r0] + b _03800CC0 +_03800C3C: + ldr r2, [r9] + ldr r0, [r2, #12] + ldr r1, [r2, #16] + ldr r2, [r2, #20] + bl CARDi_ReadBackupCore + b _03800CC0 +_03800C54: + ldr r2, [r9] + ldr r0, [r2, #16] + ldr r1, [r2, #12] + ldr r2, [r2, #20] + bl CARDi_WriteBackupCore + b _03800CC0 +_03800C6C: + ldr r2, [r9] + ldr r0, [r2, #16] + ldr r1, [r2, #12] + ldr r2, [r2, #20] + bl CARDi_ProgramBackupCore + b _03800CC0 +_03800C84: + ldr r2, [r9] + ldr r0, [r2, #16] + ldr r1, [r2, #12] + ldr r2, [r2, #20] + bl CARDi_VerifyBackupCore + b _03800CC0 +_03800C9C: + ldr r1, [r9] + ldr r0, [r1, #16] + ldr r1, [r1, #20] + bl CARDi_EraseBackupSectorCore + b _03800CC0 +_03800CB0: + bl CARDi_EraseChipCore + b _03800CC0 +_03800CB8: + ldr r0, [r9] + str r4, [r0] +_03800CC0: + mov r0, fp + mov r1, r6 + mov r2, r6 + bl PXI_SendWordByFifo + cmp r0, #0 + blt _03800CC0 + bl OS_DisableInterrupts + mov sl, r0 + ldr r0, [r9, #252] ; 0xfc + bic r0, r0, #76 ; 0x4c + str r0, [r9, #252] ; 0xfc + add r0, r9, #244 ; 0xf4 + bl OS_WakeupThread + ldr r0, [r9, #252] ; 0xfc + ands r0, r0, #16 + beq _03800D08 + mov r0, r5 + bl OS_WakeupThreadDirect +_03800D08: + mov r0, sl + bl OS_RestoreInterrupts + b _03800B44 +_03800D14: + mov r0, r9 + ldr r1, [r9, #68] ; 0x44 + mov lr, pc + bx r1 + b _03800B44 +_03800D28: .word cardi_common |