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
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;
switch (cop_state.state)
{
case COP_strobe_delay1:
+ case COP_strobe_delay3:
{
// fake MOVE phase 1
#ifdef DEBUGGER
}
#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
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;
}
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;
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);