32x: add base of SH2 emu from MAME
[picodrive.git] / pico / 32x / 32x.c
CommitLineData
be2c4208 1#include "../pico_int.h"
974fdb5b 2#include "../sound/ym2612.h"
be2c4208 3
4struct Pico32x Pico32x;
5
6void Pico32xStartup(void)
7{
8 elprintf(EL_STATUS|EL_32X, "32X startup");
9
10 PicoAHW |= PAHW_32X;
11 PicoMemSetup32x();
12
be2c4208 13 if (!Pico.m.pal)
974fdb5b 14 Pico32x.vdp_regs[0] |= P32XV_nPAL;
be2c4208 15
974fdb5b 16 emu_32x_startup();
be2c4208 17}
18
19void Pico32xInit(void)
20{
974fdb5b 21}
22
23void PicoPower32x(void)
24{
25 memset(&Pico32x, 0, sizeof(Pico32x));
5e49c3a8 26
974fdb5b 27 Pico32x.regs[0] = 0x0082; // SH2 reset?
28 Pico32x.vdp_regs[0x0a/2] = P32XV_VBLK|P32XV_HBLK|P32XV_PEN;
be2c4208 29}
30
5e49c3a8 31void PicoUnload32x(void)
32{
33 if (Pico32xMem != NULL)
34 free(Pico32xMem);
35 Pico32xMem = NULL;
36
37 PicoAHW &= ~PAHW_32X;
38}
39
be2c4208 40void PicoReset32x(void)
41{
5e49c3a8 42 extern int p32x_csum_faked;
43 p32x_csum_faked = 0; // tmp
be2c4208 44}
45
974fdb5b 46static void p32x_start_blank(void)
47{
48 // enter vblank
49 Pico32x.vdp_regs[0x0a/2] |= P32XV_VBLK|P32XV_PEN;
50
51 // swap waits until vblank
52 if ((Pico32x.vdp_regs[0x0a/2] ^ Pico32x.pending_fb) & P32XV_FS) {
53 Pico32x.vdp_regs[0x0a/2] &= ~P32XV_FS;
54 Pico32x.vdp_regs[0x0a/2] |= Pico32x.pending_fb;
55 Pico32xSwapDRAM(Pico32x.pending_fb ^ 1);
56 }
57}
58
59// FIXME..
60static __inline void SekRunM68k(int cyc)
61{
62 int cyc_do;
63 SekCycleAim+=cyc;
64 if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return;
65#if defined(EMU_CORE_DEBUG)
66 // this means we do run-compare
67 SekCycleCnt+=CM_compareRun(cyc_do, 0);
68#elif defined(EMU_C68K)
69 PicoCpuCM68k.cycles=cyc_do;
70 CycloneRun(&PicoCpuCM68k);
71 SekCycleCnt+=cyc_do-PicoCpuCM68k.cycles;
72#elif defined(EMU_M68K)
73 SekCycleCnt+=m68k_execute(cyc_do);
74#elif defined(EMU_F68K)
75 SekCycleCnt+=fm68k_emulate(cyc_do+1, 0, 0);
76#endif
77}
78
79#define PICO_32X
80#include "../pico_cmn.c"
81
82void PicoFrame32x(void)
83{
84 if ((Pico32x.vdp_regs[0] & 3 ) != 0) // no forced blanking
85 Pico32x.vdp_regs[0x0a/2] &= ~(P32XV_VBLK|P32XV_PEN); // get out of vblank
86
87 PicoFrameStart();
88 PicoFrameHints();
89}