X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?p=pcsx_rearmed.git;a=blobdiff_plain;f=frontend%2Fmenu.c;h=e1a3cc00d17f22f916363363e904091d7807b246;hp=8e663572253cb81905ceb20a84e24de5eb44d460;hb=076655d17df35d1f40137e88b7beaf5a039b058c;hpb=e6eb2066c0d198d793067caed47b670b691eb865 diff --git a/frontend/menu.c b/frontend/menu.c index 8e663572..e1a3cc00 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, @@ -122,8 +123,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); @@ -690,7 +699,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 +854,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 +865,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,6 +881,8 @@ 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[] = { @@ -880,6 +894,7 @@ static menu_entry e_menu_adv_options[] = 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 +947,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 +997,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 +1122,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 +1157,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 +1176,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 +1360,8 @@ static void menu_leave_emu(void) void menu_prepare_emu(void) { + R3000Acpu *prev_cpu = psxCpu; + plat_video_menu_leave(); switch (scaling) { @@ -1327,6 +1383,11 @@ 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)