X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=a984bbf079341ef8a62fbd8727052402530a7803;hp=3ebe9f5d16a6e60b85bc9c41955eeef4f163406e;hb=79f216e32563acc81517729fe56a6f11f110b0a4;hpb=33344895eb142f2529c9d7333f14d1ac83102837 diff --git a/frontend/menu.c b/frontend/menu.c index 3ebe9f5d..a984bbf0 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -24,12 +24,14 @@ #include "plugin_lib.h" #include "plat.h" #include "pcnt.h" -#include "common/plat.h" -#include "common/input.h" -#include "linux/in_evdev.h" +#include "libpicofe/plat.h" +#include "libpicofe/input.h" +#include "libpicofe/linux/in_evdev.h" +#include "libpicofe/plat.h" #include "../libpcsxcore/misc.h" #include "../libpcsxcore/cdrom.h" #include "../libpcsxcore/cdriso.h" +#include "../libpcsxcore/cheat.h" #include "../libpcsxcore/psemu_plugin_defs.h" #include "../libpcsxcore/new_dynarec/new_dynarec.h" #include "../plugins/dfinput/main.h" @@ -52,6 +54,8 @@ typedef enum MA_MAIN_SWAP_CD_MULTI, MA_MAIN_RUN_BIOS, MA_MAIN_RUN_EXE, + MA_MAIN_LOAD_CHEATS, + MA_MAIN_CHEATS, MA_MAIN_CONTROLS, MA_MAIN_CREDITS, MA_MAIN_EXIT, @@ -69,30 +73,24 @@ typedef enum MA_OPT_SAVECFG_GAME, MA_OPT_CPU_CLOCKS, MA_OPT_DISP_OPTS, - MA_OPT_SCALER, + MA_OPT_VARSCALER, + MA_OPT_VARSCALER_C, MA_OPT_SCALER2, - MA_OPT_FILTERING, - MA_OPT_SCALER_C, + MA_OPT_HWFILTER, + MA_OPT_SWFILTER, + MA_OPT_GAMMA, } menu_id; -enum { - SCALE_1_1, - SCALE_4_3, - SCALE_4_3v2, - SCALE_FULLSCREEN, - SCALE_CUSTOM, -}; - -static int last_psx_w, last_psx_h, last_psx_bpp; -static int scaling, cpu_clock, cpu_clock_st, volume_boost, frameskip; +static int last_vout_w, last_vout_h, last_vout_bpp; +static int cpu_clock, cpu_clock_st, volume_boost, frameskip; static char rom_fname_reload[MAXPATHLEN]; static char last_selected_fname[MAXPATHLEN]; -static int warned_about_bios, region, in_type_sel1, in_type_sel2; +static int config_save_counter, region, in_type_sel1, in_type_sel2; static int psx_clock; static int memcard1_sel, memcard2_sel; -int g_opts; +int g_opts, g_scaler, g_gamma = 100; int soft_scaling, analog_deadzone; // for Caanoo -int filter; +int filter, soft_filter; #ifdef __ARM_ARCH_7A__ #define DEFAULT_PSX_CLOCK 57 @@ -114,6 +112,16 @@ static const char *spu_plugins[16]; static const char *memcards[32]; static int bios_sel, gpu_plugsel, spu_plugsel; +#ifndef UI_FEATURES_H +#define MENU_BIOS_PATH "bios/" +#define MENU_SHOW_VARSCALER 0 +#define MENU_SHOW_SCALER2 0 +#define MENU_SHOW_NUBS_BTNS 0 +#define MENU_SHOW_VIBRATION 0 +#define MENU_SHOW_DEADZONE 0 +#define MENU_SHOW_MINIMIZE 0 +#define MENU_SHOW_VOLUME 0 +#endif static int min(int x, int y) { return x < y ? x : y; } static int max(int x, int y) { return x > y ? x : y; } @@ -213,11 +221,12 @@ static void menu_set_defconfig(void) emu_set_default_config(); g_opts = 0; - scaling = SCALE_4_3; + g_scaler = SCALE_4_3; volume_boost = 0; frameskip = 0; analog_deadzone = 50; soft_scaling = 1; + soft_filter = 0; psx_clock = DEFAULT_PSX_CLOCK; region = 0; @@ -239,6 +248,9 @@ static void menu_set_defconfig(void) #define CE_INTVAL(val) \ { #val, sizeof(val), &val } +#define CE_INTVAL_N(name, val) \ + { name, sizeof(val), &val } + #define CE_INTVAL_P(val) \ { #val, sizeof(pl_rearmed_cbs.val), &pl_rearmed_cbs.val } @@ -258,7 +270,7 @@ static const struct { void *val; } config_data[] = { CE_CONFIG_STR(Bios), - CE_CONFIG_STR_V(Gpu, 2), + CE_CONFIG_STR_V(Gpu, 3), CE_CONFIG_STR(Spu), // CE_CONFIG_STR(Cdr), CE_CONFIG_VAL(Xa), @@ -273,18 +285,21 @@ static const struct { CE_CONFIG_VAL(Cpu), CE_CONFIG_VAL(CdrReschedule), CE_INTVAL(region), - CE_INTVAL_V(scaling, 2), + CE_INTVAL_V(g_scaler, 2), CE_INTVAL(g_layer_x), CE_INTVAL(g_layer_y), CE_INTVAL(g_layer_w), CE_INTVAL(g_layer_h), CE_INTVAL(filter), + CE_INTVAL(soft_filter), CE_INTVAL(state_slot), CE_INTVAL(cpu_clock), CE_INTVAL(g_opts), CE_INTVAL(in_type_sel1), CE_INTVAL(in_type_sel2), CE_INTVAL(analog_deadzone), + CE_INTVAL_N("adev0_is_nublike", in_adev_is_nublike[0]), + CE_INTVAL_N("adev1_is_nublike", in_adev_is_nublike[1]), CE_INTVAL_V(frameskip, 3), CE_INTVAL_P(gpu_peops.iUseDither), CE_INTVAL_P(gpu_peops.dwActFixes), @@ -293,6 +308,8 @@ static const struct { CE_INTVAL_P(gpu_unai.no_light), CE_INTVAL_P(gpu_unai.no_blend), CE_INTVAL_P(gpu_neon.allow_interlace), + CE_INTVAL_P(gpu_neon.enhancement_enable), + CE_INTVAL_P(gpu_neon.enhancement_no_main), CE_INTVAL_P(gpu_peopsgl.bDrawDither), CE_INTVAL_P(gpu_peopsgl.iFilterType), CE_INTVAL_P(gpu_peopsgl.iFrameTexType), @@ -306,7 +323,7 @@ static const struct { CE_INTVAL_V(iUseReverb, 3), CE_INTVAL_V(iXAPitch, 3), CE_INTVAL_V(iUseInterpolation, 3), - CE_INTVAL(warned_about_bios), + CE_INTVAL(config_save_counter), CE_INTVAL(in_evdev_allow_abs_only), CE_INTVAL(volume_boost), CE_INTVAL(psx_clock), @@ -337,6 +354,7 @@ static void make_cfg_fname(char *buf, size_t size, int is_game) } static void keys_write_all(FILE *f); +static char *mystrip(char *str); static int menu_write_config(int is_game) { @@ -344,6 +362,8 @@ static int menu_write_config(int is_game) FILE *f; int i; + config_save_counter++; + make_cfg_fname(cfgfile, sizeof(cfgfile), is_game); f = fopen(cfgfile, "w"); if (f == NULL) { @@ -368,20 +388,40 @@ static int menu_write_config(int is_game) break; default: printf("menu_write_config: unhandled len %d for %s\n", - config_data[i].len, config_data[i].name); + (int)config_data[i].len, config_data[i].name); break; } } - if (!is_game) - fprintf(f, "lastcdimg = %s\n", last_selected_fname); - keys_write_all(f); fclose(f); return 0; } +static int menu_do_last_cd_img(int is_get) +{ + char path[256]; + FILE *f; + int ret; + + snprintf(path, sizeof(path), "." PCSX_DOT_DIR "lastcdimg.txt"); + f = fopen(path, is_get ? "r" : "w"); + if (f == NULL) + return -1; + + if (is_get) { + ret = fread(last_selected_fname, 1, sizeof(last_selected_fname) - 1, f); + last_selected_fname[ret] = 0; + mystrip(last_selected_fname); + } + else + fprintf(f, "%s\n", last_selected_fname); + fclose(f); + + return 0; +} + static void parse_str_val(char *cval, const char *src) { char *tmp; @@ -463,7 +503,7 @@ static int menu_load_config(int is_game) break; default: printf("menu_load_config: unhandled len %d for %s\n", - config_data[i].len, config_data[i].name); + (int)config_data[i].len, config_data[i].name); break; } } @@ -486,10 +526,6 @@ fail: menu_sync_config(); - // caanoo old config compat hack - if (strcmp(Config.Gpu, "gpuPCSX4ALL.so") == 0) - strcpy(Config.Gpu, "gpu_unai.so"); - // sync plugins for (i = bios_sel = 0; bioses[i] != NULL; i++) if (strcmp(Config.Bios, bioses[i]) == 0) @@ -540,9 +576,7 @@ static const char *filter_exts[] = { #define MENU_X2 0 #endif -#define menu_init menu_init_common -#include "common/menu.c" -#undef menu_init +#include "libpicofe/menu.c" // a bit of black magic here static void draw_savestate_bg(int slot) @@ -590,7 +624,7 @@ static void draw_savestate_bg(int slot) x = gpu->ulControl[5] & 0x3ff; y = (gpu->ulControl[5] >> 10) & 0x1ff; - s = (u16 *)gpu->psxVRam + y * 1024 + (x & ~1); + s = (u16 *)gpu->psxVRam + y * 1024 + x; w = psx_widths[(gpu->ulStatus >> 16) & 7]; tmp = gpu->ulControl[7]; h = ((tmp >> 10) & 0x3ff) - (tmp & 0x3ff); @@ -649,15 +683,19 @@ me_bind_action emuctrl_actions[] = { "Next Save Slot ", 1 << SACTION_NEXT_SSLOT }, { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP }, { "Take Screenshot ", 1 << SACTION_SCREENSHOT }, - { "Enter Menu ", 1 << SACTION_ENTER_MENU }, -#ifdef __ARM_ARCH_7A__ /* XXX */ + { "Fast Forward ", 1 << SACTION_FAST_FORWARD }, +#ifdef __ARM_ARCH_7A__ + { "Switch Renderer ", 1 << SACTION_SWITCH_DISPMODE }, +#endif +#if MENU_SHOW_MINIMIZE { "Minimize ", 1 << SACTION_MINIMIZE }, #endif + { "Enter Menu ", 1 << SACTION_ENTER_MENU }, { "Gun Trigger ", 1 << SACTION_GUN_TRIGGER }, { "Gun A button ", 1 << SACTION_GUN_A }, { "Gun B button ", 1 << SACTION_GUN_B }, { "Gun Offscreen Trigger", 1 << SACTION_GUN_TRIGGER2 }, -#ifndef __ARM_ARCH_7A__ /* XXX */ +#if MENU_SHOW_VOLUME { "Volume Up ", 1 << SACTION_VOLUME_UP }, { "Volume Down ", 1 << SACTION_VOLUME_DOWN }, #endif @@ -675,7 +713,7 @@ static char *mystrip(char *str) len = strlen(str); for (i = len - 1; i >= 0; i--) - if (str[i] != ' ') break; + if (str[i] != ' ' && str[i] != '\r' && str[i] != '\n') break; str[i+1] = 0; return str; @@ -875,17 +913,21 @@ static int key_config_loop_wrap(int id, int keys) return 0; } +static const char h_nubmode[] = "Maps nub-like analog controls to PSX ones better\n" + "Might cause problems with real analog sticks"; static const char *adevnames[IN_MAX_DEVS + 2]; static int stick_sel[2]; static menu_entry e_menu_keyconfig_analog[] = { - mee_enum ("Left stick (L3)", 0, stick_sel[0], adevnames), - mee_range(" X axis", 0, in_adev_axis[0][0], 0, 7), - mee_range(" Y axis", 0, in_adev_axis[0][1], 0, 7), - mee_enum ("Right stick (R3)", 0, stick_sel[1], adevnames), - mee_range(" X axis", 0, in_adev_axis[1][0], 0, 7), - mee_range(" Y axis", 0, in_adev_axis[1][1], 0, 7), + mee_enum ("Left stick (L3)", 0, stick_sel[0], adevnames), + mee_range (" X axis", 0, in_adev_axis[0][0], 0, 7), + mee_range (" Y axis", 0, in_adev_axis[0][1], 0, 7), + mee_onoff_h(" nub mode", 0, in_adev_is_nublike[0], 1, h_nubmode), + mee_enum ("Right stick (R3)", 0, stick_sel[1], adevnames), + mee_range (" X axis", 0, in_adev_axis[1][0], 0, 7), + mee_range (" Y axis", 0, in_adev_axis[1][1], 0, 7), + mee_onoff_h(" nub mode", 0, in_adev_is_nublike[1], 1, h_nubmode), mee_end, }; @@ -952,9 +994,9 @@ static const char *mgn_saveloadcfg(int id, int *offs) static int mh_savecfg(int id, int keys) { if (menu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0) == 0) - me_update_msg("config saved"); + menu_update_msg("config saved"); else - me_update_msg("failed to write config"); + menu_update_msg("failed to write config"); return 1; } @@ -963,7 +1005,7 @@ static int mh_input_rescan(int id, int keys) { //menu_sync_config(); in_probe(); - me_update_msg("rescan complete."); + menu_update_msg("rescan complete."); return 0; } @@ -1017,27 +1059,35 @@ static int menu_loop_keyconfig(int id, int keys) // ------------ gfx options menu ------------ static const char *men_scaler[] = { "1x1", "scaled 4:3", "integer scaled 4:3", "fullscreen", "custom", NULL }; +static const char *men_soft_filter[] = { "None", +#ifdef __ARM_NEON__ + "scale2x", "eagle2x", +#endif + NULL }; +static const char *men_dummy[] = { NULL }; static const char h_cscaler[] = "Displays the scaler layer, you can resize it\n" "using d-pad or move it using R+d-pad"; -static const char *men_dummy[] = { NULL }; +static const char h_soft_filter[] = "Works only if game uses low resolution modes"; +static const char h_gamma[] = "Gamma/brightness adjustment (default 100)"; static int menu_loop_cscaler(int id, int keys) { unsigned int inp; - scaling = SCALE_CUSTOM; + g_scaler = SCALE_CUSTOM; plat_gvideo_open(Config.PsxType); for (;;) { - menu_draw_begin(0); + menu_draw_begin(0, 1); memset(g_menuscreen_ptr, 4, g_menuscreen_w * g_menuscreen_h * 2); text_out16(2, 2, "%d,%d", g_layer_x, g_layer_y); text_out16(2, 480 - 18, "%dx%d | d-pad: resize, R+d-pad: move", g_layer_w, g_layer_h); menu_draw_end(); - inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_R|PBTN_MOK|PBTN_MBACK, 40); + inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT + |PBTN_R|PBTN_MOK|PBTN_MBACK, NULL, 40); if (inp & PBTN_UP) g_layer_y--; if (inp & PBTN_DOWN) g_layer_y++; if (inp & PBTN_LEFT) g_layer_x--; @@ -1074,11 +1124,13 @@ static int menu_loop_cscaler(int id, int keys) static menu_entry e_menu_gfx_options[] = { - mee_enum ("Scaler", MA_OPT_SCALER, scaling, men_scaler), + mee_enum ("Scaler", MA_OPT_VARSCALER, g_scaler, men_scaler), mee_onoff ("Software Scaling", MA_OPT_SCALER2, soft_scaling, 1), - mee_enum ("Filter", MA_OPT_FILTERING, filter, men_dummy), + mee_enum ("Hardware Filter", MA_OPT_HWFILTER, filter, men_dummy), + mee_enum_h ("Software Filter", MA_OPT_SWFILTER, soft_filter, men_soft_filter, h_soft_filter), + mee_range_h ("Gamma adjustment", MA_OPT_GAMMA, g_gamma, 1, 200, h_gamma), // mee_onoff ("Vsync", 0, vsync, 1), - mee_cust_h ("Setup custom scaler", MA_OPT_SCALER_C, menu_loop_cscaler, NULL, h_cscaler), + mee_cust_h ("Setup custom scaler", MA_OPT_VARSCALER_C, menu_loop_cscaler, NULL, h_cscaler), mee_end, }; @@ -1091,32 +1143,30 @@ static int menu_loop_gfx_options(int id, int keys) return 0; } -// XXX -void menu_set_filter_list(void *filters) -{ - int i; - - i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING); - e_menu_gfx_options[i].data = filters; - me_enable(e_menu_gfx_options, MA_OPT_FILTERING, filters != NULL); -} - // ------------ bios/plugins ------------ #ifdef __ARM_NEON__ -static const char h_gpu_neon[] = "Configure built-in NEON GPU plugin"; +static const char h_gpu_neon[] = + "Configure built-in NEON GPU plugin"; +static const char h_gpu_neon_enhanced[] = + "Renders in double resolution at the cost of lower performance\n" + "(not available for high resolution games)"; +static const char h_gpu_neon_enhanced_hack[] = + "Speed hack for above option (glitches some games)"; static const char *men_gpu_interlace[] = { "Off", "On", "Auto", NULL }; static menu_entry e_menu_plugin_gpu_neon[] = { mee_enum ("Enable interlace mode", 0, pl_rearmed_cbs.gpu_neon.allow_interlace, men_gpu_interlace), + mee_onoff_h ("Enhanced resolution (slow)", 0, pl_rearmed_cbs.gpu_neon.enhancement_enable, 1, h_gpu_neon_enhanced), + mee_onoff_h ("Enhanced res. speed hack", 0, pl_rearmed_cbs.gpu_neon.enhancement_no_main, 1, h_gpu_neon_enhanced_hack), mee_end, }; static int menu_loop_plugin_gpu_neon(int id, int keys) { - int sel = 0; + static int sel = 0; me_loop(e_menu_plugin_gpu_neon, &sel); return 0; } @@ -1234,13 +1284,10 @@ static const char h_bios[] = "HLE is simulated BIOS. BIOS selection is sav static const char h_plugin_gpu[] = #ifdef __ARM_NEON__ "builtin_gpu is the NEON GPU, very fast and accurate\n" - "gpuPEOPS " -#else - "builtin_gpu " #endif - "is Pete's soft GPU, slow but accurate\n" - "gpuPCSX4ALL is GPU from PCSX4ALL, fast but glitchy\n" - "gpuGLES Pete's hw GPU, uses 3D chip but is glitchy\n" + "gpu_peops is Pete's soft GPU, slow but accurate\n" + "gpu_unai is GPU from PCSX4ALL, fast but glitchy\n" + "gpu_gles Pete's hw GPU, uses 3D chip but is glitchy\n" "must save config and reload the game if changed"; static const char h_plugin_spu[] = "spunull effectively disables sound\n" "must save config and reload the game if changed"; @@ -1258,8 +1305,8 @@ static menu_entry e_menu_plugin_options[] = mee_handler_h ("Configure built-in GPU plugin", menu_loop_plugin_gpu_neon, h_gpu_neon), #endif mee_handler_h ("Configure gpu_peops plugin", menu_loop_plugin_gpu_peops, h_gpu_peops), - mee_handler_h ("Configure PCSX4ALL GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai), - mee_handler_h ("Configure GLES GPU plugin", menu_loop_plugin_gpu_peopsgl, h_gpu_peopsgl), + mee_handler_h ("Configure gpu_unai GPU plugin", menu_loop_plugin_gpu_unai, h_gpu_unai), + mee_handler_h ("Configure gpu_gles GPU plugin", menu_loop_plugin_gpu_peopsgl, h_gpu_peopsgl), mee_handler_h ("Configure built-in SPU plugin", menu_loop_plugin_spu, h_spu), mee_end, }; @@ -1353,7 +1400,7 @@ static int menu_loop_adv_options(int id, int keys) static int mh_restore_defaults(int id, int keys) { menu_set_defconfig(); - me_update_msg("defaults restored"); + menu_update_msg("defaults restored"); return 1; } @@ -1435,12 +1482,12 @@ static void debug_menu_loop(void) while (1) { - menu_draw_begin(0); + menu_draw_begin(0, 1); draw_frame_debug(gpuf, df_x, df_y); menu_draw_end(); inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R | - PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 10); + PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, NULL, 10); if (inp & PBTN_MBACK) break; else if (inp & PBTN_UP) { if (df_y > 0) df_y--; } else if (inp & PBTN_DOWN) { if (df_y < 512 - g_menuscreen_h) df_y++; } @@ -1487,7 +1534,7 @@ static void draw_mc_bg(void) GetMcdBlockInfo(2, i + 1, &blocks2[i]); } - menu_draw_begin(1); + menu_draw_begin(1, 1); memcpy(g_menuscreen_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); @@ -1559,6 +1606,59 @@ static int menu_loop_memcards(int id, int keys) return 0; } +// ------------ cheats menu ------------ + +static void draw_cheatlist(int sel) +{ + int max_cnt, start, i, pos, active; + + max_cnt = g_menuscreen_h / me_sfont_h; + start = max_cnt / 2 - sel; + + menu_draw_begin(1, 1); + + for (i = 0; i < NumCheats; i++) { + pos = start + i; + if (pos < 0) continue; + if (pos >= max_cnt) break; + active = Cheats[i].Enabled; + smalltext_out16(14, pos * me_sfont_h, + active ? "ON " : "OFF", active ? 0xfff6 : 0xffff); + smalltext_out16(14 + me_sfont_w*4, pos * me_sfont_h, + Cheats[i].Descr, active ? 0xfff6 : 0xffff); + } + pos = start + i; + if (pos < max_cnt) + smalltext_out16(14, pos * me_sfont_h, "done", 0xffff); + + text_out16(5, max_cnt / 2 * me_sfont_h, ">"); + menu_draw_end(); +} + +static void menu_loop_cheats(void) +{ + static int menu_sel = 0; + int inp; + + for (;;) + { + draw_cheatlist(menu_sel); + inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R + |PBTN_MOK|PBTN_MBACK, NULL, 33); + if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = NumCheats; } + if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > NumCheats) menu_sel = 0; } + if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; } + if (inp &(PBTN_RIGHT|PBTN_R)) { menu_sel+=10; if (menu_sel > NumCheats) menu_sel = NumCheats; } + if (inp & PBTN_MOK) { // action + if (menu_sel < NumCheats) + Cheats[menu_sel].Enabled = !Cheats[menu_sel].Enabled; + else break; + } + if (inp & PBTN_MBACK) + break; + } +} + // --------- main menu help ---------- static void menu_bios_warn(void) @@ -1567,11 +1667,8 @@ static void menu_bios_warn(void) static const char msg[] = "You don't seem to have copied any BIOS\n" "files to\n" -#ifdef __ARM_ARCH_7A__ // XXX - "/pandora/appdata/pcsx_rearmed/bios/\n\n" -#else - "pcsx_rearmed/bios/\n\n" -#endif + MENU_BIOS_PATH "\n\n" + "While many games work fine with fake\n" "(HLE) BIOS, others (like MGS and FF8)\n" "require BIOS to work.\n" @@ -1590,7 +1687,7 @@ static void menu_bios_warn(void) { draw_menu_message(tmp_msg, NULL); - inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, 70); + inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70); if (inp & (PBTN_MBACK|PBTN_MOK)) return; } @@ -1598,6 +1695,7 @@ static void menu_bios_warn(void) // ------------ main menu ------------ +static menu_entry e_menu_main[]; void OnFile_Exit(); static void draw_frame_main(void) @@ -1617,7 +1715,7 @@ static void draw_frame_main(void) } if (ready_to_go) { - capacity = plat_get_bat_capacity(); + capacity = plat_target_bat_capacity_get(); ltime = time(NULL); tmp = localtime(<ime); strftime(ltime_s, sizeof(ltime_s), "%H:%M", tmp); @@ -1678,7 +1776,7 @@ static int reload_plugins(const char *cdimg) pcnt_hook_plugins(); NetOpened = 0; if (OpenPlugins() == -1) { - me_update_msg("failed to open plugins"); + menu_update_msg("failed to open plugins"); return -1; } plugin_call_rearmed_cbs(); @@ -1718,7 +1816,7 @@ static int run_exe(void) SysReset(); if (Load(fname) != 0) { - me_update_msg("exe load failed, bad file?"); + menu_update_msg("exe load failed, bad file?"); printf("meh\n"); return -1; } @@ -1738,7 +1836,7 @@ static int run_cd_image(const char *fname) if (CheckCdrom() == -1) { // Only check the CD if we are starting the console with a CD ClosePlugins(); - me_update_msg("unsupported/invalid CD image"); + menu_update_msg("unsupported/invalid CD image"); return -1; } @@ -1747,13 +1845,13 @@ static int run_cd_image(const char *fname) // Read main executable directly from CDRom and start it if (LoadCdrom() == -1) { ClosePlugins(); - me_update_msg("failed to load CD image"); + menu_update_msg("failed to load CD image"); return -1; } + emu_on_new_cd(1); ready_to_go = 1; - snprintf(hud_msg, sizeof(hud_msg), "Booting up..."); - hud_new_msg = 2; + return 0; } @@ -1786,10 +1884,8 @@ static int romsel_run(void) return -1; } - if (Config.HLE) - printf("note: running without BIOS, expect compatibility problems\n"); - strcpy(last_selected_fname, rom_fname_reload); + menu_do_last_cd_img(0); return 0; } @@ -1808,11 +1904,11 @@ static int swap_cd_image(void) set_cd_image(fname); if (ReloadCdromPlugin() < 0) { - me_update_msg("failed to load cdr plugin"); + menu_update_msg("failed to load cdr plugin"); return -1; } if (CDR_open() < 0) { - me_update_msg("failed to open cdr plugin"); + menu_update_msg("failed to open cdr plugin"); return -1; } @@ -1831,7 +1927,7 @@ static int swap_cd_multidisk(void) CDR_close(); if (CDR_open() < 0) { - me_update_msg("failed to open cdr plugin"); + menu_update_msg("failed to open cdr plugin"); return -1; } @@ -1841,6 +1937,28 @@ static int swap_cd_multidisk(void) return 0; } +static void load_pcsx_cht(void) +{ + char path[256]; + char *fname; + + path[0] = 0; + fname = menu_loop_romsel(path, sizeof(path)); + if (fname == NULL) + return; + + printf("selected cheat file: %s\n", fname); + LoadCheats(fname); + + if (NumCheats == 0 && NumCodes == 0) + menu_update_msg("failed to load cheats"); + else { + snprintf(path, sizeof(path), "%d cheat(s) loaded", NumCheats + NumCodes); + menu_update_msg(path); + } + me_enable(e_menu_main, MA_MAIN_CHEATS, ready_to_go && NumCheats); +} + static int main_menu_handler(int id, int keys) { switch (id) @@ -1881,9 +1999,15 @@ static int main_menu_handler(int id, int keys) if (run_exe() == 0) return 1; break; + case MA_MAIN_CHEATS: + menu_loop_cheats(); + break; + case MA_MAIN_LOAD_CHEATS: + load_pcsx_cht(); + break; case MA_MAIN_CREDITS: draw_menu_message(credits_text, draw_frame_credits); - in_menu_wait(PBTN_MOK|PBTN_MBACK, 70); + in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70); break; case MA_MAIN_EXIT: OnFile_Exit(); @@ -1903,6 +2027,7 @@ static menu_entry e_menu_main2[] = mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler), mee_handler_id("Run EXE", MA_MAIN_RUN_EXE, main_menu_handler), mee_handler ("Memcard manager", menu_loop_memcards), + mee_handler_id("Load PCSX cheats..", MA_MAIN_LOAD_CHEATS, main_menu_handler), mee_end, }; @@ -1913,6 +2038,7 @@ static int main_menu2_handler(int id, int keys) me_enable(e_menu_main2, MA_MAIN_SWAP_CD, ready_to_go); me_enable(e_menu_main2, MA_MAIN_SWAP_CD_MULTI, ready_to_go && cdrIsoMultidiskCount > 1); me_enable(e_menu_main2, MA_MAIN_RUN_BIOS, bios_sel != 0); + me_enable(e_menu_main2, MA_MAIN_LOAD_CHEATS, ready_to_go); return me_loop_d(e_menu_main2, &sel, NULL, draw_frame_main); } @@ -1930,6 +2056,7 @@ static menu_entry e_menu_main[] = mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler), mee_handler ("Options", menu_loop_options), mee_handler ("Controls", menu_loop_keyconfig), + mee_handler_id("Cheats", MA_MAIN_CHEATS, main_menu_handler), mee_handler_h ("Extra stuff", main_menu2_handler, h_extra), mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler), mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler), @@ -1942,19 +2069,29 @@ static void menu_leave_emu(void); void menu_loop(void) { + static int warned_about_bios = 0; static int sel = 0; menu_leave_emu(); - if (bioses[1] == NULL && !warned_about_bios) { - menu_bios_warn(); - warned_about_bios = 1; + if (config_save_counter == 0) { + // assume first run + if (bioses[1] != NULL) { + // autoselect BIOS to make user's life easier + snprintf(Config.Bios, sizeof(Config.Bios), "%s", bioses[1]); + bios_sel = 1; + } + else if (!warned_about_bios) { + menu_bios_warn(); + warned_about_bios = 1; + } } me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go); me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go && CdromId[0]); me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go && CdromId[0]); me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go); + me_enable(e_menu_main, MA_MAIN_CHEATS, ready_to_go && NumCheats); in_set_config_int(0, IN_CFG_BLOCKING, 1); @@ -1963,7 +2100,7 @@ void menu_loop(void) } while (!ready_to_go); /* wait until menu, ok, back is released */ - while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) + while (in_menu_wait_any(NULL, 50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK)) ; in_set_config_int(0, IN_CFG_BLOCKING, 0); @@ -2125,19 +2262,21 @@ do_memcards: void menu_init(void) { char buff[MAXPATHLEN]; + int i; strcpy(last_selected_fname, "/media"); - cpu_clock_st = cpu_clock = plat_cpu_clock_get(); + cpu_clock_st = cpu_clock = plat_target_cpu_clock_get(); scan_bios_plugins(); - menu_init_common(); + menu_init_base(); menu_set_defconfig(); menu_load_config(0); - last_psx_w = 320; - last_psx_h = 240; - last_psx_bpp = 16; + menu_do_last_cd_img(1); + last_vout_w = 320; + last_vout_h = 240; + last_vout_bpp = 16; g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); @@ -2149,72 +2288,34 @@ void menu_init(void) emu_make_path(buff, "skin/background.png", sizeof(buff)); readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h); -#ifndef __ARM_ARCH_7A__ /* XXX */ - me_enable(e_menu_gfx_options, MA_OPT_SCALER, 0); - me_enable(e_menu_gfx_options, MA_OPT_FILTERING, 0); - me_enable(e_menu_gfx_options, MA_OPT_SCALER_C, 0); - me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, 0); -#else - me_enable(e_menu_gfx_options, MA_OPT_SCALER2, 0); - me_enable(e_menu_keyconfig, MA_CTRL_VIBRATION, 0); - me_enable(e_menu_keyconfig, MA_CTRL_DEADZONE, 0); + i = plat_target.cpu_clock_set != NULL + && plat_target.cpu_clock_get != NULL && cpu_clock_st > 0; + me_enable(e_menu_gfx_options, MA_OPT_CPU_CLOCKS, i); + + i = me_id2offset(e_menu_gfx_options, MA_OPT_HWFILTER); + e_menu_gfx_options[i].data = plat_target.hwfilters; + me_enable(e_menu_gfx_options, MA_OPT_HWFILTER, + plat_target.hwfilters != NULL); + + me_enable(e_menu_gfx_options, MA_OPT_GAMMA, + plat_target.gamma_set != NULL); + +#ifndef __ARM_ARCH_7A__ + me_enable(e_menu_gfx_options, MA_OPT_SWFILTER, 0); #endif + me_enable(e_menu_gfx_options, MA_OPT_VARSCALER, MENU_SHOW_VARSCALER); + me_enable(e_menu_gfx_options, MA_OPT_VARSCALER_C, MENU_SHOW_VARSCALER); + me_enable(e_menu_gfx_options, MA_OPT_SCALER2, MENU_SHOW_SCALER2); + me_enable(e_menu_keyconfig, MA_CTRL_NUBS_BTNS, MENU_SHOW_NUBS_BTNS); + me_enable(e_menu_keyconfig, MA_CTRL_VIBRATION, MENU_SHOW_VIBRATION); + me_enable(e_menu_keyconfig, MA_CTRL_DEADZONE, MENU_SHOW_DEADZONE); } void menu_notify_mode_change(int w, int h, int bpp) { - float mult; - int imult; - - last_psx_w = w; - last_psx_h = h; - last_psx_bpp = bpp; - - // XXX: should really menu code cotrol the layer size? - switch (scaling) { - case SCALE_1_1: - g_layer_w = w; g_layer_h = h; - break; - - case SCALE_4_3v2: - if (h > g_menuscreen_h || (240 < h && h <= 360)) - goto fractional_4_3; - - // 4:3 that prefers integer scaling - imult = g_menuscreen_h / h; - g_layer_w = w * imult; - g_layer_h = h * imult; - mult = (float)g_layer_w / (float)g_layer_h; - if (mult < 1.25f || mult > 1.666f) - g_layer_w = 4.0f/3.0f * (float)g_layer_h; - printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult); - break; - - fractional_4_3: - case SCALE_4_3: - mult = 240.0f / (float)h * 4.0f / 3.0f; - if (h > 256) - mult *= 2.0f; - g_layer_w = mult * (float)g_menuscreen_h; - g_layer_h = g_menuscreen_h; - printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult); - break; - - case SCALE_FULLSCREEN: - g_layer_w = g_menuscreen_w; - g_layer_h = g_menuscreen_h; - break; - - default: - break; - } - - g_layer_x = g_menuscreen_w / 2 - g_layer_w / 2; - g_layer_y = g_menuscreen_h / 2 - g_layer_h / 2; - if (g_layer_x < 0) g_layer_x = 0; - if (g_layer_y < 0) g_layer_y = 0; - if (g_layer_w > g_menuscreen_w) g_layer_w = g_menuscreen_w; - if (g_layer_h > g_menuscreen_h) g_layer_w = g_menuscreen_h; + last_vout_w = w; + last_vout_h = h; + last_vout_bpp = bpp; } static void menu_leave_emu(void) @@ -2229,27 +2330,27 @@ static void menu_leave_emu(void) memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); if (pl_vout_buf != NULL && ready_to_go) { - int x = max(0, g_menuscreen_w - last_psx_w); - int y = max(0, g_menuscreen_h / 2 - last_psx_h / 2); - int w = min(g_menuscreen_w, last_psx_w); - int h = min(g_menuscreen_h, last_psx_h); + int x = max(0, g_menuscreen_w - last_vout_w); + int y = max(0, g_menuscreen_h / 2 - last_vout_h / 2); + int w = min(g_menuscreen_w, last_vout_w); + int h = min(g_menuscreen_h, last_vout_h); u16 *d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x; char *s = pl_vout_buf; - if (last_psx_bpp == 16) { - for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w * 2) + if (last_vout_bpp == 16) { + for (; h > 0; h--, d += g_menuscreen_w, s += last_vout_w * 2) menu_darken_bg(d, s, w, 0); } else { - for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w * 3) { - bgr888_to_rgb565(d, s, w * 3); + for (; h > 0; h--, d += g_menuscreen_w, s += last_vout_w * 3) { + rgb888_to_rgb565(d, s, w * 3); menu_darken_bg(d, d, w, 0); } } } if (ready_to_go) - cpu_clock = plat_cpu_clock_get(); + cpu_clock = plat_target_cpu_clock_get(); } void menu_prepare_emu(void) @@ -2258,8 +2359,6 @@ void menu_prepare_emu(void) plat_video_menu_leave(); - menu_notify_mode_change(last_psx_w, last_psx_h, last_psx_bpp); - psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; if (psxCpu != prev_cpu) // note that this does not really reset, just clears drc caches @@ -2272,7 +2371,7 @@ void menu_prepare_emu(void) menu_sync_config(); if (cpu_clock > 0) - plat_cpu_clock_apply(cpu_clock); + plat_target_cpu_clock_set(cpu_clock); // push config to GPU plugin plugin_call_rearmed_cbs(); @@ -2286,7 +2385,7 @@ void menu_prepare_emu(void) dfinput_activate(); } -void me_update_msg(const char *msg) +void menu_update_msg(const char *msg) { strncpy(menu_error_msg, msg, sizeof(menu_error_msg)); menu_error_msg[sizeof(menu_error_msg) - 1] = 0; @@ -2297,5 +2396,6 @@ void me_update_msg(const char *msg) void menu_finish(void) { - plat_cpu_clock_apply(cpu_clock_st); + if (cpu_clock_st > 0) + plat_target_cpu_clock_set(cpu_clock_st); }