Update mouse device support, add mouse sensitivity option
[pcsx_rearmed.git] / frontend / libretro.c
index 856ea8e..50392a9 100644 (file)
 
 #define INTERNAL_FPS_SAMPLE_PERIOD 64
 
-#ifdef DRC_DISABLE
-int stop;
-u32 next_interupt;
-u32 event_cycles[PSXINT_COUNT];
-int cycle_multiplier;
-int new_dynarec_hacks;
-
-void new_dyna_before_save(void) {}
-void new_dyna_after_save(void) {}
-void new_dyna_freeze(void *f, int i) {}
-#endif
-
 //hack to prevent retroarch freezing when reseting in the menu but not while running with the hot key
 static int rebootemu = 0;
 
@@ -83,6 +71,8 @@ static retro_set_rumble_state_t rumble_cb;
 static struct retro_log_callback logging;
 static retro_log_printf_t log_cb;
 
+static unsigned msg_interface_version = 0;
+
 static void *vout_buf;
 static void *vout_buf_ptr;
 static int vout_width, vout_height;
@@ -100,6 +90,7 @@ static int show_advanced_gpu_peops_settings = -1;
 static int show_advanced_gpu_unai_settings = -1;
 #endif
 static int show_other_input_settings = -1;
+static float mouse_sensitivity = 1.0f;
 
 static unsigned previous_width = 0;
 static unsigned previous_height = 0;
@@ -122,6 +113,7 @@ int in_type[8] = {
 int in_analog_left[8][2] = { { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 } };
 int in_analog_right[8][2] = { { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 }, { 127, 127 } };
 unsigned short in_keystate[PORTS_NUMBER];
+int in_mouse[8][2];
 int multitap1 = 0;
 int multitap2 = 0;
 int in_enable_vibration = 1;
@@ -605,6 +597,8 @@ static void update_controller_port_variable(unsigned port)
          in_type[port] = PSE_PAD_TYPE_NEGCON;
       else if (strcmp(var.value, "guncon") == 0)
          in_type[port] = PSE_PAD_TYPE_GUNCON;
+      else if (strcmp(var.value, "mouse") == 0)
+         in_type[port] = PSE_PAD_TYPE_MOUSE;
       else if (strcmp(var.value, "none") == 0)
          in_type[port] = PSE_PAD_TYPE_NONE;
       // else 'default' case, do nothing
@@ -1242,6 +1236,7 @@ strcasestr(const char *s, const char *find)
 
 static void set_retro_memmap(void)
 {
+#ifndef NDEBUG
    struct retro_memory_map retromap = { 0 };
    struct retro_memory_descriptor mmap = {
       0, psxM, 0, 0, 0, 0, 0x200000
@@ -1251,6 +1246,7 @@ static void set_retro_memmap(void)
    retromap.num_descriptors = 1;
 
    environ_cb(RETRO_ENVIRONMENT_SET_MEMORY_MAPS, &retromap);
+#endif
 }
 
 static void update_variables(bool in_flight);
@@ -2113,6 +2109,13 @@ static void update_variables(bool in_flight)
    }
 #endif /* NEW_DYNAREC */
 
+   var.value = NULL;
+   var.key = "pcsx_rearmed_input_sensitivity";
+   if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+   {
+      mouse_sensitivity = atof(var.value);
+   }
+
    var.key = "pcsx_rearmed_show_other_input_settings";
    var.value = NULL;
 
@@ -2401,6 +2404,32 @@ static void update_input_negcon(int port, int ret)
    in_analog_left[port][1] = get_analog_button(ret, input_state_cb, port, RETRO_DEVICE_ID_JOYPAD_L);
 }
 
+static void update_input_mouse(int port, int ret)
+{
+   float raw_x = input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_X);
+   float raw_y = input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_Y);
+
+   int x = (int)roundf(raw_x * mouse_sensitivity);
+   int y = (int)roundf(raw_y * mouse_sensitivity);
+
+   if (x > 127) x = 127;
+   else if (x < -128) x = -128;
+
+   if (y > 127) y = 127;
+   else if (y < -128) y = -128;
+
+   in_mouse[port][0] = x; /* -128..+128 left/right movement, 0 = no movement */
+   in_mouse[port][1] = y; /* -128..+128 down/up movement, 0 = no movement    */
+
+   /* left mouse button state */
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_LEFT))
+      in_keystate[port] |= 1 << 11;
+
+   /* right mouse button state */
+   if (input_state_cb(port, RETRO_DEVICE_MOUSE, 0, RETRO_DEVICE_ID_MOUSE_RIGHT))
+      in_keystate[port] |= 1 << 10;
+}
+
 static void update_input(void)
 {
    // reset all keystate, query libretro for keystate
@@ -2436,6 +2465,9 @@ static void update_input(void)
       case PSE_PAD_TYPE_NEGCON:
          update_input_negcon(i, ret);
          break;
+      case PSE_PAD_TYPE_MOUSE:
+         update_input_mouse(i, ret);
+         break;      
       default:
          // Query digital inputs
          for (j = 0; j < RETRO_PSX_MAP_LEN; j++)
@@ -2465,10 +2497,6 @@ static void print_internal_fps(void)
          unsigned internal_fps = pl_rearmed_cbs.flip_cnt * (is_pal_mode ? 50 : 60) / INTERNAL_FPS_SAMPLE_PERIOD;
          char str[64];
          const char *strc = (const char *)str;
-         struct retro_message msg = {
-            strc,
-            180
-         };
 
          str[0] = '\0';
 
@@ -2476,7 +2504,27 @@ static void print_internal_fps(void)
 
          pl_rearmed_cbs.flip_cnt = 0;
 
-         environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg);
+         if (msg_interface_version >= 1)
+         {
+            struct retro_message_ext msg = {
+               strc,
+               3000,
+               1,
+               RETRO_LOG_INFO,
+               RETRO_MESSAGE_TARGET_OSD,
+               RETRO_MESSAGE_TYPE_STATUS,
+               -1
+            };
+            environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE_EXT, &msg);
+         }
+         else
+         {
+            struct retro_message msg = {
+               strc,
+               180
+            };
+            environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg);
+         }
       }
    }
    else
@@ -2485,7 +2533,6 @@ static void print_internal_fps(void)
 
 void retro_run(void)
 {
-   int i;
    //SysReset must be run while core is running,Not in menu (Locks up Retroarch)
    if (rebootemu != 0)
    {
@@ -2678,12 +2725,31 @@ static void loadPSXBios(void)
 
    if (useHLE || !found_bios)
    {
+      const char *msg_str = "No PlayStation BIOS file found - add for better compatibility";
+
       SysPrintf("no BIOS files found.\n");
-      struct retro_message msg = {
-         "No PlayStation BIOS file found - add for better compatibility",
-         180
-      };
-      environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, (void *)&msg);
+
+      if (msg_interface_version >= 1)
+      {
+         struct retro_message_ext msg = {
+            msg_str,
+            3000,
+            3,
+            RETRO_LOG_WARN,
+            RETRO_MESSAGE_TARGET_ALL,
+            RETRO_MESSAGE_TYPE_NOTIFICATION,
+            -1
+         };
+         environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE_EXT, &msg);
+      }
+      else
+      {
+         struct retro_message msg = {
+            msg_str,
+            180
+         };
+         environ_cb(RETRO_ENVIRONMENT_SET_MESSAGE, &msg);
+      }
    }
 }
 
@@ -2693,6 +2759,9 @@ void retro_init(void)
    struct retro_rumble_interface rumble;
    int ret;
 
+   msg_interface_version = 0;
+   environ_cb(RETRO_ENVIRONMENT_GET_MESSAGE_INTERFACE_VERSION, &msg_interface_version);
+
 #ifdef __MACH__
    // magic sauce to make the dynarec work on iOS
    syscall(SYS_ptrace, 0 /*PTRACE_TRACEME*/, 0, 0, 0);