More accurate HDMA during halt

This commit is contained in:
Lior Halphon 2022-02-02 23:01:38 +02:00
parent 967fdadd7c
commit 76b881c2e1
2 changed files with 7 additions and 1 deletions

View File

@ -1773,7 +1773,7 @@ skip_slow_mode_3:
GB_SLEEP(gb, display, 33, 2); GB_SLEEP(gb, display, 33, 2);
gb->cgb_palettes_blocked = !gb->cgb_double_speed; gb->cgb_palettes_blocked = !gb->cgb_double_speed;
if (gb->hdma_on_hblank) { if (gb->hdma_on_hblank && !gb->halted && !gb->stopped) {
gb->hdma_on = true; gb->hdma_on = true;
} }

View File

@ -1617,6 +1617,9 @@ void GB_cpu_run(GB_gameboy_t *gb)
/* Wake up from HALT mode without calling interrupt code. */ /* Wake up from HALT mode without calling interrupt code. */
if (gb->halted && !effective_ime && interrupt_queue) { if (gb->halted && !effective_ime && interrupt_queue) {
gb->halted = false; gb->halted = false;
if (gb->hdma_on_hblank && (gb->io_registers[GB_IO_STAT] & 3) == 0) {
gb->hdma_on = true;
}
gb->dma_cycles = 4; gb->dma_cycles = 4;
GB_dma_run(gb); GB_dma_run(gb);
gb->speed_switch_halt_countdown = 0; gb->speed_switch_halt_countdown = 0;
@ -1625,6 +1628,9 @@ void GB_cpu_run(GB_gameboy_t *gb)
/* Call interrupt */ /* Call interrupt */
else if (effective_ime && interrupt_queue) { else if (effective_ime && interrupt_queue) {
gb->halted = false; gb->halted = false;
if (gb->hdma_on_hblank && (gb->io_registers[GB_IO_STAT] & 3) == 0) {
gb->hdma_on = true;
}
// TODO: verify the timing! // TODO: verify the timing!
gb->dma_cycles = 4; gb->dma_cycles = 4;
GB_dma_run(gb); GB_dma_run(gb);