X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=7d360d58fc7b101dc0fde6566377e23a805692e3;hp=989c6ec95c02cb6c4f757da75ea5acad37092458;hb=9e5ac38fda66536f2a9e6dd2a747ae37538c3638;hpb=6469a8c407ff23af8b7a6218f759b368eec7c339 diff --git a/frontend/menu.c b/frontend/menu.c index 989c6ec9..7d360d58 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -30,6 +30,7 @@ #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 +53,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, @@ -75,23 +78,16 @@ typedef enum MA_OPT_SCALER_C, } 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, filter, 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 psx_clock; static int memcard1_sel, memcard2_sel; -int g_opts; +int g_opts, g_scaler; int soft_scaling, analog_deadzone; // for Caanoo +int filter; #ifdef __ARM_ARCH_7A__ #define DEFAULT_PSX_CLOCK 57 @@ -105,8 +101,6 @@ int soft_scaling, analog_deadzone; // for Caanoo extern int iUseReverb; extern int iUseInterpolation; extern int iXAPitch; -extern int iSPUIRQWait; -extern int iUseTimer; extern int iVolume; static const char *bioses[24]; @@ -214,7 +208,7 @@ 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; @@ -259,7 +253,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), @@ -274,7 +268,7 @@ 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), @@ -307,8 +301,6 @@ static const struct { CE_INTVAL_V(iUseReverb, 3), CE_INTVAL_V(iXAPitch, 3), CE_INTVAL_V(iUseInterpolation, 3), - CE_INTVAL_V(iSPUIRQWait, 3), - CE_INTVAL_V(iUseTimer, 3), CE_INTVAL(warned_about_bios), CE_INTVAL(in_evdev_allow_abs_only), CE_INTVAL(volume_boost), @@ -340,6 +332,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) { @@ -376,15 +369,35 @@ 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; } +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; @@ -589,7 +602,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); @@ -607,136 +620,16 @@ static void draw_savestate_bg(int slot) bgr888_to_rgb565(d, s, w * 3); else bgr555_to_rgb565(d, s, w * 2); -#ifndef __ARM_ARCH_7A__ - // better darken this on small screens - menu_darken_bg(d, d, w * 2, 0); -#endif + + // darken this so that menu text is visible + if (g_menuscreen_w - w < 320) + menu_darken_bg(d, d, w * 2, 0); } out: free(gpu); } -// ---------- XXX: pandora specific ----------- - -static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts"; -static char **pnd_filter_list; - -static void apply_filter(int which) -{ - static int old = -1; - char buf[128]; - int i; - - if (pnd_filter_list == NULL || which == old) - return; - - for (i = 0; i < which; i++) - if (pnd_filter_list[i] == NULL) - return; - - if (pnd_filter_list[i] == NULL) - return; - - snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]); - system(buf); - old = which; -} - -static void apply_lcdrate(int pal) -{ - static int old = -1; - char buf[128]; - - if (pal == old) - return; - - snprintf(buf, sizeof(buf), "%s/op_lcdrate.sh %d", - pnd_script_base, pal ? 50 : 60); - system(buf); - old = pal; -} - -static menu_entry e_menu_gfx_options[]; - -static void pnd_menu_init(void) -{ - struct dirent *ent; - int i, count = 0; - char **mfilters; - char buff[64]; - DIR *dir; - - cpu_clock_st = cpu_clock = plat_cpu_clock_get(); - - dir = opendir("/etc/pandora/conf/dss_fir"); - if (dir == NULL) { - perror("filter opendir"); - return; - } - - while (1) { - errno = 0; - ent = readdir(dir); - if (ent == NULL) { - if (errno != 0) - perror("readdir"); - break; - } - - if (ent->d_type != DT_REG && ent->d_type != DT_LNK) - continue; - - count++; - } - - if (count == 0) - return; - - mfilters = calloc(count + 1, sizeof(mfilters[0])); - if (mfilters == NULL) - return; - - rewinddir(dir); - for (i = 0; (ent = readdir(dir)); ) { - size_t len; - - if (ent->d_type != DT_REG && ent->d_type != DT_LNK) - continue; - - len = strlen(ent->d_name); - - // skip pre-HF5 extra files - if (len >= 3 && strcmp(ent->d_name + len - 3, "_v3") == 0) - continue; - if (len >= 3 && strcmp(ent->d_name + len - 3, "_v5") == 0) - continue; - - // have to cut "_up_h" for pre-HF5 - if (len > 5 && strcmp(ent->d_name + len - 5, "_up_h") == 0) - len -= 5; - - if (len > sizeof(buff) - 1) - continue; - - strncpy(buff, ent->d_name, len); - buff[len] = 0; - mfilters[i] = strdup(buff); - if (mfilters[i] != NULL) - i++; - } - closedir(dir); - - i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING); - e_menu_gfx_options[i].data = (void *)mfilters; - pnd_filter_list = mfilters; -} - -void menu_finish(void) -{ - plat_cpu_clock_apply(cpu_clock_st); -} - // -------------- key config -------------- me_bind_action me_ctrl_actions[] = @@ -794,7 +687,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; @@ -1144,9 +1037,9 @@ static int menu_loop_cscaler(int id, int keys) { unsigned int inp; - scaling = SCALE_CUSTOM; + g_scaler = SCALE_CUSTOM; - plat_gvideo_open(); + plat_gvideo_open(Config.PsxType); for (;;) { @@ -1156,7 +1049,8 @@ static int menu_loop_cscaler(int id, int keys) 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--; @@ -1182,7 +1076,7 @@ static int menu_loop_cscaler(int id, int keys) if (g_layer_y + g_layer_h > 480) g_layer_h = 480 - g_layer_y; // resize the layer - plat_gvideo_open(); + plat_gvideo_open(Config.PsxType); } } @@ -1193,7 +1087,7 @@ 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_SCALER, g_scaler, men_scaler), mee_onoff ("Software Scaling", MA_OPT_SCALER2, soft_scaling, 1), mee_enum ("Filter", MA_OPT_FILTERING, filter, men_dummy), // mee_onoff ("Vsync", 0, vsync, 1), @@ -1210,6 +1104,16 @@ 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__ @@ -1320,8 +1224,6 @@ static int menu_loop_plugin_gpu_peopsgl(int id, int keys) static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL }; static const char h_spu_volboost[] = "Large values cause distortion"; -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[] = { @@ -1329,8 +1231,6 @@ static menu_entry e_menu_plugin_spu[] = mee_onoff ("Reverb", 0, iUseReverb, 2), mee_enum ("Interpolation", 0, iUseInterpolation, men_spu_interp), mee_onoff ("Adjust XA pitch", 0, iXAPitch, 1), - mee_onoff_h ("SPU IRQ Wait", 0, iSPUIRQWait, 1, h_spu_irq_wait), - mee_onoff_h ("Sound in main thread", 0, iUseTimer, 2, h_spu_thread), mee_end, }; @@ -1347,13 +1247,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"; @@ -1371,8 +1268,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, }; @@ -1504,7 +1401,7 @@ static int menu_loop_options(int id, int keys) int i; i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS); - e_menu_options[i].enabled = cpu_clock_st != 0 ? 1 : 0; + e_menu_options[i].enabled = cpu_clock_st > 0 ? 1 : 0; me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]); me_loop(e_menu_options, &sel); @@ -1553,12 +1450,12 @@ static void debug_menu_loop(void) 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++; } - else if (inp & PBTN_LEFT) { if (df_x > 0) df_x--; } - else if (inp & PBTN_RIGHT) { if (df_x < 1024 - g_menuscreen_w) df_x++; } + else if (inp & PBTN_LEFT) { if (df_x > 0) df_x -= 2; } + else if (inp & PBTN_RIGHT) { if (df_x < 1024 - g_menuscreen_w) df_x += 2; } } free(gpuf); @@ -1672,6 +1569,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); + + 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) @@ -1694,13 +1644,16 @@ static void menu_bios_warn(void) "The file is usually named SCPH1001.BIN,\n" "but other not compressed files can be\n" "used too.\n\n" - "Press (B) or (X) to continue"; + "Press %s or %s to continue"; + char tmp_msg[sizeof(msg) + 64]; + snprintf(tmp_msg, sizeof(tmp_msg), msg, + in_get_key_name(-1, -PBTN_MOK), in_get_key_name(-1, -PBTN_MBACK)); while (1) { - draw_menu_message(msg, NULL); + 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; } @@ -1708,14 +1661,17 @@ static void menu_bios_warn(void) // ------------ main menu ------------ +static menu_entry e_menu_main[]; void OnFile_Exit(); static void draw_frame_main(void) { struct tm *tmp; time_t ltime; + int capacity; char ltime_s[16]; char buff[64]; + char *out; if (CdromId[0] != 0) { snprintf(buff, sizeof(buff), "%.32s/%.9s (running as %s, with %s)", @@ -1725,11 +1681,17 @@ static void draw_frame_main(void) } if (ready_to_go) { + capacity = plat_get_bat_capacity(); ltime = time(NULL); tmp = localtime(<ime); strftime(ltime_s, sizeof(ltime_s), "%H:%M", tmp); - snprintf(buff, sizeof(buff), "%s %3d%%", ltime_s, plat_get_bat_capacity()); - smalltext_out16(4, 1 + me_sfont_h, buff, 0x105f); + if (capacity >= 0) { + snprintf(buff, sizeof(buff), "%s %3d%%", ltime_s, capacity); + out = buff; + } + else + out = ltime_s; + smalltext_out16(4, 1 + me_sfont_h, out, 0x105f); } } @@ -1853,9 +1815,9 @@ static int run_cd_image(const char *fname) return -1; } + emu_on_new_cd(); ready_to_go = 1; - snprintf(hud_msg, sizeof(hud_msg), "Booting up..."); - hud_new_msg = 2; + return 0; } @@ -1888,10 +1850,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; } @@ -1943,6 +1903,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) + me_update_msg("failed to load cheats"); + else { + snprintf(path, sizeof(path), "%d cheat(s) loaded", NumCheats + NumCodes); + me_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) @@ -1983,9 +1965,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(); @@ -2005,6 +1993,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, }; @@ -2015,6 +2004,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); } @@ -2032,6 +2022,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), @@ -2057,6 +2048,7 @@ void menu_loop(void) 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); @@ -2065,7 +2057,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); @@ -2230,19 +2222,25 @@ void menu_init(void) strcpy(last_selected_fname, "/media"); + cpu_clock_st = cpu_clock = plat_cpu_clock_get(); + scan_bios_plugins(); - pnd_menu_init(); menu_init_common(); 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); - if (g_menubg_src_ptr == NULL) + g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); + if (g_menubg_src_ptr == NULL || g_menubg_ptr == NULL) { + fprintf(stderr, "OOM\n"); exit(1); + } + emu_make_path(buff, "skin/background.png", sizeof(buff)); readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h); @@ -2258,60 +2256,11 @@ void menu_init(void) #endif } -// XXX: should really menu code cotrol the layer size? 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; - - 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) @@ -2325,16 +2274,24 @@ static void menu_leave_emu(void) plat_video_menu_enter(ready_to_go); memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2); - if (pl_vout_buf != NULL && ready_to_go && last_psx_bpp == 16) { - 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); + if (pl_vout_buf != NULL && ready_to_go) { + 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; - u16 *s = pl_vout_buf; + char *s = pl_vout_buf; - for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w) - menu_darken_bg(d, s, w, 0); + 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_vout_w * 3) { + rgb888_to_rgb565(d, s, w * 3); + menu_darken_bg(d, d, w, 0); + } + } } if (ready_to_go) @@ -2347,8 +2304,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 @@ -2360,9 +2315,8 @@ void menu_prepare_emu(void) CDR_stop(); menu_sync_config(); - apply_lcdrate(Config.PsxType); - apply_filter(filter); - plat_cpu_clock_apply(cpu_clock); + if (cpu_clock > 0) + plat_cpu_clock_apply(cpu_clock); // push config to GPU plugin plugin_call_rearmed_cbs(); @@ -2385,3 +2339,7 @@ void me_update_msg(const char *msg) lprintf("msg: %s\n", menu_error_msg); } +void menu_finish(void) +{ + plat_cpu_clock_apply(cpu_clock_st); +}