diff options
Diffstat (limited to 'arm9/asm/OS_tick.s')
-rw-r--r-- | arm9/asm/OS_tick.s | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/arm9/asm/OS_tick.s b/arm9/asm/OS_tick.s new file mode 100644 index 00000000..f43c45a1 --- /dev/null +++ b/arm9/asm/OS_tick.s @@ -0,0 +1,151 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start OS_GetTickLo +OS_GetTickLo: ; 0x020CCC0C + ldr r0, _020CCC18 ; =0x04000100 + ldrh r0, [r0, #0x0] + bx lr + .balign 4 +_020CCC18: .word 0x04000100 + + arm_func_start OS_GetTick +OS_GetTick: ; 0x020CCC1C + stmdb sp!, {lr} + sub sp, sp, #0xc + bl OS_DisableInterrupts + ldr r1, _020CCCBC ; =0x04000100 + ldr r3, _020CCCC0 ; =OSi_TickCounter + ldrh r12, [r1, #0x0] + ldr r2, _020CCCC4 ; =0x0000FFFF + mvn r1, #0x0 + strh r12, [sp, #0x0] + ldr r12, [r3, #0x0] + ldr r3, [r3, #0x4] + and r1, r12, r1 + and r2, r3, r2 + str r1, [sp, #0x4] + ldr r1, _020CCCC8 ; =0x04000214 + str r2, [sp, #0x8] + ldr r1, [r1, #0x0] + ands r1, r1, #0x8 + beq _020CCC90 + ldrh r1, [sp, #0x0] + ands r1, r1, #0x8000 + bne _020CCC90 + ldr r3, [sp, #0x4] + mov r1, #0x1 + ldr r2, [sp, #0x8] + adds r3, r3, r1 + adc r1, r2, #0x0 + str r3, [sp, #0x4] + str r1, [sp, #0x8] +_020CCC90: + bl OS_RestoreInterrupts + ldr r2, [sp, #0x4] + ldr r1, [sp, #0x8] + ldrh r0, [sp, #0x0] + mov r1, r1, lsl #0x10 + orr r1, r1, r2, lsr #0x10 + orr r1, r1, r0, asr #0x1f + orr r0, r0, r2, lsl #0x10 + add sp, sp, #0xc + ldmia sp!, {lr} + bx lr + .balign 4 +_020CCCBC: .word 0x04000100 +_020CCCC0: .word OSi_TickCounter +_020CCCC4: .word 0x0000FFFF +_020CCCC8: .word 0x04000214 + + arm_func_start OSi_CountUpTick +OSi_CountUpTick: ; 0x020CCCCC + stmdb sp!, {lr} + sub sp, sp, #0x4 + ldr r2, _020CCD40 ; =OSi_TickCounter + ldr r1, _020CCD44 ; =OSi_NeedResetTimer + ldr r12, [r2, #0x0] + mov r0, #0x1 + ldr r3, [r2, #0x4] + adds r12, r12, r0 + ldr r0, [r1, #0x0] + adc r3, r3, #0x0 + str r12, [r2, #0x0] + str r3, [r2, #0x4] + cmp r0, #0x0 + mov r3, #0x0 + beq _020CCD24 + ldr r2, _020CCD48 ; =0x04000102 + ldr r0, _020CCD4C ; =0x04000100 + strh r3, [r2, #0x0] + strh r3, [r0, #0x0] + mov r0, #0xc1 + strh r0, [r2, #0x0] + str r3, [r1, #0x0] +_020CCD24: + mov r0, #0x0 + ldr r1, _020CCD50 ; =OSi_CountUpTick + mov r2, r0 + bl OSi_EnterTimerCallback + add sp, sp, #0x4 + ldmia sp!, {lr} + bx lr + .balign 4 +_020CCD40: .word OSi_TickCounter +_020CCD44: .word OSi_NeedResetTimer +_020CCD48: .word 0x04000102 +_020CCD4C: .word 0x04000100 +_020CCD50: .word OSi_CountUpTick + + arm_func_start OS_IsTickAvailable +OS_IsTickAvailable: ; 0x020CCD54 + ldr r0, _020CCD60 ; =OSi_UseTick + ldrh r0, [r0, #0x0] + bx lr + .balign 4 +_020CCD60: .word OSi_UseTick + + arm_func_start OS_InitTick +OS_InitTick: ; 0x020CCD64 + stmdb sp!, {lr} + sub sp, sp, #0x4 + ldr r1, _020CCDE8 ; =OSi_UseTick + ldrh r0, [r1, #0x0] + cmp r0, #0x0 + addne sp, sp, #0x4 + ldmneia sp!, {lr} + bxne lr + mov r2, #0x1 + mov r0, #0x0 + strh r2, [r1, #0x0] + bl OSi_SetTimerReserved + ldr r0, _020CCDEC ; =OSi_TickCounter + mov r2, #0x0 + str r2, [r0, #0x0] + ldr r3, _020CCDF0 ; =0x04000102 + str r2, [r0, #0x4] + ldr r0, _020CCDF4 ; =0x04000100 + strh r2, [r3, #0x0] + ldr r1, _020CCDF8 ; =OSi_CountUpTick + strh r2, [r0, #0x0] + mov r2, #0xc1 + mov r0, #0x8 + strh r2, [r3, #0x0] + bl OS_SetIrqFunction + mov r0, #0x8 + bl OS_EnableIrqMask + ldr r0, _020CCDFC ; =OSi_NeedResetTimer + mov r1, #0x0 + str r1, [r0, #0x0] + add sp, sp, #0x4 + ldmia sp!, {lr} + bx lr + .balign 4 +_020CCDE8: .word OSi_UseTick +_020CCDEC: .word OSi_TickCounter +_020CCDF0: .word 0x04000102 +_020CCDF4: .word 0x04000100 +_020CCDF8: .word OSi_CountUpTick +_020CCDFC: .word OSi_NeedResetTimer |