src/gba/hle-bios.s (view raw)
1# Copyright (c) 2013-2014 Jeffrey Pfau
2#
3# This Source Code Form is subject to the terms of the Mozilla Public
4# License, v. 2.0. If a copy of the MPL was not distributed with this
5# file, You can obtain one at http://mozilla.org/MPL/2.0/.
6#define nop andeq r0, r0
7
8.text
9
10b resetBase
11b undefBase
12b swiBase
13b pabtBase
14b dabtBase
15nop
16b irqBase
17b fiqBase
18
19resetBase:
20mov pc, #0x8000000
21
22swiBase:
23cmp sp, #0
24moveq sp, #0x04000000
25subeq sp, #0x20
26stmfd sp!, {r11-r12, lr}
27ldrb r11, [lr, #-2]
28mov r12, #swiTable
29ldr r11, [r12, r11, lsl #2]
30cmp r11, #0
31mrs r12, spsr
32stmfd sp!, {r12}
33and r12, #0x80
34orr r12, #0x1F
35msr cpsr, r12
36stmfd sp!, {lr}
37mov lr, pc
38bxne r11
39ldmfd sp!, {lr}
40msr cpsr, #0x93
41ldmfd sp!, {r12}
42msr spsr, r12
43ldmfd sp!, {r11-r12, lr}
44movs pc, lr
45.word 0x0000C301
46
47swiTable:
48.word SoftReset
49.word RegisterRamReset
50.word Halt
51.word Stop
52.word IntrWait
53.word VBlankIntrWait
54.word Div
55.word DivArm
56.word Sqrt
57.word ArcTan
58.word ArcTan2
59.word CpuSet
60.word CpuFastSet
61# ... The rest of this table isn't needed if the rest aren't implemented
62
63irqBase:
64stmfd sp!, {r0-r3, r12, lr}
65mov r0, #0x04000000
66add lr, pc, #0
67ldr pc, [r0, #-4]
68ldmfd sp!, {r0-r3, r12, lr}
69subs pc, lr, #4
70
71VBlankIntrWait:
72mov r0, #1
73mov r1, #1
74IntrWait:
75stmfd sp!, {r2-r3, lr}
76mov r12, #0x04000000
77# See if we want to return immediately
78cmp r0, #0
79mov r0, #0
80mov r2, #1
81beq 1f
82ldrh r3, [r12, #-8]
83bic r3, r1
84strh r3, [r12, #-8]
85# Halt
860:
87strb r0, [r12, #0x301]
881:
89# Check which interrupts were acknowledged
90strb r0, [r12, #0x208]
91ldrh r3, [r12, #-8]
92ands r3, r1
93eorne r3, r1
94strneh r3, [r12, #-8]
95strb r2, [r12, #0x208]
96beq 0b
97ldmfd sp!, {r2-r3, pc}
98
99CpuSet:
100stmfd sp!, {lr}
101mov r3, r2, lsl #12
102tst r2, #0x01000000
103beq 0f
104# Fill
105tst r2, #0x04000000
106beq 1f
107# Word
108add r3, r1, r3, lsr #10
109ldmia r0!, {r2}
1102:
111cmp r1, r3
112stmltia r1!, {r2}
113blt 2b
114b 3f
115# Halfword
1161:
117bic r0, #1
118bic r1, #1
119add r3, r1, r3, lsr #11
120ldrh r2, [r0]
1212:
122cmp r1, r3
123strlth r2, [r1], #2
124blt 2b
125b 3f
126# Copy
1270:
128tst r2, #0x04000000
129beq 1f
130# Word
131add r3, r1, r3, lsr #10
1322:
133cmp r1, r3
134ldmltia r0!, {r2}
135stmltia r1!, {r2}
136blt 2b
137b 3f
138# Halfword
1391:
140add r3, r1, r3, lsr #11
141bic r0, #1
142bic r1, #1
1432:
144cmp r1, r3
145ldrlth r2, [r0], #2
146strlth r2, [r1], #2
147blt 2b
1483:
149ldmfd sp!, {pc}
150
151CpuFastSet:
152stmfd sp!, {r4-r10, lr}
153tst r2, #0x01000000
154mov r3, r2, lsl #12
155add r2, r1, r3, lsr #10
156beq 0f
157# Fill
158ldr r3, [r0]
159mov r4, r3
160mov r5, r3
161mov r6, r3
162mov r7, r3
163mov r8, r3
164mov r9, r3
165mov r10, r3
1661:
167cmp r1, r2
168stmltia r1!, {r3-r10}
169blt 1b
170b 2f
171# Copy
1720:
173cmp r1, r2
174ldmltia r0!, {r3-r10}
175stmltia r1!, {r3-r10}
176blt 0b
1772:
178ldmfd sp!, {r4-r10, pc}