mgba/src/gba/gba-bios.c

63 lines
1.5 KiB
C
Raw Normal View History

2013-04-14 20:21:21 +00:00
#include "gba-bios.h"
#include "gba.h"
2013-04-14 20:36:32 +00:00
#include "gba-memory.h"
static void _CpuSet(struct GBA* gba) {
uint32_t source = gba->cpu.gprs[0];
uint32_t dest = gba->cpu.gprs[1];
uint32_t mode = gba->cpu.gprs[2];
int count = mode & 0x000FFFFF;
int fill = mode & 0x01000000;
int wordsize = (mode & 0x04000000) ? 4 : 2;
int i;
if (fill) {
if (wordsize == 4) {
source &= 0xFFFFFFFC;
dest &= 0xFFFFFFFC;
int32_t word = GBALoad32(&gba->memory.d, source);
for (i = 0; i < count; ++i) {
GBAStore32(&gba->memory.d, dest + (i << 2), word);
}
} else {
source &= 0xFFFFFFFE;
dest &= 0xFFFFFFFE;
uint16_t word = GBALoad16(&gba->memory.d, source);
for (i = 0; i < count; ++i) {
GBAStore16(&gba->memory.d, dest + (i << 1), word);
}
}
} else {
if (wordsize == 4) {
source &= 0xFFFFFFFC;
dest &= 0xFFFFFFFC;
for (i = 0; i < count; ++i) {
int32_t word = GBALoad32(&gba->memory.d, source + (i << 2));
GBAStore32(&gba->memory.d, dest + (i << 2), word);
}
} else {
source &= 0xFFFFFFFE;
dest &= 0xFFFFFFFE;
for (i = 0; i < count; ++i) {
uint16_t word = GBALoad16(&gba->memory.d, source + (i << 1));
GBAStore16(&gba->memory.d, dest + (i << 1), word);
}
}
}
}
2013-04-14 20:21:21 +00:00
void GBASwi16(struct ARMBoard* board, int immediate) {
2013-04-14 20:36:32 +00:00
struct GBA* gba = ((struct GBABoard*) board)->p;
2013-04-14 20:21:21 +00:00
switch (immediate) {
2013-04-14 20:36:32 +00:00
case 0xB:
_CpuSet(gba);
break;
2013-04-14 20:21:21 +00:00
default:
GBALog(GBA_LOG_STUB, "Stub software interrupt: %02x", immediate);
}
}
void GBASwi32(struct ARMBoard* board, int immediate) {
2013-04-14 20:46:48 +00:00
GBASwi32(board, immediate >> 16);
2013-04-14 20:21:21 +00:00
}