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 r0, #0x8000000
21ldrb r1, [r0, #3]
22cmp r1, #0xEA
23movne r0, #0x2000000
24bx r0
25.word 0
26.word 0xE129F000
27
28swiBase:
29cmp sp, #0
30moveq sp, #0x04000000
31subeq sp, #0x20
32stmfd sp!, {r11-r12, lr}
33ldrb r11, [lr, #-2]
34mov r12, #swiTable
35ldr r11, [r12, r11, lsl #2]
36cmp r11, #0
37mrs r12, spsr
38stmfd sp!, {r12}
39and r12, #0x80
40orr r12, #0x1F
41msr cpsr, r12
42stmfd sp!, {lr}
43mov lr, pc
44bxne r11
45ldmfd sp!, {lr}
46msr cpsr, #0x93
47ldmfd sp!, {r12}
48msr spsr, r12
49ldmfd sp!, {r11-r12, lr}
50movs pc, lr
51.word 0
52.word 0xE3A02004
53
54swiTable:
55.word SoftReset
56.word RegisterRamReset
57.word Halt
58.word Stop
59.word IntrWait
60.word VBlankIntrWait
61.word Div
62.word DivArm
63.word Sqrt
64.word ArcTan
65.word ArcTan2
66.word CpuSet
67.word CpuFastSet
68# ... The rest of this table isn't needed if the rest aren't implemented
69
70irqBase:
71stmfd sp!, {r0-r3, r12, lr}
72mov r0, #0x04000000
73add lr, pc, #0
74ldr pc, [r0, #-4]
75ldmfd sp!, {r0-r3, r12, lr}
76subs pc, lr, #4
77.word 0
78.word 0xE55EC002
79
80VBlankIntrWait:
81mov r0, #1
82mov r1, #1
83IntrWait:
84stmfd sp!, {r2-r3, lr}
85mov r12, #0x04000000
86# See if we want to return immediately
87cmp r0, #0
88mov r0, #0
89mov r2, #1
90beq 1f
91ldrh r3, [r12, #-8]
92bic r3, r1
93strh r3, [r12, #-8]
94# Halt
950:
96strb r0, [r12, #0x301]
971:
98# Check which interrupts were acknowledged
99strb r0, [r12, #0x208]
100ldrh r3, [r12, #-8]
101ands r3, r1
102eorne r3, r1
103strneh r3, [r12, #-8]
104strb r2, [r12, #0x208]
105beq 0b
106ldmfd sp!, {r2-r3, pc}
107
108CpuSet:
109stmfd sp!, {lr}
110mov r3, r2, lsl #12
111tst r2, #0x01000000
112beq 0f
113# Fill
114tst r2, #0x04000000
115beq 1f
116# Word
117add r3, r1, r3, lsr #10
118ldmia r0!, {r2}
1192:
120cmp r1, r3
121stmltia r1!, {r2}
122blt 2b
123b 3f
124# Halfword
1251:
126bic r0, #1
127bic r1, #1
128add r3, r1, r3, lsr #11
129ldrh r2, [r0]
1302:
131cmp r1, r3
132strlth r2, [r1], #2
133blt 2b
134b 3f
135# Copy
1360:
137tst r2, #0x04000000
138beq 1f
139# Word
140add r3, r1, r3, lsr #10
1412:
142cmp r1, r3
143ldmltia r0!, {r2}
144stmltia r1!, {r2}
145blt 2b
146b 3f
147# Halfword
1481:
149add r3, r1, r3, lsr #11
150bic r0, #1
151bic r1, #1
1522:
153cmp r1, r3
154ldrlth r2, [r0], #2
155strlth r2, [r1], #2
156blt 2b
1573:
158ldmfd sp!, {pc}
159
160CpuFastSet:
161stmfd sp!, {r4-r10, lr}
162tst r2, #0x01000000
163mov r3, r2, lsl #12
164add r2, r1, r3, lsr #10
165beq 0f
166# Fill
167ldr r3, [r0]
168mov r4, r3
169mov r5, r3
170mov r6, r3
171mov r7, r3
172mov r8, r3
173mov r9, r3
174mov r10, r3
1751:
176cmp r1, r2
177stmltia r1!, {r3-r10}
178blt 1b
179b 2f
180# Copy
1810:
182cmp r1, r2
183ldmltia r0!, {r3-r10}
184stmltia r1!, {r3-r10}
185blt 0b
1862:
187ldmfd sp!, {r4-r10, pc}