libretro.c: Create pcsx_rearmed_memcard2 option to enable/disable memcard2
[pcsx_rearmed.git] / frontend / libretro.c
index 35e37a0..4816b62 100644 (file)
@@ -54,6 +54,8 @@ static retro_input_state_t input_state_cb;
 static retro_environment_t environ_cb;
 static retro_audio_sample_batch_t audio_batch_cb;
 static struct retro_rumble_interface rumble;
+static struct retro_log_callback logging;
+static retro_log_printf_t log_cb;
 
 static void *vout_buf;
 static void * vout_buf_ptr;
@@ -435,7 +437,8 @@ 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_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" },
@@ -447,6 +450,7 @@ void retro_set_environment(retro_environment_t cb)
       { "pcsx_rearmed_multitap1", "Multitap 1; auto|disabled|enabled" },
       { "pcsx_rearmed_multitap2", "Multitap 2; auto|disabled|enabled" },
       { "pcsx_rearmed_vibration", "Enable Vibration; enabled|disabled" },
+      { "pcsx_rearmed_dithering", "Enable Dithering; enabled|disabled" },
 #ifndef DRC_DISABLE
       { "pcsx_rearmed_drc", "Dynamic recompiler; enabled|disabled" },
 #endif
@@ -464,6 +468,9 @@ void retro_set_environment(retro_environment_t cb)
       { NULL, NULL },
    };
 
+    if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging))
+        log_cb = logging.log;
+
    environ_cb = cb;
 
    cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars);
@@ -1218,7 +1225,7 @@ bool retro_load_game(const struct retro_game_info *info)
 
        if (is_m3u) {
                if (!read_m3u(info->path)) {
-                       SysPrintf("failed to read m3u file\n");
+                       log_cb(RETRO_LOG_INFO, "failed to read m3u file\n");
                        return false;
                }
        } else {
@@ -1230,7 +1237,7 @@ bool retro_load_game(const struct retro_game_info *info)
 
        /* have to reload after set_cd_image for correct cdr plugin */
        if (LoadPlugins() == -1) {
-               SysPrintf("failed to load plugins\n");
+               log_cb(RETRO_LOG_INFO, "failed to load plugins\n");
                return false;
        }
 
@@ -1238,23 +1245,22 @@ bool retro_load_game(const struct retro_game_info *info)
        NetOpened = 0;
 
        if (OpenPlugins() == -1) {
-               SysPrintf("failed to open plugins\n");
+               log_cb(RETRO_LOG_INFO, "failed to open plugins\n");
                return false;
        }
 
        plugin_call_rearmed_cbs();
        dfinput_activate();
 
-       Config.PsxAuto = 1;
        if (CheckCdrom() == -1) {
-               SysPrintf("unsupported/invalid CD image: %s\n", info->path);
+        log_cb(RETRO_LOG_INFO, "unsupported/invalid CD image: %s\n", info->path);
                return false;
        }
 
        SysReset();
 
        if (LoadCdrom() == -1) {
-               SysPrintf("could not load CD-ROM!\n");
+               log_cb(RETRO_LOG_INFO, "could not load CD\n");
                return false;
        }
        emu_on_new_cd(0);
@@ -1334,7 +1340,7 @@ static void update_variables(bool in_flight)
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
    {
       Config.PsxAuto = 0;
-      if (strcmp(var.value, "Automatic") == 0)
+      if (strcmp(var.value, "auto") == 0)
          Config.PsxAuto = 1;
       else if (strcmp(var.value, "NTSC") == 0)
          Config.PsxType = 0;
@@ -1358,6 +1364,27 @@ static void update_variables(bool in_flight)
          in_enable_vibration = 1;
    }
 
+   var.value = NULL;
+   var.key = "pcsx_rearmed_dithering";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      if (strcmp(var.value, "disabled") == 0) {
+         pl_rearmed_cbs.gpu_peops.iUseDither = 0;
+         pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 0;
+#ifdef __ARM_NEON__
+         pl_rearmed_cbs.gpu_neon.allow_dithering = 0;
+#endif
+      }
+      else if (strcmp(var.value, "enabled") == 0) {
+         pl_rearmed_cbs.gpu_peops.iUseDither = 1;
+         pl_rearmed_cbs.gpu_peopsgl.bDrawDither = 1;
+#ifdef __ARM_NEON__
+         pl_rearmed_cbs.gpu_neon.allow_dithering = 1;
+#endif
+      }
+   }
+
 #ifdef __ARM_NEON__
    var.value = "NULL";
    var.key = "pcsx_rearmed_neon_interlace_enable";
@@ -1611,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" };
@@ -1641,6 +1703,7 @@ void retro_init(void)
    if(!__ctr_svchax)
       Config.Cpu = CPU_INTERPRETER;
 #endif
+       ret |= init_memcards();
 
        ret |= emu_core_init();
        if (ret != 0) {
@@ -1680,7 +1743,7 @@ void retro_init(void)
                SysPrintf("no BIOS files found.\n");
                struct retro_message msg =
                {
-                       "No BIOS file found - add for better compatibility",
+                       "No PlayStation BIOS file found - add for better compatibility",
                        180
                };
                environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void*)&msg);
@@ -1700,11 +1763,6 @@ void retro_init(void)
        pl_rearmed_cbs.gpu_peops.iUseDither = 1;
        spu_config.iUseFixedUpdates = 1;
 
-       McdDisable[0] = 0;
-       McdDisable[1] = 1;
-       init_memcard(Mcd1Data);
-   init_memcard(Mcd2Data);
-
        SaveFuncs.open = save_open;
        SaveFuncs.read = save_read;
        SaveFuncs.write = save_write;