X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=pico%2F32x%2F32x.c;h=8e3553aff56b3f4ac332d65cce994fafad8c1341;hb=bca23c1c797cf33c2c6812962c479398e644f0aa;hp=dc881a964f4a84a9350e0675b74f946045168b00;hpb=be2c420828ab3c36ef652584fbdef0e0597c7028;p=picodrive.git diff --git a/pico/32x/32x.c b/pico/32x/32x.c index dc881a9..8e3553a 100644 --- a/pico/32x/32x.c +++ b/pico/32x/32x.c @@ -1,4 +1,5 @@ #include "../pico_int.h" +#include "../sound/ym2612.h" struct Pico32x Pico32x; @@ -9,23 +10,94 @@ void Pico32xStartup(void) PicoAHW |= PAHW_32X; PicoMemSetup32x(); - // probably should only done on power -// memset(&Pico32x, 0, sizeof(Pico32x)); + sh2_init(&msh2); + sh2_reset(&msh2); + + sh2_init(&ssh2); + sh2_reset(&ssh2); if (!Pico.m.pal) - Pico32x.vdp_regs[0] |= 0x8000; + Pico32x.vdp_regs[0] |= P32XV_nPAL; - // prefill checksum - Pico32x.regs[0x28/2] = *(unsigned short *)(Pico.rom + 0x18e); + emu_32x_startup(); } void Pico32xInit(void) { - // XXX: mv - Pico32x.regs[0] = 0x0082; +} + +void PicoPower32x(void) +{ + memset(&Pico32x, 0, sizeof(Pico32x)); + + Pico32x.regs[0] = 0x0082; // SH2 reset? + Pico32x.vdp_regs[0x0a/2] = P32XV_VBLK|P32XV_HBLK|P32XV_PEN; +} + +void PicoUnload32x(void) +{ + if (Pico32xMem != NULL) + free(Pico32xMem); + Pico32xMem = NULL; + + PicoAHW &= ~PAHW_32X; } void PicoReset32x(void) { + extern int p32x_csum_faked; + p32x_csum_faked = 0; // tmp +} + +static void p32x_start_blank(void) +{ + // enter vblank + Pico32x.vdp_regs[0x0a/2] |= P32XV_VBLK|P32XV_PEN; + + // swap waits until vblank + if ((Pico32x.vdp_regs[0x0a/2] ^ Pico32x.pending_fb) & P32XV_FS) { + Pico32x.vdp_regs[0x0a/2] &= ~P32XV_FS; + Pico32x.vdp_regs[0x0a/2] |= Pico32x.pending_fb; + Pico32xSwapDRAM(Pico32x.pending_fb ^ 1); + } +} + +// FIXME.. +static __inline void SekRunM68k(int cyc) +{ + int cyc_do; + SekCycleAim+=cyc; + if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return; +#if defined(EMU_CORE_DEBUG) + // this means we do run-compare + SekCycleCnt+=CM_compareRun(cyc_do, 0); +#elif defined(EMU_C68K) + PicoCpuCM68k.cycles=cyc_do; + CycloneRun(&PicoCpuCM68k); + SekCycleCnt+=cyc_do-PicoCpuCM68k.cycles; +#elif defined(EMU_M68K) + SekCycleCnt+=m68k_execute(cyc_do); +#elif defined(EMU_F68K) + SekCycleCnt+=fm68k_emulate(cyc_do+1, 0, 0); +#endif } +// ~1463.8, but due to cache misses and slow mem +// it's much lower than that +#define SH2_LINE_CYCLES 700 + +#define PICO_32X +#define RUN_SH2S \ + if (!(Pico32x.emu_flags & P32XF_MSH2POLL)) \ + sh2_execute(&msh2, SH2_LINE_CYCLES); + +#include "../pico_cmn.c" + +void PicoFrame32x(void) +{ + if ((Pico32x.vdp_regs[0] & 3 ) != 0) // no forced blanking + Pico32x.vdp_regs[0x0a/2] &= ~(P32XV_VBLK|P32XV_PEN); // get out of vblank + + PicoFrameStart(); + PicoFrameHints(); +}