1 + cpuid, SH2_DRCBLK_DA_SHIFT, 0xfff);
}
-void sh2_execute(SH2 *sh2c, int cycles)
+int sh2_execute(SH2 *sh2c, int cycles)
{
int ret_cycles;
sh2 = sh2c; // XXX
- sh2c->cycles_aim += cycles;
- cycles = sh2c->cycles_aim - sh2c->cycles_done;
+ sh2c->cycles_timeslice = cycles;
// cycles are kept in SHR_SR unused bits (upper 20)
// bit19 contains T saved for delay slot
if (ret_cycles > 0)
dbg(1, "warning: drc returned with cycles: %d", ret_cycles);
- sh2c->cycles_done += cycles - ret_cycles;
+ return sh2c->cycles_timeslice - ret_cycles;
}
#if (DRC_DEBUG & 2)
#ifndef DRC_SH2
-void sh2_execute(SH2 *sh2_, int cycles)
+int sh2_execute(SH2 *sh2_, int cycles)
{
sh2 = sh2_;
- sh2->cycles_aim += cycles;
- sh2->icount = cycles = sh2->cycles_aim - sh2->cycles_done;
+ sh2->icount = cycles;
if (sh2->icount <= 0)
- return;
+ return cycles;
+
+ sh2->cycles_timeslice = cycles;
do
{
}
while (sh2->icount > 0 || sh2->delay); /* can't interrupt before delay */
- sh2->cycles_done += cycles - sh2->icount;
+ return sh2->cycles_timeslice - sh2->icount;
}
#else // DRC_SH2
{
int ret = 0;
- memset(sh2, 0, sizeof(*sh2));
+ memset(sh2, 0, offsetof(SH2, mult_m68k_to_sh2));
sh2->is_slave = is_slave;
pdb_register_cpu(sh2, PDBCT_SH2, is_slave ? "ssh2" : "msh2");
#ifdef DRC_SH2
sh2->pc = p32x_sh2_read32(sh2->vbr + vector * 4, sh2);
/* 13 cycles at best */
- sh2->cycles_done += 13;
+ sh2->m68krcycles_done += C_SH2_TO_M68K(*sh2, 13);
// sh2->icount -= 13;
}
p[0] = sh2->pending_int_irq;
p[1] = sh2->pending_int_vector;
- p[2] = sh2->cycles_aim;
- p[3] = sh2->cycles_done;
}
void sh2_unpack(SH2 *sh2, const unsigned char *buff)
sh2->pending_int_irq = p[0];
sh2->pending_int_vector = p[1];
- sh2->cycles_aim = p[2];
- sh2->cycles_done = p[3];
}
int REGPARM(2) (*irq_callback)(struct SH2_ *sh2, int level);\r
int is_slave;\r
\r
- unsigned int cycles_aim; // subtract sh2_icount to get global counter\r
- unsigned int cycles_done;\r
+ unsigned int cycles_timeslice;\r
+\r
+ // we use 68k reference cycles for easier sync\r
+ unsigned int m68krcycles_done;\r
+ unsigned int mult_m68k_to_sh2;\r
+ unsigned int mult_sh2_to_m68k;\r
} SH2;\r
\r
+#define CYCLE_MULT_SHIFT 10\r
+#define C_M68K_TO_SH2(xsh2, c) \\r
+ ((int)((c) * (xsh2).mult_m68k_to_sh2) >> CYCLE_MULT_SHIFT)\r
+#define C_SH2_TO_M68K(xsh2, c) \\r
+ ((int)((c + 3) * (xsh2).mult_sh2_to_m68k) >> CYCLE_MULT_SHIFT)\r
+\r
extern SH2 *sh2; // active sh2. XXX: consider removing\r
\r
int sh2_init(SH2 *sh2, int is_slave);\r
void sh2_pack(const SH2 *sh2, unsigned char *buff);\r
void sh2_unpack(SH2 *sh2, const unsigned char *buff);\r
\r
-void sh2_execute(SH2 *sh2, int cycles);\r
+int sh2_execute(SH2 *sh2, int cycles);\r
\r
// regs, pending_int*, cycles, reserved\r
#define SH2_STATE_SIZE ((24 + 2 + 2 + 12) * 4)\r
sh2_set_vbr(1, vbr);
// program will set S_OK
}
+
+ msh2.m68krcycles_done = ssh2.m68krcycles_done = SekCyclesDoneT();
}
void Pico32xInit(void)
{
+ if (msh2.mult_m68k_to_sh2 == 0 || msh2.mult_sh2_to_m68k == 0)
+ Pico32xSetClocks(PICO_MSH2_HZ, 0);
+ if (ssh2.mult_m68k_to_sh2 == 0 || ssh2.mult_sh2_to_m68k == 0)
+ Pico32xSetClocks(0, PICO_MSH2_HZ);
}
void PicoPower32x(void)
p32x_poll_event(3, 1);
}
-static __inline void run_m68k(int cyc)
-{
- pprof_start(m68k);
-
-p32x_poll_event(3, 0);
-#if defined(EMU_C68K)
- PicoCpuCM68k.cycles = cyc;
- CycloneRun(&PicoCpuCM68k);
- SekCycleCnt += cyc - PicoCpuCM68k.cycles;
-#elif defined(EMU_M68K)
- SekCycleCnt += m68k_execute(cyc);
-#elif defined(EMU_F68K)
- SekCycleCnt += fm68k_emulate(cyc+1, 0, 0);
-#endif
-
- pprof_end(m68k);
-}
+#define sync_sh2s_normal p32x_sync_sh2s
+//#define sync_sh2s_lockstep p32x_sync_sh2s
-// ~1463.8, but due to cache misses and slow mem
-// it's much lower than that
-//#define SH2_LINE_CYCLES 735
-#define CYCLES_M68K2MSH2(x) (((x) * p32x_msh2_multiplier) >> 10)
-#define CYCLES_M68K2SSH2(x) (((x) * p32x_ssh2_multiplier) >> 10)
-
-#define PICO_32X
-#define CPUS_RUN_SIMPLE(m68k_cycles,s68k_cycles) \
-{ \
- int slice; \
- SekCycleAim += m68k_cycles; \
- while (SekCycleCnt < SekCycleAim) { \
- slice = SekCycleCnt; \
- run_m68k(SekCycleAim - SekCycleCnt); \
- if (!(Pico32x.regs[0] & P32XS_nRES)) \
- continue; /* SH2s reseting */ \
- slice = SekCycleCnt - slice; /* real count from 68k */ \
- if (SekCycleCnt < SekCycleAim) \
- elprintf(EL_32X, "slice %d", slice); \
- if (!(Pico32x.emu_flags & (P32XF_SSH2POLL|P32XF_SSH2VPOLL))) { \
- pprof_start(ssh2); \
- sh2_execute(&ssh2, CYCLES_M68K2SSH2(slice)); \
- pprof_end(ssh2); \
- } \
- if (!(Pico32x.emu_flags & (P32XF_MSH2POLL|P32XF_MSH2VPOLL))) { \
- pprof_start(msh2); \
- sh2_execute(&msh2, CYCLES_M68K2MSH2(slice)); \
- pprof_end(msh2); \
- } \
- pprof_start(dummy); \
- pprof_end(dummy); \
- } \
+void sync_sh2s_normal(unsigned int m68k_target)
+{
+ unsigned int target = m68k_target;
+ int msh2_cycles, ssh2_cycles;
+ int done;
+
+ elprintf(EL_32X, "sh2 sync to %u (%u)", m68k_target, SekCycleCnt);
+
+ if (!(Pico32x.regs[0] & P32XS_nRES))
+ return; // rare
+
+ {
+ msh2_cycles = C_M68K_TO_SH2(msh2, target - msh2.m68krcycles_done);
+ ssh2_cycles = C_M68K_TO_SH2(ssh2, target - ssh2.m68krcycles_done);
+
+ while (msh2_cycles > 0 || ssh2_cycles > 0) {
+ elprintf(EL_32X, "sh2 exec %u,%u->%u",
+ msh2.m68krcycles_done, ssh2.m68krcycles_done, target);
+
+ if (Pico32x.emu_flags & (P32XF_SSH2POLL|P32XF_SSH2VPOLL)) {
+ ssh2.m68krcycles_done = target;
+ ssh2_cycles = 0;
+ }
+ else if (ssh2_cycles > 0) {
+ done = sh2_execute(&ssh2, ssh2_cycles);
+ ssh2.m68krcycles_done += C_SH2_TO_M68K(ssh2, done);
+
+ ssh2_cycles = C_M68K_TO_SH2(ssh2, target - ssh2.m68krcycles_done);
+ }
+
+ if (Pico32x.emu_flags & (P32XF_MSH2POLL|P32XF_MSH2VPOLL)) {
+ msh2.m68krcycles_done = target;
+ msh2_cycles = 0;
+ }
+ else if (msh2_cycles > 0) {
+ done = sh2_execute(&msh2, msh2_cycles);
+ msh2.m68krcycles_done += C_SH2_TO_M68K(msh2, done);
+
+ msh2_cycles = C_M68K_TO_SH2(msh2, target - msh2.m68krcycles_done);
+ }
+ }
+ }
}
#define STEP_68K 24
-#define CPUS_RUN_LOCKSTEP(m68k_cycles,s68k_cycles) \
-{ \
- int slice; \
- SekCycleAim += m68k_cycles; \
- while (SekCycleCnt < SekCycleAim) { \
- slice = SekCycleCnt; \
- run_m68k(STEP_68K); \
- if (!(Pico32x.regs[0] & P32XS_nRES)) \
- continue; /* SH2s reseting */ \
- slice = SekCycleCnt - slice; /* real count from 68k */ \
- if (!(Pico32x.emu_flags & (P32XF_SSH2POLL|P32XF_SSH2VPOLL))) { \
- sh2_execute(&ssh2, CYCLES_M68K2SSH2(slice)); \
- } \
- if (!(Pico32x.emu_flags & (P32XF_MSH2POLL|P32XF_MSH2VPOLL))) { \
- sh2_execute(&msh2, CYCLES_M68K2MSH2(slice)); \
- } \
- } \
+
+void sync_sh2s_lockstep(unsigned int m68k_target)
+{
+ unsigned int mcycles;
+
+ mcycles = msh2.m68krcycles_done;
+ if (ssh2.m68krcycles_done < mcycles)
+ mcycles = ssh2.m68krcycles_done;
+
+ while (mcycles < m68k_target) {
+ mcycles += STEP_68K;
+ sync_sh2s_normal(mcycles);
+ }
}
-#define CPUS_RUN CPUS_RUN_SIMPLE
-//#define CPUS_RUN CPUS_RUN_LOCKSTEP
+#define CPUS_RUN(m68k_cycles,s68k_cycles) do { \
+ SekRunM68k(m68k_cycles); \
+ if (SekIsStoppedM68k()) \
+ p32x_sync_sh2s(SekCycleCntT + SekCycleCnt); \
+} while (0)
+#define PICO_32X
#include "../pico_cmn.c"
void PicoFrame32x(void)
elprintf(EL_32X, "poll: %02x", Pico32x.emu_flags);
}
+// calculate multipliers against 68k clock (7670442)
+// normally * 3, but effectively slower due to high latencies everywhere
+// however using something lower breaks MK2 animations
+void Pico32xSetClocks(int msh2_hz, int ssh2_hz)
+{
+ float m68k_clk = (float)(OSC_NTSC / 7);
+ if (msh2_hz > 0) {
+ msh2.mult_m68k_to_sh2 = (int)((float)msh2_hz * (1 << CYCLE_MULT_SHIFT) / m68k_clk);
+ msh2.mult_sh2_to_m68k = (int)(m68k_clk * (1 << CYCLE_MULT_SHIFT) / (float)msh2_hz);
+ }
+ if (ssh2_hz > 0) {
+ ssh2.mult_m68k_to_sh2 = (int)((float)ssh2_hz * (1 << CYCLE_MULT_SHIFT) / m68k_clk);
+ ssh2.mult_sh2_to_m68k = (int)(m68k_clk * (1 << CYCLE_MULT_SHIFT) / (float)ssh2_hz);
+ }
+}
+
+// vim:shiftwidth=2:ts=2:expandtab
#endif
}
-// vim:shiftwidth=2:expandtab
+// vim:shiftwidth=2:ts=2:expandtab
return 0;
}
-static __inline void SekRunM68k(int cyc)
-{
- int cyc_do;
-
- pprof_start(m68k);
-
- SekCycleAim+=cyc;
- if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return;
-#if defined(EMU_CORE_DEBUG)
- 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)
- m68k_set_context(&PicoCpuMM68k);
- SekCycleCnt+=m68k_execute(cyc_do);
-#elif defined(EMU_F68K)
- g_m68kcontext=&PicoCpuFM68k;
- SekCycleCnt+=fm68k_emulate(cyc_do, 0, 0);
-#endif
- pprof_end(m68k);
-}
-
static __inline void SekRunS68k(int cyc)
{
int cyc_do;
#elif defined(EMU_M68K)
m68k_set_context(&PicoCpuMS68k);
SekCycleCntS68k+=m68k_execute(cyc_do);
+ m68k_set_context(&PicoCpuMM68k);
#elif defined(EMU_F68K)
g_m68kcontext=&PicoCpuFS68k;
SekCycleCntS68k+=fm68k_emulate(cyc_do, 0, 0);
+ g_m68kcontext=&PicoCpuFM68k;
#endif
}
int emustatus; // rapid_ym2612, multi_ym_updates\r
int scanlines_total;\r
\r
-int p32x_msh2_multiplier = MSH2_MULTI_DEFAULT;\r
-int p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT;\r
-\r
void (*PicoWriteSound)(int len) = NULL; // called at the best time to send sound buffer (PsndOut) to hardware\r
void (*PicoResetHook)(void) = NULL;\r
void (*PicoLineHook)(void) = NULL;\r
return burn;\r
}\r
\r
-static __inline void SekRunM68k(int cyc)\r
-{\r
- int cyc_do;\r
- pprof_start(m68k);\r
-\r
- SekCycleAim+=cyc;\r
- if ((cyc_do=SekCycleAim-SekCycleCnt) <= 0) return;\r
-#if defined(EMU_CORE_DEBUG)\r
- // this means we do run-compare\r
- SekCycleCnt+=CM_compareRun(cyc_do, 0);\r
-#elif defined(EMU_C68K)\r
- PicoCpuCM68k.cycles=cyc_do;\r
- CycloneRun(&PicoCpuCM68k);\r
- SekCycleCnt+=cyc_do-PicoCpuCM68k.cycles;\r
-#elif defined(EMU_M68K)\r
- SekCycleCnt+=m68k_execute(cyc_do);\r
-#elif defined(EMU_F68K)\r
- SekCycleCnt+=fm68k_emulate(cyc_do+1, 0, 0);\r
-#endif\r
-\r
- pprof_end(m68k);\r
-}\r
-\r
#include "pico_cmn.c"\r
\r
int z80stopCycle;\r
extern void (*PicoPrepareCram)(); // prepares PicoCramHigh for renderer to use\r
\r
// pico.c (32x)\r
-// multipliers against 68k clock (7670442)\r
-// normally * 3, but effectively slower due to high latencies everywhere\r
-// however using something lower breaks MK2 animations\r
-extern int p32x_msh2_multiplier;\r
-extern int p32x_ssh2_multiplier;\r
-#define SH2_MULTI_SHIFT 10\r
-#define MSH2_MULTI_DEFAULT ((1 << SH2_MULTI_SHIFT) * 3)\r
-#define SSH2_MULTI_DEFAULT ((1 << SH2_MULTI_SHIFT) * 3)\r
+#ifndef NO_32X\r
+\r
+void Pico32xSetClocks(int msh2_hz, int ssh2_hz);\r
\r
// 32x/draw.c\r
void PicoDraw32xSetFrameMode(int is_on, int only_32x);\r
\r
+#else\r
+\r
+#define Pico32xSetClocks(msh2_khz, ssh2_khz)\r
+\r
+#endif\r
+\r
+// normally 68k clock (7670442) * 3, in reality but much lower\r
+// because of high memory latencies\r
+#define PICO_MSH2_HZ ((int)(7670442.0 * 2.4))\r
+#define PICO_SSH2_HZ ((int)(7670442.0 * 2.4))\r
+\r
// sound.c\r
extern int PsndRate,PsndLen;\r
extern short *PsndOut;\r
SekRunM68k(m68k_cycles)
#endif
+static __inline void SekRunM68k(int cyc)
+{
+ int cyc_do;
+ pprof_start(m68k);
+
+ 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
+
+ pprof_end(m68k);
+}
+
static int PicoFrameHints(void)
{
struct PicoVideo *pv=&Pico.video;
#define SekSr CycloneGetSr(&PicoCpuCM68k)\r
#define SekSetStop(x) { PicoCpuCM68k.state_flags&=~1; if (x) { PicoCpuCM68k.state_flags|=1; PicoCpuCM68k.cycles=0; } }\r
#define SekSetStopS68k(x) { PicoCpuCS68k.state_flags&=~1; if (x) { PicoCpuCS68k.state_flags|=1; PicoCpuCS68k.cycles=0; } }\r
+#define SekIsStoppedM68k() (PicoCpuCM68k.state_flags&1)\r
#define SekIsStoppedS68k() (PicoCpuCS68k.state_flags&1)\r
#define SekShouldInterrupt (PicoCpuCM68k.irq > (PicoCpuCM68k.srh&7))\r
\r
PicoCpuFS68k.execinfo &= ~FM68K_HALTED; \\r
if (x) { PicoCpuFS68k.execinfo |= FM68K_HALTED; PicoCpuFS68k.io_cycle_counter = 0; } \\r
}\r
+#define SekIsStoppedM68k() (PicoCpuFM68k.execinfo&FM68K_HALTED)\r
#define SekIsStoppedS68k() (PicoCpuFS68k.execinfo&FM68K_HALTED)\r
#define SekShouldInterrupt fm68k_would_interrupt()\r
\r
if(x) { SET_CYCLES(0); PicoCpuMS68k.stopped=STOP_LEVEL_STOP; } \\r
else PicoCpuMS68k.stopped=0; \\r
}\r
+#define SekIsStoppedM68k() (PicoCpuMM68k.stopped==STOP_LEVEL_STOP)\r
#define SekIsStoppedS68k() (PicoCpuMS68k.stopped==STOP_LEVEL_STOP)\r
#define SekShouldInterrupt (CPU_INT_LEVEL > FLAG_INT_MASK)\r
\r
\r
#ifndef DRC_SH2\r
# define ash2_end_run(after) if (sh2->icount > (after)) sh2->icount = after\r
-# define ash2_cycles_done() (sh2->cycles_aim - sh2->icount)\r
+# define ash2_cycles_done() (sh2->cycles_timeslice - sh2->icount)\r
#else\r
# define ash2_end_run(after) { \\r
if ((sh2->sr >> 12) > (after)) \\r
{ sh2->sr &= 0xfff; sh2->sr |= (after) << 12; } \\r
}\r
-# define ash2_cycles_done() (sh2->cycles_aim - (sh2->sr >> 12))\r
+# define ash2_cycles_done() (sh2->cycles_timeslice - (sh2->sr >> 12))\r
#endif\r
\r
//#define sh2_pc(c) (c) ? ssh2.ppc : msh2.ppc\r
void Pico32xStartup(void);\r
void PicoUnload32x(void);\r
void PicoFrame32x(void);\r
+void p32x_sync_sh2s(unsigned int m68k_target);\r
void p32x_update_irls(int nested_call);\r
void p32x_reset_sh2s(void);\r
\r
CHECKED_WRITE_BUFF(CHUNK_SDRAM, Pico32xMem->sdram);\r
CHECKED_WRITE_BUFF(CHUNK_DRAM, Pico32xMem->dram);\r
CHECKED_WRITE_BUFF(CHUNK_32XPAL, Pico32xMem->pal);\r
+\r
+ sh2s[0].m68krcycles_done = sh2s[1].m68krcycles_done = SekCycleCnt;\r
}\r
#endif\r
\r
#endif\r
}\r
\r
-// vim:shiftwidth=2:expandtab\r
+// vim:shiftwidth=2:ts=2:expandtab\r
return 1;
case MA_32XOPT_MSH2_CYCLES:
- case MA_32XOPT_SSH2_CYCLES: {
- int *mul = (me->id == MA_32XOPT_MSH2_CYCLES) ? &p32x_msh2_multiplier : &p32x_ssh2_multiplier;
- *mul = ((unsigned int)atoi(val) << SH2_MULTI_SHIFT) / 7670;
+ currentConfig.msh2_khz = atoi(val);
+ Pico32xSetClocks(currentConfig.msh2_khz * 1000, 0);
+ return 1;
+
+ case MA_32XOPT_SSH2_CYCLES:
+ currentConfig.ssh2_khz = atoi(val);
+ Pico32xSetClocks(0, currentConfig.ssh2_khz * 1000);
return 1;
- }
/* PSP */
case MA_OPT3_SCALE:
defaultConfig.gamma = 100;\r
defaultConfig.scaling = 0;\r
defaultConfig.turbo_rate = 15;\r
+ defaultConfig.msh2_khz = PICO_MSH2_HZ / 1000;\r
+ defaultConfig.ssh2_khz = PICO_SSH2_HZ / 1000;\r
\r
// platform specific overrides\r
pemu_prep_defconfig();\r
PicoRegionOverride = currentConfig.s_PicoRegion;\r
PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
- p32x_msh2_multiplier = MSH2_MULTI_DEFAULT;\r
- p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT;\r
}\r
\r
int emu_read_config(const char *rom_fname, int no_defaults)\r
int renderer32x;
int filter; // pandora
int analog_deadzone;
+ int msh2_khz;
+ int ssh2_khz;
} currentConfig_t;
extern currentConfig_t currentConfig, defaultConfig;
// convert from multiplier of VClk
static int mh_opt_sh2cycles(int id, int keys)
{
- int *mul = (id == MA_32XOPT_MSH2_CYCLES) ? &p32x_msh2_multiplier : &p32x_ssh2_multiplier;
+ int *khz = (id == MA_32XOPT_MSH2_CYCLES) ?
+ ¤tConfig.msh2_khz : ¤tConfig.ssh2_khz;
if (keys & (PBTN_LEFT|PBTN_RIGHT))
- *mul += (keys & PBTN_LEFT) ? -10 : 10;
+ *khz += (keys & PBTN_LEFT) ? -50 : 50;
if (keys & (PBTN_L|PBTN_R))
- *mul += (keys & PBTN_L) ? -100 : 100;
+ *khz += (keys & PBTN_L) ? -500 : 500;
- if (*mul < 1)
- *mul = 1;
- else if (*mul > (10 << SH2_MULTI_SHIFT))
- *mul = 10 << SH2_MULTI_SHIFT;
+ if (*khz < 1)
+ *khz = 1;
+ else if (*khz > 0x7fffffff / 1000)
+ *khz = 0x7fffffff / 1000;
return 0;
}
static const char *mgn_opt_sh2cycles(int id, int *offs)
{
- int mul = (id == MA_32XOPT_MSH2_CYCLES) ? p32x_msh2_multiplier : p32x_ssh2_multiplier;
-
- sprintf(static_buff, "%d", 7670 * mul >> SH2_MULTI_SHIFT);
+ int khz = (id == MA_32XOPT_MSH2_CYCLES) ?
+ currentConfig.msh2_khz : currentConfig.ssh2_khz;
+
+ sprintf(static_buff, "%d", khz);
return static_buff;
}
me_enable(e_menu_32x_options, MA_32XOPT_RENDERER, renderer_names32x[0] != NULL);
me_loop(e_menu_32x_options, &sel);
+ Pico32xSetClocks(currentConfig.msh2_khz * 1000, currentConfig.msh2_khz * 1000);
+
return 0;
}
PicoAutoRgnOrder = 0x184; // US, EU, JP
PicoCDBuffers = 0;
- p32x_msh2_multiplier = MSH2_MULTI_DEFAULT;
- p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT;
-
vout_width = 320;
vout_height = 240;
vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);