new timing for main and cd
[picodrive.git] / pico / cd / memory.c
index 95c78f9..2c6eadc 100644 (file)
@@ -99,8 +99,11 @@ static u32 m68k_reg_read16(u32 a)
     case 0xA:\r
       elprintf(EL_UIO, "m68k FIXME: reserved read");\r
       goto end;\r
-    case 0xC:\r
-      d = Pico_mcd->m.timer_stopwatch >> 16;\r
+    case 0xC: // 384 cycle stopwatch timer\r
+      // ugh..\r
+      d = pcd_cycles_m68k_to_s68k(SekCyclesDone());\r
+      d = (d - Pico_mcd->m.stopwatch_base_c) / 384;\r
+      d &= 0x0fff;\r
       elprintf(EL_CDREGS, "m68k stopwatch timer read (%04x)", d);\r
       goto end;\r
   }\r
@@ -273,7 +276,9 @@ u32 s68k_reg_read16(u32 a)
     case 8:\r
       return Read_CDC_Host(1); // Gens returns 0 here on byte reads\r
     case 0xC:\r
-      d = Pico_mcd->m.timer_stopwatch >> 16;\r
+      d = SekCyclesDoneS68k() - Pico_mcd->m.stopwatch_base_c;\r
+      d /= 384;\r
+      d &= 0x0fff;\r
       elprintf(EL_CDREGS, "s68k stopwatch timer read (%04x)", d);\r
       return d;\r
     case 0x30:\r
@@ -363,21 +368,29 @@ void s68k_reg_write8(u32 a, u32 d)
       elprintf(EL_CDREGS, "s68k set CDC dma addr");\r
       break;\r
     case 0xc:\r
-    case 0xd:\r
-      elprintf(EL_CDREGS, "s68k set stopwatch timer");\r
-      Pico_mcd->m.timer_stopwatch = 0;\r
+    case 0xd: // 384 cycle stopwatch timer\r
+      elprintf(EL_CDREGS|EL_CD, "s68k clear stopwatch (%x)", d);\r
+      // does this also reset internal 384 cycle counter?\r
+      Pico_mcd->m.stopwatch_base_c = SekCyclesDoneS68k();\r
       return;\r
     case 0xe:\r
       Pico_mcd->s68k_regs[0xf] = (d>>1) | (d<<7); // ror8 1, Gens note: Dragons lair\r
       return;\r
-    case 0x31:\r
-      elprintf(EL_CDREGS, "s68k set int3 timer: %02x", d);\r
-      Pico_mcd->m.timer_int3 = (d & 0xff) << 16;\r
+    case 0x31: // 384 cycle int3 timer\r
+      d &= 0xff;\r
+      elprintf(EL_CDREGS|EL_CD, "s68k set int3 timer: %02x", d);\r
+      Pico_mcd->s68k_regs[a] = (u8) d;\r
+      if (d) // d or d+1??\r
+        pcd_event_schedule_s68k(PCD_EVENT_TIMER3, d * 384);\r
+      else\r
+        pcd_event_schedule(0, PCD_EVENT_TIMER3, 0);\r
       break;\r
     case 0x33: // IRQ mask\r
-      elprintf(EL_CDREGS, "s68k irq mask: %02x", d);\r
-      if ((d&(1<<4)) && (Pico_mcd->s68k_regs[0x37]&4) && !(Pico_mcd->s68k_regs[0x33]&(1<<4))) {\r
-        CDD_Export_Status();\r
+      elprintf(EL_CDREGS|EL_CD, "s68k irq mask: %02x", d);\r
+      d &= 0x7e;\r
+      if ((d ^ Pico_mcd->s68k_regs[0x33]) & d & PCDS_IEN4) {\r
+        if (Pico_mcd->s68k_regs[0x37] & 4)\r
+          CDD_Export_Status();\r
       }\r
       break;\r
     case 0x34: // fader\r
@@ -978,7 +991,7 @@ static void remap_word_ram(int r3)
 #endif\r
 }\r
 \r
-void PicoMemStateLoaded(void)\r
+void pcd_state_loaded_mem(void)\r
 {\r
   int r3 = Pico_mcd->s68k_regs[3];\r
 \r
@@ -1147,3 +1160,4 @@ static void m68k_mem_setup_cd(void)
 }\r
 #endif // EMU_M68K\r
 \r
+// vim:shiftwidth=2:ts=2:expandtab\r