mirror of
https://github.com/ekeeke/Genesis-Plus-GX.git
synced 2024-11-10 21:05:12 +01:00
[libretro] improved system region swapping
This commit is contained in:
parent
740f690de8
commit
b5c243664d
Binary file not shown.
@ -70,8 +70,6 @@ static bool is_running = 0;
|
|||||||
static uint8_t temp[0x10000];
|
static uint8_t temp[0x10000];
|
||||||
static int16 soundbuffer[3068];
|
static int16 soundbuffer[3068];
|
||||||
static uint16_t bitmap_data_[720 * 576];
|
static uint16_t bitmap_data_[720 * 576];
|
||||||
static const double pal_fps = 53203424.0 / (3420.0 * 313.0);
|
|
||||||
static const double ntsc_fps = 53693175.0 / (3420.0 * 262.0);
|
|
||||||
|
|
||||||
static char g_rom_dir[256];
|
static char g_rom_dir[256];
|
||||||
static char g_rom_name[256];
|
static char g_rom_name[256];
|
||||||
@ -727,6 +725,7 @@ static void check_variables(void)
|
|||||||
bool update_viewports = false;
|
bool update_viewports = false;
|
||||||
bool reinit = false;
|
bool reinit = false;
|
||||||
struct retro_variable var = {0};
|
struct retro_variable var = {0};
|
||||||
|
struct retro_system_av_info info;
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_bram";
|
var.key = "genesis_plus_gx_bram";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
@ -800,6 +799,24 @@ static void check_variables(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var.key = "genesis_plus_gx_bios";
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
|
{
|
||||||
|
orig_value = config.bios;
|
||||||
|
if (!strcmp(var.value, "enabled"))
|
||||||
|
config.bios = 3;
|
||||||
|
else
|
||||||
|
config.bios = 0;
|
||||||
|
|
||||||
|
if (orig_value != config.bios)
|
||||||
|
{
|
||||||
|
if (system_hw)
|
||||||
|
{
|
||||||
|
reinit = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_region_detect";
|
var.key = "genesis_plus_gx_region_detect";
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
||||||
{
|
{
|
||||||
@ -818,25 +835,70 @@ static void check_variables(void)
|
|||||||
if (system_hw)
|
if (system_hw)
|
||||||
{
|
{
|
||||||
get_region(NULL);
|
get_region(NULL);
|
||||||
|
|
||||||
|
if ((system_hw == SYSTEM_MCD) || ((system_hw & SYSTEM_SMS) && config.bios))
|
||||||
|
{
|
||||||
|
/* system with region BIOS should be reinitialized */
|
||||||
reinit = true;
|
reinit = true;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var.key = "genesis_plus_gx_bios";
|
|
||||||
environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var);
|
|
||||||
{
|
|
||||||
orig_value = config.bios;
|
|
||||||
if (!strcmp(var.value, "enabled"))
|
|
||||||
config.bios = 3;
|
|
||||||
else
|
else
|
||||||
config.bios = 0;
|
{
|
||||||
|
static const uint16 vc_table[4][2] =
|
||||||
|
{
|
||||||
|
/* NTSC, PAL */
|
||||||
|
{0xDA , 0xF2}, /* Mode 4 (192 lines) */
|
||||||
|
{0xEA , 0x102}, /* Mode 5 (224 lines) */
|
||||||
|
{0xDA , 0xF2}, /* Mode 4 (192 lines) */
|
||||||
|
{0x106, 0x10A} /* Mode 5 (240 lines) */
|
||||||
|
};
|
||||||
|
|
||||||
if (orig_value != config.bios)
|
/* framerate might have changed, reinitialize audio timings */
|
||||||
|
audio_set_rate(44100, 0);
|
||||||
|
|
||||||
|
/* reinitialize I/O region register */
|
||||||
|
if (system_hw == SYSTEM_MD)
|
||||||
{
|
{
|
||||||
if (system_hw)
|
io_reg[0x00] = 0x20 | region_code | (config.bios & 1);
|
||||||
|
}
|
||||||
|
else if (system_hw == SYSTEM_MCD)
|
||||||
{
|
{
|
||||||
reinit = true;
|
io_reg[0x00] = region_code | (config.bios & 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
io_reg[0x00] = 0x80 | (region_code >> 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reinitialize VDP timings */
|
||||||
|
lines_per_frame = vdp_pal ? 313 : 262;
|
||||||
|
|
||||||
|
/* reinitialize NTSC/PAL mode in VDP status */
|
||||||
|
if (system_hw & SYSTEM_MD)
|
||||||
|
{
|
||||||
|
status = (status & ~1) | vdp_pal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reinitialize VC max value */
|
||||||
|
switch (bitmap.viewport.h)
|
||||||
|
{
|
||||||
|
case 192:
|
||||||
|
vc_max = vc_table[0][vdp_pal];
|
||||||
|
break;
|
||||||
|
case 224:
|
||||||
|
vc_max = vc_table[1][vdp_pal];
|
||||||
|
break;
|
||||||
|
case 240:
|
||||||
|
vc_max = vc_table[3][vdp_pal];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* force overscan change */
|
||||||
|
bitmap.viewport.changed = 3;
|
||||||
|
|
||||||
|
/* reinitialize libretro audio/video timings */
|
||||||
|
retro_get_system_av_info(&info);
|
||||||
|
environ_cb(RETRO_ENVIRONMENT_SET_SYSTEM_AV_INFO, &info);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1017,7 +1079,7 @@ static void check_variables(void)
|
|||||||
|
|
||||||
if (reinit)
|
if (reinit)
|
||||||
{
|
{
|
||||||
audio_init(44100, snd.frame_rate);
|
audio_init(44100, 0);
|
||||||
memcpy(temp, sram.sram, sizeof(temp));
|
memcpy(temp, sram.sram, sizeof(temp));
|
||||||
system_init();
|
system_init();
|
||||||
system_reset();
|
system_reset();
|
||||||
@ -1574,7 +1636,7 @@ void retro_get_system_av_info(struct retro_system_av_info *info)
|
|||||||
info->geometry.max_width = 720;
|
info->geometry.max_width = 720;
|
||||||
info->geometry.max_height = 576;
|
info->geometry.max_height = 576;
|
||||||
info->geometry.aspect_ratio = 4.0 / 3.0;
|
info->geometry.aspect_ratio = 4.0 / 3.0;
|
||||||
info->timing.fps = snd.frame_rate;
|
info->timing.fps = (double)(system_clock) / (double)lines_per_frame / (double)MCYCLES_PER_LINE;
|
||||||
info->timing.sample_rate = 44100;
|
info->timing.sample_rate = 44100;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1836,7 +1898,7 @@ bool retro_load_game(const struct retro_game_info *info)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
audio_init(44100, vdp_pal ? pal_fps : ntsc_fps);
|
audio_init(44100,0);
|
||||||
system_init();
|
system_init();
|
||||||
system_reset();
|
system_reset();
|
||||||
is_running = false;
|
is_running = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user