+static int controller_port_variable(unsigned port, struct retro_variable *var)
+{
+ if (port >= PORTS_NUMBER)
+ return 0;
+
+ if (!environ_cb)
+ return 0;
+
+ var->value = NULL;
+ switch (port) {
+ case 0:
+ var->key = "pcsx_rearmed_pad1type";
+ break;
+ case 1:
+ var->key = "pcsx_rearmed_pad2type";
+ break;
+ case 2:
+ var->key = "pcsx_rearmed_pad3type";
+ break;
+ case 3:
+ var->key = "pcsx_rearmed_pad4type";
+ break;
+ case 4:
+ var->key = "pcsx_rearmed_pad5type";
+ break;
+ case 5:
+ var->key = "pcsx_rearmed_pad6type";
+ break;
+ case 6:
+ var->key = "pcsx_rearmed_pad7type";
+ break;
+ case 7:
+ var->key = "pcsx_rearmed_pad8type";
+ break;
+ }
+
+ return environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, var) || var->value;
+}
+
+static void update_controller_port_variable(unsigned port)
+{
+ if (port >= PORTS_NUMBER)
+ return;
+
+ struct retro_variable var;
+
+ if (controller_port_variable(port, &var))
+ {
+ if (strcmp(var.value, "standard") == 0)
+ in_type[port] = PSE_PAD_TYPE_STANDARD;
+ else if (strcmp(var.value, "analog") == 0)
+ in_type[port] = PSE_PAD_TYPE_ANALOGPAD;
+ else if (strcmp(var.value, "negcon") == 0)
+ in_type[port] = PSE_PAD_TYPE_NEGCON;
+ else if (strcmp(var.value, "none") == 0)
+ in_type[port] = PSE_PAD_TYPE_NONE;
+ // else 'default' case, do nothing
+ }
+}
+
+static void update_controller_port_device(unsigned port, unsigned device)
+{
+ if (port >= PORTS_NUMBER)
+ return;
+
+ struct retro_variable var;
+
+ if (!controller_port_variable(port, &var))
+ return;
+
+ if (strcmp(var.value, "default") != 0)
+ return;
+
+ switch (device)
+ {
+ case RETRO_DEVICE_JOYPAD:
+ in_type[port] = PSE_PAD_TYPE_STANDARD;
+ break;
+ case RETRO_DEVICE_ANALOG:
+ in_type[port] = PSE_PAD_TYPE_ANALOGPAD;
+ break;
+ case RETRO_DEVICE_MOUSE:
+ in_type[port] = PSE_PAD_TYPE_MOUSE;
+ break;
+ case RETRO_DEVICE_LIGHTGUN:
+ in_type[port] = PSE_PAD_TYPE_GUN;
+ break;
+ case RETRO_DEVICE_NONE:
+ default:
+ in_type[port] = PSE_PAD_TYPE_NONE;
+ }
+}
+
+static void update_multitap()
+{
+ 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;
+
+ 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;
+ }
+
+ var.value = NULL;
+ var.key = "pcsx_rearmed_multitap2";
+ auto_case = 0;
+ if (environ_cb && (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) || var.value))
+ {
+ if (strcmp(var.value, "enabled") == 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;
+ }
+}
+