]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
LPSTOP fix
authorToni Wilen <twilen@winuae.net>
Fri, 10 Feb 2023 19:27:31 +0000 (21:27 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 10 Feb 2023 19:27:31 +0000 (21:27 +0200)
gencpu.cpp
include/newcpu.h
newcpu.cpp

index 4de001a551eb8fd1a3db50f827daaa207b97ccba..4580acbef4bb425de1d4d6e8071ad82a5f573f7e 100644 (file)
@@ -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");
index fe91ddef491d8caa8a826d518095f0fb91e4edb6..4fd8b7b92a06a30d8583df4aa292453bbc48abb6 100644 (file)
@@ -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);
index 6ed0cc44a0ac8839c55d8d4c71a54c6b667eab1f..6cf99ae57b7c4ef0c4110ef054086e3b2142c31b 100644 (file)
@@ -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();
 }