workaround idledet breaking op test
authornotaz <notasas@gmail.com>
Wed, 20 Sep 2017 20:39:20 +0000 (23:39 +0300)
committernotaz <notasas@gmail.com>
Wed, 20 Sep 2017 20:47:09 +0000 (23:47 +0300)
cpu/fame/famec_opcodes.h
pico/sek.c

index 99ba379..3ba7275 100644 (file)
@@ -18574,6 +18574,10 @@ RET(8)
 // ILLEGAL
 OPCODE(0x4AFC)
 {
+#ifdef PICODRIVE_HACK
+       extern void SekFinishIdleDet(void);
+       SekFinishIdleDet();
+#endif
        SET_PC(execute_exception(M68K_ILLEGAL_INSTRUCTION_EX, GET_PC-2, GET_SR));
 RET(0)
 }
index 4525c7c..8bf0341 100644 (file)
@@ -60,6 +60,8 @@ static int SekUnrecognizedOpcode()
     PicoCpuCM68k.state_flags |= 1;\r
     return 1;\r
   }\r
+  // happened once - may happen again\r
+  SekFinishIdleDet();\r
 #ifdef EMU_M68K // debugging cyclone\r
   {\r
     extern int have_illegal;\r
@@ -421,6 +423,8 @@ int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx)
 \r
 void SekFinishIdleDet(void)\r
 {\r
+  if (idledet_count < 0)\r
+    return;\r
 #ifdef EMU_C68K\r
   CycloneFinishIdle();\r
 #endif\r
@@ -439,6 +443,7 @@ void SekFinishIdleDet(void)
     else\r
       elprintf(EL_STATUS|EL_IDLE, "idle: don't know how to restore %04x", *op);\r
   }\r
+  idledet_count = -1;\r
 }\r
 \r
 \r