fix various logging issues
[picodrive.git] / pico / sek.c
index 8dd7729..c91374b 100644 (file)
@@ -36,8 +36,8 @@ M68K_CONTEXT PicoCpuFM68k;
 static int SekIntAck(int level)\r
 {\r
   // try to emulate VDP's reaction to 68000 int ack\r
-  if     (level == 4) { Pico.video.pending_ints  =  0;    elprintf(EL_INTS, "hack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
-  else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
+  if     (level == 4) { Pico.video.pending_ints  =  0;    elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, SekCycleCnt); }\r
+  else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, SekCycleCnt); }\r
   PicoCpuCM68k.irq = 0;\r
   return CYCLONE_INT_ACK_AUTOVECTOR;\r
 }\r
@@ -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
@@ -74,8 +76,8 @@ static int SekUnrecognizedOpcode()
 #ifdef EMU_M68K\r
 static int SekIntAckM68K(int level)\r
 {\r
-  if     (level == 4) { Pico.video.pending_ints  =  0;    elprintf(EL_INTS, "hack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
-  else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
+  if     (level == 4) { Pico.video.pending_ints  =  0;    elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, SekCycleCnt); }\r
+  else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, SekCycleCnt); }\r
   CPU_INT_LEVEL = 0;\r
   return M68K_INT_ACK_AUTOVECTOR;\r
 }\r
@@ -90,8 +92,14 @@ static int SekTasCallback(void)
 #ifdef EMU_F68K\r
 static void SekIntAckF68K(unsigned level)\r
 {\r
-  if     (level == 4) { Pico.video.pending_ints  =  0;    elprintf(EL_INTS, "hack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
-  else if(level == 6) { Pico.video.pending_ints &= ~0x20; elprintf(EL_INTS, "vack: @ %06x [%i]", SekPc, SekCycleCnt); }\r
+  if     (level == 4) {\r
+    Pico.video.pending_ints = 0;\r
+    elprintf(EL_INTS, "hack: @ %06x [%u]", SekPc, SekCyclesDone());\r
+  }\r
+  else if(level == 6) {\r
+    Pico.video.pending_ints &= ~0x20;\r
+    elprintf(EL_INTS, "vack: @ %06x [%u]", SekPc, SekCyclesDone());\r
+  }\r
   PicoCpuFM68k.interrupts[0] = 0;\r
 }\r
 #endif\r
@@ -170,7 +178,7 @@ void SekStepM68k(void)
 #elif defined(EMU_M68K)\r
   SekCycleCnt+=m68k_execute(1);\r
 #elif defined(EMU_F68K)\r
-  SekCycleCnt+=fm68k_emulate(1, 0, 0);\r
+  SekCycleCnt+=fm68k_emulate(1, 0);\r
 #endif\r
 }\r
 \r
@@ -294,7 +302,8 @@ void SekRegisterIdleHit(unsigned int pc)
 \r
 void SekInitIdleDet(void)\r
 {\r
-  unsigned short **tmp = realloc(idledet_ptrs, 0x200*4);\r
+  unsigned short **tmp;\r
+  tmp = realloc(idledet_ptrs, 0x200 * sizeof(tmp[0]));\r
   if (tmp == NULL) {\r
     free(idledet_ptrs);\r
     idledet_ptrs = NULL;\r
@@ -311,7 +320,7 @@ void SekInitIdleDet(void)
   CycloneInitIdle();\r
 #endif\r
 #ifdef EMU_F68K\r
-  fm68k_emulate(0, 0, 1);\r
+  fm68k_emulate(0, 1);\r
 #endif\r
 }\r
 \r
@@ -402,7 +411,8 @@ int SekRegisterIdlePatch(unsigned int pc, int oldop, int newop, void *ctx)
   }\r
 \r
   if (idledet_count >= 0x200 && (idledet_count & 0x1ff) == 0) {\r
-    unsigned short **tmp = realloc(idledet_ptrs, (idledet_count+0x200)*4);\r
+    unsigned short **tmp;\r
+    tmp = realloc(idledet_ptrs, (idledet_count+0x200) * sizeof(tmp[0]));\r
     if (tmp == NULL)\r
       return 1;\r
     idledet_ptrs = tmp;\r
@@ -415,11 +425,13 @@ 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
 #ifdef EMU_F68K\r
-  fm68k_emulate(0, 0, 2);\r
+  fm68k_emulate(0, 2);\r
 #endif\r
   while (idledet_count > 0)\r
   {\r
@@ -433,6 +445,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
@@ -543,6 +556,7 @@ breakloop:
                        printf("D%d: %08x  A%d: %08x\n", i, x68k->dar[i],\r
         i, x68k->dar[i + 8]);\r
                printf("PC: %08x, %08x\n", x68k->pc, x68k->pc_prev);\r
+               printf("SR: %04x\n", x68k->sr);\r
 \r
     PDebugDumpMem();\r
     exit(1);\r