+// 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
{ \
if ((PicoOpt&4) && Pico.m.z80Run) \
{ \
+ int cnt; \
if (Pico.m.z80Run & 2) z80CycleAim += z80_cycles; \
else { \
- int cnt = SekCyclesDone() - z80startCycle; \
+ 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; \
} \
- total_z80+=z80_run(z80CycleAim-total_z80); \
+ cnt=z80CycleAim-total_z80; \
+ if (cnt > 0) total_z80+=z80_run(cnt); \
} \
}
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
- int total_z80=0,lines,y,lines_vis = 224,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
//dprintf("-hint: %i", hint);
// This is to make active scan longer (needed for Double Dragon 2, mainly)
- CPUS_RUN(CYCLES_M68K_ASD, CYCLES_Z80_ASD, CYCLES_S68K_ASD);
+ // also trying to adjust for z80 overclock here (due to int line cycle counts)
+ z80CycleAim = Pico.m.pal ? -40 : 7;
+ CPUS_RUN(CYCLES_M68K_ASD, 0, CYCLES_S68K_ASD);
for (y=0;y<lines_vis;y++)
{
PicoLine(y);
if(PicoOpt&1)
- sound_timers_and_dac(y);
+ Psnd_timers_and_dac(y);
#ifndef PICO_CD
// get samples from sound chips
#ifdef PICO_CD
update_chips();
+#else
+ if (PicoLineHook) PicoLineHook(1);
#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
CYCLES_Z80_LINE - CYCLES_Z80_ASD, CYCLES_S68K_LINE - CYCLES_S68K_ASD);
#ifdef PICO_CD
- update_chips();
+ update_chips();
+#else
+ if (PicoLineHook) PicoLineHook(1);
#endif
// PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
#endif
if(PicoOpt&1)
- sound_timers_and_dac(y);
+ Psnd_timers_and_dac(y);
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
#ifdef PICO_CD
update_chips();
+#else
+ if (PicoLineHook) PicoLineHook(1);
#endif
}
- // draw a frame just after vblank in alternative render mode
- if (!PicoSkipFrame && (PicoOpt&0x10))
- PicoFrameFull();
-
return 0;
}