Add core option to force the Region FPS (NTSC, PAL)

This new core option will override the Region option.
So it's possible to choose the Europe Region and the NTSC FPS.
Strangely the region protection has no effect on megadrive :-)
But will happend on 32x and SegaCD (Maybe it can be fixed by activating
this core option after a little delay on startup)
This commit is contained in:
David
2015-12-13 14:54:13 +01:00
parent bd7b09f4f9
commit 48582bcfb8
4 changed files with 59 additions and 16 deletions

View File

@@ -12,12 +12,13 @@
struct Pico Pico;
int PicoOpt;
int PicoSkipFrame; // skip rendering frame?
int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU
int PicoPadInt[2]; // internal copy
int PicoAHW; // active addon hardware: PAHW_*
int PicoQuirks; // game-specific quirks
int PicoRegionOverride; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe
int PicoSkipFrame; // skip rendering frame?
int PicoPad[2]; // Joypads, format is MXYZ SACB RLDU
int PicoPadInt[2]; // internal copy
int PicoAHW; // active addon hardware: PAHW_*
int PicoQuirks; // game-specific quirks
int PicoRegionOverride; // override the region detection 0: Auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe
int PicoRegionFPSOverride; // override the refresh rate of the region 0: Auto, 1: NTSC, 2: PAL
int PicoAutoRgnOrder;
struct PicoSRAM SRam;
@@ -91,6 +92,10 @@ void PicoPower(void)
PICO_INTERNAL void PicoDetectRegion(void)
{
// PicoDetectRegion not ready yet
if (Pico.romsize <= 0)
return;
int support=0, hw=0, i;
unsigned char pal=0;
@@ -143,6 +148,10 @@ PICO_INTERNAL void PicoDetectRegion(void)
else hw=0x80; // USA
Pico.m.hardware=(unsigned char)(hw|0x20); // No disk attached
if (PicoRegionFPSOverride > 0)
pal = PicoRegionFPSOverride - 1; // pal - 0: NTSC, 1: PAL | PicoRegionFPSOverride - 0: Auto, 1: NTSC, 2: PAL
Pico.m.pal=pal;
}
@@ -216,9 +225,16 @@ int PicoReset(void)
// flush config changes before emu loop starts
void PicoLoopPrepare(void)
{
if (PicoRegionOverride)
if (PicoRegionFPSOverride) // PicoRegionFPSOverride is proprietary on PicoRegionOverride
{
// force setting possibly changed..
Pico.m.pal = PicoRegionFPSOverride - 1; // Pico.m.pal - 0: NTSC, 1: PAL | PicoRegionFPSOverride - 0: Auto, 1: NTSC, 2: PAL
}
else if (PicoRegionOverride)
{
// force setting possibly changed..
Pico.m.pal = (PicoRegionOverride == 2 || PicoRegionOverride == 8) ? 1 : 0;
}
// FIXME: PAL has 313 scanlines..
scanlines_total = Pico.m.pal ? 312 : 262;

View File

@@ -81,9 +81,10 @@ extern int PicoAHW; // Pico active hw
#define PQUIRK_FORCE_6BTN (1<<0)
extern int PicoQuirks;
extern int PicoSkipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff
extern int PicoRegionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe
extern int PicoAutoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP
extern int PicoSkipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff
extern int PicoRegionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe
extern int PicoRegionFPSOverride; // override the refresh rate of the region 0: Auto, 1: NTSC, 2: PAL
extern int PicoAutoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP
extern int PicoSVPCycles;
void PicoInit(void);
void PicoExit(void);

View File

@@ -118,6 +118,10 @@ PICO_INTERNAL void PsndReset(void)
// to be called after changing sound rate or chips
void PsndRerate(int preserve_state)
{
// PsndRerate not ready yet
if (Pico.romsize <= 0)
return;
void *state = NULL;
int target_fps = Pico.m.pal ? 50 : 60;

View File

@@ -477,12 +477,12 @@ void lprintf(const char *fmt, ...)
void retro_set_environment(retro_environment_t cb)
{
static const struct retro_variable vars[] = {
//{ "region", "Region; Auto|NTSC|PAL" },
{ "picodrive_input1", "Input device 1; 3 button pad|6 button pad|None" },
{ "picodrive_input2", "Input device 2; 3 button pad|6 button pad|None" },
{ "picodrive_sprlim", "No sprite limit; disabled|enabled" },
{ "picodrive_ramcart", "MegaCD RAM cart; disabled|enabled" },
{ "picodrive_region", "Region; Auto|Japan NTSC|Japan PAL|US|Europe" },
{ "picodrive_input1", "Input device 1; 3 button pad|6 button pad|None" },
{ "picodrive_input2", "Input device 2; 3 button pad|6 button pad|None" },
{ "picodrive_sprlim", "No sprite limit; disabled|enabled" },
{ "picodrive_ramcart", "MegaCD RAM cart; disabled|enabled" },
{ "picodrive_region", "Region; Auto|Japan NTSC|Japan PAL|US|Europe" },
{ "picodrive_region_fps", "Region FPS; Auto|NTSC|PAL"},
#ifdef DRC_SH2
{ "picodrive_drc", "Dynamic recompilers; enabled|disabled" },
#endif
@@ -1144,6 +1144,7 @@ static void update_variables(void)
PicoOpt &= ~POPT_EN_MCD_RAMCART;
}
int OldPicoRegionOverride = PicoRegionOverride;
var.value = NULL;
var.key = "picodrive_region";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
@@ -1159,6 +1160,27 @@ static void update_variables(void)
PicoRegionOverride = 8;
}
int OldPicoRegionFPSOverride = PicoRegionFPSOverride;
var.value = NULL;
var.key = "picodrive_region_fps";
if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) {
if (strcmp(var.value, "Auto") == 0)
PicoRegionFPSOverride = 0;
else if (strcmp(var.value, "NTSC") == 0)
PicoRegionFPSOverride = 1;
else if (strcmp(var.value, "PAL") == 0)
PicoRegionFPSOverride = 2;
}
// Update region, fps and sound flags if needed
if (PicoRegionOverride != OldPicoRegionOverride ||
PicoRegionFPSOverride != OldPicoRegionFPSOverride)
{
PicoDetectRegion();
PicoLoopPrepare();
PsndRerate(1);
}
#ifdef DRC_SH2
var.value = NULL;
var.key = "picodrive_drc";