From d382721eb8f59692e7919ea4fa157262dfe82c35 Mon Sep 17 00:00:00 2001 From: Malik Olivier Boussejra Date: Mon, 7 May 2018 04:05:46 +0900 Subject: [PATCH] libretro.c: Create pcsx_rearmed_memcard2 option to enable/disable memcard2 Memcard2 defaults to being disabled. Indeed enabling it might break some games. Setting "pcsx_rearmed_memcard2" to "enabled" allows to use a memory card 2 file situated in the loaded game's directory with the filename "pcsx-card2.mcd". --- frontend/libretro.c | 50 +++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/frontend/libretro.c b/frontend/libretro.c index 1e888e19..4816b628 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -438,6 +438,7 @@ void retro_set_environment(retro_environment_t cb) static const struct retro_variable vars[] = { { "pcsx_rearmed_frameskip", "Frameskip; 0|1|2|3" }, { "pcsx_rearmed_region", "Region; auto|NTSC|PAL" }, + { "pcsx_rearmed_memcard2", "Enable second memory card; disabled|enabled" }, { "pcsx_rearmed_pad1type", "Pad 1 Type; default|none|standard|analog|negcon" }, { "pcsx_rearmed_pad2type", "Pad 2 Type; default|none|standard|analog|negcon" }, { "pcsx_rearmed_pad3type", "Pad 3 Type; default|none|standard|analog|negcon" }, @@ -1637,6 +1638,41 @@ static void check_system_specs(void) environ_cb(RETRO_ENVIRONMENT_SET_PERFORMANCE_LEVEL, &level); } +static int init_memcards(void) +{ + int ret = 0; + const char *dir; + struct retro_variable var = { .key="pcsx_rearmed_memcard2", .value=NULL }; + static const char CARD2_FILE[] = "pcsx-card2.mcd"; + + McdDisable[0] = 0; + // Disable memcard 2 by default + McdDisable[1] = 1; + init_memcard(Mcd1Data); + // Memcard 2 is managed by the emulator on the filesystem, + // There is no need to initialize Mcd2Data like Mcd1Data. + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) { + SysPrintf("Memcard 2: %s\n", var.value); + if (memcmp(var.value, "enabled", 7) == 0) { + if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir) && dir) { + if (strlen(dir) + strlen(CARD2_FILE) + 2 > sizeof(Config.Mcd2)) { + SysPrintf("Path '%s' is too long. Cannot use memcard 2. Use a shorter path.\n", dir); + ret = -1; + } else { + McdDisable[1] = 0; + snprintf(Config.Mcd2, sizeof(Config.Mcd2), "%s/%s", dir, CARD2_FILE); + SysPrintf("Use memcard 2: %s\n", Config.Mcd2); + } + } else { + SysPrintf("Could not get save directory! Could not create memcard 2."); + ret = -1; + } + } + } + return ret; +} + void retro_init(void) { const char *bios[] = { "SCPH101", "SCPH7001", "SCPH5501", "SCPH1001" }; @@ -1667,15 +1703,7 @@ void retro_init(void) if(!__ctr_svchax) Config.Cpu = CPU_INTERPRETER; #endif - if (environ_cb(RETRO_ENVIRONMENT_GET_SAVE_DIRECTORY, &dir) && dir) { - const char CARD_FILE[] = "pcsx-card2.mcd"; - if (strlen(dir) + strlen(CARD_FILE) + 2 > sizeof(Config.Mcd2)) { - SysPrintf("Path '%s' is too long. Cannot use memcard 2. Use a shorter path.\n", dir); - } else { - snprintf(Config.Mcd2, sizeof(Config.Mcd2), "%s/%s", dir, CARD_FILE); - SysPrintf("Use memory card2: %s\n", Config.Mcd2); - } - } + ret |= init_memcards(); ret |= emu_core_init(); if (ret != 0) { @@ -1735,10 +1763,6 @@ void retro_init(void) pl_rearmed_cbs.gpu_peops.iUseDither = 1; spu_config.iUseFixedUpdates = 1; - McdDisable[0] = 0; - McdDisable[1] = 0; - init_memcard(Mcd1Data); - SaveFuncs.open = save_open; SaveFuncs.read = save_read; SaveFuncs.write = save_write; -- 2.39.5