summaryrefslogtreecommitdiff
path: root/arm7/asm/OS_irqHandler.s
blob: 6c3ffc5a60e8ddafad651f5eb750ca38221993ae (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
	.include "asm/macros.inc"
	.include "global.inc"

    .section .data

	.global _038075E4
_038075E4:
	.word	0x00090008
	.word	0x000B000A
	.word	0x00040003
	.word	0x00060005
	.word	0x00000000

	.global OS_IRQTable
OS_IRQTable:
	.word	OSi_IrqVBlank
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OSi_IrqTimer0
	.word	OSi_IrqTimer1
	.word	OSi_IrqTimer2
	.word	OSi_IrqTimer3
	.word	OS_IrqDummy
	.word	OSi_IrqDma0
	.word	OSi_IrqDma1
	.word	OSi_IrqDma2
	.word	OSi_IrqDma3
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy
	.word	OS_IrqDummy

    .section .text

	arm_func_start OS_IrqHandler
OS_IrqHandler: ; 0x037F853C
	stmfd	sp!, {lr}
	mov	ip, #67108864	; 0x4000000
	add	ip, ip, #528	; 0x210
	ldr	r1, [ip, #-8]
	cmp	r1, #0
	ldmeqfd	sp!, {pc}
	ldmia	ip, {r1, r2}
	ands	r1, r1, r2
	ldmeqfd	sp!, {pc}
	mov	r3, #1
	mov	r0, #0
_037F8568:
	ands	r2, r1, r3, lsl r0
	addeq	r0, r0, #1
	beq	_037F8568
	str	r2, [ip, #4]
	ldr	r1, _037F8588	; =OS_IRQTable
	ldr	r0, [r1, r0, lsl #2]
	ldr	lr, _037F858C	; =OS_IrqHandler_ThreadSwitch
	bx	r0
_037F8588:	.word	OS_IRQTable
_037F858C:	.word	OS_IrqHandler_ThreadSwitch

	arm_func_start OS_IrqHandler_ThreadSwitch
OS_IrqHandler_ThreadSwitch:
	ldr	ip, _037F86AC	; =OSi_IrqThreadQueue
	mov	r3, #0
	ldr	ip, [ip]
	mov	r2, #1
	cmp	ip, #0
	beq	_037F85E0
_037F85A8:
	str	r2, [ip, #72]	; 0x48
	str	r3, [ip, #92]	; 0x5c
	str	r3, [ip, #96]	; 0x60
	ldr	r0, [ip, #100]	; 0x64
	str	r3, [ip, #100]	; 0x64
	mov	ip, r0
	cmp	ip, #0
	bne	_037F85A8
	ldr	ip, _037F86AC	; =OSi_IrqThreadQueue
	str	r3, [ip]
	str	r3, [ip, #4]
	ldr	ip, _037F86B0	; =OSi_ThreadInfo
	mov	r1, #1
	strh	r1, [ip]
_037F85E0:
	ldr	ip, _037F86B0	; =OSi_ThreadInfo
	ldrh	r1, [ip]
	cmp	r1, #0
	ldreq	pc, [sp], #4		; (ldreq pc, [sp], #4)
	mov	r1, #0
	strh	r1, [ip]
	mov	r3, #210	; 0xd2
	msr	CPSR_c, r3
	add	r2, ip, #8
	ldr	r1, [r2]
_037F8608:
	cmp	r1, #0
	ldrneh	r0, [r1, #72]	; 0x48
	cmpne	r0, #1
	ldrne	r1, [r1, #76]	; 0x4c
	bne	_037F8608
	cmp	r1, #0
	bne	_037F8630
_037F8624:
	mov	r3, #146	; 0x92
	msr	CPSR_c, r3
	ldr pc, [sp], #4
_037F8630:
	ldr	r0, [ip, #4]
	cmp	r1, r0
	beq	_037F8624
	ldr	r3, [ip, #12]
	cmp	r3, #0
	beq	_037F8658
	stmdb	sp!, {r0, r1, ip}
	mov	lr, pc
	bx	r3
	ldmia	sp!, {r0, r1, ip}
_037F8658:
	str	r1, [ip, #4]
	mrs	r2, SPSR
	str	r2, [r0, #0]!
	ldmib	sp!, {r2, r3}
	stmib	r0!, {r2, r3}
	ldmib	sp!, {r2, r3, ip, lr}
	stmib	r0!, {r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
	stmib	r0!, {lr}
	mov	r3, #211	; 0xd3
	msr	CPSR_c, r3
	stmib	r0!, {sp}
	ldr	sp, [r1, #68]	; 0x44
	mov	r3, #210	; 0xd2
	msr	CPSR_c, r3
	ldr	r2, [r1, #0]!
	msr	SPSR_fc, r2
	ldr	lr, [r1, #64]	; 0x40
	ldmib	r1!, {r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, sl, fp, ip, sp, lr}^
	nop			; (mov r0, r0)
	stmda	sp!, {r0, r1, r2, r3, ip, lr}
	ldmia	sp!, {pc}
_037F86AC:	.word	OSi_IrqThreadQueue
_037F86B0:	.word	OSi_ThreadInfo