drc: support ms ABI
[picodrive.git] / pico / pico_cmn.c
index 50b8ced..95b6b10 100644 (file)
@@ -81,7 +81,7 @@ static void do_timing_hacks_as(struct PicoVideo *pv, int vdp_slots)
 
 static void do_timing_hacks_vb(void)
 {
-  if (Pico.m.dma_xfers)
+  if (unlikely(Pico.m.dma_xfers))
     SekCyclesBurn(CheckDMA());
 }
 
@@ -153,7 +153,7 @@ static int PicoFrameHints(void)
     }
 
     // get samples from sound chips
-    if ((y == 224 || y == line_sample) && PsndOut)
+    if ((y == 224 || y == line_sample) && PicoIn.sndOut)
     {
       cycles = SekCyclesDone();
 
@@ -241,7 +241,7 @@ static int PicoFrameHints(void)
 #endif
 
   // get samples from sound chips
-  if (y == 224 && PsndOut)
+  if (y == 224 && PicoIn.sndOut)
     PsndGetSamples(y);
 
   // Run scanline:
@@ -272,7 +272,7 @@ static int PicoFrameHints(void)
 
     PAD_DELAY();
 
-    if ((pv->status & PVS_ACTIVE) && --hint < 0)
+    if (unlikely(pv->status & PVS_ACTIVE) && --hint < 0)
     {
       hint = pv->reg[10]; // Reload H-Int counter
       do_hint(pv);
@@ -287,6 +287,15 @@ static int PicoFrameHints(void)
     pevt_log_m68k_o(EVT_NEXT_LINE);
   }
 
+  if (unlikely(PicoIn.overclockM68k)) {
+    unsigned int l = PicoIn.overclockM68k * lines / 100;
+    while (l-- > 0) {
+      Pico.t.m68c_cnt -= CYCLES_M68K_LINE;
+      do_timing_hacks_vb();
+      SekSyncM68k();
+    }
+  }
+
   pv->status &= ~(SR_VB | PVS_VB2);
   pv->status |= ((pv->reg[1] >> 3) ^ SR_VB) & SR_VB; // forced blanking
 
@@ -315,9 +324,9 @@ static int PicoFrameHints(void)
   cycles = SekCyclesDone();
   if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoIn.opt&POPT_EN_Z80))
     PicoSyncZ80(cycles);
-  if (PsndOut && ym2612.dacen && PsndDacLine < lines)
+  if (PicoIn.sndOut && ym2612.dacen && Pico.snd.dac_line < lines)
     PsndDoDAC(lines - 1);
-  if (PsndOut && PsndPsgLine < lines)
+  if (PicoIn.sndOut && Pico.snd.psg_line < lines)
     PsndDoPSG(lines - 1);
 
 #ifdef PICO_CD