mirror of https://github.com/mgba-emu/mgba.git
Optimize and fix IntrWait, make sure that SVC doesn't trample its input register r0
This commit is contained in:
parent
f90b01b95d
commit
ee344f0dca
|
@ -1,24 +1,22 @@
|
||||||
#include "hle-bios.h"
|
#include "hle-bios.h"
|
||||||
|
|
||||||
const unsigned int hleBiosLength = 220;
|
const unsigned int hleBiosLength = 196;
|
||||||
const unsigned char hleBios[] = {
|
const unsigned char hleBios[] = {
|
||||||
0x06, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x05, 0x00, 0x00, 0xea,
|
0x06, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x05, 0x00, 0x00, 0xea,
|
||||||
0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1,
|
0xfe, 0xff, 0xff, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x00, 0x00, 0xa0, 0xe1,
|
||||||
0x0c, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0xf3, 0xa0, 0xe3,
|
0x0e, 0x00, 0x00, 0xea, 0xfe, 0xff, 0xff, 0xea, 0x02, 0xf3, 0xa0, 0xe3,
|
||||||
0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, 0x20, 0xd0, 0x4d, 0x02,
|
0x00, 0x00, 0x5d, 0xe3, 0x01, 0xd3, 0xa0, 0x03, 0x20, 0xd0, 0x4d, 0x02,
|
||||||
0x00, 0x40, 0x2d, 0xe9, 0x02, 0x00, 0x5e, 0xe5, 0x04, 0x00, 0x50, 0xe3,
|
0x04, 0x40, 0x2d, 0xe9, 0x02, 0x20, 0x5e, 0xe5, 0x04, 0x00, 0x52, 0xe3,
|
||||||
0x09, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x50, 0xe3, 0x07, 0x00, 0x00, 0x0b,
|
0x0b, 0x00, 0x00, 0x0b, 0x05, 0x00, 0x52, 0xe3, 0x01, 0x00, 0xa0, 0x03,
|
||||||
0x00, 0x40, 0xbd, 0xe8, 0x0e, 0xf0, 0xb0, 0xe1, 0x0f, 0x50, 0x2d, 0xe9,
|
0x01, 0x10, 0xa0, 0x03, 0x07, 0x00, 0x00, 0x0b, 0x04, 0x40, 0xbd, 0xe8,
|
||||||
0x01, 0x03, 0xa0, 0xe3, 0x00, 0xe0, 0x8f, 0xe2, 0x04, 0xf0, 0x10, 0xe5,
|
0x0e, 0xf0, 0xb0, 0xe1, 0x0f, 0x50, 0x2d, 0xe9, 0x01, 0x03, 0xa0, 0xe3,
|
||||||
0x0f, 0x50, 0xbd, 0xe8, 0x04, 0xf0, 0x5e, 0xe2, 0x10, 0x40, 0x2d, 0xe9,
|
0x00, 0xe0, 0x8f, 0xe2, 0x04, 0xf0, 0x10, 0xe5, 0x0f, 0x50, 0xbd, 0xe8,
|
||||||
0x04, 0xd0, 0x4d, 0xe2, 0xb0, 0x10, 0xcd, 0xe1, 0x01, 0x43, 0xa0, 0xe3,
|
0x04, 0xf0, 0x5e, 0xe2, 0x10, 0x40, 0x2d, 0xe9, 0x00, 0x30, 0x0f, 0xe1,
|
||||||
0x02, 0x4c, 0x84, 0xe2, 0xb0, 0x00, 0xd4, 0xe1, 0xb2, 0x00, 0xcd, 0xe1,
|
0x80, 0x30, 0xc3, 0xe3, 0x03, 0xf0, 0x29, 0xe1, 0x01, 0x43, 0xa0, 0xe3,
|
||||||
0xb0, 0x10, 0xdd, 0xe1, 0x01, 0x00, 0x80, 0xe1, 0xb0, 0x00, 0xc4, 0xe1,
|
0x00, 0x00, 0x50, 0xe3, 0x00, 0x00, 0xa0, 0xe3, 0x01, 0x20, 0xa0, 0xe3,
|
||||||
0x01, 0x43, 0xa0, 0xe3, 0x1f, 0x00, 0xa0, 0xe3, 0x00, 0xf0, 0x29, 0xe1,
|
0x00, 0x00, 0x00, 0x0a, 0x01, 0x03, 0xc4, 0xe5, 0x04, 0x22, 0xc4, 0xe5,
|
||||||
0x00, 0x00, 0xa0, 0xe3, 0x01, 0x03, 0xc4, 0xe5, 0xd3, 0x00, 0xa0, 0xe3,
|
0xb8, 0x30, 0x54, 0xe1, 0x01, 0x30, 0x13, 0xe0, 0x01, 0x30, 0x23, 0x10,
|
||||||
0x00, 0xf0, 0x29, 0xe1, 0xb8, 0x00, 0x54, 0xe1, 0xb0, 0x10, 0xdd, 0xe1,
|
0xb8, 0x30, 0x44, 0x11, 0x04, 0x02, 0xc4, 0xe5, 0xf7, 0xff, 0xff, 0x0a,
|
||||||
0x00, 0x10, 0x11, 0xe0, 0x00, 0x10, 0x21, 0x10, 0xb8, 0x10, 0x44, 0x11,
|
0x00, 0x00, 0x0f, 0xe1, 0x80, 0x00, 0x80, 0xe3, 0x00, 0xf0, 0x29, 0xe1,
|
||||||
0xf3, 0xff, 0xff, 0x0a, 0x01, 0x43, 0xa0, 0xe3, 0x02, 0x4c, 0x84, 0xe2,
|
|
||||||
0xb2, 0x00, 0xdd, 0xe1, 0xb0, 0x00, 0xc4, 0xe1, 0x04, 0xd0, 0x8d, 0xe2,
|
|
||||||
0x10, 0x80, 0xbd, 0xe8
|
0x10, 0x80, 0xbd, 0xe8
|
||||||
};
|
};
|
||||||
|
|
|
@ -18,13 +18,15 @@ swiBase:
|
||||||
cmp sp, #0
|
cmp sp, #0
|
||||||
moveq sp, #0x04000000
|
moveq sp, #0x04000000
|
||||||
subeq sp, #0x20
|
subeq sp, #0x20
|
||||||
stmfd sp!, {lr}
|
stmfd sp!, {r2, lr}
|
||||||
ldrb r0, [lr, #-2]
|
ldrb r2, [lr, #-2]
|
||||||
cmp r0, #4
|
cmp r2, #4
|
||||||
bleq IntrWait
|
bleq IntrWait
|
||||||
cmp r0, #5
|
cmp r2, #5
|
||||||
|
moveq r0, #1
|
||||||
|
moveq r1, #1
|
||||||
bleq IntrWait
|
bleq IntrWait
|
||||||
ldmfd sp!, {lr}
|
ldmfd sp!, {r2, lr}
|
||||||
movs pc, lr
|
movs pc, lr
|
||||||
|
|
||||||
irqBase:
|
irqBase:
|
||||||
|
@ -37,32 +39,31 @@ subs pc, lr, #4
|
||||||
|
|
||||||
IntrWait:
|
IntrWait:
|
||||||
stmfd sp!, {r4, lr}
|
stmfd sp!, {r4, lr}
|
||||||
add sp, #-4
|
# Save inputs
|
||||||
strh r1, [sp, #0]
|
mrs r3, cpsr
|
||||||
|
bic r3, #0x80
|
||||||
|
msr cpsr, r3
|
||||||
|
# Pull current interrupts enabled and add the ones we need
|
||||||
mov r4, #0x04000000
|
mov r4, #0x04000000
|
||||||
add r4, #0x200
|
# See if we want to return immediately
|
||||||
ldrh r0, [r4, #0]
|
cmp r0, #0
|
||||||
strh r0, [sp, #2]
|
|
||||||
ldrh r1, [sp, #0]
|
|
||||||
orr r0, r1
|
|
||||||
strh r0, [r4, #0x0]
|
|
||||||
mov r4, #0x04000000
|
|
||||||
IntrWaitLoop:
|
|
||||||
mov r0, #0x1F
|
|
||||||
msr cpsr, r0
|
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
|
mov r2, #1
|
||||||
|
beq .L1
|
||||||
|
# Halt
|
||||||
|
.L0:
|
||||||
strb r0, [r4, #0x301]
|
strb r0, [r4, #0x301]
|
||||||
mov r0, #0xD3
|
.L1:
|
||||||
|
# Check which interrupts were acknowledged
|
||||||
|
strb r2, [r4, #0x204]
|
||||||
|
ldrh r3, [r4, #-8]
|
||||||
|
ands r3, r1
|
||||||
|
eorne r3, r1
|
||||||
|
strneh r3, [r4, #-8]
|
||||||
|
strb r0, [r4, #0x204]
|
||||||
|
beq .L0
|
||||||
|
#Restore state
|
||||||
|
mrs r0, cpsr
|
||||||
|
orr r0, #0x80
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
ldrh r0, [r4, #-8]
|
|
||||||
ldrh r1, [sp, #0]
|
|
||||||
ands r1, r0
|
|
||||||
eorne r1, r0
|
|
||||||
strneh r1, [r4, #-8]
|
|
||||||
beq IntrWaitLoop
|
|
||||||
mov r4, #0x04000000
|
|
||||||
add r4, #0x200
|
|
||||||
ldrh r0, [sp, #2]
|
|
||||||
strh r0, [r4, #0]
|
|
||||||
add sp, #4
|
|
||||||
ldmfd sp!, {r4, pc}
|
ldmfd sp!, {r4, pc}
|
||||||
|
|
Loading…
Reference in New Issue