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=8e663572253cb81905ceb20a84e24de5eb44d460;hb=bce6b05695beb988b607eb1dd82c27c1ed841faa;hpb=e6eb2066c0d198d793067caed47b670b691eb865 diff --git a/frontend/menu.c b/frontend/menu.c index 8e663572..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; @@ -122,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); @@ -132,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; @@ -191,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), @@ -690,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; } @@ -845,6 +852,8 @@ 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; @@ -854,6 +863,7 @@ static int menu_loop_plugin_options(int id, int keys) 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; } @@ -869,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, }; @@ -932,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); @@ -982,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; @@ -1066,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); @@ -1104,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), @@ -1122,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 { @@ -1306,6 +1358,8 @@ static void menu_leave_emu(void) void menu_prepare_emu(void) { + R3000Acpu *prev_cpu = psxCpu; + plat_video_menu_leave(); switch (scaling) { @@ -1327,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);