From 2da11dd523543964bf3b1bf378071a815a8bf575 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Tue, 16 Apr 2013 07:42:20 -0700 Subject: [PATCH] Continue implementing IRQs --- src/gba/gba-io.c | 8 ++++++++ src/gba/gba.c | 39 ++++++++++++++++++++++++++++++++++++++- src/gba/gba.h | 2 ++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/src/gba/gba-io.c b/src/gba/gba-io.c index 9217403dd..93d161f1e 100644 --- a/src/gba/gba-io.c +++ b/src/gba/gba-io.c @@ -10,6 +10,12 @@ void GBAIOWrite(struct GBA* gba, uint32_t address, uint16_t value) { case REG_WAITCNT: GBAAdjustWaitstates(&gba->memory, value); break; + case REG_IE: + GBAWriteIE(gba, value); + break; + case REG_IME: + GBAWriteIME(gba, value); + break; default: GBALog(GBA_LOG_STUB, "Stub I/O register write: %03x", address); break; @@ -22,7 +28,9 @@ uint16_t GBAIORead(struct GBA* gba, uint32_t address) { case REG_DISPSTAT: return GBAVideoReadDISPSTAT(&gba->video); break; + case REG_IE: case REG_WAITCNT: + case REG_IME: // Handled transparently by registers break; default: diff --git a/src/gba/gba.c b/src/gba/gba.c index c63692112..6751118fb 100644 --- a/src/gba/gba.c +++ b/src/gba/gba.c @@ -1,6 +1,7 @@ #include "gba.h" #include "gba-bios.h" +#include "gba-io.h" #include "debugger.h" @@ -86,8 +87,44 @@ void GBALoadROM(struct GBA* gba, int fd) { // TODO: error check } +void GBAWriteIE(struct GBA* gba, uint16_t value) { + if (value & ((1 << IRQ_TIMER0) | (1 << IRQ_TIMER1) | (1 << IRQ_TIMER2) | (1 << IRQ_TIMER3))) { + GBALog(GBA_LOG_STUB, "Timer interrupts not implemented"); + } + + if (value & (1 << IRQ_SIO)) { + GBALog(GBA_LOG_STUB, "SIO interrupts not implemented"); + } + + if (value & ((1 << IRQ_DMA0) | (1 << IRQ_DMA1) | (1 << IRQ_DMA2) | (1 << IRQ_DMA3))) { + GBALog(GBA_LOG_STUB, "DMA interrupts not implemented"); + } + + if (value & (1 << IRQ_KEYPAD)) { + GBALog(GBA_LOG_STUB, "Keypad interrupts not implemented"); + } + + if (value & (1 << IRQ_GAMEPAK)) { + GBALog(GBA_LOG_STUB, "Gamepak interrupts not implemented"); + } + + if (gba->memory.io[REG_IME >> 1] && value & gba->memory.io[REG_IF >> 1]) { + //ARMRaiseIRQ(&gba.cpu); + } +} + +void GBAWriteIME(struct GBA* gba, uint16_t value) { + if (value && gba->memory.io[REG_IE >> 1] & gba->memory.io[REG_IF >> 1]) { + //ARMRaiseIRQ(&gba.cpu); + } +} + void GBARaiseIRQ(struct GBA* gba, enum GBAIRQ irq) { - GBALog(GBA_LOG_STUB, "Attempting to raise IRQ"); + gba->memory.io[REG_IF >> 1] |= 1 << irq; + + if (gba->memory.io[REG_IME >> 1] && (gba->memory.io[REG_IE >> 1] & 1 << irq)) { + //ARMRaiseIRQ(); + } } void GBALog(int level, const char* format, ...) { diff --git a/src/gba/gba.h b/src/gba/gba.h index 7f5dbeede..7f9fd1e9c 100644 --- a/src/gba/gba.h +++ b/src/gba/gba.h @@ -58,6 +58,8 @@ void GBAMemoryDeinit(struct GBAMemory* memory); void GBABoardInit(struct GBABoard* board); void GBABoardReset(struct ARMBoard* board); +void GBAWriteIE(struct GBA* gba, uint16_t value); +void GBAWriteIME(struct GBA* gba, uint16_t value); void GBARaiseIRQ(struct GBA* gba, enum GBAIRQ irq); void GBAAttachDebugger(struct GBA* gba, struct ARMDebugger* debugger);