all repos — mgba @ 89f7a69f3a000bfa8c0e1cfb4a84f71ad5c940d2

mGBA Game Boy Advance Emulator

src/gba/hle-bios.s (view raw)

  1#define nop andeq r0, r0
  2
  3.text
  4
  5b resetBase
  6b undefBase
  7b swiBase
  8b pabtBase
  9b dabtBase
 10nop
 11b irqBase
 12b fiqBase
 13
 14resetBase:
 15mov pc, #0x8000000
 16
 17swiBase:
 18cmp    sp, #0
 19moveq  sp, #0x04000000
 20subeq  sp, #0x20
 21stmfd  sp!, {r11-r12, lr}
 22ldrb   r11, [lr, #-2]
 23mov    r12, #swiTable
 24ldr    r11, [r12, r11, lsl #2]
 25cmp    r11, #0
 26mrs    r12, spsr
 27stmfd  sp!, {r12}
 28and    r12, #0x80
 29orr    r12, #0x1F
 30msr    cpsr, r12
 31stmfd  sp!, {lr}
 32mov    lr, pc
 33bxne   r11
 34ldmfd  sp!, {lr}
 35msr    cpsr, #0x93
 36ldmfd  sp!, {r12}
 37msr    spsr, r12
 38ldmfd  sp!, {r11-r12, lr}
 39movs   pc, lr
 40
 41swiTable:
 42.word SoftReset
 43.word RegisterRamReset
 44.word Halt
 45.word Stop
 46.word IntrWait
 47.word VBlankIntrWait
 48.word Div
 49.word DivArm
 50.word Sqrt
 51.word ArcTan
 52.word ArcTan2
 53.word CpuSet
 54.word CpuFastSet
 55# ... The rest of this table isn't needed if the rest aren't implemented
 56
 57irqBase:
 58stmfd  sp!, {r0-r3, r12, lr}
 59mov    r0, #0x04000000
 60add    lr, pc, #0
 61ldr    pc, [r0, #-4]
 62ldmfd  sp!, {r0-r3, r12, lr}
 63subs   pc, lr, #4
 64
 65VBlankIntrWait:
 66mov    r0, #1
 67mov    r1, #1
 68IntrWait:
 69stmfd  sp!, {r2-r3, lr}
 70mov    r12, #0x04000000
 71# See if we want to return immediately
 72cmp    r0, #0
 73mov    r0, #0
 74mov    r2, #1
 75beq    1f
 76# Halt
 770:
 78strb   r0, [r12, #0x301]
 791:
 80# Check which interrupts were acknowledged
 81strb   r0, [r12, #0x208]
 82ldrh   r3, [r12, #-8]
 83ands   r3, r1
 84eorne  r3, r1
 85strneh r3, [r12, #-8]
 86strb   r2, [r12, #0x208]
 87beq    0b
 88ldmfd  sp!, {r2-r3, pc}
 89
 90CpuSet:
 91stmfd  sp!, {lr}
 92mov    r3, r2, lsl #12
 93tst    r2, #0x01000000
 94beq    0f
 95# Fill
 96tst    r2, #0x04000000
 97beq    1f
 98# Word
 99add    r3, r1, r3, lsr #10
100ldmia  r0!, {r2}
1012:
102cmp    r1, r3
103stmltia  r1!, {r2}
104blt    2b
105b      3f
106# Halfword
1071:
108bic    r0, #1
109bic    r1, #1
110add    r3, r1, r3, lsr #11
111ldrh   r2, [r0]
1122:
113cmp    r1, r3
114strlth r2, [r1], #2
115blt    2b
116b      3f
117# Copy
1180:
119tst    r2, #0x04000000
120beq    1f
121# Word
122add    r3, r1, r3, lsr #10
1232:
124cmp    r1, r3
125ldmltia r0!, {r2}
126stmltia r1!, {r2}
127blt    2b
128b      3f
129# Halfword
1301:
131add    r3, r1, r3, lsr #11
132bic    r0, #1
133bic    r1, #1
1342:
135cmp    r1, r3
136ldrlth r2, [r0], #2
137strlth r2, [r1], #2
138blt    2b
1393:
140ldmfd  sp!, {pc}
141
142CpuFastSet:
143stmfd  sp!, {r4-r10, lr}
144tst    r2, #0x01000000
145mov    r3, r2, lsl #12
146add    r2, r1, r3, lsr #10
147beq    0f
148# Fill
149ldr    r3, [r0]
150mov    r4, r3
151mov    r5, r3
152mov    r6, r3
153mov    r7, r3
154mov    r8, r3
155mov    r9, r3
156mov    r10, r3
1571:
158cmp    r1, r2
159stmltia r1!, {r3-r10}
160blt    1b
161b      2f
162# Copy
1630:
164cmp    r1, r2
165ldmltia r0!, {r3-r10}
166stmltia r1!, {r3-r10}
167blt    0b
1682:
169ldmfd  sp!, {r4-r10, pc}