LR35902: Fix IRQs and RST

This commit is contained in:
Jeffrey Pfau 2016-01-26 02:25:26 -08:00
parent b9a42cc5a9
commit c9d0f651b6
3 changed files with 25 additions and 9 deletions

View File

@ -163,7 +163,6 @@ void GBUpdateIRQs(struct GB* gb) {
return; return;
} }
gb->cpu->irqh.setInterrupts(gb->cpu, false);
if (irqs & (1 << GB_IRQ_VBLANK)) { if (irqs & (1 << GB_IRQ_VBLANK)) {
LR35902RaiseIRQ(gb->cpu, GB_VECTOR_VBLANK); LR35902RaiseIRQ(gb->cpu, GB_VECTOR_VBLANK);
gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_VBLANK); gb->memory.io[REG_IF] &= ~(1 << GB_IRQ_VBLANK);

View File

@ -732,14 +732,30 @@ DEFINE_INSTRUCTION_LR35902(DI, cpu->irqh.setInterrupts(cpu, false));
DEFINE_INSTRUCTION_LR35902(EI, cpu->irqh.setInterrupts(cpu, true)); DEFINE_INSTRUCTION_LR35902(EI, cpu->irqh.setInterrupts(cpu, true));
DEFINE_INSTRUCTION_LR35902(HALT, cpu->irqh.halt(cpu)); DEFINE_INSTRUCTION_LR35902(HALT, cpu->irqh.halt(cpu));
DEFINE_INSTRUCTION_LR35902(RST00, LR35902RaiseIRQ(cpu, 0x00)); #define DEFINE_RST_INSTRUCTION_LR35902(VEC) \
DEFINE_INSTRUCTION_LR35902(RST08, LR35902RaiseIRQ(cpu, 0x08)); DEFINE_INSTRUCTION_LR35902(RST ## VEC ## UpdateSPL, \
DEFINE_INSTRUCTION_LR35902(RST10, LR35902RaiseIRQ(cpu, 0x10)); cpu->pc = 0x ## VEC; \
DEFINE_INSTRUCTION_LR35902(RST18, LR35902RaiseIRQ(cpu, 0x18)); cpu->executionState = LR35902_CORE_STALL;) \
DEFINE_INSTRUCTION_LR35902(RST20, LR35902RaiseIRQ(cpu, 0x20)); DEFINE_INSTRUCTION_LR35902(RST ## VEC ## UpdateSPH, \
DEFINE_INSTRUCTION_LR35902(RST28, LR35902RaiseIRQ(cpu, 0x28)); cpu->index = cpu->sp + 1; \
DEFINE_INSTRUCTION_LR35902(RST30, LR35902RaiseIRQ(cpu, 0x30)); cpu->bus = (cpu->pc + 2) >> 8; \
DEFINE_INSTRUCTION_LR35902(RST38, LR35902RaiseIRQ(cpu, 0x38)); cpu->executionState = LR35902_CORE_MEMORY_STORE; \
cpu->instruction = _LR35902InstructionRST ## VEC ## UpdateSPL;) \
DEFINE_INSTRUCTION_LR35902(RST ## VEC, \
cpu->sp -= 2; /* TODO: Atomic incrementing? */ \
cpu->index = cpu->sp; \
cpu->bus = cpu->pc; \
cpu->executionState = LR35902_CORE_MEMORY_STORE; \
cpu->instruction = _LR35902InstructionRST ## VEC ## UpdateSPH;)
DEFINE_RST_INSTRUCTION_LR35902(00);
DEFINE_RST_INSTRUCTION_LR35902(08);
DEFINE_RST_INSTRUCTION_LR35902(10);
DEFINE_RST_INSTRUCTION_LR35902(18);
DEFINE_RST_INSTRUCTION_LR35902(20);
DEFINE_RST_INSTRUCTION_LR35902(28);
DEFINE_RST_INSTRUCTION_LR35902(30);
DEFINE_RST_INSTRUCTION_LR35902(38);
DEFINE_INSTRUCTION_LR35902(STUB, cpu->irqh.hitStub(cpu)); DEFINE_INSTRUCTION_LR35902(STUB, cpu->irqh.hitStub(cpu));

View File

@ -90,6 +90,7 @@ static void _LR35902InstructionIRQ(struct LR35902Core* cpu) {
cpu->bus = cpu->pc; cpu->bus = cpu->pc;
cpu->executionState = LR35902_CORE_MEMORY_STORE; cpu->executionState = LR35902_CORE_MEMORY_STORE;
cpu->instruction = _LR35902InstructionIRQFinish; cpu->instruction = _LR35902InstructionIRQFinish;
cpu->irqh.setInterrupts(cpu, false);
} }
void LR35902Tick(struct LR35902Core* cpu) { void LR35902Tick(struct LR35902Core* cpu) {