X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=f2a24fd6c91fae63ccf3f76fd23f9e76ec8eab27;hp=34b6e362b0ce1116618a43ceea59e7f0bd0c2398;hb=bce6b05695beb988b607eb1dd82c27c1ed841faa;hpb=ee78346e30720ddb3f4c97b6598bdc6dc7257f98 diff --git a/frontend/menu.c b/frontend/menu.c index 34b6e362..f2a24fd6 100644 --- a/frontend/menu.c +++ b/frontend/menu.c @@ -36,6 +36,7 @@ typedef enum MA_MAIN_LOAD_STATE, MA_MAIN_RESET_GAME, MA_MAIN_LOAD_ROM, + MA_MAIN_RUN_BIOS, MA_MAIN_CONTROLS, MA_MAIN_CREDITS, MA_MAIN_EXIT, @@ -67,7 +68,6 @@ int g_opts; // from softgpu plugin extern int iUseDither; extern int UseFrameSkip; -extern int UseFrameLimit; extern uint32_t dwActFixes; extern float fFrameRateHz; extern int dwFrameRateTicks; @@ -79,9 +79,10 @@ extern int iXAPitch; extern int iSPUIRQWait; extern int iUseTimer; +static const char *bioses[24]; static const char *gpu_plugins[16]; static const char *spu_plugins[16]; -static int gpu_plugsel, spu_plugsel; +static int bios_sel, gpu_plugsel, spu_plugsel; static int min(int x, int y) { return x < y ? x : y; } @@ -121,8 +122,16 @@ static int emu_save_load_game(int load, int sram) if (ret != 0) return 0; - if (load) + if (load) { ret = LoadState(fname); + + // reflect hle/bios mode from savestate + if (Config.HLE) + bios_sel = 0; + else if (bios_sel == 0 && bioses[1] != NULL) + // XXX: maybe find the right bios instead + bios_sel = 1; + } else ret = SaveState(fname); @@ -131,13 +140,13 @@ static int emu_save_load_game(int load, int sram) static void menu_set_defconfig(void) { + g_opts = 0; scaling = SCALE_4_3; Config.Xa = Config.Cdda = Config.Sio = Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0; iUseDither = UseFrameSkip = 0; - UseFrameLimit = 1; dwActFixes = 1<<7; iUseReverb = 2; @@ -190,7 +199,6 @@ static const struct { CE_INTVAL(g_opts), CE_INTVAL(iUseDither), CE_INTVAL(UseFrameSkip), - CE_INTVAL(UseFrameLimit), CE_INTVAL(dwActFixes), CE_INTVAL(iUseReverb), CE_INTVAL(iUseInterpolation), @@ -351,6 +359,10 @@ static int menu_load_config(int is_game) } // sync plugins + for (i = bios_sel = 0; bioses[i] != NULL; i++) + if (strcmp(Config.Bios, bioses[i]) == 0) + { bios_sel = i; break; } + for (i = gpu_plugsel = 0; gpu_plugins[i] != NULL; i++) if (strcmp(Config.Gpu, gpu_plugins[i]) == 0) { gpu_plugsel = i; break; } @@ -685,7 +697,7 @@ static int menu_loop_keyconfig(int id, int keys) { static int sel = 0; -// me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go); +// me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]); me_loop(e_menu_keyconfig, &sel, NULL); return 0; } @@ -822,13 +834,17 @@ static int menu_loop_plugin_spu(int id, int keys) return 0; } -static const char h_gpu[] = "Configure built-in P.E.Op.S. SoftGL Driver V1.17"; -static const char h_spu[] = "Configure built-in P.E.Op.S. Sound Driver V1.7"; +static const char h_bios[] = "HLE is simulated BIOS. BIOS is saved in savestates.\n" + "Must save config and reload the game\n" + "for change to take effect"; static const char h_plugin_xpu[] = "Must save config and reload the game\n" "for plugin change to take effect"; +static const char h_gpu[] = "Configure built-in P.E.Op.S. SoftGL Driver V1.17"; +static const char h_spu[] = "Configure built-in P.E.Op.S. Sound Driver V1.7"; static menu_entry e_menu_plugin_options[] = { + mee_enum_h ("BIOS", 0, bios_sel, bioses, h_bios), mee_enum_h ("GPU plugin", 0, gpu_plugsel, gpu_plugins, h_plugin_xpu), mee_enum_h ("SPU plugin", 0, spu_plugsel, spu_plugins, h_plugin_xpu), mee_handler_h ("Configure built-in GPU plugin", menu_loop_plugin_gpu, h_gpu), @@ -836,14 +852,18 @@ static menu_entry e_menu_plugin_options[] = mee_end, }; +static menu_entry e_menu_main[]; + static int menu_loop_plugin_options(int id, int keys) { static int sel = 0; me_loop(e_menu_plugin_options, &sel, NULL); - // sync plugins + // sync BIOS/plugins + snprintf(Config.Bios, sizeof(Config.Bios), "%s", bioses[bios_sel]); snprintf(Config.Gpu, sizeof(Config.Gpu), "%s", gpu_plugins[gpu_plugsel]); snprintf(Config.Spu, sizeof(Config.Spu), "%s", spu_plugins[spu_plugsel]); + me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0); return 0; } @@ -859,17 +879,20 @@ static const char h_cfg_sio[] = "This should be enabled for certain memcards/ static const char h_cfg_spuirq[] = "Compatibility tweak; should probably be left off"; static const char h_cfg_rcnt1[] = "Parasite Eve 2, Vandal Hearts 1/2 Fix"; static const char h_cfg_rcnt2[] = "InuYasha Sengoku Battle Fix"; +static const char h_cfg_nodrc[] = "Disable dynamic recompiler and use interpreter\n" + "Might be useful to overcome some dynarec bugs"; static menu_entry e_menu_adv_options[] = { mee_onoff_h ("Show CPU load", 0, g_opts, OPT_SHOWCPU, h_cfg_cpul), - mee_onoff_h ("Frame Limiter", 0, UseFrameLimit, 1, h_cfg_fl), + mee_onoff_h ("Disable Frame Limiter", 0, g_opts, OPT_NO_FRAMELIM, h_cfg_fl), mee_onoff_h ("Disable XA Decoding", 0, Config.Xa, 1, h_cfg_xa), mee_onoff_h ("Disable CD Audio", 0, Config.Cdda, 1, h_cfg_cdda), mee_onoff_h ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio), mee_onoff_h ("SPU IRQ Always Enabled", 0, Config.SpuIrq, 1, h_cfg_spuirq), mee_onoff_h ("Rootcounter hack", 0, Config.RCntFix, 1, h_cfg_rcnt1), mee_onoff_h ("Rootcounter hack 2", 0, Config.VSyncWA, 1, h_cfg_rcnt2), + mee_onoff_h ("Disable dynarec (slow!)",0, Config.Cpu, 1, h_cfg_nodrc), mee_end, }; @@ -922,7 +945,7 @@ static int menu_loop_options(int id, int keys) i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS); e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0; - me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go); + me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]); me_loop(e_menu_options, &sel, NULL); @@ -972,9 +995,50 @@ const char *plat_get_credits(void) " frontend (C) 2010-2011 notaz\n"; } +static int reset_game(void) +{ + // sanity check + if (bios_sel == 0 && !Config.HLE) + return -1; + + ClosePlugins(); + OpenPlugins(); + SysReset(); + if (CheckCdrom() != -1) { + LoadCdrom(); + } + return 0; +} + +static int run_bios(void) +{ + if (bios_sel == 0) + return -1; + + ready_to_go = 0; + pl_fbdev_buf = NULL; + + ClosePlugins(); + set_cd_image(NULL); + LoadPlugins(); + NetOpened = 0; + if (OpenPlugins() == -1) { + me_update_msg("failed to open plugins"); + return -1; + } + plugin_call_rearmed_cbs(); + + CdromId[0] = '\0'; + CdromLabel[0] = '\0'; + + SysReset(); + + ready_to_go = 1; + return 0; +} + static int run_cd_image(const char *fname) { - extern void set_cd_image(const char *fname); ready_to_go = 0; pl_fbdev_buf = NULL; @@ -1056,20 +1120,17 @@ static int main_menu_handler(int id, int keys) return menu_loop_savestate(1); break; case MA_MAIN_RESET_GAME: - if (ready_to_go) { - ClosePlugins(); - OpenPlugins(); - SysReset(); - if (CheckCdrom() != -1) { - LoadCdrom(); - } + if (ready_to_go && reset_game() == 0) return 1; - } break; case MA_MAIN_LOAD_ROM: if (romsel_run() == 0) return 1; break; + case MA_MAIN_RUN_BIOS: + if (run_bios() == 0) + return 1; + break; case MA_MAIN_CREDITS: draw_menu_credits(draw_frame_debug); in_menu_wait(PBTN_MOK|PBTN_MBACK, 70); @@ -1094,6 +1155,7 @@ static menu_entry e_menu_main[] = mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler), mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler), mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler), + mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler), mee_handler ("Options", menu_loop_options), mee_handler ("Controls", menu_loop_keyconfig), mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler), @@ -1112,11 +1174,11 @@ void menu_loop(void) menu_leave_emu(); me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go); - me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go); - me_enable(e_menu_main, MA_MAIN_LOAD_STATE, 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_RUN_BIOS, bios_sel != 0); -// menu_enter(ready_to_go); in_set_config_int(0, IN_CFG_BLOCKING, 1); do { @@ -1132,22 +1194,61 @@ void menu_loop(void) menu_prepare_emu(); } -static void scan_plugins(void) +static void scan_bios_plugins(void) { char fname[MAXPATHLEN]; struct dirent *ent; - int gpu_i, spu_i; + int bios_i, gpu_i, spu_i; char *p; DIR *dir; + bioses[0] = "HLE"; gpu_plugins[0] = "builtin_gpu"; spu_plugins[0] = "builtin_spu"; - gpu_i = spu_i = 1; + bios_i = gpu_i = spu_i = 1; + + snprintf(fname, sizeof(fname), "%s/", Config.BiosDir); + dir = opendir(fname); + if (dir == NULL) { + perror("scan_bios_plugins bios opendir"); + goto do_plugins; + } + + while (1) { + struct stat st; + + 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; + + snprintf(fname, sizeof(fname), "%s/%s", Config.BiosDir, ent->d_name); + if (stat(fname, &st) != 0 || st.st_size != 512*1024) { + printf("bad BIOS file: %s\n", ent->d_name); + continue; + } + + if (bios_i < ARRAY_SIZE(bioses) - 1) { + bioses[bios_i++] = strdup(ent->d_name); + continue; + } + printf("too many BIOSes, dropping \"%s\"\n", ent->d_name); + } + + closedir(dir); + +do_plugins: snprintf(fname, sizeof(fname), "%s/", Config.PluginsDir); dir = opendir(fname); if (dir == NULL) { - perror("scan_plugins opendir"); + perror("scan_bios_plugins opendir"); return; } @@ -1202,7 +1303,7 @@ void menu_init(void) strcpy(last_selected_fname, "/media"); - scan_plugins(); + scan_bios_plugins(); pnd_menu_init(); menu_init_common(); @@ -1257,6 +1358,8 @@ static void menu_leave_emu(void) void menu_prepare_emu(void) { + R3000Acpu *prev_cpu = psxCpu; + plat_video_menu_leave(); switch (scaling) { @@ -1278,16 +1381,17 @@ void menu_prepare_emu(void) apply_cpu_clock(); stop = 0; + psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec; + if (psxCpu != prev_cpu) + // note that this does not really reset, just clears drc caches + psxCpu->Reset(); + // core doesn't care about Config.Cdda changes, // so handle them manually here if (Config.Cdda) CDR_stop(); - // HACK to set up the frame limiter if softgpu is not used.. - if (gpu_plugsel != 0) { - fFrameRateHz = Config.PsxType ? 50.0f : 59.94f; - dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100)); - } + pl_frame_interval = Config.PsxType ? 20000 : 16667; if (GPU_open != NULL) { int ret = GPU_open(&gpuDisp, "PCSX", NULL);