[Core/CPU] improved 68k MOVEM instruction accuracy (implements extra read cycle from memory as verified on real hardware, cf https://gendev.spritesmind.net/forum/viewtopic.php?t=2010)

This commit is contained in:
ekeeke 2024-02-20 15:01:34 +01:00
parent 771452f7a1
commit 6b1dfa1cef
2 changed files with 49 additions and 0 deletions

View File

@ -119,6 +119,7 @@ Genesis Plus GX 1.7.5 (xx/xx/xxxx) (Eke-Eke)
---------------
* added Z80 wait-states on 68k bus access (fixes Remute Red Eyes demo)
* improved 68k auto-vectored interrupts acknowledge cycle timing accuracy (Bubsy background color corruption during cutscenes)
* improved 68k MOVEM instruction accuracy (implements extra read cycle from memory as verified on real hardware)
* fixed 68k undocumented behaviors for ABCD/SBCD/NBCD instructions (thanks to Flamewing for his test ROM)
* fixed 68k timing of BTST Dn,#Imm instruction (verified by Flamewing in original microcode)
* fixed 68k timings of ANDI.L #Imm,Dn, ADDQ.W #Imm,An and TAS instructions (cf. Yacht.txt)

View File

@ -15231,6 +15231,9 @@ static void m68k_op_movem_16_er_pi(void)
}
AY = ea;
/* MOVEM extra read cycle (can have side effect if target hardware is impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15250,6 +15253,9 @@ static void m68k_op_movem_16_er_pcdi(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if target hardware is impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15269,6 +15275,9 @@ static void m68k_op_movem_16_er_pcix(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15288,6 +15297,9 @@ static void m68k_op_movem_16_er_ai(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15307,6 +15319,9 @@ static void m68k_op_movem_16_er_di(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15326,6 +15341,9 @@ static void m68k_op_movem_16_er_ix(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15345,6 +15363,9 @@ static void m68k_op_movem_16_er_aw(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15364,6 +15385,9 @@ static void m68k_op_movem_16_er_al(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_W);
}
@ -15384,6 +15408,9 @@ static void m68k_op_movem_32_er_pi(void)
}
AY = ea;
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15403,6 +15430,9 @@ static void m68k_op_movem_32_er_pcdi(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15422,6 +15452,9 @@ static void m68k_op_movem_32_er_pcix(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15441,6 +15474,9 @@ static void m68k_op_movem_32_er_ai(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15460,6 +15496,9 @@ static void m68k_op_movem_32_er_di(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15479,6 +15518,9 @@ static void m68k_op_movem_32_er_ix(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15498,6 +15540,9 @@ static void m68k_op_movem_32_er_aw(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}
@ -15517,6 +15562,9 @@ static void m68k_op_movem_32_er_al(void)
count++;
}
/* MOVEM extra read cycle (can have side effect if extra address is not mapped or mapped to hardware impacted by read access) */
m68ki_read_16(ea);
USE_CYCLES(count * CYC_MOVEM_L);
}