Pass off video registers to renderer
This commit is contained in:
parent
573fcead5d
commit
cdddcbf7aa
168
src/gba/gba-io.c
168
src/gba/gba-io.c
@ -7,93 +7,97 @@ void GBAIOInit(struct GBA* gba) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) {
|
void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) {
|
||||||
switch (address) {
|
if (address < REG_SOUND1CNT_LO && address != REG_DISPSTAT) {
|
||||||
// Video
|
gba->video.renderer->writeVideoRegister(gba->video.renderer, address, value);
|
||||||
case REG_DISPSTAT:
|
} else {
|
||||||
GBAVideoWriteDISPSTAT(&gba->video, value);
|
switch (address) {
|
||||||
break;
|
// Video
|
||||||
|
case REG_DISPSTAT:
|
||||||
|
GBAVideoWriteDISPSTAT(&gba->video, value);
|
||||||
|
break;
|
||||||
|
|
||||||
// DMA
|
// DMA
|
||||||
case REG_DMA0CNT_LO:
|
case REG_DMA0CNT_LO:
|
||||||
GBAMemoryWriteDMACNT_LO(&gba->memory, 0, value);
|
GBAMemoryWriteDMACNT_LO(&gba->memory, 0, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA0CNT_HI:
|
case REG_DMA0CNT_HI:
|
||||||
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 0, value);
|
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 0, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA1CNT_LO:
|
case REG_DMA1CNT_LO:
|
||||||
GBAMemoryWriteDMACNT_LO(&gba->memory, 1, value);
|
GBAMemoryWriteDMACNT_LO(&gba->memory, 1, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA1CNT_HI:
|
case REG_DMA1CNT_HI:
|
||||||
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 1, value);
|
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 1, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA2CNT_LO:
|
case REG_DMA2CNT_LO:
|
||||||
GBAMemoryWriteDMACNT_LO(&gba->memory, 2, value);
|
GBAMemoryWriteDMACNT_LO(&gba->memory, 2, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA2CNT_HI:
|
case REG_DMA2CNT_HI:
|
||||||
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 2, value);
|
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 2, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA3CNT_LO:
|
case REG_DMA3CNT_LO:
|
||||||
GBAMemoryWriteDMACNT_LO(&gba->memory, 3, value);
|
GBAMemoryWriteDMACNT_LO(&gba->memory, 3, value);
|
||||||
break;
|
break;
|
||||||
case REG_DMA3CNT_HI:
|
case REG_DMA3CNT_HI:
|
||||||
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 3, value);
|
value = GBAMemoryWriteDMACNT_HI(&gba->memory, 3, value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Timers
|
// Timers
|
||||||
case REG_TM0CNT_LO:
|
case REG_TM0CNT_LO:
|
||||||
GBATimerWriteTMCNT_LO(gba, 0, value);
|
GBATimerWriteTMCNT_LO(gba, 0, value);
|
||||||
return;
|
return;
|
||||||
case REG_TM1CNT_LO:
|
case REG_TM1CNT_LO:
|
||||||
GBATimerWriteTMCNT_LO(gba, 1, value);
|
GBATimerWriteTMCNT_LO(gba, 1, value);
|
||||||
return;
|
return;
|
||||||
case REG_TM2CNT_LO:
|
case REG_TM2CNT_LO:
|
||||||
GBATimerWriteTMCNT_LO(gba, 2, value);
|
GBATimerWriteTMCNT_LO(gba, 2, value);
|
||||||
return;
|
return;
|
||||||
case REG_TM3CNT_LO:
|
case REG_TM3CNT_LO:
|
||||||
GBATimerWriteTMCNT_LO(gba, 3, value);
|
GBATimerWriteTMCNT_LO(gba, 3, value);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
case REG_TM0CNT_HI:
|
case REG_TM0CNT_HI:
|
||||||
value &= 0x00C7;
|
value &= 0x00C7;
|
||||||
GBATimerWriteTMCNT_HI(gba, 0, value);
|
GBATimerWriteTMCNT_HI(gba, 0, value);
|
||||||
break;
|
break;
|
||||||
case REG_TM1CNT_HI:
|
case REG_TM1CNT_HI:
|
||||||
value &= 0x00C7;
|
value &= 0x00C7;
|
||||||
GBATimerWriteTMCNT_HI(gba, 1, value);
|
GBATimerWriteTMCNT_HI(gba, 1, value);
|
||||||
break;
|
break;
|
||||||
case REG_TM2CNT_HI:
|
case REG_TM2CNT_HI:
|
||||||
value &= 0x00C7;
|
value &= 0x00C7;
|
||||||
GBATimerWriteTMCNT_HI(gba, 2, value);
|
GBATimerWriteTMCNT_HI(gba, 2, value);
|
||||||
break;
|
break;
|
||||||
case REG_TM3CNT_HI:
|
case REG_TM3CNT_HI:
|
||||||
value &= 0x00C7;
|
value &= 0x00C7;
|
||||||
GBATimerWriteTMCNT_HI(gba, 3, value);
|
GBATimerWriteTMCNT_HI(gba, 3, value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Interrupts and misc
|
// Interrupts and misc
|
||||||
case REG_WAITCNT:
|
case REG_WAITCNT:
|
||||||
GBAAdjustWaitstates(&gba->memory, value);
|
GBAAdjustWaitstates(&gba->memory, value);
|
||||||
break;
|
break;
|
||||||
case REG_IE:
|
case REG_IE:
|
||||||
GBAWriteIE(gba, value);
|
GBAWriteIE(gba, value);
|
||||||
break;
|
break;
|
||||||
case REG_IF:
|
case REG_IF:
|
||||||
value = gba->memory.io[REG_IF >> 1] & ~value;
|
value = gba->memory.io[REG_IF >> 1] & ~value;
|
||||||
break;
|
break;
|
||||||
case REG_IME:
|
case REG_IME:
|
||||||
GBAWriteIME(gba, value);
|
GBAWriteIME(gba, value);
|
||||||
break;
|
break;
|
||||||
case REG_HALTCNT:
|
case REG_HALTCNT:
|
||||||
value &= 0x80;
|
value &= 0x80;
|
||||||
if (!value) {
|
if (!value) {
|
||||||
GBAHalt(gba);
|
GBAHalt(gba);
|
||||||
} else {
|
} else {
|
||||||
GBALog(GBA_LOG_STUB, "Stop unimplemented");
|
GBALog(GBA_LOG_STUB, "Stop unimplemented");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
GBALog(GBA_LOG_STUB, "Stub I/O register write: %03x", address);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
default:
|
|
||||||
GBALog(GBA_LOG_STUB, "Stub I/O register write: %03x", address);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
gba->memory.io[address >> 1] = value;
|
gba->memory.io[address >> 1] = value;
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,10 @@ static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer) {
|
|||||||
|
|
||||||
static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
||||||
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
||||||
|
switch (address) {
|
||||||
|
default:
|
||||||
|
GBALog(GBA_LOG_STUB, "Stub video register write: %03x", address);
|
||||||
|
}
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user