+// common code for Pico.c and cd/Pico.c
+// (c) Copyright 2007, Grazvydas "notaz" Ignotas
+
#define CYCLES_M68K_LINE 488 // suitable for both PAL/NTSC
#define CYCLES_M68K_VINT_LAG 68
#define CYCLES_M68K_ASD 148
else { \
cnt = SekCyclesDone() - z80startCycle; \
cnt = (cnt>>1)-(cnt>>5); \
- if (cnt > (z80_cycles)) cnt = z80_cycles; \
+ if (cnt < 0 || cnt > (z80_cycles)) cnt = z80_cycles; \
Pico.m.z80Run |= 2; \
z80CycleAim+=cnt; \
} \
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
- int lines,y,lines_vis = 224,total_z80 = 0,z80CycleAim = 0,line_sample;
- int skip=PicoSkipFrame || (PicoOpt&0x10);
+ int lines, y, lines_vis = 224, total_z80 = 0, z80CycleAim = 0, line_sample, skip;
int hint; // Hint counter
+ if ((PicoOpt&0x10) && !PicoSkipFrame) {
+ // draw a frame just after vblank in alternative render mode
+ // yes, this will cause 1 frame lag, but this is inaccurate mode anyway.
+ PicoFrameFull();
+#ifdef DRAW_FINISH_FUNC
+ DRAW_FINISH_FUNC();
+#endif
+ skip = 1;
+ }
+ else skip=PicoSkipFrame;
+
if (Pico.m.pal) {
//cycles_68k = (int) ((double) OSC_PAL / 7 / 50 / 312 + 0.4); // should compile to a constant (488)
//cycles_z80 = (int) ((double) OSC_PAL / 15 / 50 / 312 + 0.4); // 228
PicoLine(y);
if(PicoOpt&1)
- sound_timers_and_dac(y);
+ Psnd_timers_and_dac(y);
#ifndef PICO_CD
// get samples from sound chips
#endif
}
+#ifdef DRAW_FINISH_FUNC
+ if (!skip)
+ DRAW_FINISH_FUNC();
+#endif
+
// V-int line (224 or 240)
Pico.m.scanline=(short)y;
z80_int();
if (PicoOpt&1)
- sound_timers_and_dac(y);
+ Psnd_timers_and_dac(y);
// get samples from sound chips
#ifndef PICO_CD
#endif
if(PicoOpt&1)
- sound_timers_and_dac(y);
+ Psnd_timers_and_dac(y);
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
#endif
}
- // draw a frame just after vblank in alternative render mode
- if (!PicoSkipFrame && (PicoOpt&0x10))
- PicoFrameFull();
-
return 0;
}