From d5f102c9c2ef3e374d661a51bb99e4f50247525d Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Sat, 26 Nov 2022 19:45:07 +0200 Subject: [PATCH] Copper last cycle special case fix --- custom.cpp | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/custom.cpp b/custom.cpp index 02389a67..fd515230 100644 --- a/custom.cpp +++ b/custom.cpp @@ -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); -- 2.47.3