GB: Fix execution state and HALT getting out of sync
Vicki Pfau vi@endrift.com
Sun, 12 Nov 2017 17:25:26 -0800
1 files changed,
8 insertions(+),
1 deletions(-)
jump to
M
src/gb/gb.c
→
src/gb/gb.c
@@ -622,6 +622,8 @@ break;
} if (cpu->halted) { cpu->cycles = cpu->nextEvent; + cpu->executionState += cpu->nextEvent; + cpu->executionState &= 3; if (!gb->memory.ie || !gb->memory.ime) { break; }@@ -677,9 +679,14 @@ GBUpdateIRQs(gb);
} void GBHalt(struct LR35902Core* cpu) { - if (!cpu->irqPending) { + struct GB* gb = (struct GB*) cpu->master; + if (!(gb->memory.ie & gb->memory.io[REG_IF])) { + cpu->executionState += cpu->nextEvent - cpu->cycles; + cpu->executionState &= 3; cpu->cycles = cpu->nextEvent; cpu->halted = true; + } else if (gb->model < GB_MODEL_CGB) { + mLOG(GB, STUB, "Unimplemented HALT bug"); } }