\r
struct Pico Pico;\r
struct PicoMem PicoMem;\r
-int PicoOpt; \r
-int PicoSkipFrame; // skip rendering frame?\r
-int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU\r
-int PicoPadInt[2]; // internal copy\r
-int PicoAHW; // active addon hardware: PAHW_*\r
-int PicoQuirks; // game-specific quirks\r
-int PicoRegionOverride; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe\r
-int PicoAutoRgnOrder;\r
-\r
-int emustatus; // rapid_ym2612, multi_ym_updates\r
+PicoInterface PicoIn;\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
// Blank space for state:\r
memset(&Pico,0,sizeof(Pico));\r
memset(&PicoMem,0,sizeof(PicoMem));\r
- memset(&PicoPad,0,sizeof(PicoPad));\r
- memset(&PicoPadInt,0,sizeof(PicoPadInt));\r
+ memset(&PicoIn.pad,0,sizeof(PicoIn.pad));\r
+ memset(&PicoIn.padInt,0,sizeof(PicoIn.padInt));\r
\r
Pico.est.Pico = &Pico;\r
Pico.est.PicoMem_vram = PicoMem.vram;\r
Pico.est.PicoMem_cram = PicoMem.cram;\r
- Pico.est.PicoOpt = &PicoOpt;\r
+ Pico.est.PicoOpt = &PicoIn.opt;\r
\r
// Init CPUs:\r
SekInit();\r
// to be called once on emu exit\r
void PicoExit(void)\r
{\r
- if (PicoAHW & PAHW_MCD)\r
+ if (PicoIn.AHW & PAHW_MCD)\r
PicoExitMCD();\r
PicoCartUnload();\r
z80_exit();\r
Pico.video.reg[0xc] = 0x81;\r
Pico.video.reg[0xf] = 0x02;\r
\r
- if (PicoAHW & PAHW_MCD)\r
+ if (PicoIn.AHW & PAHW_MCD)\r
PicoPowerMCD();\r
\r
- if (PicoOpt & POPT_EN_32X)\r
+ if (PicoIn.opt & POPT_EN_32X)\r
PicoPower32x();\r
\r
PicoReset();\r
int support=0, hw=0, i;\r
unsigned char pal=0;\r
\r
- if (PicoRegionOverride)\r
+ if (PicoIn.regionOverride)\r
{\r
- support = PicoRegionOverride;\r
+ support = PicoIn.regionOverride;\r
}\r
else\r
{\r
}\r
\r
// auto detection order override\r
- if (PicoAutoRgnOrder) {\r
- if (((PicoAutoRgnOrder>>0)&0xf) & support) support = (PicoAutoRgnOrder>>0)&0xf;\r
- else if (((PicoAutoRgnOrder>>4)&0xf) & support) support = (PicoAutoRgnOrder>>4)&0xf;\r
- else if (((PicoAutoRgnOrder>>8)&0xf) & support) support = (PicoAutoRgnOrder>>8)&0xf;\r
+ if (PicoIn.autoRgnOrder) {\r
+ if (((PicoIn.autoRgnOrder>>0)&0xf) & support) support = (PicoIn.autoRgnOrder>>0)&0xf;\r
+ else if (((PicoIn.autoRgnOrder>>4)&0xf) & support) support = (PicoIn.autoRgnOrder>>4)&0xf;\r
+ else if (((PicoIn.autoRgnOrder>>8)&0xf) & support) support = (PicoIn.autoRgnOrder>>8)&0xf;\r
}\r
\r
// Try to pick the best hardware value for English/50hz:\r
return 1;\r
\r
#if defined(CPU_CMP_R) || defined(CPU_CMP_W) || defined(DRC_CMP)\r
- PicoOpt |= POPT_DIS_VDP_FIFO|POPT_DIS_IDLE_DET;\r
+ PicoIn.opt |= POPT_DIS_VDP_FIFO|POPT_DIS_IDLE_DET;\r
#endif\r
\r
/* must call now, so that banking is reset, and correct vectors get fetched */\r
if (PicoResetHook)\r
PicoResetHook();\r
\r
- memset(&PicoPadInt,0,sizeof(PicoPadInt));\r
- emustatus = 0;\r
+ memset(&PicoIn.padInt, 0, sizeof(PicoIn.padInt));\r
\r
- if (PicoAHW & PAHW_SMS) {\r
+ if (PicoIn.AHW & PAHW_SMS) {\r
PicoResetMS();\r
return 0;\r
}\r
// ..but do not reset SekCycle* to not desync with addons\r
\r
// s68k doesn't have the TAS quirk, so we just globally set normal TAS handler in MCD mode (used by Batman games).\r
- SekSetRealTAS(PicoAHW & PAHW_MCD);\r
+ SekSetRealTAS(PicoIn.AHW & PAHW_MCD);\r
\r
Pico.m.dirtyPal = 1;\r
\r
PsndReset(); // pal must be known here\r
\r
// create an empty "dma" to cause 68k exec start at random frame location\r
- if (Pico.m.dma_xfers == 0 && !(PicoOpt & POPT_DIS_VDP_FIFO))\r
+ if (Pico.m.dma_xfers == 0 && !(PicoIn.opt & POPT_DIS_VDP_FIFO))\r
Pico.m.dma_xfers = rand() & 0x1fff;\r
\r
SekFinishIdleDet();\r
\r
- if (PicoAHW & PAHW_MCD) {\r
+ if (PicoIn.AHW & PAHW_MCD) {\r
PicoResetMCD();\r
return 0;\r
}\r
\r
// reinit, so that checksum checks pass\r
- if (!(PicoOpt & POPT_DIS_IDLE_DET))\r
+ if (!(PicoIn.opt & POPT_DIS_IDLE_DET))\r
SekInitIdleDet();\r
\r
- if (PicoOpt & POPT_EN_32X)\r
+ if (PicoIn.opt & POPT_EN_32X)\r
PicoReset32x();\r
\r
// reset sram state; enable sram access by default if it doesn't overlap with ROM\r
// flush config changes before emu loop starts\r
void PicoLoopPrepare(void)\r
{\r
- if (PicoRegionOverride)\r
+ if (PicoIn.regionOverride)\r
// force setting possibly changed..\r
- Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;\r
+ Pico.m.pal = (PicoIn.regionOverride == 2 || PicoIn.regionOverride == 8) ? 1 : 0;\r
\r
Pico.m.dirtyPal = 1;\r
rendstatus_old = -1;\r
\r
Pico.m.frame_count++;\r
\r
- if (PicoAHW & PAHW_SMS) {\r
+ if (PicoIn.AHW & PAHW_SMS) {\r
PicoFrameMS();\r
goto end;\r
}\r
\r
- if (PicoAHW & PAHW_32X) {\r
+ if (PicoIn.AHW & PAHW_32X) {\r
PicoFrame32x(); // also does MCD+32X\r
goto end;\r
}\r
\r
- if (PicoAHW & PAHW_MCD) {\r
+ if (PicoIn.AHW & PAHW_MCD) {\r
PicoFrameMCD();\r
goto end;\r
}\r
\r
void PicoFrameDrawOnly(void)\r
{\r
- if (!(PicoAHW & PAHW_SMS)) {\r
+ if (!(PicoIn.AHW & PAHW_SMS)) {\r
PicoFrameStart();\r
PicoDrawSync(223, 0);\r
} else {\r