libretro: add dynarec switch
[pcsx_rearmed.git] / frontend / libretro.c
index 103ee8e..23eecf6 100644 (file)
@@ -242,6 +242,10 @@ void retro_set_environment(retro_environment_t cb)
    static const struct retro_variable vars[] = {
       { "frameskip", "Frameskip; 0|1|2|3" },
       { "region", "Region; Auto|NTSC|PAL" },
+      { "pad1type", "Pad 1 Type; standard|analog" },
+#ifndef DRC_DISABLE
+      { "rearmed_drc", "Dynamic recompiler; enabled|disabled" },
+#endif
 #ifdef __ARM_NEON__
       { "neon_interlace_enable", "Enable interlacing mode(s); disabled|enabled" },
       { "neon_enhancement_enable", "Enhanced resolution (slow); disabled|enabled" },
@@ -785,6 +789,17 @@ static void update_variables(bool in_flight)
       else if (strcmp(var.value, "PAL") == 0)
          Config.PsxType = 1;
    }
+
+   var.value = NULL;
+   var.key = "pad1type";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      in_type1 = PSE_PAD_TYPE_STANDARD;
+      if (strcmp(var.value, "analog") == 0)
+         in_type1 = PSE_PAD_TYPE_ANALOGPAD;
+   }
+
 #ifdef __ARM_NEON__
    var.value = "NULL";
    var.key = "neon_interlace_enable";
@@ -819,6 +834,27 @@ static void update_variables(bool in_flight)
          pl_rearmed_cbs.gpu_neon.enhancement_no_main = 1;
    }
 #endif
+#ifndef DRC_DISABLE
+   var.value = NULL;
+   var.key = "rearmed_drc";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value)
+   {
+      R3000Acpu *prev_cpu = psxCpu;
+
+      if (strcmp(var.value, "disabled") == 0)
+         Config.Cpu = CPU_INTERPRETER;
+      else if (strcmp(var.value, "enabled") == 0)
+         Config.Cpu = CPU_DYNAREC;
+
+      psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
+      if (psxCpu != prev_cpu) {
+         prev_cpu->Shutdown();
+         psxCpu->Init();
+         psxCpu->Reset(); // not really a reset..
+      }
+   }
+#endif
 
        if (in_flight) {
                // inform core things about possible config changes
@@ -852,6 +888,14 @@ void retro_run(void)
                if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, i))
                        in_keystate |= retro_psx_map[i];
 
+   if (in_type1 == PSE_PAD_TYPE_ANALOGPAD)
+   {
+      in_a1[0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128;
+      in_a1[1] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_LEFT, RETRO_DEVICE_ID_ANALOG_Y) / 256) + 128;
+      in_a2[0] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_X) / 256) + 128;
+      in_a2[1] = (input_state_cb(0, RETRO_DEVICE_ANALOG, RETRO_DEVICE_INDEX_ANALOG_RIGHT, RETRO_DEVICE_ID_ANALOG_Y) / 256) + 128;
+   }
+
        stop = 0;
        psxCpu->Execute();