summaryrefslogtreecommitdiff
path: root/arm9/asm/OS_tick.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/OS_tick.s')
-rw-r--r--arm9/asm/OS_tick.s151
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