#define CYCLES_M68K_ASD 148
#define CYCLES_Z80_LINE 228
#define CYCLES_Z80_ASD 69
+#define CYCLES_S68K_LINE 795
+#define CYCLES_S68K_ASD 241
// pad delay (for 6 button pads)
#define PAD_DELAY \
} \
}
+// CPUS_RUN
+#ifndef PICO_CD
+#define CPUS_RUN(m68k_cycles,z80_cycles,s68k_cycles) \
+ SekRunM68k(m68k_cycles); \
+ Z80_RUN(z80_cycles);
+#else
+#define CPUS_RUN(m68k_cycles,z80_cycles,s68k_cycles) \
+{ \
+ if ((PicoOpt & 0x2000) && (Pico_mcd->m.busreq&3) == 1) { \
+ SekRunPS(m68k_cycles, s68k_cycles); /* "better/perfect sync" */ \
+ } else { \
+ SekRunM68k(m68k_cycles); \
+ if ((Pico_mcd->m.busreq&3) == 1) /* no busreq/no reset */ \
+ SekRunS68k(s68k_cycles); \
+ } \
+ Z80_RUN(z80_cycles); \
+}
+#endif
+
// Accurate but slower frame which does hints
static int PicoFrameHints(void)
{
}
SekCyclesReset();
+#ifdef PICO_CD
+ SekCyclesResetS68k();
+#endif
pv->status&=~0x88; // clear V-Int, come out of vblank
//dprintf("-hint: %i", hint);
// This is to make active scan longer (needed for Double Dragon 2, mainly)
- SekRun(CYCLES_M68K_ASD);
- Z80_RUN(CYCLES_Z80_ASD);
+ CPUS_RUN(CYCLES_M68K_ASD, CYCLES_Z80_ASD, CYCLES_S68K_ASD);
for (y=0;y<lines_vis;y++)
{
}
PAD_DELAY
+#ifdef PICO_CD
+ check_cd_dma();
+#endif
// H-Interrupts:
if (--hint < 0) // y <= lines_vis: Comix Zone, Golden Axe
if(PicoOpt&1)
sound_timers_and_dac(y);
+#ifndef PICO_CD
// get samples from sound chips
if(y == 32 && PsndOut)
emustatus &= ~1;
else if((y == 224 || y == line_sample) && PsndOut)
getSamples(y);
+#endif
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
- SekRun(CYCLES_M68K_LINE);
- Z80_RUN(CYCLES_Z80_LINE);
+ CPUS_RUN(CYCLES_M68K_LINE, CYCLES_Z80_LINE, CYCLES_S68K_LINE);
+
+#ifdef PICO_CD
+ update_chips();
+#endif
}
// V-int line (224 or 240)
Pico.video.status|=0x200;
PAD_DELAY
+#ifdef PICO_CD
+ check_cd_dma();
+#endif
// Last H-Int:
if (--hint < 0)
// there must be a delay after vblank bit is set and irq is asserted (Mazin Saga)
// also delay between F bit (bit 7) is set in SR and IRQ happens (Ex-Mutants)
// also delay between last H-int and V-int (Golden Axe 3)
- SekRun(CYCLES_M68K_VINT_LAG);
+ SekRunM68k(CYCLES_M68K_VINT_LAG);
if (pv->reg[1]&0x20) {
elprintf(EL_INTS, "vint: @ %06x [%i]", SekPc, SekCycleCnt);
SekInterrupt(6);
sound_timers_and_dac(y);
// get samples from sound chips
- if ((y == 224) && PsndOut)
- getSamples(y);
+#ifndef PICO_CD
+ if (y == 224)
+#endif
+ if (PsndOut)
+ getSamples(y);
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
- SekRun(CYCLES_M68K_LINE - CYCLES_M68K_VINT_LAG - CYCLES_M68K_ASD);
- Z80_RUN(CYCLES_Z80_LINE - CYCLES_Z80_ASD);
+ CPUS_RUN(CYCLES_M68K_LINE - CYCLES_M68K_VINT_LAG - CYCLES_M68K_ASD,
+ CYCLES_Z80_LINE - CYCLES_Z80_ASD, CYCLES_S68K_LINE - CYCLES_S68K_ASD);
+
+#ifdef PICO_CD
+ update_chips();
+#endif
// PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
lines = Pico.m.pal ? 312 : 262;
Pico.m.scanline=(short)y;
PAD_DELAY
+#ifdef PICO_CD
+ check_cd_dma();
+#endif
if(PicoOpt&1)
sound_timers_and_dac(y);
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
- SekRun(CYCLES_M68K_LINE);
- Z80_RUN(CYCLES_Z80_LINE);
+ CPUS_RUN(CYCLES_M68K_LINE, CYCLES_Z80_LINE, CYCLES_S68K_LINE);
+
+#ifdef PICO_CD
+ update_chips();
+#endif
}
// draw a frame just after vblank in alternative render mode
#undef PAD_DELAY
#undef Z80_RUN
+#undef CPUS_RUN