mcd, improve polling detection
authorkub <derkub@gmail.com>
Fri, 14 May 2021 20:55:03 +0000 (22:55 +0200)
committerkub <derkub@gmail.com>
Fri, 14 May 2021 21:00:04 +0000 (23:00 +0200)
pico/cd/mcd.c
pico/cd/memory.c
pico/pico_int.h

index 732a429..602b6eb 100644 (file)
@@ -342,7 +342,7 @@ void pcd_run_cpus_normal(int m68k_cycles)
       Pico_mcd->m.m68k_poll_cnt = 0;
 
 #ifdef USE_POLL_DETECT
-    if (Pico_mcd->m.m68k_poll_cnt >= 16) {
+    if (Pico_mcd->m.m68k_poll_cnt >= 32) {
       int s68k_left;
       // main CPU is polling, (wake and) run sub only
       if (SekIsStoppedS68k())
index a7b47b9..a47d6a3 100644 (file)
@@ -63,19 +63,22 @@ static void remap_prg_window(u32 r1, u32 r3);
 static void remap_word_ram(u32 r3);\r
 \r
 // poller detection\r
-#define POLL_LIMIT 16\r
+#define POLL_LIMIT 32\r
 #define POLL_CYCLES 64\r
 \r
 void m68k_comm_check(u32 a)\r
 {\r
-  pcd_sync_s68k(SekCyclesDone(), 0);\r
+  u32 cycles = SekCyclesDone();\r
+  u32 clkdiff = cycles - Pico_mcd->m.m68k_poll_clk;\r
+  pcd_sync_s68k(cycles, 0);\r
   if (a >= 0x0e && !Pico_mcd->m.need_sync) {\r
     // there are cases when slave updates comm and only switches RAM\r
     // over after that (mcd1b), so there must be a resync..\r
     SekEndRun(64);\r
     Pico_mcd->m.need_sync = 1;\r
   }\r
-  if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a) {\r
+  Pico_mcd->m.m68k_poll_clk = cycles;\r
+  if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a || clkdiff > POLL_CYCLES) {\r
     Pico_mcd->m.m68k_poll_a = a;\r
     Pico_mcd->m.m68k_poll_cnt = 0;\r
     SekNotPolling = 0;\r
index c404416..6a393fb 100644 (file)
@@ -491,7 +491,8 @@ struct mcd_misc
   unsigned char  dmna_ret_2m;\r
   unsigned char  need_sync;\r
   unsigned char  pad3;\r
-  int pad4[9];\r
+  unsigned int   m68k_poll_clk;\r
+  int pad4[8];\r
 };\r
 \r
 typedef struct\r