new timing for main and cd
[picodrive.git] / pico / state.c
index 6c11381..a369597 100644 (file)
@@ -173,9 +173,11 @@ typedef enum {
   CHUNK_32X_EVT,\r
   CHUNK_32X_FIRST = CHUNK_MSH2,\r
   CHUNK_32X_LAST = CHUNK_32X_EVT,\r
+  // add new stuff here\r
+  CHUNK_CD_EVT = 50,\r
   //\r
   CHUNK_DEFAULT_COUNT,\r
-  CHUNK_CARTHW_ = CHUNK_CARTHW,  // defined in PicoInt\r
+  CHUNK_CARTHW_ = CHUNK_CARTHW,  // 64 (defined in PicoInt)\r
 } chunk_name_e;\r
 \r
 static const char * const chunk_names[] = {\r
@@ -305,6 +307,9 @@ static int state_save(void *file)
     CHECKED_WRITE_BUFF(CHUNK_SCD,      Pico_mcd->scd);\r
     CHECKED_WRITE_BUFF(CHUNK_RC,       Pico_mcd->rot_comp);\r
     CHECKED_WRITE_BUFF(CHUNK_MISC_CD,  Pico_mcd->m);\r
+    memset(buff, 0, 0x40);\r
+    memcpy(buff, pcd_event_times, sizeof(pcd_event_times));\r
+    CHECKED_WRITE(CHUNK_CD_EVT, 0x40, buff);\r
 \r
     if (Pico_mcd->s68k_regs[3] & 4) // convert back\r
       wram_2M_to_1M(Pico_mcd->word_ram2M);\r
@@ -336,7 +341,7 @@ static int state_save(void *file)
     CHECKED_WRITE_BUFF(CHUNK_32XPAL,    Pico32xMem->pal);\r
 \r
     memset(buff, 0, 0x40);\r
-    memcpy(buff, event_times, sizeof(event_times));\r
+    memcpy(buff, p32x_event_times, sizeof(p32x_event_times));\r
     CHECKED_WRITE(CHUNK_32X_EVT, 0x40, buff);\r
   }\r
 #endif\r
@@ -403,6 +408,9 @@ static int state_load(void *file)
     R_ERROR_RETURN("bad header");\r
   CHECKED_READ(4, &ver);\r
 \r
+  memset(pcd_event_times, 0, sizeof(pcd_event_times));\r
+  memset(p32x_event_times, 0, sizeof(p32x_event_times));\r
+\r
   while (!areaEof(file))\r
   {\r
     CHECKED_READ(1, &chunk);\r
@@ -459,6 +467,11 @@ static int state_load(void *file)
       case CHUNK_RC:       CHECKED_READ_BUFF(Pico_mcd->rot_comp); break;\r
       case CHUNK_MISC_CD:  CHECKED_READ_BUFF(Pico_mcd->m); break;\r
 \r
+      case CHUNK_CD_EVT:\r
+        CHECKED_READ_BUFF(buff);\r
+        memcpy(pcd_event_times, buff, sizeof(pcd_event_times));\r
+        break;\r
+\r
       // 32x stuff\r
 #ifndef NO_32X\r
       case CHUNK_MSH2:\r
@@ -485,7 +498,7 @@ static int state_load(void *file)
 \r
       case CHUNK_32X_EVT:\r
         CHECKED_READ_BUFF(buff);\r
-        memcpy(event_times, buff, sizeof(event_times));\r
+        memcpy(p32x_event_times, buff, sizeof(p32x_event_times));\r
         break;\r
 #endif\r
       default:\r
@@ -510,14 +523,6 @@ readend:
   if (PicoAHW & PAHW_SMS)\r
     PicoStateLoadedMS();\r
 \r
-  if (PicoAHW & PAHW_MCD)\r
-  {\r
-    PicoMemStateLoaded();\r
-\r
-    if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))\r
-      cdda_start_play();\r
-  }\r
-\r
   if (PicoAHW & PAHW_32X)\r
     Pico32xStateLoaded(1);\r
 \r
@@ -530,8 +535,17 @@ readend:
   z80_unpack(buff_z80);\r
 \r
   // due to dep from 68k cycles..\r
+  SekCycleAim = SekCycleCnt;\r
   if (PicoAHW & PAHW_32X)\r
     Pico32xStateLoaded(0);\r
+  if (PicoAHW & PAHW_MCD)\r
+  {\r
+    SekCycleAimS68k = SekCycleCntS68k;\r
+    pcd_state_loaded();\r
+\r
+    if (!(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1))\r
+      cdda_start_play();\r
+  }\r
 \r
   return 0;\r
 }\r