X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=6a50d1676a042a55ded1511fd273abb4f36354bf;hp=b3b717735c7883e17b3064d2b7de0faed74ef1f6;hb=ddc0a02a811034532a8e013c14091b61a89439ba;hpb=b105cf4f5e168fdce54c6011533df76d196a917b diff --git a/frontend/menu.c b/frontend/menu.c index b3b71773..6a50d167 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, @@ -83,8 +86,8 @@ enum { 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 scaling, 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; @@ -92,6 +95,7 @@ static int psx_clock; static int memcard1_sel, memcard2_sel; int g_opts; int soft_scaling, analog_deadzone; // for Caanoo +int filter; #ifdef __ARM_ARCH_7A__ #define DEFAULT_PSX_CLOCK 57 @@ -105,8 +109,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]; @@ -307,8 +309,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), @@ -376,15 +376,31 @@ 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; + + snprintf(path, sizeof(path), "." PCSX_DOT_DIR "lastcdimg.txt"); + f = fopen(path, is_get ? "r" : "w"); + if (f == NULL) + return -1; + + if (is_get) + fscanf(f, "%255s", 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; @@ -489,6 +505,10 @@ 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) @@ -589,7 +609,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); @@ -617,126 +637,6 @@ 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[] = @@ -1146,7 +1046,7 @@ static int menu_loop_cscaler(int id, int keys) scaling = SCALE_CUSTOM; - plat_gvideo_open(); + plat_gvideo_open(Config.PsxType); for (;;) { @@ -1156,7 +1056,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 +1083,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); } } @@ -1210,6 +1111,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 +1231,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 +1238,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, }; @@ -1553,12 +1460,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 +1579,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 +1654,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,6 +1671,7 @@ static void menu_bios_warn(void) // ------------ main menu ------------ +static menu_entry e_menu_main[]; void OnFile_Exit(); static void draw_frame_main(void) @@ -1861,9 +1825,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; } @@ -1896,9 +1860,6 @@ 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); return 0; } @@ -1951,6 +1912,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) @@ -1991,9 +1974,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(); @@ -2013,6 +2002,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, }; @@ -2023,6 +2013,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); } @@ -2040,6 +2031,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), @@ -2065,6 +2057,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); @@ -2073,7 +2066,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); @@ -2238,15 +2231,17 @@ 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); g_menubg_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1); @@ -2275,9 +2270,9 @@ 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; + last_vout_w = w; + last_vout_h = h; + last_vout_bpp = bpp; // XXX: should really menu code cotrol the layer size? switch (scaling) { @@ -2338,20 +2333,20 @@ 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); } } @@ -2367,7 +2362,7 @@ void menu_prepare_emu(void) plat_video_menu_leave(); - menu_notify_mode_change(last_psx_w, last_psx_h, last_psx_bpp); + menu_notify_mode_change(last_vout_w, last_vout_h, last_vout_bpp); psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; if (psxCpu != prev_cpu) @@ -2380,8 +2375,6 @@ void menu_prepare_emu(void) CDR_stop(); menu_sync_config(); - apply_lcdrate(Config.PsxType); - apply_filter(filter); if (cpu_clock > 0) plat_cpu_clock_apply(cpu_clock); @@ -2406,3 +2399,8 @@ void me_update_msg(const char *msg) lprintf("msg: %s\n", menu_error_msg); } +void menu_finish(void) +{ + menu_do_last_cd_img(0); + plat_cpu_clock_apply(cpu_clock_st); +}