overwrite dynarec related code with upstream version
[pcsx_rearmed.git] / frontend / libretro.c
index e18b190..8252e15 100644 (file)
 #include <libretro.h>
 #include "libretro_core_options.h"
 
+#ifdef USE_LIBRETRO_VFS
+#include <streams/file_stream_transforms.h>
+#endif
+
 #ifdef _3DS
 #include "3ds/3ds_utils.h"
 #endif
@@ -117,7 +121,6 @@ int in_mouse[8][2];
 int multitap1 = 0;
 int multitap2 = 0;
 int in_enable_vibration = 1;
-static int input_changed = 0;
 
 // NegCon adjustment parameters
 // > The NegCon 'twist' action is somewhat awkward when mapped
@@ -555,6 +558,10 @@ static const struct retro_controller_info ports[9] =
 /* libretro */
 void retro_set_environment(retro_environment_t cb)
 {
+#ifdef USE_LIBRETRO_VFS
+   struct retro_vfs_interface_info vfs_iface_info;
+#endif
+
    environ_cb = cb;
 
    if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging))
@@ -562,6 +569,13 @@ void retro_set_environment(retro_environment_t cb)
 
    environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
    libretro_set_core_options(environ_cb);
+
+#ifdef USE_LIBRETRO_VFS
+   vfs_iface_info.required_interface_version = 1;
+   vfs_iface_info.iface                      = NULL;
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VFS_INTERFACE, &vfs_iface_info))
+          filestream_vfs_init(&vfs_iface_info);
+#endif
 }
 
 void retro_set_video_refresh(retro_video_refresh_t cb) { video_cb = cb; }
@@ -577,53 +591,24 @@ unsigned retro_api_version(void)
 
 static void update_multitap(void)
 {
-   struct retro_variable var;
-   int auto_case, port;
-
-   var.value = NULL;
-   var.key = "pcsx_rearmed_multitap1";
-   auto_case = 0;
-   if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value))
-   {
-      if (strcmp(var.value, "enabled") == 0)
-         multitap1 = 1;
-      else if (strcmp(var.value, "disabled") == 0)
-         multitap1 = 0;
-      else // 'auto' case
-         auto_case = 1;
-   }
-   else
-      auto_case = 1;
+   struct retro_variable var = { 0 };
 
-   if (auto_case)
-   {
-      // If a gamepad is plugged after port 2, we need a first multitap.
-      multitap1 = 0;
-      for (port = 2; port < PORTS_NUMBER; port++)
-         multitap1 |= in_type[port] != PSE_PAD_TYPE_NONE;
-   }
+   multitap1 = 0;
+   multitap2 = 0;
 
    var.value = NULL;
-   var.key = "pcsx_rearmed_multitap2";
-   auto_case = 0;
+   var.key = "pcsx_rearmed_multitap";
    if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value))
    {
-      if (strcmp(var.value, "enabled") == 0)
+      if (strcmp(var.value, "port 1") == 0)
+         multitap1 = 1;
+      else if (strcmp(var.value, "port 2") == 0)
          multitap2 = 1;
-      else if (strcmp(var.value, "disabled") == 0)
-         multitap2 = 0;
-      else // 'auto' case
-         auto_case = 1;
-   }
-   else
-      auto_case = 1;
-
-   if (auto_case)
-   {
-      // If a gamepad is plugged after port 4, we need a second multitap.
-      multitap2 = 0;
-      for (port = 4; port < PORTS_NUMBER; port++)
-         multitap2 |= in_type[port] != PSE_PAD_TYPE_NONE;
+      else if (strcmp(var.value, "ports 1 and 2") == 0)
+      {
+         multitap1 = 1;
+         multitap2 = 1;
+      }
    }
 }
 
@@ -1112,11 +1097,11 @@ static bool read_m3u(const char *file)
 {
    char line[1024];
    char name[PATH_MAX];
-   FILE *f = fopen(file, "r");
-   if (!f)
+   FILE *fp = fopen(file, "r");
+   if (!fp)
       return false;
 
-   while (fgets(line, sizeof(line), f) && disk_count < sizeof(disks) / sizeof(disks[0]))
+   while (fgets(line, sizeof(line), fp) && disk_count < sizeof(disks) / sizeof(disks[0]))
    {
       if (line[0] == '#')
          continue;
@@ -1142,7 +1127,7 @@ static bool read_m3u(const char *file)
       }
    }
 
-   fclose(f);
+   fclose(fp);
    return (disk_count != 0);
 }
 
@@ -1352,14 +1337,12 @@ bool retro_load_game(const struct retro_game_info *info)
 
       for (i = 0; i < sizeof(disks) / sizeof(disks[0]) && i < cdrIsoMultidiskCount; i++)
       {
-         char disk_name[PATH_MAX];
-         char disk_label[PATH_MAX];
-         disk_name[0] = '\0';
-         disk_label[0] = '\0';
+         char disk_name[PATH_MAX - 16] = { 0 };
+         char disk_label[PATH_MAX] = { 0 };
 
          disks[i].fname = strdup(info->path);
 
-         get_disk_label(disk_name, info->path, PATH_MAX);
+         get_disk_label(disk_name, info->path, sizeof(disk_name));
          snprintf(disk_label, sizeof(disk_label), "%s #%u", disk_name, (unsigned)i + 1);
          disks[i].flabel = strdup(disk_label);
 
@@ -1400,6 +1383,10 @@ bool retro_load_game(const struct retro_game_info *info)
       }
    }
 
+   /* set ports to use "standard controller" initially */
+   for (i = 0; i < 8; ++i)
+      in_type[i] = PSE_PAD_TYPE_STANDARD;
+
    plugin_call_rearmed_cbs();
    /* dfinput_activate(); */
 
@@ -1420,8 +1407,6 @@ bool retro_load_game(const struct retro_game_info *info)
 
    set_retro_memmap();
 
-   input_changed = 1;
-
    return true;
 }
 
@@ -1510,9 +1495,6 @@ static void update_variables(bool in_flight)
          Config.PsxType = 1;
    }
 
-   /*for (i = 0; i < PORTS_NUMBER; i++)
-      update_controller_port_variable(i);*/
-
    update_multitap();
 
    var.value = NULL;
@@ -1646,11 +1628,13 @@ static void update_variables(bool in_flight)
          display_internal_fps = true;
    }
 
-#if defined(LIGHTREC) || defined(NEW_DYNAREC)
+#ifndef DRC_DISABLE
    var.value = NULL;
    var.key = "pcsx_rearmed_drc";
 
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   if (!environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var))
+      var.value = "enabled";
+
    {
       R3000Acpu *prev_cpu = psxCpu;
 #if defined(LIGHTREC)
@@ -1677,7 +1661,8 @@ static void update_variables(bool in_flight)
          psxCpu->Reset(); // not really a reset..
       }
    }
-#endif /* LIGHTREC || NEW_DYNAREC */
+#endif /* !DRC_DISABLE */
+   psxCpu->ApplyConfig();
 
    var.value = NULL;
    var.key = "pcsx_rearmed_spu_reverb";
@@ -1715,16 +1700,16 @@ static void update_variables(bool in_flight)
       else if (strcmp(var.value, "enabled") == 0)
          Config.RCntFix = 1;
    }
-
+   
    var.value = NULL;
-   var.key = "pcsx_rearmed_idiablofix";
+   var.key = "pcsx_rearmed_icache_emulation";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "disabled") == 0)
-         spu_config.idiablofix = 0;
+         Config.icache_emulation = 0;
       else if (strcmp(var.value, "enabled") == 0)
-         spu_config.idiablofix = 1;
+         Config.icache_emulation = 1;
    }
 
    var.value = NULL;
@@ -1744,9 +1729,20 @@ static void update_variables(bool in_flight)
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "async") == 0)
+      {
          Config.AsyncCD = 1;
-      else
+         Config.CHD_Precache = 0;
+      }
+      else if (strcmp(var.value, "sync") == 0)
+      {
          Config.AsyncCD = 0;
+         Config.CHD_Precache = 0;
+      }
+      else if (strcmp(var.value, "precache") == 0)
+      {
+         Config.AsyncCD = 0;
+         Config.CHD_Precache = 1;
+      }
    }
 #endif
 
@@ -2057,7 +2053,7 @@ static void update_variables(bool in_flight)
       GunconAdjustRatioY = atof(var.value);
    }
 
-#ifdef NEW_DYNAREC
+#if !defined(DRC_DISABLE) && !defined(LIGHTREC)
    var.value = NULL;
    var.key = "pcsx_rearmed_nosmccheck";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
@@ -2096,7 +2092,27 @@ static void update_variables(bool in_flight)
       int psxclock = atoi(var.value);
       cycle_multiplier = 10000 / psxclock;
    }
-#endif /* NEW_DYNAREC */
+
+   var.value = NULL;
+   var.key = "pcsx_rearmed_nocompathacks";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "enabled") == 0)
+         new_dynarec_hacks |= NDHACK_NO_COMPAT_HACKS;
+      else
+         new_dynarec_hacks &= ~NDHACK_NO_COMPAT_HACKS;
+   }
+#endif /* !DRC_DISABLE && !LIGHTREC */
+
+   var.value = NULL;
+   var.key = "pcsx_rearmed_nostalls";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "enabled") == 0)
+         Config.DisableStalls = 1;
+      else
+         Config.DisableStalls = 0;
+   }
 
    var.value = NULL;
    var.key = "pcsx_rearmed_input_sensitivity";
@@ -2121,8 +2137,6 @@ static void update_variables(bool in_flight)
          unsigned i;
          struct retro_core_option_display option_display;
          char gpu_peops_option[][50] = {
-            "pcsx_rearmed_multitap1",
-            "pcsx_rearmed_multitap2",
             "pcsx_rearmed_negcon_deadzone",
             "pcsx_rearmed_negcon_response",
             "pcsx_rearmed_analog_axis_modifier",
@@ -2511,19 +2525,6 @@ static void print_internal_fps(void)
 
 void retro_run(void)
 {
-   /* update multitap when inputs have changed */
-   /* this is only applied on core restart */
-   if (input_changed)
-   {
-      int i;
-      input_changed = 0;
-      update_multitap();
-      for (i = 0; i < 8; i++)
-         SysDLog("Player %d: %s\n", i + 1, get_pse_pad_label[in_type[i]]);
-      SysDLog("Multiplayer 1: %s\n", multitap1 ? "enabled" : "disabled");
-      SysDLog("Multiplayer 2: %s\n", multitap2 ? "enabled" : "disabled");
-   }
-
    //SysReset must be run while core is running,Not in menu (Locks up Retroarch)
    if (rebootemu != 0)
    {
@@ -2559,17 +2560,15 @@ void retro_run(void)
 
 static bool try_use_bios(const char *path)
 {
-   FILE *f;
    long size;
    const char *name;
-
-   f = fopen(path, "rb");
-   if (f == NULL)
+   FILE *fp = fopen(path, "rb");
+   if (fp == NULL)
       return false;
 
-   fseek(f, 0, SEEK_END);
-   size = ftell(f);
-   fclose(f);
+   fseek(fp, 0, SEEK_END);
+   size = ftell(fp);
+   fclose(fp);
 
    if (size != 512 * 1024)
       return false;
@@ -2715,11 +2714,19 @@ static void loadPSXBios(void)
       }
    }
 
-   if (useHLE || !found_bios)
+   if (!found_bios)
    {
-      const char *msg_str = "No PlayStation BIOS file found - add for better compatibility";
-
-      SysPrintf("no BIOS files found.\n");
+      const char *msg_str;
+      if (useHLE)
+      {
+         msg_str = "BIOS set to \'hle\' in core options - real BIOS will be ignored";
+         SysPrintf("Using HLE BIOS.\n");
+      }
+      else
+      {
+         msg_str = "No PlayStation BIOS file found - add for better compatibility";
+         SysPrintf("No BIOS files found.\n");
+      }
 
       if (msg_interface_version >= 1)
       {
@@ -2754,7 +2761,7 @@ void retro_init(void)
    msg_interface_version = 0;
    environ_cb(RETRO_ENVIRONMENT_GET_MESSAGE_INTERFACE_VERSION, &msg_interface_version);
 
-#ifdef __MACH__
+#if defined(__MACH__) && !defined(TVOS)
    // magic sauce to make the dynarec work on iOS
    syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0);
 #endif
@@ -2787,7 +2794,8 @@ void retro_init(void)
 #ifdef _3DS
    vout_buf = linearMemAlign(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2, 0x80);
 #elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && !defined(VITA) && !defined(__SWITCH__)
-   posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);
+   if (posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2) != 0)
+      vout_buf = (void *) 0;
 #else
    vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2);
 #endif