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 0
46.word 0xE3A02004
47
48swiTable:
49.word SoftReset
50.word RegisterRamReset
51.word Halt
52.word Stop
53.word IntrWait
54.word VBlankIntrWait
55.word Div
56.word DivArm
57.word Sqrt
58.word ArcTan
59.word ArcTan2
60.word CpuSet
61.word CpuFastSet
62# ... The rest of this table isn't needed if the rest aren't implemented
63
64irqBase:
65stmfd sp!, {r0-r3, r12, lr}
66mov r0, #0x04000000
67add lr, pc, #0
68ldr pc, [r0, #-4]
69ldmfd sp!, {r0-r3, r12, lr}
70subs pc, lr, #4
71
72VBlankIntrWait:
73mov r0, #1
74mov r1, #1
75IntrWait:
76stmfd sp!, {r2-r3, lr}
77mov r12, #0x04000000
78# See if we want to return immediately
79cmp r0, #0
80mov r0, #0
81mov r2, #1
82beq 1f
83ldrh r3, [r12, #-8]
84bic r3, r1
85strh r3, [r12, #-8]
86# Halt
870:
88strb r0, [r12, #0x301]
891:
90# Check which interrupts were acknowledged
91strb r0, [r12, #0x208]
92ldrh r3, [r12, #-8]
93ands r3, r1
94eorne r3, r1
95strneh r3, [r12, #-8]
96strb r2, [r12, #0x208]
97beq 0b
98ldmfd sp!, {r2-r3, pc}
99
100CpuSet:
101stmfd sp!, {lr}
102mov r3, r2, lsl #12
103tst r2, #0x01000000
104beq 0f
105# Fill
106tst r2, #0x04000000
107beq 1f
108# Word
109add r3, r1, r3, lsr #10
110ldmia r0!, {r2}
1112:
112cmp r1, r3
113stmltia r1!, {r2}
114blt 2b
115b 3f
116# Halfword
1171:
118bic r0, #1
119bic r1, #1
120add r3, r1, r3, lsr #11
121ldrh r2, [r0]
1222:
123cmp r1, r3
124strlth r2, [r1], #2
125blt 2b
126b 3f
127# Copy
1280:
129tst r2, #0x04000000
130beq 1f
131# Word
132add r3, r1, r3, lsr #10
1332:
134cmp r1, r3
135ldmltia r0!, {r2}
136stmltia r1!, {r2}
137blt 2b
138b 3f
139# Halfword
1401:
141add r3, r1, r3, lsr #11
142bic r0, #1
143bic r1, #1
1442:
145cmp r1, r3
146ldrlth r2, [r0], #2
147strlth r2, [r1], #2
148blt 2b
1493:
150ldmfd sp!, {pc}
151
152CpuFastSet:
153stmfd sp!, {r4-r10, lr}
154tst r2, #0x01000000
155mov r3, r2, lsl #12
156add r2, r1, r3, lsr #10
157beq 0f
158# Fill
159ldr r3, [r0]
160mov r4, r3
161mov r5, r3
162mov r6, r3
163mov r7, r3
164mov r8, r3
165mov r9, r3
166mov r10, r3
1671:
168cmp r1, r2
169stmltia r1!, {r3-r10}
170blt 1b
171b 2f
172# Copy
1730:
174cmp r1, r2
175ldmltia r0!, {r3-r10}
176stmltia r1!, {r3-r10}
177blt 0b
1782:
179ldmfd sp!, {r4-r10, pc}