cd: delay gfx ops again
[picodrive.git] / pico / 32x / memory.c
index 5be4da4..722698e 100644 (file)
@@ -65,7 +65,7 @@ static int m68k_poll_detect(u32 a, u32 cycles, u32 flags)
   int ret = 0;
 
   if (a - 2 <= m68k_poll.addr && m68k_poll.addr <= a + 2
-    && cycles - m68k_poll.cycles <= 64)
+    && cycles - m68k_poll.cycles <= 64 && !SekNotPolling)
   {
     if (m68k_poll.cnt++ > POLL_THRESHOLD) {
       if (!(Pico32x.emu_flags & flags)) {
@@ -79,6 +79,7 @@ static int m68k_poll_detect(u32 a, u32 cycles, u32 flags)
   else {
     m68k_poll.cnt = 0;
     m68k_poll.addr = a;
+    SekNotPolling = 0;
   }
   m68k_poll.cycles = cycles;
 
@@ -186,15 +187,9 @@ static u32 p32x_reg_read16(u32 a)
     return sh2_comm_faker(a);
 #else
   if ((a & 0x30) == 0x20) {
-    static u32 dr2 = 0;
-    unsigned int cycles = SekCyclesDoneT();
+    unsigned int cycles = SekCyclesDone();
     int comreg = 1 << (a & 0x0f) / 2;
 
-    // evil X-Men proto polls in a dbra loop and expects it to expire..
-    if (SekDar(2) != dr2)
-      m68k_poll.cnt = 0;
-    dr2 = SekDar(2);
-
     if (cycles - msh2.m68krcycles_done > 244
         || (Pico32x.comm_dirty_68k & comreg))
       p32x_sync_sh2s(cycles);
@@ -205,20 +200,19 @@ static u32 p32x_reg_read16(u32 a)
       SekSetStop(1);
       SekEndRun(16);
     }
-    dr2 = SekDar(2);
     goto out;
   }
 #endif
 
   if (a == 2) { // INTM, INTS
-    unsigned int cycles = SekCyclesDoneT();
+    unsigned int cycles = SekCyclesDone();
     if (cycles - msh2.m68krcycles_done > 64)
       p32x_sync_sh2s(cycles);
     goto out;
   }
 
   if ((a & 0x30) == 0x30)
-    return p32x_pwm_read16(a, NULL, SekCyclesDoneT());
+    return p32x_pwm_read16(a, NULL, SekCyclesDone());
 
 out:
   return Pico32x.regs[a / 2];
@@ -241,7 +235,7 @@ static void dreq0_write(u16 *r, u32 d)
       r[6 / 2] &= ~P32XS_68S;
 
     if ((Pico32x.dmac0_fifo_ptr & 3) == 0) {
-      p32x_sync_sh2s(SekCyclesDoneT());
+      p32x_sync_sh2s(SekCyclesDone());
       p32x_dreq0_trigger();
     }
   }
@@ -272,7 +266,7 @@ static void p32x_reg_write8(u32 a, u32 d)
       return;
     case 0x03: // irq ctl
       if ((d ^ r[0x02 / 2]) & 3) {
-        int cycles = SekCyclesDoneT();
+        int cycles = SekCyclesDone();
         p32x_sync_sh2s(cycles);
         r[0x02 / 2] = d & 3;
         p32x_update_cmd_irq(NULL, cycles);
@@ -383,12 +377,12 @@ static void p32x_reg_write8(u32 a, u32 d)
     case 0x3f:
       return;
     pwm_write:
-      p32x_pwm_write16(a & ~1, d, NULL, SekCyclesDoneT());
+      p32x_pwm_write16(a & ~1, d, NULL, SekCyclesDone());
       return;
   }
 
   if ((a & 0x30) == 0x20) {
-    int cycles = SekCyclesDoneT();
+    int cycles = SekCyclesDone();
     int comreg;
     
     if (REG8IN16(r, a) == d)
@@ -448,13 +442,13 @@ static void p32x_reg_write16(u32 a, u32 d)
     case 0x30: // PWM control
       d = (r[a / 2] & ~0x0f) | (d & 0x0f);
       r[a / 2] = d;
-      p32x_pwm_write16(a, d, NULL, SekCyclesDoneT());
+      p32x_pwm_write16(a, d, NULL, SekCyclesDone());
       return;
   }
 
   // comm port
   if ((a & 0x30) == 0x20) {
-    int cycles = SekCyclesDoneT();
+    int cycles = SekCyclesDone();
     int comreg;
     
     if (r[a / 2] == d)
@@ -475,7 +469,7 @@ static void p32x_reg_write16(u32 a, u32 d)
   }
   // PWM
   else if ((a & 0x30) == 0x30) {
-    p32x_pwm_write16(a, d, NULL, SekCyclesDoneT());
+    p32x_pwm_write16(a, d, NULL, SekCyclesDone());
     return;
   }