rework sh2 sync, again..
[picodrive.git] / pico / debug.c
index 2370bfa..e579296 100644 (file)
@@ -402,3 +402,137 @@ void PDebugCPUStep(void)
     SekStepM68k();
 }
 
+#ifdef EVT_LOG
+static struct evt_t {
+  unsigned int cycles;
+  short cpu;
+  short evt;
+} *evts;
+static int first_frame;
+static int evt_alloc;
+static int evt_cnt;
+
+void pevt_log(unsigned int cycles, enum evt_cpu c, enum evt e)
+{
+  if (first_frame == 0)
+    first_frame = Pico.m.frame_count;
+  if (evt_alloc == evt_cnt) {
+    evt_alloc = evt_alloc * 2 + 16 * 1024;
+    evts = realloc(evts, evt_alloc * sizeof(evts[0]));
+  }
+  evts[evt_cnt].cycles = cycles;
+  evts[evt_cnt].cpu = c;
+  evts[evt_cnt].evt = e;
+  evt_cnt++;
+}
+
+static int evt_cmp(const void *p1, const void *p2)
+{
+  const struct evt_t *e1 = p1, *e2 = p2;
+  int ret = (int)(e1->cycles - e2->cycles);
+  if (ret)
+    return ret;
+  if (e1->evt == EVT_RUN_END || e1->evt == EVT_POLL_END)
+    return -1;
+  if (e1->evt == EVT_RUN_START || e1->evt == EVT_POLL_START)
+    return 1;
+  if (e2->evt == EVT_RUN_END || e2->evt == EVT_POLL_END)
+    return 1;
+  if (e1->evt == EVT_RUN_START || e1->evt == EVT_POLL_START)
+    return -1;
+  return 0;
+}
+
+void pevt_dump(void)
+{
+  static const char *evt_names[EVT_CNT] = {
+    "x", "x", "+run", "-run", "+poll", "-poll",
+  };
+  char evt_print[EVT_CPU_CNT][EVT_CNT] = {{0,}};
+  unsigned int start_cycles[EVT_CPU_CNT] = {0,};
+  unsigned int run_cycles[EVT_CPU_CNT] = {0,};
+  unsigned int frame_cycles[EVT_CPU_CNT] = {0,};
+  unsigned int frame_resched[EVT_CPU_CNT] = {0,};
+  unsigned int cycles = 0;
+  int frame = first_frame - 1;
+  int line = 0;
+  int cpu_mask = 0;
+  int dirty = 0;
+  int i;
+
+  qsort(evts, evt_cnt, sizeof(evts[0]), evt_cmp);
+
+  for (i = 0; i < evt_cnt; i++) {
+    int c = evts[i].cpu, e = evts[i].evt;
+    int ei, ci;
+
+    if (cycles != evts[i].cycles || (cpu_mask & (1 << c))
+        || e == EVT_FRAME_START || e == EVT_NEXT_LINE)
+    {
+      if (dirty) {
+        printf("%u:%03u:%u ", frame, line, cycles);
+        for (ci = 0; ci < EVT_CPU_CNT; ci++) {
+          int found = 0;
+          for (ei = 0; ei < EVT_CNT; ei++) {
+            if (evt_print[ci][ei]) {
+              if (ei == EVT_RUN_END) {
+                printf("%8s%4d", evt_names[ei], run_cycles[ci]);
+                run_cycles[ci] = 0;
+              }
+              else
+                printf("%8s    ", evt_names[ei]);
+              found = 1;
+            }
+          }
+          if (!found)
+            printf("%12s", "");
+        }
+        printf("\n");
+        memset(evt_print, 0, sizeof(evt_print));
+        cpu_mask = 0;
+        dirty = 0;
+      }
+      cycles = evts[i].cycles;
+    }
+
+    switch (e) {
+    case EVT_FRAME_START:
+      frame++;
+      line = 0;
+      printf("%u:%03u:%u ", frame, line, cycles);
+      for (ci = 0; ci < EVT_CPU_CNT; ci++) {
+        printf("%12u", frame_cycles[ci]);
+        frame_cycles[ci] = 0;
+      }
+      printf("\n");
+      printf("%u:%03u:%u ", frame, line, cycles);
+      for (ci = 0; ci < EVT_CPU_CNT; ci++) {
+        printf("%12u", frame_resched[ci]);
+        frame_resched[ci] = 0;
+      }
+      printf("\n");
+      break;
+    case EVT_NEXT_LINE:
+      line++;
+      printf("%u:%03u:%u\n", frame, line, cycles);
+      break;
+    case EVT_RUN_START:
+      start_cycles[c] = cycles;
+      goto default_;
+    case EVT_RUN_END:
+      run_cycles[c] += cycles - start_cycles[c];
+      frame_cycles[c] += cycles - start_cycles[c];
+      frame_resched[c]++;
+      goto default_;
+    default_:
+    default:
+      evt_print[c][e] = 1;
+      cpu_mask |= 1 << c;
+      dirty = 1;
+      break;
+    }
+  }
+}
+#endif
+
+// vim:shiftwidth=2:ts=2:expandtab