mcd, fix timing for irq while polling detected
authorkub <derkub@gmail.com>
Thu, 6 May 2021 19:19:25 +0000 (21:19 +0200)
committerkub <derkub@gmail.com>
Thu, 6 May 2021 19:22:31 +0000 (21:22 +0200)
pico/cd/cdc.c
pico/cd/gfx.c
pico/cd/mcd.c
pico/cd/memory.c
pico/pico_int.h

index bf688f5..7091463 100644 (file)
@@ -367,7 +367,7 @@ void cdc_dma_update(void)
       {
         /* update IRQ level */
         elprintf(EL_INTS, "cdc DTE irq 5");
-        SekInterruptS68k(5);
+        pcd_irq_s68k(5, 1);
       }
     }
 
@@ -411,7 +411,7 @@ int cdc_decoder_update(uint8 header[4])
       {
         /* update IRQ level */
         elprintf(EL_INTS, "cdc DEC irq 5");
-        SekInterruptS68k(5);
+        pcd_irq_s68k(5, 1);
       }
     }
 
@@ -469,13 +469,13 @@ void cdc_reg_w(unsigned char data)
         {
           /* update IRQ level */
           elprintf(EL_INTS, "cdc pending irq 5");
-          SekInterruptS68k(5);
+          pcd_irq_s68k(5, 1);
         }
       }
       else // if (scd.pending & (1 << 5))
       {
         /* clear pending level 5 interrupts */
-        SekInterruptClearS68k(5);
+        pcd_irq_s68k(5, 0);
       }
 
       /* abort any data transfer if data output is disabled */
@@ -614,7 +614,7 @@ void cdc_reg_w(unsigned char data)
       if ((cdc.ifstat | BIT_DECI) || !(cdc.ifctrl & BIT_DECIEN))
       {
         /* clear pending level 5 interrupt */
-        SekInterruptClearS68k(5);
+        pcd_irq_s68k(5, 0);
       }
 #endif
       Pico_mcd->s68k_regs[0x04+1] = 0x08;
@@ -774,7 +774,7 @@ unsigned char cdc_reg_r(void)
       if ((cdc.ifstat | BIT_DTEI) || !(cdc.ifctrl & BIT_DTEIEN))
       {
         /* clear pending level 5 interrupt */
-        SekInterruptClearS68k(5);
+        pcd_irq_s68k(5, 0);
       }
 #endif
 
@@ -826,7 +826,7 @@ unsigned short cdc_host_r(void)
         {
           /* update IRQ level */
           elprintf(EL_INTS, "cdc DTE irq 5");
-          SekInterruptS68k(5);
+          pcd_irq_s68k(5, 1);
         }
       }
 
index b7d9cf1..0a231b7 100644 (file)
@@ -421,7 +421,7 @@ void gfx_update(unsigned int cycles)
 
     if (Pico_mcd->s68k_regs[0x33] & PCDS_IEN1) {
       elprintf(EL_INTS|EL_CD, "s68k: gfx_cd irq 1");
-      SekInterruptS68k(1);
+      pcd_irq_s68k(1, 1);
     }
   }
   else {
index 559fca7..255b2e9 100644 (file)
@@ -177,7 +177,7 @@ static void pcd_cdc_event(unsigned int now)
 
     if (Pico_mcd->s68k_regs[0x33] & PCDS_IEN4) {
       elprintf(EL_INTS|EL_CD, "s68k: cdd irq 4");
-      SekInterruptS68k(4);
+      pcd_irq_s68k(4, 1);
     }
   }
 
@@ -188,7 +188,7 @@ static void pcd_int3_timer_event(unsigned int now)
 {
   if (Pico_mcd->s68k_regs[0x33] & PCDS_IEN3) {
     elprintf(EL_INTS|EL_CD, "s68k: timer irq 3");
-    SekInterruptS68k(3);
+    pcd_irq_s68k(3, 1);
   }
 
   if (Pico_mcd->s68k_regs[0x31] != 0)
@@ -280,6 +280,16 @@ static void pcd_run_events(unsigned int until)
       oldest, event_time_next);
 }
 
+void pcd_irq_s68k(int irq, int state)
+{
+  if (state) {
+    SekInterruptS68k(irq);
+    SekSetStopS68k(0);
+    Pico_mcd->m.s68k_poll_a = 0;
+  } else
+    SekInterruptClearS68k(irq);
+}
+
 int pcd_sync_s68k(unsigned int m68k_target, int m68k_poll_sync)
 {
   #define now SekCycleCntS68k
index 255461d..f3b7a16 100644 (file)
@@ -150,7 +150,7 @@ void m68k_reg_write8(u32 a, u32 d)
       if (d && (Pico_mcd->s68k_regs[0x33] & PCDS_IEN2)) {\r
         elprintf(EL_INTS, "m68k: s68k irq 2");\r
         pcd_sync_s68k(SekCyclesDone(), 0);\r
-        SekInterruptS68k(2);\r
+        pcd_irq_s68k(2, 1);\r
       }\r
       return;\r
     case 1:\r
@@ -425,7 +425,7 @@ void s68k_reg_write8(u32 a, u32 d)
         // XXX: emulate pending irq instead?\r
         if (Pico_mcd->s68k_regs[0x37] & 4) {\r
           elprintf(EL_INTS, "cdd export irq 4 (unmask)");\r
-          SekInterruptS68k(4);\r
+          pcd_irq_s68k(4, 1);\r
         }\r
       }\r
       break;\r
@@ -443,7 +443,7 @@ void s68k_reg_write8(u32 a, u32 d)
 \r
         if (Pico_mcd->s68k_regs[0x33] & PCDS_IEN4) {\r
           elprintf(EL_INTS, "cdd export irq 4");\r
-          SekInterruptS68k(4);\r
+          pcd_irq_s68k(4, 1);\r
         }\r
       }\r
       return;\r
index 84bd201..c404416 100644 (file)
@@ -773,6 +773,7 @@ void pcd_event_schedule(unsigned int now, enum pcd_event event, int after);
 void pcd_event_schedule_s68k(enum pcd_event event, int after);\r
 void pcd_prepare_frame(void);\r
 unsigned int pcd_cycles_m68k_to_s68k(unsigned int c);\r
+void pcd_irq_s68k(int irq, int state);\r
 int  pcd_sync_s68k(unsigned int m68k_target, int m68k_poll_sync);\r
 void pcd_run_cpus(int m68k_cycles);\r
 void pcd_soft_reset(void);\r