X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=77629059137ee6e9a024e6500d233bfabf69ff25;hp=ea1ebe516aef93aefb196a14a0ea2bee8b84a3d8;hb=cdb31c9557f464b452ce6dc78b58b7e73cd423d8;hpb=907b1e90dff65f404907aeff405742030b62671e diff --git a/frontend/menu.c b/frontend/menu.c index ea1ebe51..77629059 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -22,7 +22,7 @@ #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 @@ -60,10 +60,10 @@ enum { }; static int last_psx_w, last_psx_h, last_psx_bpp; -static int scaling, filter, state_slot, cpu_clock, cpu_clock_st; +static int scaling, filter, 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 @@ -103,28 +103,16 @@ void emu_make_path(char *buff, const char *end, int size) static int emu_check_save_file(int slot) { - char fname[MAXPATHLEN]; - int ret; - - ret = get_state_filename(fname, sizeof(fname), slot); - if (ret != 0) - return 0; - - ret = CheckState(fname); + int ret = emu_check_state(slot); return ret == 0 ? 1 : 0; } -static int emu_save_load_game(int load, int sram) +static int emu_save_load_game(int load, int unused) { - char fname[MAXPATHLEN]; int ret; - ret = get_state_filename(fname, sizeof(fname), state_slot); - if (ret != 0) - return 0; - if (load) { - ret = LoadState(fname); + ret = emu_load_state(state_slot); // reflect hle/bios mode from savestate if (Config.HLE) @@ -134,7 +122,7 @@ static int emu_save_load_game(int load, int sram) bios_sel = 1; } else - ret = SaveState(fname); + ret = emu_save_state(state_slot); return ret; } @@ -147,8 +135,9 @@ static void menu_sync_config(void) 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)); @@ -160,15 +149,18 @@ static void menu_set_defconfig(void) 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; iUseInterpolation = 1; - iXAPitch = iSPUIRQWait = 0; + iXAPitch = 0; + iSPUIRQWait = 1; iUseTimer = 2; menu_sync_config(); @@ -186,6 +178,10 @@ static void menu_set_defconfig(void) #define CE_INTVAL(val) \ { #val, sizeof(val), &val } +// 'versioned' var, used when defaults change +#define CE_INTVAL_V(val, ver) \ + { #val #ver, sizeof(val), &val } + static const struct { const char *name; size_t len; @@ -215,13 +211,14 @@ static const struct { 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), CE_INTVAL(iUseReverb), - CE_INTVAL(iUseInterpolation), CE_INTVAL(iXAPitch), - CE_INTVAL(iSPUIRQWait), + CE_INTVAL_V(iUseInterpolation, 2), + CE_INTVAL_V(iSPUIRQWait, 2), CE_INTVAL(iUseTimer), }; @@ -247,6 +244,8 @@ static void make_cfg_fname(char *buf, size_t size, int is_game) 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]; @@ -285,7 +284,9 @@ static int menu_write_config(int is_game) if (!is_game) fprintf(f, "lastcdimg = %s\n", last_selected_fname); + keys_write_all(f); fclose(f); + return 0; } @@ -301,6 +302,8 @@ static void parse_str_val(char *cval, const char *src) *tmp = 0; } +static void keys_load_all(const char *cfg); + static int menu_load_config(int is_game) { char cfgfile[MAXPATHLEN]; @@ -396,6 +399,7 @@ static int menu_load_config(int is_game) if (strcmp(Config.Spu, spu_plugins[i]) == 0) { spu_plugsel = i; break; } + keys_load_all(cfg); ret = 0; fail_read: free(cfg); @@ -643,6 +647,8 @@ me_bind_action me_ctrl_actions[] = { "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 } @@ -650,16 +656,186 @@ me_bind_action me_ctrl_actions[] = me_bind_action emuctrl_actions[] = { -/* - { "Load State ", PEV_STATE_LOAD }, - { "Save State ", PEV_STATE_SAVE }, - { "Prev Save Slot ", PEV_SSLOT_PREV }, - { "Next Save Slot ", PEV_SSLOT_NEXT }, -*/ - { "Enter Menu ", PEV_MENU }, + { "Save State ", 1 << SACTION_SAVE_STATE }, + { "Load State ", 1 << SACTION_LOAD_STATE }, + { "Prev Save Slot ", 1 << SACTION_PREV_SSLOT }, + { "Next Save Slot ", 1 << SACTION_NEXT_SSLOT }, + { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP }, + { "Enter Menu ", 1 << SACTION_ENTER_MENU }, { 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) { @@ -711,13 +887,17 @@ static int mh_savecfg(int id, int keys) 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), @@ -851,7 +1031,7 @@ static int menu_loop_plugin_gpu(int id, int keys) static const char *men_spu_reverb[] = { "Off", "Fake", "On", NULL }; static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL }; -static const char h_spu_irq_wait[] = "Wait for CPU; only useful for some games, may cause glitches"; +static const char h_spu_irq_wait[] = "Wait for CPU (recommended set to ON)"; static const char h_spu_thread[] = "Run sound emulation in main thread (recommended)"; static menu_entry e_menu_plugin_spu[] = @@ -907,7 +1087,7 @@ static int menu_loop_plugin_options(int id, int keys) // ------------ adv options menu ------------ -static const char h_cfg_cpul[] = "Shows CPU usage in %%"; +static const char h_cfg_cpul[] = "Shows CPU usage in %"; static const char h_cfg_fl[] = "Frame Limiter keeps the game from running too fast"; static const char h_cfg_xa[] = "Disables XA sound, which can sometimes improve performance"; static const char h_cfg_cdda[] = "Disable CD Audio for a performance boost\n" @@ -1037,10 +1217,10 @@ const char *plat_get_credits(void) 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" @@ -1434,7 +1614,6 @@ void menu_prepare_emu(void) } apply_filter(filter); apply_cpu_clock(); - stop = 0; psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; if (psxCpu != prev_cpu)