]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Fix copper not starting (almost) immediately when DMACON was written to.
authorToni Wilen <twilen@winuae.net>
Sat, 11 Mar 2023 17:39:47 +0000 (19:39 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 11 Mar 2023 17:39:47 +0000 (19:39 +0200)
custom.cpp

index 553c47d4b5813005665847a17df7522b32220985..47dc02554819d55e799bcc190b5010a5da8cabb5 100644 (file)
@@ -7993,6 +7993,11 @@ static void bitplane_dma_change(uae_u32 v)
        dmacon_bpl = (v & DMA_BITPLANE) && (v & 0x200);
 }
 
+static void compute_spcflag_copper_delayed(uae_u32 v)
+{
+       compute_spcflag_copper();
+}
+
 static void DMACON(int hpos, uae_u16 v)
 {
        uae_u16 changed;
@@ -8019,7 +8024,11 @@ static void DMACON(int hpos, uae_u16 v)
                copper_dma_change_cycle = get_cycles();
        }
        if (newcop && !oldcop) {
-               compute_spcflag_copper();
+               if (copper_dma_change_cycle == get_cycles()) {
+                       event2_newevent_xx(-1, CYCLE_UNIT, 0, compute_spcflag_copper_delayed);
+               } else {
+                       compute_spcflag_copper();
+               }
        }
 
        int oldblt = (oldcon & DMA_BLITTER) && (oldcon & DMA_MASTER);
@@ -10109,7 +10118,7 @@ static void do_copper_fetch(int hpos, uae_u16 id)
        {
                // fake MOVE phase 2
 #ifdef DEBUGGER
-               uae_u16 reg = cop_state.ir[0] & 0x1FE;
+               uae_u16 reg = 0x8c; // COPINS
                if (debug_dma) {
                        record_dma_read(reg, cop_state.ip, hpos, vpos, DMARECORD_COPPER, 0);
                }
@@ -10118,6 +10127,7 @@ static void do_copper_fetch(int hpos, uae_u16 id)
 #ifdef DEBUGGER
                if (debug_dma) {
                        record_dma_read_value(cop_state.ir[1]);
+                       record_dma_event2(DMA_EVENT2_COPPERUSE, hpos, vpos);
                }
 #endif
                if (cop_state.state == COP_strobe_delay4) {
@@ -10653,7 +10663,7 @@ next:
 
 static void compute_spcflag_copper(void)
 {
-       if (!is_copper_dma() || cop_state.state == COP_stop || cop_state.state == COP_waitforever || cop_state.state == COP_bltwait || cop_state.state == COP_bltwait2 || custom_disabled)
+       if (cop_state.state == COP_stop || cop_state.state == COP_waitforever || cop_state.state == COP_bltwait || cop_state.state == COP_bltwait2 || custom_disabled)
                return;
        if (cop_state.state == COP_wait1) {
                int vp = vpos & (((cop_state.ir[1] >> 8) & 0x7F) | 0x80);