some new cpu debug code
[picodrive.git] / pico / sek.c
index 85bfd28..2fe77cb 100644 (file)
@@ -420,6 +420,122 @@ void SekFinishIdleDet(void)
 }\r
 \r
 \r
+#if defined(CPU_CMP_R) || defined(CPU_CMP_W)\r
+#include "debug.h"\r
+\r
+struct ref_68k {\r
+  u32 dar[16];\r
+  u32 pc;\r
+  u32 sr;\r
+  u32 cycles;\r
+  u32 pc_prev;\r
+};\r
+struct ref_68k ref_68ks[2];\r
+static int current_68k;\r
+\r
+void SekTrace(int is_s68k)\r
+{\r
+  struct ref_68k *x68k = &ref_68ks[is_s68k];\r
+  u32 pc = is_s68k ? SekPcS68k : SekPc;\r
+  u32 sr = is_s68k ? SekSrS68k : SekSr;\r
+  u32 cycles = is_s68k ? SekCycleCntS68k : SekCycleCnt;\r
+  u32 r;\r
+  u8 cmd;\r
+#ifdef CPU_CMP_W\r
+  int i;\r
+\r
+  if (is_s68k != current_68k) {\r
+    current_68k = is_s68k;\r
+    cmd = CTL_68K_SLAVE | current_68k;\r
+    tl_write(&cmd, sizeof(cmd));\r
+  }\r
+  if (pc != x68k->pc) {\r
+    x68k->pc = pc;\r
+    tl_write_uint(CTL_68K_PC, x68k->pc);\r
+  }\r
+  if (sr != x68k->sr) {\r
+    x68k->sr = sr;\r
+    tl_write_uint(CTL_68K_SR, x68k->sr);\r
+  }\r
+  for (i = 0; i < 16; i++) {\r
+    r = is_s68k ? SekDarS68k(i) : SekDar(i);\r
+    if (r != x68k->dar[i]) {\r
+      x68k->dar[i] = r;\r
+      tl_write_uint(CTL_68K_R + i, r);\r
+    }\r
+  }\r
+  tl_write_uint(CTL_68K_CYCLES, cycles);\r
+#else\r
+  int i, bad = 0;\r
+\r
+  while (1)\r
+  {\r
+    int ret = tl_read(&cmd, sizeof(cmd));\r
+    if (ret == 0) {\r
+      elprintf(EL_STATUS, "EOF");\r
+      exit(1);\r
+    }\r
+    switch (cmd) {\r
+    case CTL_68K_SLAVE:\r
+    case CTL_68K_SLAVE + 1:\r
+      current_68k = cmd & 1;\r
+      break;\r
+    case CTL_68K_PC:\r
+      tl_read_uint(&x68k->pc);\r
+      break;\r
+    case CTL_68K_SR:\r
+      tl_read_uint(&x68k->sr);\r
+      break;\r
+    case CTL_68K_CYCLES:\r
+      tl_read_uint(&x68k->cycles);\r
+      goto breakloop;\r
+    default:\r
+      if (CTL_68K_R <= cmd && cmd < CTL_68K_R + 0x10)\r
+        tl_read_uint(&x68k->dar[cmd - CTL_68K_R]);\r
+      else\r
+        elprintf(EL_STATUS, "invalid cmd: %02x", cmd);\r
+    }\r
+  }\r
+\r
+breakloop:\r
+  if (is_s68k != current_68k) {\r
+               printf("bad 68k: %d %d\n", is_s68k, current_68k);\r
+    bad = 1;\r
+  }\r
+  if (cycles != x68k->cycles) {\r
+               printf("bad cycles: %u %u\n", cycles, x68k->cycles);\r
+    bad = 1;\r
+  }\r
+  if ((pc ^ x68k->pc) & 0xffffff) {\r
+               printf("bad PC: %08x %08x\n", pc, x68k->pc);\r
+    bad = 1;\r
+  }\r
+  if (sr != x68k->sr) {\r
+               printf("bad SR:  %03x %03x\n", sr, x68k->sr);\r
+    bad = 1;\r
+  }\r
+  for (i = 0; i < 16; i++) {\r
+    r = is_s68k ? SekDarS68k(i) : SekDar(i);\r
+    if (r != x68k->dar[i]) {\r
+                 printf("bad %c%d: %08x %08x\n", i < 8 ? 'D' : 'A', i & 7,\r
+        r, x68k->dar[i]);\r
+      bad = 1;\r
+    }\r
+  }\r
+  if (bad) {\r
+    for (i = 0; i < 8; i++)\r
+                       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
+\r
+    PDebugDumpMem();\r
+    exit(1);\r
+  }\r
+  x68k->pc_prev = x68k->pc;\r
+#endif\r
+}\r
+#endif // CPU_CMP_*\r
+\r
 #if defined(EMU_M68K) && M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER\r
 static unsigned char op_flags[0x400000/2] = { 0, };\r
 static int atexit_set = 0;\r
@@ -447,3 +563,5 @@ void instruction_hook(void)
     op_flags[REG_PC/2] = 1;\r
 }\r
 #endif\r
+\r
+// vim:shiftwidth=2:ts=2:expandtab\r