summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_tick.s
blob: f9688b9e7db74c0aeb28414ccff21d07825ddc2f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
    .include "asm/macros.inc"
    .include "global.inc"

    .section .bss

	.global _03807920
_03807920: ;0x03807920
	.space 0x03807924 - 0x03807920

	.global OSi_NeedResetTimer
OSi_NeedResetTimer: ;0x03807924
	.space 0x03807928 - 0x03807924

	.global OSi_TickCounter
OSi_TickCounter: ;0x03807928
	.space 0x03807930 - 0x03807928

    .section .text

	arm_func_start OS_GetTick
OS_GetTick: ; 0x037FA364
	stmfd	sp!, {lr}
	sub	sp, sp, #12
	bl	OS_DisableInterrupts
	ldr	r1, _037FA404	; =0x04000100
	ldrh	r1, [r1]
	strh	r1, [sp]
	ldr	r1, _037FA408	; =OSi_TickCounter
	ldr	ip, [r1]
	ldr	r3, [r1, #4]
	ldr	r2, _037FA40C	; =0x0000FFFF
	mvn	r1, #0
	and	r2, r3, r2
	and	r1, ip, r1
	str	r1, [sp, #4]
	str	r2, [sp, #8]
	ldr	r1, _037FA410	; =0x04000214
	ldr	r1, [r1]
	ands	r1, r1, #8
	beq	_037FA3D8
	ldrh	r1, [sp]
	ands	r1, r1, #32768	; 0x8000
	bne	_037FA3D8
	ldr	r3, [sp, #4]
	ldr	r2, [sp, #8]
	mov	r1, #1
	adds	r3, r3, r1
	adc	r1, r2, #0
	str	r3, [sp, #4]
	str	r1, [sp, #8]
_037FA3D8:
	bl	OS_RestoreInterrupts
	ldr	r2, [sp, #4]
	ldr	r0, [sp, #8]
	mov	r1, r0, lsl #16
	orr	r1, r1, r2, lsr #16
	ldrh	r0, [sp]
	orr	r1, r1, r0, asr #31
	orr	r0, r0, r2, lsl #16
	add	sp, sp, #12
	ldmia	sp!, {lr}
	bx	lr
_037FA404:	.word	0x04000100
_037FA408:	.word	OSi_TickCounter
_037FA40C:	.word	0x0000FFFF
_037FA410:	.word	0x04000214

	arm_func_start OSi_CountUpTick
OSi_CountUpTick: ; 0x037FA414
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	r1, _037FA488	; =OSi_TickCounter
	ldr	ip, [r1]
	ldr	r2, [r1, #4]
	mov	r3, #0
	mov	r0, #1
	adds	ip, ip, r0
	adc	r0, r2, #0
	str	ip, [r1]
	str	r0, [r1, #4]
	ldr	r0, _037FA48C	; =OSi_NeedResetTimer
	ldr	r1, [r0]
	cmp	r1, #0
	beq	_037FA46C
	ldr	r2, _037FA490	; =0x04000102
	strh	r3, [r2]
	ldr	r1, _037FA494	; =0x04000100
	strh	r3, [r1]
	mov	r1, #193	; 0xc1
	strh	r1, [r2]
	str	r3, [r0]
_037FA46C:
	mov	r0, #0
	ldr	r1, _037FA498	; =OSi_CountUpTick
	mov	r2, r0
	bl	OSi_EnterTimerCallback
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FA488:	.word	OSi_TickCounter
_037FA48C:	.word	OSi_NeedResetTimer
_037FA490:	.word	0x04000102
_037FA494:	.word	0x04000100
_037FA498:	.word	OSi_CountUpTick

	arm_func_start OS_IsTickAvailable
OS_IsTickAvailable: ; 0x037FA49C
	ldr	r0, _037FA4A8	; =_03807920
	ldrh	r0, [r0]
	bx	lr
_037FA4A8:	.word	_03807920

	arm_func_start OS_InitTick
OS_InitTick: ; 0x037FA4AC
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	r0, _037FA528	; =_03807920
	ldrh	r1, [r0]
	cmp	r1, #0
	bne	_037FA51C
	mov	r1, #1
	strh	r1, [r0]
	mov	r0, #0
	bl	OSi_SetTimerReserved
	mov	r2, #0
	ldr	r0, _037FA52C	; =OSi_TickCounter
	str	r2, [r0]
	str	r2, [r0, #4]
	ldr	r1, _037FA530	; =0x04000102
	strh	r2, [r1]
	ldr	r0, _037FA534	; =0x04000100
	strh	r2, [r0]
	mov	r0, #193	; 0xc1
	strh	r0, [r1]
	mov	r0, #8
	ldr	r1, _037FA538	; =OSi_CountUpTick
	bl	OS_SetIrqFunction
	mov	r0, #8
	bl	OS_EnableIrqMask
	mov	r1, #0
	ldr	r0, _037FA53C	; =OSi_NeedResetTimer
	str	r1, [r0]
_037FA51C:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FA528:	.word	_03807920
_037FA52C:	.word	OSi_TickCounter
_037FA530:	.word	0x04000102
_037FA534:	.word	0x04000100
_037FA538:	.word	OSi_CountUpTick
_037FA53C:	.word	OSi_NeedResetTimer