From 280bfc3ca7c4c085ded9c6bcf42cdf58707a166d Mon Sep 17 00:00:00 2001 From: kub Date: Tue, 19 Oct 2021 22:45:32 +0200 Subject: [PATCH] sms, add system select option --- pico/media.c | 2 +- pico/pico.h | 5 ++++ pico/sms.c | 28 ++++++++++++++-------- platform/common/emu.c | 2 ++ platform/common/emu.h | 1 + platform/common/menu_pico.c | 29 +++++++++++++++++++++++ platform/common/menu_pico.h | 1 + platform/libretro/libretro.c | 25 +++++++++++++------ platform/libretro/libretro_core_options.h | 28 +++++++++++++++------- 9 files changed, 95 insertions(+), 26 deletions(-) diff --git a/pico/media.c b/pico/media.c index d6d136bc..c944f989 100644 --- a/pico/media.c +++ b/pico/media.c @@ -298,7 +298,7 @@ enum media_type_e PicoLoadMedia(const char *filename, // simple test for GG. Do this here since m.hardware is nulled in Insert if (PicoIn.AHW & PAHW_SMS) { - if (!strcmp(rom->ext,"gg")) { + if (!strcmp(rom->ext,"gg") && !PicoIn.hwSelect) { Pico.m.hardware |= 0x1; lprintf("detected GG ROM\n"); } else diff --git a/pico/pico.h b/pico/pico.h index dc615d1e..e68671aa 100644 --- a/pico/pico.h +++ b/pico/pico.h @@ -82,6 +82,10 @@ extern void *p32x_bios_g, *p32x_bios_m, *p32x_bios_s; #define PAHW_PICO (1<<3) #define PAHW_SMS (1<<4) +#define PHWS_AUTO 0 +#define PHWS_GG 1 +#define PHWS_SMS 2 + #define PQUIRK_FORCE_6BTN (1<<0) // the emulator is configured and some status is reported @@ -97,6 +101,7 @@ typedef struct PicoInterface unsigned short skipFrame; // skip rendering frame, but still do sound (if enabled) and emulation stuff unsigned short regionOverride; // override the region detection 0: auto, 1: Japan NTSC, 2: Japan PAL, 4: US, 8: Europe unsigned short autoRgnOrder; // packed priority list of regions, for example 0x148 means this detection order: EUR, USA, JAP + unsigned short hwSelect; // hardware preselected via option menu unsigned short quirks; // game-specific quirks: PQUIRK_* unsigned short overclockM68k; // overclock the emulated 68k, in % diff --git a/pico/sms.c b/pico/sms.c index 5cb1e03d..5e6d7deb 100644 --- a/pico/sms.c +++ b/pico/sms.c @@ -335,6 +335,24 @@ void PicoResetMS(void) ymflag = 0xffff; Pico.m.dirtyPal = 1; + if (PicoIn.hwSelect) { + switch (PicoIn.hwSelect) { + case PHWS_GG: Pico.m.hardware |= 0x1; break; + default: Pico.m.hardware &= ~0x1; break; + } + } else { + unsigned tmr; + + // check if the ROM header contains more system information to detect GG + for (tmr = 0x2000; tmr < 0xbfff && tmr <= Pico.romsize; tmr *= 2) { + if (!memcmp(Pico.rom + tmr-16, "TMR SEGA", 8)) { + if (Pico.rom[tmr-1] >= 0x50 && Pico.rom[tmr-1] < 0x80) + Pico.m.hardware |= 0x1; + break; + } + } + } + // reset memory mapping PicoMemSetupMS(); } @@ -342,7 +360,6 @@ void PicoResetMS(void) void PicoPowerMS(void) { int s, tmp; - unsigned tmr; memset(&PicoMem,0,sizeof(PicoMem)); memset(&Pico.video,0,sizeof(Pico.video)); @@ -359,15 +376,6 @@ void PicoPowerMS(void) tmp = 1 << s; bank_mask = (tmp - 1) >> 14; - // check if the ROM header contains more system information to detect GG - for (tmr = 0x2000; tmr < 0xbfff && tmr <= Pico.romsize; tmr *= 2) { - if (!memcmp(Pico.rom + tmr-16, "TMR SEGA", 8)) { - if (Pico.rom[tmr-1] >= 0x50 && Pico.rom[tmr-1] < 0x80) - Pico.m.hardware |= 0x1; - break; - } - } - PicoReset(); } diff --git a/platform/common/emu.c b/platform/common/emu.c index 1ae8cdb5..faadafd1 100644 --- a/platform/common/emu.c +++ b/platform/common/emu.c @@ -597,6 +597,7 @@ void emu_prep_defconfig(void) defaultConfig.s_PsndRate = 44100; defaultConfig.s_PicoRegion = 0; // auto defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP + defaultConfig.s_hwSelect = PHWS_AUTO; defaultConfig.s_PicoCDBuffers = 0; defaultConfig.s_PicoSndFilterAlpha = 0x10000 * 60 / 100; defaultConfig.confirm_save = EOPT_CONFIRM_SAVE; @@ -622,6 +623,7 @@ void emu_set_defconfig(void) PicoIn.sndRate = currentConfig.s_PsndRate; PicoIn.regionOverride = currentConfig.s_PicoRegion; PicoIn.autoRgnOrder = currentConfig.s_PicoAutoRgnOrder; + PicoIn.hwSelect = currentConfig.s_hwSelect; PicoIn.sndFilterAlpha = currentConfig.s_PicoSndFilterAlpha; } diff --git a/platform/common/emu.h b/platform/common/emu.h index c7477dcb..de91b9b7 100644 --- a/platform/common/emu.h +++ b/platform/common/emu.h @@ -72,6 +72,7 @@ typedef struct _currentConfig_t { int s_PsndRate; int s_PicoRegion; int s_PicoAutoRgnOrder; + int s_hwSelect; int s_PicoCDBuffers; int s_PicoSndFilterAlpha; int Frameskip; diff --git a/platform/common/menu_pico.c b/platform/common/menu_pico.c index c6162987..80139c56 100644 --- a/platform/common/menu_pico.c +++ b/platform/common/menu_pico.c @@ -523,6 +523,29 @@ static int menu_loop_32x_options(int id, int keys) #endif +// ------------ SMS options menu ------------ + +#ifndef NO_SMS + +static const char *sms_hardwares[] = { "auto", "Game Gear", "Master System", NULL }; + +static menu_entry e_menu_sms_options[] = +{ + mee_enum ("System", MA_SMSOPT_HARDWARE, currentConfig.s_hwSelect, sms_hardwares ), +}; + +static int menu_loop_sms_options(int id, int keys) +{ + static int sel = 0; + + me_loop(e_menu_sms_options, &sel); + + PicoIn.hwSelect = currentConfig.s_hwSelect; + return 0; +} + +#endif + // ------------ adv options menu ------------ static const char h_ovrclk[] = "Will break some games, keep at 0"; @@ -828,6 +851,9 @@ static menu_entry e_menu_options[] = mee_handler ("[Sega/Mega CD options]", menu_loop_cd_options), #ifndef NO_32X mee_handler ("[32X options]", menu_loop_32x_options), +#endif +#ifndef NO_SMS + mee_handler ("[SMS options]", menu_loop_sms_options), #endif mee_handler ("[Advanced options]", menu_loop_adv_options), mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg), @@ -1290,6 +1316,9 @@ static menu_entry *e_menu_table[] = e_menu_cd_options, #ifndef NO_32X e_menu_32x_options, +#endif +#ifndef NO_SMS + e_menu_sms_options, #endif e_menu_keyconfig, e_menu_hidden, diff --git a/platform/common/menu_pico.h b/platform/common/menu_pico.h index af365dbb..0199146e 100644 --- a/platform/common/menu_pico.h +++ b/platform/common/menu_pico.h @@ -87,6 +87,7 @@ typedef enum MA_32XOPT_PWM, MA_32XOPT_MSH2_CYCLES, MA_32XOPT_SSH2_CYCLES, + MA_SMSOPT_HARDWARE, MA_CTRL_PLAYER1, MA_CTRL_PLAYER2, MA_CTRL_EMU, diff --git a/platform/libretro/libretro.c b/platform/libretro/libretro.c index 90505fea..ea640c22 100644 --- a/platform/libretro/libretro.c +++ b/platform/libretro/libretro.c @@ -1451,21 +1451,23 @@ static void update_variables(bool first_run) PicoSetInputDevice(1, input_name_to_val(var.value)); var.value = NULL; - var.key = "picodrive_sprlim"; + var.key = "picodrive_ramcart"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { if (strcmp(var.value, "enabled") == 0) - PicoIn.opt |= POPT_DIS_SPRITE_LIM; + PicoIn.opt |= POPT_EN_MCD_RAMCART; else - PicoIn.opt &= ~POPT_DIS_SPRITE_LIM; + PicoIn.opt &= ~POPT_EN_MCD_RAMCART; } var.value = NULL; - var.key = "picodrive_ramcart"; + var.key = "picodrive_smstype"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { - if (strcmp(var.value, "enabled") == 0) - PicoIn.opt |= POPT_EN_MCD_RAMCART; + if (strcmp(var.value, "Auto") == 0) + PicoIn.hwSelect = PHWS_AUTO; + else if (strcmp(var.value, "Game Gear") == 0) + PicoIn.hwSelect = PHWS_GG; else - PicoIn.opt &= ~POPT_EN_MCD_RAMCART; + PicoIn.hwSelect = PHWS_SMS; } OldPicoRegionOverride = PicoIn.regionOverride; @@ -1512,6 +1514,15 @@ static void update_variables(bool first_run) environ_cb(RETRO_ENVIRONMENT_SET_GEOMETRY, &av_info); } + var.value = NULL; + var.key = "picodrive_sprlim"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + if (strcmp(var.value, "enabled") == 0) + PicoIn.opt |= POPT_DIS_SPRITE_LIM; + else + PicoIn.opt &= ~POPT_DIS_SPRITE_LIM; + } + old_show_overscan = show_overscan; var.value = NULL; var.key = "picodrive_overscan"; diff --git a/platform/libretro/libretro_core_options.h b/platform/libretro/libretro_core_options.h index 23ca4163..5d6911e2 100644 --- a/platform/libretro/libretro_core_options.h +++ b/platform/libretro/libretro_core_options.h @@ -74,9 +74,9 @@ struct retro_core_option_definition option_defs_us[] = { "3 button pad" }, { - "picodrive_sprlim", - "No sprite limit", - "Enable this to remove the sprite limit.", + "picodrive_ramcart", + "MegaCD RAM cart", + "Emulate a MegaCD RAM cart, used for save game data. WARNING: When enabled, internal save data (BRAM) will be discarded.", { { "disabled", NULL }, { "enabled", NULL }, @@ -85,12 +85,13 @@ struct retro_core_option_definition option_defs_us[] = { "disabled" }, { - "picodrive_ramcart", - "MegaCD RAM cart", - "Emulate a MegaCD RAM cart, used for save game data. WARNING: When enabled, internal save data (BRAM) will be discarded.", + "picodrive_smstype", + "Master System type", + "Choose which type of system the core should emulate for Master system", { - { "disabled", NULL }, - { "enabled", NULL }, + { "Auto", NULL }, + { "Game Gear", NULL }, + { "Master System", NULL }, { NULL, NULL }, }, "disabled" @@ -121,6 +122,17 @@ struct retro_core_option_definition option_defs_us[] = { }, "PAR" }, + { + "picodrive_sprlim", + "No sprite limit", + "Enable this to remove the sprite limit.", + { + { "disabled", NULL }, + { "enabled", NULL }, + { NULL, NULL }, + }, + "disabled" + }, { "picodrive_overscan", "Show Overscan", -- 2.39.2