Browse Source

mcd, improve polling detection

root 3 years ago
parent
commit
86896ccefc
3 changed files with 9 additions and 5 deletions
  1. 1 1
      pico/cd/mcd.c
  2. 6 3
      pico/cd/memory.c
  3. 2 1
      pico/pico_int.h

+ 1 - 1
pico/cd/mcd.c

@@ -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())

+ 6 - 3
pico/cd/memory.c

@@ -63,19 +63,22 @@ static void remap_prg_window(u32 r1, u32 r3);
 static void remap_word_ram(u32 r3);
 
 // poller detection
-#define POLL_LIMIT 16
+#define POLL_LIMIT 32
 #define POLL_CYCLES 64
 
 void m68k_comm_check(u32 a)
 {
-  pcd_sync_s68k(SekCyclesDone(), 0);
+  u32 cycles = SekCyclesDone();
+  u32 clkdiff = cycles - Pico_mcd->m.m68k_poll_clk;
+  pcd_sync_s68k(cycles, 0);
   if (a >= 0x0e && !Pico_mcd->m.need_sync) {
     // there are cases when slave updates comm and only switches RAM
     // over after that (mcd1b), so there must be a resync..
     SekEndRun(64);
     Pico_mcd->m.need_sync = 1;
   }
-  if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a) {
+  Pico_mcd->m.m68k_poll_clk = cycles;
+  if (SekNotPolling || a != Pico_mcd->m.m68k_poll_a || clkdiff > POLL_CYCLES) {
     Pico_mcd->m.m68k_poll_a = a;
     Pico_mcd->m.m68k_poll_cnt = 0;
     SekNotPolling = 0;

+ 2 - 1
pico/pico_int.h

@@ -491,7 +491,8 @@ struct mcd_misc
   unsigned char  dmna_ret_2m;
   unsigned char  need_sync;
   unsigned char  pad3;
-  int pad4[9];
+  unsigned int   m68k_poll_clk;
+  int pad4[8];
 };
 
 typedef struct