all repos — mgba @ 8118c94c8128a4aaf5cef83d87dab1e4b09bd646

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 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}