menu: don't override region, fix P.E.Op.S. frameskip
[pcsx_rearmed.git] / frontend / menu.c
index 05f5481..ea1ebe5 100644 (file)
@@ -63,12 +63,12 @@ static int last_psx_w, last_psx_h, last_psx_bpp;
 static int scaling, filter, state_slot, cpu_clock, cpu_clock_st;
 static char rom_fname_reload[MAXPATHLEN];
 static char last_selected_fname[MAXPATHLEN];
+static int region;
 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;
@@ -139,21 +139,39 @@ static int emu_save_load_game(int load, int sram)
        return ret;
 }
 
+// propagate menu settings to the emu vars
+static void menu_sync_config(void)
+{
+       Config.PsxAuto = 1;
+       if (region > 0) {
+               Config.PsxAuto = 0;
+               Config.PsxType = region - 1;
+       }
+       pl_frame_interval = Config.PsxType ? 20000 : 16667;
+
+       // used by P.E.Op.S. frameskip code
+       fFrameRateHz = Config.PsxType ? 50.0f : 59.94f;
+       dwFrameRateTicks = (100000*100 / (unsigned long)(fFrameRateHz*100));
+}
+
 static void menu_set_defconfig(void)
 {
+       g_opts = 0;
        scaling = SCALE_4_3;
 
+       region = 0;
        Config.Xa = Config.Cdda = Config.Sio =
        Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
 
        iUseDither = UseFrameSkip = 0;
-       UseFrameLimit = 1;
        dwActFixes = 1<<7;
 
        iUseReverb = 2;
        iUseInterpolation = 1;
        iXAPitch = iSPUIRQWait = 0;
        iUseTimer = 2;
+
+       menu_sync_config();
 }
 
 #define CE_CONFIG_STR(val) \
@@ -176,11 +194,10 @@ static const struct {
        CE_CONFIG_STR(Bios),
        CE_CONFIG_STR(Gpu),
        CE_CONFIG_STR(Spu),
-       CE_CONFIG_STR(Cdr),
+//     CE_CONFIG_STR(Cdr),
        CE_CONFIG_VAL(Xa),
        CE_CONFIG_VAL(Sio),
        CE_CONFIG_VAL(Mdec),
-       CE_CONFIG_VAL(PsxAuto),
        CE_CONFIG_VAL(Cdda),
        CE_CONFIG_VAL(Debug),
        CE_CONFIG_VAL(PsxOut),
@@ -188,7 +205,7 @@ static const struct {
        CE_CONFIG_VAL(RCntFix),
        CE_CONFIG_VAL(VSyncWA),
        CE_CONFIG_VAL(Cpu),
-       CE_CONFIG_VAL(PsxType),
+       CE_INTVAL(region),
        CE_INTVAL(scaling),
        CE_INTVAL(g_layer_x),
        CE_INTVAL(g_layer_y),
@@ -200,7 +217,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),
@@ -209,9 +225,9 @@ static const struct {
        CE_INTVAL(iUseTimer),
 };
 
-static void make_cfg_fname(char *buf, size_t size, int is_game)
+static char *get_cd_label(void)
 {
-       char trimlabel[33];
+       static char trimlabel[33];
        int j;
 
        strncpy(trimlabel, CdromLabel, 32);
@@ -220,8 +236,13 @@ static void make_cfg_fname(char *buf, size_t size, int is_game)
                if (trimlabel[j] == ' ')
                        trimlabel[j] = 0;
 
+       return trimlabel;
+}
+
+static void make_cfg_fname(char *buf, size_t size, int is_game)
+{
        if (is_game)
-               snprintf(buf, size, "." PCSX_DOT_DIR "cfg/%.32s-%.9s.cfg", trimlabel, CdromId);
+               snprintf(buf, size, "." PCSX_DOT_DIR "cfg/%.32s-%.9s.cfg", get_cd_label(), CdromId);
        else
                snprintf(buf, size, "." PCSX_DOT_DIR "%s", cfgfile_basename);
 }
@@ -360,6 +381,8 @@ static int menu_load_config(int is_game)
                }
        }
 
+       menu_sync_config();
+
        // sync plugins
        for (i = bios_sel = 0; bioses[i] != NULL; i++)
                if (strcmp(Config.Bios, bioses[i]) == 0)
@@ -384,8 +407,8 @@ fail:
 // rrrr rggg gggb bbbb
 static unsigned short fname2color(const char *fname)
 {
-       static const char *cdimg_exts[] = { ".bin", ".img", ".iso", ".z", ".cue" };
-       static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub", ".table" };
+       static const char *cdimg_exts[] = { ".bin", ".img", ".iso", ".cue", ".z", ".bz", ".znx", ".pbp" };
+       static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub", ".table", ".index" };
        const char *ext = strrchr(fname, '.');
        int i;
 
@@ -530,7 +553,7 @@ static void pnd_menu_init(void)
        struct dirent *ent;
        int i, count = 0;
        char **mfilters;
-       char buff[64], *p;
+       char buff[64];
        DIR *dir;
 
        cpu_clock_st = cpu_clock = get_cpu_clock();
@@ -549,9 +572,11 @@ static void pnd_menu_init(void)
                                perror("readdir");
                        break;
                }
-               p = strstr(ent->d_name, "_up");
-               if (p != NULL && (p[3] == 0 || !strcmp(p + 3, "_h")))
-                       count++;
+
+               if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
+                       continue;
+
+               count++;
        }
 
        if (count == 0)
@@ -565,11 +590,21 @@ static void pnd_menu_init(void)
        for (i = 0; (ent = readdir(dir)); ) {
                size_t len;
 
-               p = strstr(ent->d_name, "_up");
-               if (p == NULL || (p[3] != 0 && strcmp(p + 3, "_h")))
+               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;
 
-               len = p - ent->d_name;
                if (len > sizeof(buff) - 1)
                        continue;
 
@@ -817,7 +852,7 @@ static int menu_loop_plugin_gpu(int id, int keys)
 static const char *men_spu_reverb[] = { "Off", "Fake", "On", NULL };
 static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL };
 static const char h_spu_irq_wait[]  = "Wait for CPU; only useful for some games, may cause glitches";
-static const char h_spu_thread[]    = "Run sound emulation in separate thread";
+static const char h_spu_thread[]    = "Run sound emulation in main thread (recommended)";
 
 static menu_entry e_menu_plugin_spu[] =
 {
@@ -825,7 +860,7 @@ static menu_entry e_menu_plugin_spu[] =
        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   ("Use sound thread",          0, iUseTimer, 1, h_spu_thread),
+       mee_onoff_h   ("Sound in main thread",      0, iUseTimer, 2, h_spu_thread),
        mee_end,
 };
 
@@ -873,7 +908,7 @@ static int menu_loop_plugin_options(int id, int keys)
 // ------------ adv options menu ------------
 
 static const char h_cfg_cpul[]   = "Shows CPU usage in %%";
-static const char h_cfg_fl[]     = "Keeps the game from running too fast";
+static const char h_cfg_fl[]     = "Frame Limiter keeps the game from running too fast";
 static const char h_cfg_xa[]     = "Disables XA sound, which can sometimes improve performance";
 static const char h_cfg_cdda[]   = "Disable CD Audio for a performance boost\n"
                                   "(proper .cue/.bin dump is needed otherwise)";
@@ -881,17 +916,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,
 };
 
@@ -911,7 +949,7 @@ static int mh_restore_defaults(int id, int keys)
        return 1;
 }
 
-static const char *men_region[]       = { "NTSC", "PAL", NULL };
+static const char *men_region[]       = { "Auto", "NTSC", "PAL", NULL };
 /*
 static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
 static const char h_confirm_save[]    = "Ask for confirmation when overwriting save,\n"
@@ -926,7 +964,7 @@ static menu_entry e_menu_options[] =
 //     mee_enum_h    ("Confirm savestate",        0, dummy, men_confirm_save, h_confirm_save),
        mee_onoff     ("Frameskip",                0, UseFrameSkip, 1),
        mee_onoff     ("Show FPS",                 0, g_opts, OPT_SHOWFPS),
-       mee_enum      ("Region",                   0, Config.PsxType, men_region),
+       mee_enum      ("Region",                   0, region, men_region),
        mee_range     ("CPU clock",                MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000),
        mee_handler   ("[Display]",                menu_loop_gfx_options),
        mee_handler   ("[BIOS/Plugins]",           menu_loop_plugin_options),
@@ -979,6 +1017,21 @@ static void debug_menu_loop(void)
 
 void OnFile_Exit();
 
+static void draw_frame_main(void)
+{
+       if (CdromId[0] != 0) {
+               char buff[64];
+               snprintf(buff, sizeof(buff), "%.32s/%.9s (running as %s)",
+                        get_cd_label(), CdromId, Config.PsxType ? "PAL" : "NTSC");
+               smalltext_out16(4, 1, buff, 0x105f);
+       }
+}
+
+static void draw_frame_credits(void)
+{
+       smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
+}
+
 const char *plat_get_credits(void)
 {
        return  "PCSX-ReARMed\n\n"
@@ -1131,7 +1184,7 @@ static int main_menu_handler(int id, int keys)
                        return 1;
                break;
        case MA_MAIN_CREDITS:
-               draw_menu_credits(draw_frame_debug);
+               draw_menu_credits(draw_frame_credits);
                in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
                break;
        case MA_MAIN_EXIT:
@@ -1181,7 +1234,7 @@ void menu_loop(void)
        in_set_config_int(0, IN_CFG_BLOCKING, 1);
 
        do {
-               me_loop(e_menu_main, &sel, NULL);
+               me_loop(e_menu_main, &sel, draw_frame_main);
        } while (!ready_to_go);
 
        /* wait until menu, ok, back is released */
@@ -1352,11 +1405,16 @@ static void menu_leave_emu(void)
                        menu_darken_bg(d, s, w, 0);
        }
 
+       if (ready_to_go)
+               cpu_clock = get_cpu_clock();
+
        plat_video_menu_enter(ready_to_go);
 }
 
 void menu_prepare_emu(void)
 {
+       R3000Acpu *prev_cpu = psxCpu;
+
        plat_video_menu_leave();
 
        switch (scaling) {
@@ -1378,16 +1436,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));
-       }
+       menu_sync_config();
 
        if (GPU_open != NULL) {
                int ret = GPU_open(&gpuDisp, "PCSX", NULL);