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
|