all repos — mgba @ 2fb098cb014a0412fe2949be9259873e3df2bae8

mGBA Game Boy Advance Emulator

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}