]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Copper last cycle special case fix
authorToni Wilen <twilen@winuae.net>
Sat, 26 Nov 2022 17:45:07 +0000 (19:45 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 26 Nov 2022 17:45:07 +0000 (19:45 +0200)
custom.cpp

index 02389a67ddeccf5af073234023de14d3f892e594..fd515230112b158997e18843b95f173ad876518e 100644 (file)
@@ -487,6 +487,7 @@ enum copper_states {
        COP_strobe_delay2,
        COP_strobe_delay3,
        COP_strobe_delay4,
+       COP_strobe_delay5,
        COP_strobe_delay1x,
        COP_strobe_delay2x,
        COP_strobe_extra, // just to skip current cycle when CPU wrote to COPJMP
@@ -7547,12 +7548,14 @@ static void COPJMP(int num, int vblank)
                        cop_state.state = COP_strobe_delay2;
                        switch (cop_state.state_prev)
                        {
-                               case copper_states::COP_read2:
                                case copper_states::COP_read1:
                                        // Wake up is delayed by 1 copper cycle if copper is currently loading words
                                        cop_state.state = COP_strobe_delay3;
                                        break;
-
+                               case copper_states::COP_read2:
+                                       // Wake up is delayed by 1 copper cycle if copper is currently loading words
+                                       cop_state.state = COP_strobe_delay4;
+                                       break;
                        }
                } else {
                        cop_state.state = copper_access ? COP_strobe_delay1 : COP_strobe_extra;
@@ -9639,6 +9642,7 @@ static void do_copper_fetch(int hpos, uae_u16 id)
        switch (cop_state.state)
        {
        case COP_strobe_delay1:
+       case COP_strobe_delay3:
        {
                // fake MOVE phase 1
 #ifdef DEBUGGER
@@ -9659,12 +9663,22 @@ static void do_copper_fetch(int hpos, uae_u16 id)
                }
 #endif
                cop_state.ip += 2;
-               cop_state.state = COP_strobe_delay2;
+               if (cop_state.state == COP_strobe_delay3) {
+                       cop_state.state = COP_strobe_delay5;
+                       if (cop_state.strobe == 1) {
+                               cop_state.ip = cop1lc;
+                       } else {
+                               cop_state.ip = cop2lc;
+                       }
+                       cop_state.strobe = 0;
+               } else {
+                       cop_state.state = COP_strobe_delay2;
+               }
                alloc_cycle(hpos, CYCLE_COPPER);
                break;
        }
        case COP_strobe_delay2:
-       case COP_strobe_delay3:
+       case COP_strobe_delay4:
        {
                // fake MOVE phase 2
 #ifdef DEBUGGER
@@ -9679,8 +9693,8 @@ static void do_copper_fetch(int hpos, uae_u16 id)
                        record_dma_read_value(cop_state.ir[1]);
                }
 #endif
-               if (cop_state.state == COP_strobe_delay3) {
-                       cop_state.state = COP_strobe_delay4;
+               if (cop_state.state == COP_strobe_delay4) {
+                       cop_state.state = COP_strobe_delay5;
                } else {
                        cop_state.state = COP_read1;
                }
@@ -9694,7 +9708,7 @@ static void do_copper_fetch(int hpos, uae_u16 id)
                alloc_cycle(hpos, CYCLE_COPPER);
        }
        break;
-       case COP_strobe_delay4:
+       case COP_strobe_delay5:
        {
                // COPJMP when previous instruction is mid-cycle
                cop_state.state = COP_read1;
@@ -10031,6 +10045,7 @@ static void update_copper(int until_hpos)
                case COP_strobe_delay2:
                case COP_strobe_delay3:
                case COP_strobe_delay4:
+               case COP_strobe_delay5:
                        // Second cycle after COPJMP does basically skipped MOVE (MOVE to 1FE)
                        // Cycle is used and needs to be free.
                        copper_cant_read(hpos, CYCLE_PIPE_COPPER);