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;
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");
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);
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;
}
if (get_long (0x10) == 0) {
notify_user (NUMSG_KS68020);
uae_restart (-1, NULL);
- m68k_setstopped();
+ m68k_setstopped(1);
return 4;
}
}
#ifdef AUTOCONFIG
if (opcode == 0xFF0D && inrt) {
/* User-mode STOP replacement */
- m68k_setstopped ();
+ m68k_setstopped(1);
return 4;
}
#define CPUTYPE_EC 1
#define CPUMODE_HALT 1
+#define CPUMODE_HALT2 2
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;
}
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) {
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 */
}
}
-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();
}