// common code for Pico.c and cd/Pico.c
-// (c) Copyright 2007,2008 Grazvydas "notaz" Ignotas
+// (c) Copyright 2007-2009 Grazvydas "notaz" Ignotas
#define CYCLES_M68K_LINE 488 // suitable for both PAL/NTSC
#define CYCLES_M68K_VINT_LAG 68
#define CYCLES_M68K_ASD 148
#define CYCLES_S68K_LINE 795
+#define CYCLES_S68K_VINT_LAG 111
#define CYCLES_S68K_ASD 241
// pad delay (for 6 button pads)
}
// CPUS_RUN
-#ifndef PICO_CD
+#ifndef CPUS_RUN
#define CPUS_RUN(m68k_cycles,s68k_cycles) \
- SekRunM68k(m68k_cycles);
-#else
-#define CPUS_RUN(m68k_cycles,s68k_cycles) \
-{ \
- if ((PicoOpt&POPT_EN_MCD_PSYNC) && (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); \
- } \
-}
+ SekRunM68k(m68k_cycles)
#endif
-// Accurate but slower frame which does hints
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
SekCyclesResetS68k();
#endif
PsndDacLine = 0;
+ emustatus &= ~1;
pv->status&=~0x88; // clear V-Int, come out of vblank
#ifdef PICO_CD
check_cd_dma();
#endif
+#ifdef PICO_32X
+ p32x_timers_do(1);
+#endif
// H-Interrupts:
if (--hint < 0) // y <= lines_vis: Comix Zone, Golden Axe
}
}
-#ifndef PICO_CD
// get samples from sound chips
- if (y == 32 && PsndOut)
- emustatus &= ~1;
- else if ((y == 224 || y == line_sample) && PsndOut)
+ if ((y == 224 || y == line_sample) && PsndOut)
{
if (Pico.m.z80Run && !Pico.m.z80_reset && (PicoOpt&POPT_EN_Z80))
PicoSyncZ80(SekCycleCnt);
if (ym2612.dacen && PsndDacLine <= y)
PsndDoDAC(y);
- getSamples(y);
+ PsndGetSamples(y);
}
-#endif
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
#ifdef PICO_CD
check_cd_dma();
#endif
+#ifdef PICO_32X
+ p32x_timers_do(1);
+#endif
// Last H-Int:
if (--hint < 0)
pv->status|=0x08; // go into vblank
pv->pending_ints|=0x20;
+#ifdef PICO_32X
+ p32x_start_blank();
+#endif
+
// the following SekRun is there for several reasons:
// 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)
- SekRunM68k(CYCLES_M68K_VINT_LAG);
+ CPUS_RUN(CYCLES_M68K_VINT_LAG, CYCLES_S68K_VINT_LAG);
if (pv->reg[1]&0x20) {
elprintf(EL_INTS, "vint: @ %06x [%i]", SekPc, SekCycleCnt);
}
// get samples from sound chips
-#ifndef PICO_CD
- if (y == 224)
-#endif
- if (PsndOut)
- {
- if (ym2612.dacen && PsndDacLine <= y)
- PsndDoDAC(y);
- getSamples(y);
- }
+ if (y == 224 && PsndOut)
+ {
+ if (ym2612.dacen && PsndDacLine <= y)
+ PsndDoDAC(y);
+ PsndGetSamples(y);
+ }
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());
CPUS_RUN(CYCLES_M68K_LINE - CYCLES_M68K_VINT_LAG - CYCLES_M68K_ASD,
- CYCLES_S68K_LINE - CYCLES_S68K_ASD);
+ CYCLES_S68K_LINE - CYCLES_S68K_VINT_LAG - CYCLES_S68K_ASD);
#ifdef PICO_CD
update_chips();
if (PicoLineHook) PicoLineHook();
#endif
- // PAL line count might actually be 313 according to Steve Snake, but that would complicate things.
- lines = Pico.m.pal ? 312 : 262;
- vcnt_wrap = Pico.m.pal ? 0x103 : 0xEB; // based on Gens
+ lines = scanlines_total;
+ vcnt_wrap = Pico.m.pal ? 0x103 : 0xEB; // based on Gens, TODO: verify
for (y++; y < lines; y++)
{
#ifdef PICO_CD
check_cd_dma();
#endif
+#ifdef PICO_32X
+ p32x_timers_do(1);
+#endif
// Run scanline:
if (Pico.m.dma_xfers) SekCyclesBurn(CheckDMA());