#include "omap.h"
#include "common/plat.h"
#include "../libpcsxcore/misc.h"
-#include "../libpcsxcore/new_dynarec/new_dynarec.h"
+#include "../libpcsxcore/psemu_plugin_defs.h"
#include "revision.h"
#define MENU_X2 1
static int scaling, filter, state_slot, cpu_clock, cpu_clock_st;
static char rom_fname_reload[MAXPATHLEN];
static char last_selected_fname[MAXPATHLEN];
-static int region;
+static int region, in_type_sel;
int g_opts;
// from softgpu plugin
Config.PsxAuto = 0;
Config.PsxType = region - 1;
}
- pl_frame_interval = Config.PsxType ? 20000 : 16667;
+ in_type = in_type_sel ? PSE_PAD_TYPE_ANALOGPAD : PSE_PAD_TYPE_STANDARD;
+ pl_frame_interval = Config.PsxType ? 20000 : 16667;
// used by P.E.Op.S. frameskip code
fFrameRateHz = Config.PsxType ? 50.0f : 59.94f;
dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100));
scaling = SCALE_4_3;
region = 0;
+ in_type_sel = 0;
Config.Xa = Config.Cdda = Config.Sio =
Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
- iUseDither = UseFrameSkip = 0;
+ iUseDither = 0;
+ UseFrameSkip = 1;
dwActFixes = 1<<7;
iUseReverb = 2;
CE_INTVAL(state_slot),
CE_INTVAL(cpu_clock),
CE_INTVAL(g_opts),
+ CE_INTVAL(in_type_sel),
CE_INTVAL(iUseDither),
CE_INTVAL(UseFrameSkip),
CE_INTVAL(dwActFixes),
snprintf(buf, size, "." PCSX_DOT_DIR "%s", cfgfile_basename);
}
+static void keys_write_all(FILE *f);
+
static int menu_write_config(int is_game)
{
char cfgfile[MAXPATHLEN];
if (!is_game)
fprintf(f, "lastcdimg = %s\n", last_selected_fname);
+ keys_write_all(f);
fclose(f);
+
return 0;
}
*tmp = 0;
}
+static void keys_load_all(const char *cfg);
+
static int menu_load_config(int is_game)
{
char cfgfile[MAXPATHLEN];
if (strcmp(Config.Spu, spu_plugins[i]) == 0)
{ spu_plugsel = i; break; }
+ keys_load_all(cfg);
ret = 0;
fail_read:
free(cfg);
{ "R1 ", 1 << DKEY_R1 },
{ "L2 ", 1 << DKEY_L2 },
{ "R2 ", 1 << DKEY_R2 },
+ { "L3 ", 1 << DKEY_L3 },
+ { "R3 ", 1 << DKEY_R3 },
{ "START ", 1 << DKEY_START },
{ "SELECT ", 1 << DKEY_SELECT },
{ NULL, 0 }
{ NULL, 0 }
};
+static char *mystrip(char *str)
+{
+ int i, len;
+
+ len = strlen(str);
+ for (i = 0; i < len; i++)
+ if (str[i] != ' ') break;
+ if (i > 0) memmove(str, str + i, len - i + 1);
+
+ len = strlen(str);
+ for (i = len - 1; i >= 0; i--)
+ if (str[i] != ' ') break;
+ str[i+1] = 0;
+
+ return str;
+}
+
+static void get_line(char *d, size_t size, const char *s)
+{
+ const char *pe;
+ size_t len;
+
+ for (pe = s; *pe != '\r' && *pe != '\n' && *pe != 0; pe++)
+ ;
+ len = pe - s;
+ if (len > size - 1)
+ len = size - 1;
+ strncpy(d, s, len);
+ d[len] = 0;
+
+ mystrip(d);
+}
+
+static void keys_write_all(FILE *f)
+{
+ int d;
+
+ for (d = 0; d < IN_MAX_DEVS; d++)
+ {
+ const int *binds = in_get_dev_binds(d);
+ const char *name = in_get_dev_name(d, 0, 0);
+ int k, count = 0;
+
+ if (binds == NULL || name == NULL)
+ continue;
+
+ fprintf(f, "binddev = %s\n", name);
+ in_get_config(d, IN_CFG_BIND_COUNT, &count);
+
+ for (k = 0; k < count; k++)
+ {
+ int i, kbinds, mask;
+ char act[32];
+
+ act[0] = act[31] = 0;
+ name = in_get_key_name(d, k);
+
+ kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_PLAYER12)];
+ for (i = 0; kbinds && i < ARRAY_SIZE(me_ctrl_actions) - 1; i++) {
+ mask = me_ctrl_actions[i].mask;
+ if (mask & kbinds) {
+ strncpy(act, me_ctrl_actions[i].name, 31);
+ fprintf(f, "bind %s = player1 %s\n", name, mystrip(act));
+ kbinds &= ~mask;
+ }
+ mask = me_ctrl_actions[i].mask << 16;
+ if (mask & kbinds) {
+ strncpy(act, me_ctrl_actions[i].name, 31);
+ fprintf(f, "bind %s = player2 %s\n", name, mystrip(act));
+ kbinds &= ~mask;
+ }
+ }
+
+ kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_EMU)];
+ for (i = 0; kbinds && i < ARRAY_SIZE(emuctrl_actions) - 1; i++) {
+ mask = emuctrl_actions[i].mask;
+ if (mask & kbinds) {
+ strncpy(act, emuctrl_actions[i].name, 31);
+ fprintf(f, "bind %s = %s\n", name, mystrip(act));
+ kbinds &= ~mask;
+ }
+ }
+ }
+ }
+}
+
+static int parse_bind_val(const char *val, int *type)
+{
+ int i;
+
+ *type = IN_BINDTYPE_NONE;
+ if (val[0] == 0)
+ return 0;
+
+ if (strncasecmp(val, "player", 6) == 0)
+ {
+ int player, shift = 0;
+ player = atoi(val + 6) - 1;
+
+ if ((unsigned int)player > 1)
+ return -1;
+ if (player == 1)
+ shift = 16;
+
+ *type = IN_BINDTYPE_PLAYER12;
+ for (i = 0; me_ctrl_actions[i].name != NULL; i++) {
+ if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0)
+ return me_ctrl_actions[i].mask << shift;
+ }
+ }
+ for (i = 0; emuctrl_actions[i].name != NULL; i++) {
+ if (strncasecmp(emuctrl_actions[i].name, val, strlen(val)) == 0) {
+ *type = IN_BINDTYPE_EMU;
+ return emuctrl_actions[i].mask;
+ }
+ }
+
+ return -1;
+}
+
+static void keys_load_all(const char *cfg)
+{
+ char dev[256], key[128], *act;
+ const char *p;
+ int bind, bindtype;
+ int dev_id;
+
+ p = cfg;
+ while (p != NULL && (p = strstr(p, "binddev = ")) != NULL) {
+ p += 10;
+
+ get_line(dev, sizeof(dev), p);
+ dev_id = in_config_parse_dev(dev);
+ if (dev_id < 0) {
+ printf("input: can't handle dev: %s\n", dev);
+ continue;
+ }
+
+ in_unbind_all(dev_id, -1, -1);
+ while ((p = strstr(p, "bind"))) {
+ if (strncmp(p, "binddev = ", 10) == 0)
+ break;
+
+ p += 4;
+ if (*p != ' ') {
+ printf("input: parse error: %16s..\n", p);
+ continue;
+ }
+
+ get_line(key, sizeof(key), p);
+ act = strchr(key, '=');
+ if (act == NULL) {
+ printf("parse failed: %16s..\n", p);
+ continue;
+ }
+ *act = 0;
+ act++;
+ mystrip(key);
+ mystrip(act);
+
+ bind = parse_bind_val(act, &bindtype);
+ if (bind != -1 && bind != 0) {
+ printf("bind #%d '%s' %08x (%s)\n", dev_id, key, bind, act);
+ in_config_bind_key(dev_id, key, bind, bindtype);
+ }
+ else
+ lprintf("config: unhandled action \"%s\"\n", act);
+ }
+ }
+}
+
static int key_config_loop_wrap(int id, int keys)
{
switch (id) {
return 1;
}
+static const char *men_in_type_sel[] = { "Standard (SCPH-1080)", "Analog (SCPH-1150)", NULL };
+
static menu_entry e_menu_keyconfig[] =
{
mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap),
mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap),
mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
-// mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
-// mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
+ mee_label (""),
+ mee_enum ("Controller", 0, in_type_sel, men_in_type_sel),
+ mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
+ mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
mee_label (""),
mee_label ("Input devices:"),
mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
return "PCSX-ReARMed\n\n"
"(C) 1999-2003 PCSX Team\n"
"(C) 2005-2009 PCSX-df Team\n"
- "(C) 2009-2010 PCSX-Reloaded Team\n\n"
+ "(C) 2009-2011 PCSX-Reloaded Team\n\n"
"GPU and SPU code by Pete Bernert\n"
" and the P.E.Op.S. team\n"
- "ARM recompiler (C) 2009-2010 Ari64\n"
+ "ARM recompiler (C) 2009-2011 Ari64\n"
"PCSX4ALL plugins by PCSX4ALL team\n"
" Chui, Franxis, Unai\n\n"
"integration, optimization and\n"
}
apply_filter(filter);
apply_cpu_clock();
- stop = 0;
psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
if (psxCpu != prev_cpu)