]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
STOP timing fix.
authorToni Wilen <twilen@winuae.net>
Wed, 20 Jul 2022 17:58:54 +0000 (20:58 +0300)
committerToni Wilen <twilen@winuae.net>
Wed, 20 Jul 2022 17:58:54 +0000 (20:58 +0300)
gencpu.cpp
include/newcpu.h
newcpu.cpp

index 6e5fef5896ce661f931d26dafc6c53a0e58933b7..cf9056c2e85cbee0bd8668f0e249170c9b60470e 100644 (file)
@@ -6679,9 +6679,16 @@ static void gen_opcode (unsigned int opcode)
                        write_return_cycles(0);
                        out("}\n");
                }
-               out("regs.sr = sr;\n");
                check_ipl_always();
-               out("MakeFromSR();\n");
+               if (cpu_level <= 1) {
+                       out("checkint();\n");
+                       out("regs.sr = sr;\n");
+                       out("MakeFromSR_STOP();\n");
+               } else {
+                       out("regs.sr = sr;\n");
+                       out("checkint();\n");
+                       out("MakeFromSR_STOP();\n");
+               }
                out("do_cycles_stop(4);\n");
                out("m68k_setstopped();\n");
                // STOP does not prefetch anything
index 8262118500c7ec25eec53cc5afdc68b553d7eaa4..afa0d5cf6d962da02f8c0a5398eb5cb6ebd96285 100644 (file)
@@ -682,6 +682,7 @@ extern void flush_cpu_caches_040(uae_u16 opcode);
 extern void REGPARAM3 MakeSR (void) REGPARAM;
 extern void REGPARAM3 MakeFromSR(void) REGPARAM;
 extern void REGPARAM3 MakeFromSR_T0(void) REGPARAM;
+extern void REGPARAM3 MakeFromSR_STOP(void) REGPARAM;
 extern void REGPARAM3 MakeFromSR_intmask(uae_u16 oldsr, uae_u16 newsr) REGPARAM;
 extern void REGPARAM3 Exception (int) REGPARAM;
 extern void REGPARAM3 Exception_cpu(int) REGPARAM;
@@ -691,6 +692,7 @@ extern void NMI (void);
 extern void IRQ_forced(int, int);
 extern void prepare_interrupt (uae_u32);
 extern void doint(void);
+extern void checkint(void);
 extern void intlev_load(void);
 extern void dump_counts (void);
 extern int m68k_move2c (int, uae_u32 *);
index 8b8428767b9e4654e82d4231ca06b2da68a2ae4b..913b9f54dee1a448cf8901c8be4e9a6114a6f0d4 100644 (file)
@@ -2318,7 +2318,7 @@ static void activate_trace(void)
 }
 
 // make sure interrupt is checked immediately after current instruction
-static void doint_imm(void)
+void checkint(void)
 {
        doint();
        if (!currprefs.cachesize && !(regs.spcflags & SPCFLAG_INT) && (regs.spcflags & SPCFLAG_DOINT))
@@ -2368,7 +2368,7 @@ static void MakeFromSR_x(int t0trace)
        regs.t1 = (regs.sr >> 15) & 1;
        regs.t0 = (regs.sr >> 14) & 1;
        regs.s  = (regs.sr >> 13) & 1;
-       regs.m  = (regs.sr >> 12) & 1;
+       regs.m = (regs.sr >> 12) & 1;
        regs.intmask = (regs.sr >> 8) & 7;
 
        if (currprefs.cpu_model >= 68020) {
@@ -2419,7 +2419,10 @@ static void MakeFromSR_x(int t0trace)
        }
 #endif
 
-       doint_imm();
+       if (t0trace >= 0) {
+               checkint();
+       }
+
        if (regs.t1 || regs.t0) {
                set_special (SPCFLAG_TRACE);
        } else {
@@ -2443,6 +2446,10 @@ void REGPARAM2 MakeFromSR(void)
 {
        MakeFromSR_x(0);
 }
+void REGPARAM2 MakeFromSR_STOP(void)
+{
+       MakeFromSR_x(-1);
+}
 
 void REGPARAM2 MakeFromSR_intmask(uae_u16 oldsr, uae_u16 newsr)
 {