cd: tweak the poll code further
authornotaz <notasas@gmail.com>
Wed, 4 Sep 2013 22:09:17 +0000 (01:09 +0300)
committernotaz <notasas@gmail.com>
Fri, 6 Sep 2013 00:37:05 +0000 (03:37 +0300)
pico/cd/mcd.c
pico/cd/memory.c

index 0157bb5..0824ec0 100644 (file)
@@ -82,6 +82,9 @@ static __inline void SekRunS68k(unsigned int to)
   if ((cyc_do = SekCycleAimS68k - SekCycleCntS68k) <= 0)
     return;
 
+  if (SekShouldInterrupt())
+    Pico_mcd->m.s68k_poll_a = 0;
+
   SekCycleCntS68k += cyc_do;
 #if defined(EMU_C68K)
   PicoCpuCS68k.cycles = cyc_do;
@@ -263,7 +266,7 @@ static void SekSyncM68k(void);
 static inline void pcd_run_cpus_normal(int m68k_cycles)
 {
   SekCycleAim += m68k_cycles;
-  if (SekShouldInterrupt())
+  if (SekShouldInterrupt() || Pico_mcd->m.m68k_poll_cnt < 12)
     Pico_mcd->m.m68k_poll_cnt = 0;
   else if (Pico_mcd->m.m68k_poll_cnt >= 16) {
     int s68k_left = pcd_sync_s68k(SekCycleAim, 1);
index 4b4c18f..2d8cc76 100644 (file)
@@ -70,7 +70,7 @@ static void remap_word_ram(u32 r3);
 \r
 // poller detection\r
 #define POLL_LIMIT 16\r
-#define POLL_CYCLES 124\r
+#define POLL_CYCLES 64\r
 \r
 void m68k_comm_check(u32 a)\r
 {\r
@@ -143,9 +143,6 @@ void m68k_reg_write8(u32 a, u32 d)
   u32 dold;\r
   a &= 0x3f;\r
 \r
-  Pico_mcd->m.m68k_poll_a =\r
-  Pico_mcd->m.m68k_poll_cnt = 0;\r
-\r
   switch (a) {\r
     case 0:\r
       d &= 1;\r
@@ -230,18 +227,17 @@ write_comm:
   if (d == Pico_mcd->s68k_regs[a])\r
     return;\r
 \r
-  Pico_mcd->s68k_regs[a] = d;\r
   pcd_sync_s68k(SekCyclesDone(), 0);\r
-  if (Pico_mcd->m.s68k_poll_a == a && Pico_mcd->m.s68k_poll_cnt > POLL_LIMIT) {\r
+  Pico_mcd->s68k_regs[a] = d;\r
+  if (Pico_mcd->m.s68k_poll_a == (a & ~1)\r
+      && Pico_mcd->m.s68k_poll_cnt > POLL_LIMIT)\r
+  {\r
     SekSetStopS68k(0);\r
     Pico_mcd->m.s68k_poll_a = 0;\r
     elprintf(EL_CDPOLL, "s68k poll release, a=%02x", a);\r
   }\r
 }\r
 \r
-#ifndef _ASM_CD_MEMORY_C\r
-static\r
-#endif\r
 u32 s68k_poll_detect(u32 a, u32 d)\r
 {\r
 #ifdef USE_POLL_DETECT\r
@@ -807,7 +803,7 @@ static u32 PicoReadS68k8_pr(u32 a)
     a &= 0x1ff;\r
     if (a >= 0x0e && a < 0x30) {\r
       d = Pico_mcd->s68k_regs[a];\r
-      s68k_poll_detect(a, d);\r
+      s68k_poll_detect(a & ~1, d);\r
       goto regs_done;\r
     }\r
     else if (a >= 0x58 && a < 0x68)\r