]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Use global interrupt delay enable variable in custom chipset emulation.
authorToni Wilen <twilen@winuae.net>
Sun, 3 Oct 2021 14:05:07 +0000 (17:05 +0300)
committerToni Wilen <twilen@winuae.net>
Sun, 3 Oct 2021 14:05:07 +0000 (17:05 +0300)
blitter.cpp
custom.cpp
include/newcpu.h

index 5a5626a0a4c6e067eb68ba287227cdc0975add89..dc60cde4bee35eb33fa1ef07a219976f55d99038 100644 (file)
@@ -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) {
index 8bda5bca9f9eca404cc71e20a09e0956970487c6..1305036be2de6a4a758c14140d9b2611b93041b1 100644 (file)
@@ -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);
        }
 }
 
index 9588f89f79ebf863b2fc3818ec862fdfa576f7bf..cb339844b5196627886a9a26be23ad088d8eb4f3 100644 (file)
@@ -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);