From b7705d2846c13f3f8d38a1b0bf90fe4807cac11a Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sun, 3 Oct 2021 17:05:07 +0300 Subject: [PATCH] Use global interrupt delay enable variable in custom chipset emulation. --- blitter.cpp | 6 +++++- custom.cpp | 14 +++++++++----- include/newcpu.h | 1 + 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/blitter.cpp b/blitter.cpp index 5a5626a0..dc60cde4 100644 --- a/blitter.cpp +++ b/blitter.cpp @@ -446,7 +446,11 @@ static void blitter_done_all(int hpos) { blt_info.blit_main = 0; blt_info.blit_finald = 0; - blt_info.finishhpos = (hpos + 1) % maxhpos; + if (m68k_interrupt_delay && hpos >= 0) { + blt_info.finishhpos = (hpos + 1) % maxhpos; + } else { + blt_info.finishhpos = -1; + } blitter_interrupt(); blitter_done_notify(blitline); if (!blt_info.blit_queued && !blt_info.blit_finald) { diff --git a/custom.cpp b/custom.cpp index 8bda5bca..1305036b 100644 --- a/custom.cpp +++ b/custom.cpp @@ -6439,7 +6439,7 @@ static void send_interrupt_do(uae_u32 v) // external delayed interrupt (4 CCKs minimum) void send_interrupt(int num, int delay) { - if (delay > 0 && currprefs.cpu_compatible) { + if (delay > 0 && m68k_interrupt_delay) { event2_newevent_xx(-1, delay, num, send_interrupt_do); } else { send_interrupt_do(num); @@ -6453,7 +6453,7 @@ static void doint_delay_do(uae_u32 v) static void doint_delay(void) { - if (currprefs.cpu_compatible) { + if (m68k_interrupt_delay) { event2_newevent_xx(-1, CYCLE_UNIT + CYCLE_UNIT / 2, 0, doint_delay_do); } else { doint_delay_do(0); @@ -9827,7 +9827,7 @@ static void dmal_emu(uae_u32 v) } } - if (v >= 6) { + if (v >= 6 && v < 14) { v -= 6; int nr = v / 2; uaecptr pt = audio_getpt(nr, (v & 1) != 0); @@ -9854,14 +9854,14 @@ static void dmal_emu(uae_u32 v) } regs.chipset_latch_rw = last_custom_value = dat; AUDxDAT(nr, dat, pt); - } else { + } else if (v >= 0 && v < 6) { uae_u16 dat = 0; int w = v & 1; - uaecptr pt = disk_getpt(); // disk_fifostatus() needed in >100% disk speed modes if (w) { // write to disk if (disk_fifostatus() <= 0) { + uaecptr pt = disk_getpt(); if (dmal_ce) { #ifdef DEBUGGER if (debug_dma) { @@ -9889,6 +9889,7 @@ static void dmal_emu(uae_u32 v) } else { // read from disk if (disk_fifostatus() >= 0) { + uaecptr pt = disk_getpt(); dat = DSKDATR(); if (dmal_ce) { #ifdef DEBUGGER @@ -9901,8 +9902,11 @@ static void dmal_emu(uae_u32 v) #endif } chipmem_wput_indirect(pt, dat); + regs.chipset_latch_rw = last_custom_value = dat; } } + } else { + write_log(_T("invalid DMAL position %d\n"), v); } } diff --git a/include/newcpu.h b/include/newcpu.h index 9588f89f..cb339844 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -310,6 +310,7 @@ extern int mmu_enabled, mmu_triggered; extern int cpu_cycles; extern int cpucycleunit; extern int m68k_pc_indirect; +extern bool m68k_interrupt_delay; extern void safe_interrupt_set(int, int, bool); -- 2.47.3