void PicoMCDPrepare(void)
 {
-  // ~1.63 for NTSC, ~1.645 for PAL
+  // 12500000/(osc/7), ~1.63 for NTSC, ~1.645 for PAL
 #define DIV_ROUND(x,y) ((x)+(y)/2) / (y) // round to nearest, x/y+0.5 -> (x+y/2)/y
   unsigned int osc = (Pico.m.pal ? OSC_PAL : OSC_NTSC);
-  mcd_m68k_cycle_mult = DIV_ROUND(12500000ull << 16, osc / 7);
+  mcd_m68k_cycle_mult = DIV_ROUND(7 * 12500000ull << 16, osc);
   mcd_s68k_cycle_mult = DIV_ROUND(1ull * osc << 16, 7 * 12500000);
 }
 
 /* events */
 static void pcd_cdc_event(unsigned int now)
 {
+  int audio = Pico_mcd->s68k_regs[0x36] & 0x1;
+
   // 75Hz CDC update
   cdd_update();
 
+  // main 68k cycles since frame start
+  int cycles = 1LL*(now-mcd_s68k_cycle_base) * mcd_s68k_cycle_mult >> 16;
+  // samples@rate since frame start
+  int samples = 1LL * cycles_68k_to_z80(cycles) * Pico.snd.clkz_mult >> 20;
+  // samples@44100Hz since frame start
+  samples = samples * Pico.snd.cdda_mult >> 16;
+  if (samples < 2352/4) // save offset to 1st used sample for state saving
+    Pico_mcd->m.cdda_lba_offset = 2352/4 - samples;
+
+  /* if audio just turned on, store start offset for sound */
+  audio &= !(Pico_mcd->s68k_regs[0x36] & 0x1);
+  if (audio) {
+    Pico_mcd->m.cdda_lba_offset = 0; // starting with full lba
+    Pico_mcd->cdda_frame_offs = samples;
+  }
+
   /* check if a new CDD command has been processed */
   if (!(Pico_mcd->s68k_regs[0x4b] & 0xf0))
   {
 
 // ---------------------------------------------------------\r
 \r
 // main oscillator clock which controls timing\r
-#define OSC_NTSC 53693100\r
+#define OSC_NTSC 53693175\r
 #define OSC_PAL  53203424\r
 \r
 // PicoVideo.debug_p\r
   short len_use;                        // adjusted\r
   int len_e_add;                        // for non-int samples/frame\r
   int len_e_cnt;\r
-  unsigned int clkl_mult;               // z80 clocks per line in Q20\r
+  unsigned int clkz_mult;               // z80 clocks per sample in Q20\r
   unsigned int smpl_mult;               // samples per line in Q16\r
   unsigned int cdda_mult, cdda_div;     // 44.1 KHz resampling factor in Q16\r
   short dac_val, dac_val2;              // last DAC sample\r
   unsigned char  need_sync;\r
   unsigned char  pad3;\r
   unsigned int   m68k_poll_clk;\r
-  int pad4[8];\r
+  unsigned int   cdda_lba_offset; // 20\r
+  int pad4[7];\r
 };\r
 \r
 typedef struct\r
   struct mcd_pcm pcm;                          // 112240:\r
   void *cdda_stream;\r
   int cdda_type;\r
+  unsigned int cdda_frame_offs;\r
   int pcm_mixbuf[PCM_MIXBUF_LEN * 2];\r
   int pcm_mixpos;\r
   char pcm_mixbuf_dirty;\r
 
   // samples per line (Q16)\r
   Pico.snd.smpl_mult = 65536LL * PicoIn.sndRate / (target_fps*target_lines);\r
   // samples per z80 clock (Q20)\r
-  Pico.snd.clkl_mult = 16 * Pico.snd.smpl_mult * 15/7 / 488.5;\r
-  // samples per 44.1 KHz sample\r
+  Pico.snd.clkz_mult = 16 * Pico.snd.smpl_mult * 15/7 / 488.5;\r
+  // samples per 44.1 KHz sample (Q16)\r
   Pico.snd.cdda_mult = 65536LL * 44100 / PicoIn.sndRate;\r
   Pico.snd.cdda_div  = 65536LL * PicoIn.sndRate / 44100;\r
 \r
   if (!PicoIn.sndOut) return;\r
 \r
   // number of samples to fill in buffer (Q20)\r
-  len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.dac_pos;\r
+  len = (cyc_to * Pico.snd.clkz_mult) - Pico.snd.dac_pos;\r
 \r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.dac_pos+0x80000) >> 20;\r
   if (!PicoIn.sndOut) return;\r
 \r
   // number of samples to fill in buffer (Q20)\r
-  len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.psg_pos;\r
+  len = (cyc_to * Pico.snd.clkz_mult) - Pico.snd.psg_pos;\r
 \r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.psg_pos+0x80000) >> 20;\r
   if (!PicoIn.sndOut) return;\r
 \r
   // number of samples to fill in buffer (Q20)\r
-  len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.ym2413_pos;\r
+  len = (cyc_to * Pico.snd.clkz_mult) - Pico.snd.ym2413_pos;\r
 \r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.ym2413_pos+0x80000) >> 20;\r
   if (!PicoIn.sndOut) return;\r
 \r
   // Q20, number of samples since last call\r
-  len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.fm_pos;\r
+  len = (cyc_to * Pico.snd.clkz_mult) - Pico.snd.fm_pos;\r
 \r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.fm_pos+0x80000) >> 20;\r
   if (!PicoIn.sndOut) return;\r
 \r
   // Q20, number of samples since last call\r
-  len = (cyc_to * Pico.snd.clkl_mult) - Pico.snd.pcm_pos;\r
+  len = (cyc_to * Pico.snd.clkz_mult) - Pico.snd.pcm_pos;\r
 \r
   // update position and calculate buffer offset and length\r
   pos = (Pico.snd.pcm_pos+0x80000) >> 20;\r
 {\r
   int ret, cdda_bytes;\r
 \r
+  // apply start offset in frame (offset to 1st lba to play)\r
+  int offs = Pico_mcd->cdda_frame_offs * Pico.snd.cdda_div >> 16;\r
+  length -= offs;\r
+  buffer += offs * (stereo ? 2 : 1);\r
+  Pico_mcd->cdda_frame_offs = 0;\r
+\r
   cdda_bytes = (length * Pico.snd.cdda_mult >> 16) * 4;\r
 \r
+  // compute offset of last played sample in this frame (need for save/load)\r
+  Pico_mcd->m.cdda_lba_offset += cdda_bytes/4;\r
+  while (Pico_mcd->m.cdda_lba_offset >= 2352/4)\r
+    Pico_mcd->m.cdda_lba_offset -= 2352/4;\r
+\r
   ret = pm_read_audio(cdda_out_buffer, cdda_bytes, Pico_mcd->cdda_stream);\r
   if (ret < cdda_bytes) {\r
     memset((char *)cdda_out_buffer + ret, 0, cdda_bytes - ret);\r
     Pico_mcd->cdda_stream = NULL;\r
-    return;\r
   }\r
 \r
   // now mix\r
     return;\r
   }\r
 \r
-  pm_seek(Pico_mcd->cdda_stream, (lba_base + lba_offset) * 2352, SEEK_SET);\r
+  // on restart after loading, consider offset of last played sample\r
+  pm_seek(Pico_mcd->cdda_stream, (lba_base + lba_offset) * 2352 +\r
+                                  Pico_mcd->m.cdda_lba_offset * 4, SEEK_SET);\r
   if (Pico_mcd->cdda_type == CT_WAV)\r
   {\r
     // skip headers, assume it's 44kHz stereo uncompressed\r