adjust bios handling again
[pcsx_rearmed.git] / frontend / libretro.c
index 15c53a3..60fff5d 100644 (file)
@@ -501,7 +501,7 @@ struct rearmed_cbs pl_rearmed_cbs = {
 void pl_frame_limit(void)
 {
    /* called once per frame, make psxCpu->Execute() above return */
-   stop = 1;
+   stop++;
 }
 
 void pl_timing_prepare(int is_pal)
@@ -1936,6 +1936,8 @@ static void update_variables(bool in_flight)
          display_internal_fps = true;
    }
 
+   //
+   // CPU emulation related config
 #ifndef DRC_DISABLE
    var.value = NULL;
    var.key = "pcsx_rearmed_drc";
@@ -1964,54 +1966,77 @@ static void update_variables(bool in_flight)
       psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
       if (psxCpu != prev_cpu)
       {
+         prev_cpu->Notify(R3000ACPU_NOTIFY_BEFORE_SAVE, NULL);
          prev_cpu->Shutdown();
          psxCpu->Init();
-         psxCpu->Reset(); // not really a reset..
+         psxCpu->Reset();
+         psxCpu->Notify(R3000ACPU_NOTIFY_AFTER_LOAD, NULL);
       }
    }
 #endif /* !DRC_DISABLE */
-   psxCpu->ApplyConfig();
 
    var.value = NULL;
-   var.key = "pcsx_rearmed_spu_reverb";
+   var.key = "pcsx_rearmed_psxclock";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      int psxclock = atoi(var.value);
+      Config.cycle_multiplier = 10000 / psxclock;
+   }
 
+#if !defined(DRC_DISABLE) && !defined(LIGHTREC)
+   var.value = NULL;
+   var.key = "pcsx_rearmed_nosmccheck";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
-      if (strcmp(var.value, "disabled") == 0)
-         spu_config.iUseReverb = false;
-      else if (strcmp(var.value, "enabled") == 0)
-         spu_config.iUseReverb = true;
+      if (strcmp(var.value, "enabled") == 0)
+         new_dynarec_hacks |= NDHACK_NO_SMC_CHECK;
+      else
+         new_dynarec_hacks &= ~NDHACK_NO_SMC_CHECK;
    }
 
    var.value = NULL;
-   var.key = "pcsx_rearmed_spu_interpolation";
+   var.key = "pcsx_rearmed_gteregsunneeded";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "enabled") == 0)
+         new_dynarec_hacks |= NDHACK_GTE_UNNEEDED;
+      else
+         new_dynarec_hacks &= ~NDHACK_GTE_UNNEEDED;
+   }
 
+   var.value = NULL;
+   var.key = "pcsx_rearmed_nogteflags";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
-      if (strcmp(var.value, "simple") == 0)
-         spu_config.iUseInterpolation = 1;
-      else if (strcmp(var.value, "gaussian") == 0)
-         spu_config.iUseInterpolation = 2;
-      else if (strcmp(var.value, "cubic") == 0)
-         spu_config.iUseInterpolation = 3;
-      else if (strcmp(var.value, "off") == 0)
-         spu_config.iUseInterpolation = 0;
+      if (strcmp(var.value, "enabled") == 0)
+         new_dynarec_hacks |= NDHACK_GTE_NO_FLAGS;
+      else
+         new_dynarec_hacks &= ~NDHACK_GTE_NO_FLAGS;
    }
 
    var.value = NULL;
-   var.key = "pcsx_rearmed_pe2_fix";
+   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, "disabled") == 0)
-         Config.RCntFix = 0;
-      else if (strcmp(var.value, "enabled") == 0)
-         Config.RCntFix = 1;
+      if (strcmp(var.value, "enabled") == 0)
+         Config.DisableStalls = 1;
+      else
+         Config.DisableStalls = 0;
    }
-   
+
    var.value = NULL;
    var.key = "pcsx_rearmed_icache_emulation";
-
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "disabled") == 0)
@@ -2020,15 +2045,45 @@ static void update_variables(bool in_flight)
          Config.icache_emulation = 1;
    }
 
+   psxCpu->ApplyConfig();
+
+   // end of CPU emu config
+   //
+
    var.value = NULL;
-   var.key = "pcsx_rearmed_inuyasha_fix";
+   var.key = "pcsx_rearmed_spu_reverb";
 
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "disabled") == 0)
-         Config.VSyncWA = 0;
+         spu_config.iUseReverb = false;
       else if (strcmp(var.value, "enabled") == 0)
-         Config.VSyncWA = 1;
+         spu_config.iUseReverb = true;
+   }
+
+   var.value = NULL;
+   var.key = "pcsx_rearmed_spu_interpolation";
+
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "simple") == 0)
+         spu_config.iUseInterpolation = 1;
+      else if (strcmp(var.value, "gaussian") == 0)
+         spu_config.iUseInterpolation = 2;
+      else if (strcmp(var.value, "cubic") == 0)
+         spu_config.iUseInterpolation = 3;
+      else if (strcmp(var.value, "off") == 0)
+         spu_config.iUseInterpolation = 0;
+   }
+
+   var.value = NULL;
+   var.key = "pcsx_rearmed_spu_thread";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      if (strcmp(var.value, "enabled") == 0)
+         spu_config.iUseThread = 1;
+      else
+         spu_config.iUseThread = 0;
    }
 
 #ifndef _WIN32
@@ -2075,13 +2130,15 @@ static void update_variables(bool in_flight)
    }
 
    var.value = NULL;
-   var.key = "pcsx_rearmed_spuirq";
+   var.key = "pcsx_rearmed_gpu_slow_llists";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
    {
       if (strcmp(var.value, "disabled") == 0)
-         Config.SpuIrq = 0;
-      else
-         Config.SpuIrq = 1;
+        Config.GpuListWalking = 0;
+      else if (strcmp(var.value, "enabled") == 0)
+        Config.GpuListWalking = 1;
+      else // auto
+        Config.GpuListWalking = -1;
    }
 
 #ifdef THREAD_RENDERING
@@ -2267,67 +2324,6 @@ static void update_variables(bool in_flight)
       GunconAdjustRatioY = atof(var.value);
    }
 
-#if !defined(DRC_DISABLE) && !defined(LIGHTREC)
-   var.value = NULL;
-   var.key = "pcsx_rearmed_nosmccheck";
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
-   {
-      if (strcmp(var.value, "enabled") == 0)
-         new_dynarec_hacks |= NDHACK_NO_SMC_CHECK;
-      else
-         new_dynarec_hacks &= ~NDHACK_NO_SMC_CHECK;
-   }
-
-   var.value = NULL;
-   var.key = "pcsx_rearmed_gteregsunneeded";
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
-   {
-      if (strcmp(var.value, "enabled") == 0)
-         new_dynarec_hacks |= NDHACK_GTE_UNNEEDED;
-      else
-         new_dynarec_hacks &= ~NDHACK_GTE_UNNEEDED;
-   }
-
-   var.value = NULL;
-   var.key = "pcsx_rearmed_nogteflags";
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
-   {
-      if (strcmp(var.value, "enabled") == 0)
-         new_dynarec_hacks |= NDHACK_GTE_NO_FLAGS;
-      else
-         new_dynarec_hacks &= ~NDHACK_GTE_NO_FLAGS;
-   }
-
-   /* this probably is safe to change in real-time */
-   var.value = NULL;
-   var.key = "pcsx_rearmed_psxclock";
-   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
-   {
-      int psxclock = atoi(var.value);
-      cycle_multiplier = 10000 / psxclock;
-   }
-
-   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";
    if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
@@ -2437,17 +2433,19 @@ static void update_input_guncon(int port, int ret)
    //Mouse range is -32767 -> 32767
    //1% is about 655
    //Use the left analog stick field to store the absolute coordinates
-   //Fix cursor to top-left when gun is detected as "offscreen"
+
+   int gunx = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X);
+   int guny = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y);
+
+   //Have the Libretro API let /libpcsxcore/plugins.c know when the lightgun is pointed offscreen
+   //Offscreen value is chosen to be well out of range of any possible scaling done via core options
    if (input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_IS_OFFSCREEN) || input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_RELOAD))
    {
-      in_analog_left[port][0] = -32767;
-      in_analog_left[port][1] = -32767;
+      in_analog_left[port][0] = (65536 - 512) * 64;
+      in_analog_left[port][1] = (65536 - 512) * 64;
    }
    else
    {
-      int gunx = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_X);
-      int guny = input_state_cb(port, RETRO_DEVICE_LIGHTGUN, 0, RETRO_DEVICE_ID_LIGHTGUN_SCREEN_Y);
-          
       in_analog_left[port][0] = (gunx * GunconAdjustRatioX) + (GunconAdjustX * 655);
       in_analog_left[port][1] = (guny * GunconAdjustRatioY) + (GunconAdjustY * 655);
    }
@@ -2712,12 +2710,6 @@ void retro_run(void)
    {
       rebootemu = 0;
       SysReset();
-      if (!Config.HLE && !Config.SlowBoot)
-      {
-         // skip BIOS logos
-         psxRegs.pc = psxRegs.GPR.n.ra;
-      }
-      return;
    }
 
    print_internal_fps();
@@ -3049,9 +3041,9 @@ void retro_init(void)
    /* Set how much slower PSX CPU runs * 100 (so that 200 is 2 times)
     * we have to do this because cache misses and some IO penalties
     * are not emulated. Warning: changing this may break compatibility. */
-   cycle_multiplier = 175;
+   Config.cycle_multiplier = CYCLE_MULT_DEFAULT;
 #if defined(HAVE_PRE_ARMV7) && !defined(_3DS)
-   cycle_multiplier = 200;
+   Config.cycle_multiplier = 200;
 #endif
    pl_rearmed_cbs.gpu_peops.iUseDither = 1;
    pl_rearmed_cbs.gpu_peops.dwActFixes = GPU_PEOPS_OLD_FRAME_SKIP;