mirror of https://github.com/mgba-emu/mgba.git
Implement FastCpuSet
This commit is contained in:
parent
c143dec77d
commit
45fcd0fcb5
|
@ -46,6 +46,26 @@ static void _CpuSet(struct GBA* gba) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _FastCpuSet(struct GBA* gba) {
|
||||||
|
uint32_t source = gba->cpu.gprs[0] & 0xFFFFFFFC;
|
||||||
|
uint32_t dest = gba->cpu.gprs[1] & 0xFFFFFFFC;
|
||||||
|
uint32_t mode = gba->cpu.gprs[2];
|
||||||
|
int count = mode & 0x000FFFFF;
|
||||||
|
count = ((count + 7) >> 3) << 3;
|
||||||
|
int i;
|
||||||
|
if (mode & 0x01000000) {
|
||||||
|
int32_t word = GBALoad32(&gba->memory.d, source);
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
GBAStore32(&gba->memory.d, dest + (i << 2), word);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < count; ++i) {
|
||||||
|
int32_t word = GBALoad32(&gba->memory.d, source + (i << 2));
|
||||||
|
GBAStore32(&gba->memory.d, dest + (i << 2), word);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void GBASwi16(struct ARMBoard* board, int immediate) {
|
void GBASwi16(struct ARMBoard* board, int immediate) {
|
||||||
struct GBA* gba = ((struct GBABoard*) board)->p;
|
struct GBA* gba = ((struct GBABoard*) board)->p;
|
||||||
switch (immediate) {
|
switch (immediate) {
|
||||||
|
@ -55,6 +75,9 @@ void GBASwi16(struct ARMBoard* board, int immediate) {
|
||||||
case 0xB:
|
case 0xB:
|
||||||
_CpuSet(gba);
|
_CpuSet(gba);
|
||||||
break;
|
break;
|
||||||
|
case 0xC:
|
||||||
|
_FastCpuSet(gba);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
GBALog(GBA_LOG_STUB, "Stub software interrupt: %02x", immediate);
|
GBALog(GBA_LOG_STUB, "Stub software interrupt: %02x", immediate);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue