From f27259a2e903fe1c08600062636c19309c5595b9 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 10 Feb 2023 21:27:31 +0200 Subject: [PATCH] LPSTOP fix --- gencpu.cpp | 11 ++++++----- include/newcpu.h | 2 +- newcpu.cpp | 38 +++++++++++++++++++++++--------------- 3 files changed, 30 insertions(+), 21 deletions(-) diff --git a/gencpu.cpp b/gencpu.cpp index 4de001a5..4580acbe 100644 --- a/gencpu.cpp +++ b/gencpu.cpp @@ -6951,7 +6951,7 @@ static void gen_opcode (unsigned int opcode) out("MakeFromSR_STOP();\n"); } out("do_cycles_stop(4);\n"); - out("m68k_setstopped();\n"); + out("m68k_setstopped(1);\n"); // STOP does not prefetch anything did_prefetch = -1; m68k_pc_offset = 0; @@ -6975,10 +6975,11 @@ static void gen_opcode (unsigned int opcode) write_return_cycles(0); out("}\n"); out("regs.sr = newsr;\n"); - makefromsr(); - out("m68k_setstopped();\n"); - sync_m68k_pc(); - fill_prefetch_full_ntx(0); + out("checkint();\n"); + out("MakeFromSR_STOP();\n"); + out("m68k_setstopped(2);\n"); + did_prefetch = -1; + m68k_pc_offset = 0; break; case i_HALT: /* 68060 debug */ out("cpu_halt(CPU_HALT_68060_HALT);\n"); diff --git a/include/newcpu.h b/include/newcpu.h index fe91ddef..4fd8b7b9 100644 --- a/include/newcpu.h +++ b/include/newcpu.h @@ -664,7 +664,7 @@ extern uae_u32 REGPARAM3 x_get_disp_ea_040(uae_u32 base, int idx) REGPARAM; extern uae_u32 REGPARAM3 x_get_bitfield (uae_u32 src, uae_u32 bdata[2], uae_s32 offset, int width) REGPARAM; extern void REGPARAM3 x_put_bitfield (uae_u32 dst, uae_u32 bdata[2], uae_u32 val, uae_s32 offset, int width) REGPARAM; -extern void m68k_setstopped(void); +extern void m68k_setstopped(int stoptype); extern void m68k_resumestopped(void); extern void m68k_cancel_idle(void); extern void do_cycles_stop(int); diff --git a/newcpu.cpp b/newcpu.cpp index 6ed0cc44..6cf99ae5 100644 --- a/newcpu.cpp +++ b/newcpu.cpp @@ -2315,11 +2315,11 @@ void m68k_cancel_idle(void) cpu_last_stop_vpos = -1; } -static void m68k_set_stop(void) +static void m68k_set_stop(int stoptype) { if (regs.stopped) return; - regs.stopped = 1; + regs.stopped = stoptype; if (cpu_last_stop_vpos >= 0) { cpu_last_stop_vpos = vpos; } @@ -3756,7 +3756,7 @@ uae_u32 REGPARAM2 op_illg (uae_u32 opcode) if (get_long (0x10) == 0) { notify_user (NUMSG_KS68020); uae_restart (-1, NULL); - m68k_setstopped(); + m68k_setstopped(1); return 4; } } @@ -3764,7 +3764,7 @@ uae_u32 REGPARAM2 op_illg (uae_u32 opcode) #ifdef AUTOCONFIG if (opcode == 0xFF0D && inrt) { /* User-mode STOP replacement */ - m68k_setstopped (); + m68k_setstopped(1); return 4; } @@ -6791,6 +6791,7 @@ void m68k_dumpcache (bool dc) #define CPUTYPE_EC 1 #define CPUMODE_HALT 1 +#define CPUMODE_HALT2 2 uae_u8 *restore_cpu (uae_u8 *src) { @@ -6819,7 +6820,7 @@ uae_u8 *restore_cpu (uae_u8 *src) regs.sr = restore_u16 (); l = restore_u32 (); if (l & CPUMODE_HALT) { - regs.stopped = 1; + regs.stopped = (l & CPUMODE_HALT2) ? 2 : 1; } else { regs.stopped = 0; } @@ -7196,11 +7197,11 @@ uae_u8 *restore_cpu_trace(uae_u8 *src) cputrace.pipeline_r8[1] = restore_u16(); cputrace.pipeline_stop = restore_u16(); } - if (v & 64) { - cputrace.ird = restore_u16(); - cputrace.read_buffer = restore_u16(); - cputrace.write_buffer = restore_u16(); - } + } + if (v & 64) { + cputrace.ird = restore_u16(); + cputrace.read_buffer = restore_u16(); + cputrace.write_buffer = restore_u16(); } if (v & 128) { @@ -7300,7 +7301,7 @@ uae_u8 *save_cpu(size_t *len, uae_u8 *dstptr) save_u32 (!regs.s ? regs.regs[15] : regs.usp); /* USP */ save_u32 (regs.s ? regs.regs[15] : regs.isp); /* ISP */ save_u16 (regs.sr); /* SR/CCR */ - save_u32 (regs.stopped ? CPUMODE_HALT : 0); /* flags */ + save_u32 (regs.stopped == 1 ? CPUMODE_HALT : (regs.stopped == 2 ? (CPUMODE_HALT | CPUMODE_HALT2) : 0)); /* flags */ if (model >= 68010) { save_u32 (regs.dfc); /* DFC */ save_u32 (regs.sfc); /* SFC */ @@ -7778,16 +7779,23 @@ void do_cycles_stop(int c) } } -void m68k_setstopped (void) +void m68k_setstopped(int stoptype) { - m68k_set_stop(); + m68k_set_stop(stoptype); } void m68k_resumestopped(void) { - if (!regs.stopped) + if (!regs.stopped) { return; - m68k_incpci(4); + } + if (regs.stopped == 1) { + // STOP + m68k_incpci(4); + } else if (regs.stopped == 2) { + // LPSTOP + m68k_incpci(6); + } m68k_unset_stop(); } -- 2.47.3