From 6b1dfa1cef043ee148af1ac3da92b9c03d813b70 Mon Sep 17 00:00:00 2001 From: ekeeke Date: Tue, 20 Feb 2024 15:01:34 +0100 Subject: [PATCH] [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) --- HISTORY.txt | 1 + core/m68k/m68kops.h | 48 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/HISTORY.txt b/HISTORY.txt index 57a7139..8e9c29c 100644 --- a/HISTORY.txt +++ b/HISTORY.txt @@ -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) diff --git a/core/m68k/m68kops.h b/core/m68k/m68kops.h index f8e2b87..7f2f206 100644 --- a/core/m68k/m68kops.h +++ b/core/m68k/m68kops.h @@ -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); }