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
drv->feed = snd_feed;
}
+#define RETRO_DEVICE_PSE_STANDARD RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_JOYPAD, 0)
+#define RETRO_DEVICE_PSE_ANALOG RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 0)
+#define RETRO_DEVICE_PSE_DUALSHOCK RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 1)
+#define RETRO_DEVICE_PSE_NEGCON RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_ANALOG, 2)
+#define RETRO_DEVICE_PSE_GUNCON RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_LIGHTGUN, 0)
+#define RETRO_DEVICE_PSE_MOUSE RETRO_DEVICE_SUBCLASS(RETRO_DEVICE_MOUSE, 0)
+
+static char *get_pse_pad_label[] = {
+ "none", "mouse", "negcon", "konami gun", "standard", "analog", "guncon", "dualshock"
+};
+
+static const struct retro_controller_description pads[7] =
+{
+ { "standard", RETRO_DEVICE_JOYPAD },
+ { "analog", RETRO_DEVICE_PSE_ANALOG },
+ { "dualshock", RETRO_DEVICE_PSE_DUALSHOCK },
+ { "negcon", RETRO_DEVICE_PSE_NEGCON },
+ { "guncon", RETRO_DEVICE_PSE_GUNCON },
+ { "mouse", RETRO_DEVICE_PSE_MOUSE },
+ { NULL, 0 },
+};
+
+static const struct retro_controller_info ports[9] =
+{
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { pads, 7 },
+ { NULL, 0 },
+};
+
/* libretro */
void retro_set_environment(retro_environment_t cb)
{
if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logging))
log_cb = logging.log;
+ environ_cb(RETRO_ENVIRONMENT_SET_CONTROLLER_INFO, (void*)ports);
libretro_set_core_options(environ_cb);
}
return RETRO_API_VERSION;
}
-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_ANALOGJOY;
- else if (strcmp(var.value, "dualshock") == 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, "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
- }
-}
-
-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()
+static void update_multitap(void)
{
struct retro_variable var;
int auto_case, port;
void retro_set_controller_port_device(unsigned port, unsigned device)
{
- SysPrintf("port %u device %u", port, device);
-
if (port >= PORTS_NUMBER)
return;
- update_controller_port_device(port, device);
- update_multitap();
+ switch (device)
+ {
+ case RETRO_DEVICE_JOYPAD:
+ case RETRO_DEVICE_PSE_STANDARD:
+ in_type[port] = PSE_PAD_TYPE_STANDARD;
+ break;
+ case RETRO_DEVICE_PSE_ANALOG:
+ in_type[port] = PSE_PAD_TYPE_ANALOGJOY;
+ break;
+ case RETRO_DEVICE_PSE_DUALSHOCK:
+ in_type[port] = PSE_PAD_TYPE_ANALOGPAD;
+ break;
+ case RETRO_DEVICE_PSE_MOUSE:
+ in_type[port] = PSE_PAD_TYPE_MOUSE;
+ break;
+ case RETRO_DEVICE_PSE_NEGCON:
+ in_type[port] = PSE_PAD_TYPE_NEGCON;
+ break;
+ case RETRO_DEVICE_PSE_GUNCON:
+ in_type[port] = PSE_PAD_TYPE_GUNCON;
+ break;
+ case RETRO_DEVICE_NONE:
+ default:
+ in_type[port] = PSE_PAD_TYPE_NONE;
+ break;
+ }
+
+ SysPrintf("port: %u device: %s\n", port + 1, get_pse_pad_label[in_type[port]]);
}
void retro_get_system_info(struct retro_system_info *info)
}
plugin_call_rearmed_cbs();
- dfinput_activate();
+ /* dfinput_activate(); */
if (CheckCdrom() == -1)
{
set_retro_memmap();
+ input_changed = 1;
+
return true;
}
static void update_variables(bool in_flight)
{
struct retro_variable var;
- int i;
#ifdef GPU_PEOPS
int gpu_peops_fix = 0;
#endif
Config.PsxType = 1;
}
- for (i = 0; i < PORTS_NUMBER; i++)
- update_controller_port_variable(i);
+ /*for (i = 0; i < PORTS_NUMBER; i++)
+ update_controller_port_variable(i);*/
update_multitap();
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
Config.SpuIrq = 1;
}
+#ifdef THREAD_RENDERING
+ var.key = "pcsx_rearmed_gpu_thread_rendering";
+ var.value = NULL;
+
+ if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value)
+ {
+ if (strcmp(var.value, "disabled") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_OFF;
+ else if (strcmp(var.value, "sync") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_SYNC;
+ else if (strcmp(var.value, "async") == 0)
+ pl_rearmed_cbs.thread_rendering = THREAD_RENDERING_ASYNC;
+ }
+#endif
+
#ifdef GPU_PEOPS
var.value = NULL;
var.key = "pcsx_rearmed_gpu_peops_odd_even_bit";
"pcsx_rearmed_gpu_unai_fast_lighting",
"pcsx_rearmed_gpu_unai_ilace_force",
"pcsx_rearmed_gpu_unai_pixel_skip",
- "pcsx_rearmed_gpu_unai_scale_hires"
+ "pcsx_rearmed_gpu_unai_scale_hires",
};
option_display.visible = show_advanced_gpu_unai_settings;
char gpu_peops_option[][50] = {
"pcsx_rearmed_multitap1",
"pcsx_rearmed_multitap2",
- "pcsx_rearmed_pad3type",
- "pcsx_rearmed_pad4type",
- "pcsx_rearmed_pad5type",
- "pcsx_rearmed_pad6type",
- "pcsx_rearmed_pad7type",
- "pcsx_rearmed_pad8type",
"pcsx_rearmed_negcon_deadzone",
"pcsx_rearmed_negcon_response",
"pcsx_rearmed_analog_axis_modifier",
GPU_open(&gpuDisp, "PCSX", NULL);
}
- dfinput_activate();
+ /* dfinput_activate(); */
}
else
{
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)
{
// skip BIOS logos
psxRegs.pc = psxRegs.GPR.n.ra;
}
+ return;
}
print_internal_fps();
* we have to do this because cache misses and some IO penalties
* are not emulated. Warning: changing this may break compatibility. */
cycle_multiplier = 175;
-#ifdef HAVE_PRE_ARMV7
+#if defined(HAVE_PRE_ARMV7) && !defined(_3DS)
cycle_multiplier = 200;
#endif
pl_rearmed_cbs.gpu_peops.iUseDither = 1;