sh2 overclock and logging stuff, menu refactoring
[libpicofe.git] / common / emu.c
index 1e83694..a075abd 100644 (file)
@@ -92,6 +92,36 @@ static void get_ext(const char *file, char *ext)
        strlwr_(ext);\r
 }\r
 \r
+static void fname_ext(char *dst, int dstlen, const char *prefix, const char *ext, const char *fname)\r
+{\r
+       int prefix_len = 0;\r
+       const char *p;\r
+\r
+       *dst = 0;\r
+       if (prefix) {\r
+               int len = plat_get_root_dir(dst, dstlen);\r
+               strcpy(dst + len, prefix);\r
+               prefix_len = len + strlen(prefix);\r
+       }\r
+\r
+       p = fname + strlen(fname) - 1;\r
+       for (; p >= fname && *p != PATH_SEP_C; p--)\r
+               ;\r
+       p++;\r
+       strncpy(dst + prefix_len, p, dstlen - prefix_len - 1);\r
+\r
+       dst[dstlen - 8] = 0;\r
+       if (dst[strlen(dst) - 4] == '.')\r
+               dst[strlen(dst) - 4] = 0;\r
+       if (ext)\r
+               strcat(dst, ext);\r
+}\r
+\r
+static void romfname_ext(char *dst, int dstlen, const char *prefix, const char *ext)\r
+{\r
+       fname_ext(dst, dstlen, prefix, ext, rom_fname_loaded);\r
+}\r
+\r
 void emu_status_msg(const char *format, ...)\r
 {\r
        va_list vl;\r
@@ -365,7 +395,7 @@ static int extract_text(char *dest, const unsigned char *src, int len, int swab)
        return p - dest;\r
 }\r
 \r
-static char *emu_make_rom_id(void)\r
+static char *emu_make_rom_id(const char *fname)\r
 {\r
        static char id_string[3+0xe*3+0x3*3+0x30*3+3];\r
        int pos, swab = 1;\r
@@ -374,15 +404,25 @@ static char *emu_make_rom_id(void)
                strcpy(id_string, "CD|");\r
                swab = 0;\r
        }\r
-       else strcpy(id_string, "MD|");\r
+       else if (PicoAHW & PAHW_SMS)\r
+               strcpy(id_string, "MS|");\r
+       else    strcpy(id_string, "MD|");\r
        pos = 3;\r
 \r
-       pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial\r
-       id_string[pos] = '|'; pos++;\r
-       pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region\r
-       id_string[pos] = '|'; pos++;\r
-       pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name\r
-       id_string[pos] = 0;\r
+       if (!(PicoAHW & PAHW_SMS)) {\r
+               pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial\r
+               id_string[pos] = '|'; pos++;\r
+               pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region\r
+               id_string[pos] = '|'; pos++;\r
+               pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name\r
+               id_string[pos] = 0;\r
+               if (pos > 5)\r
+                       return id_string;\r
+               pos = 3;\r
+       }\r
+\r
+       // can't find name in ROM, use filename\r
+       fname_ext(id_string + 3, sizeof(id_string) - 3, NULL, NULL, fname);\r
 \r
        return id_string;\r
 }\r
@@ -530,8 +570,8 @@ int emu_reload_rom(char *rom_fname)
                        // valid CD image, check for BIOS..\r
 \r
                        // we need to have config loaded at this point\r
-                       ret = emu_read_config(1, 0);\r
-                       if (!ret) emu_read_config(0, 0);\r
+                       ret = emu_read_config(rom_fname, 0);\r
+                       if (!ret) emu_read_config(NULL, 0);\r
                        cfg_loaded = 1;\r
 \r
                        if (PicoRegionOverride) {\r
@@ -593,8 +633,8 @@ int emu_reload_rom(char *rom_fname)
        if (!(PicoAHW & PAHW_MCD))\r
                memcpy(id_header, rom_data + 0x100, sizeof(id_header));\r
        if (!cfg_loaded) {\r
-               ret = emu_read_config(1, 0);\r
-               if (!ret) emu_read_config(0, 0);\r
+               ret = emu_read_config(rom_fname, 0);\r
+               if (!ret) emu_read_config(NULL, 0);\r
        }\r
 \r
        emu_make_path(static_buff, "carthw.cfg", sizeof(static_buff));\r
@@ -681,29 +721,6 @@ int emu_swap_cd(const char *fname)
        return 1;\r
 }\r
 \r
-static void romfname_ext(char *dst, const char *prefix, const char *ext)\r
-{\r
-       char *p;\r
-       int prefix_len = 0;\r
-\r
-       // make save filename\r
-       p = rom_fname_loaded + strlen(rom_fname_loaded) - 1;\r
-       for (; p >= rom_fname_loaded && *p != PATH_SEP_C; p--); p++;\r
-       *dst = 0;\r
-       if (prefix) {\r
-               int len = plat_get_root_dir(dst, 512);\r
-               strcpy(dst + len, prefix);\r
-               prefix_len = len + strlen(prefix);\r
-       }\r
-#ifdef UIQ3\r
-       else p = rom_fname_loaded; // backward compatibility\r
-#endif\r
-       strncpy(dst + prefix_len, p, 511-prefix_len);\r
-       dst[511-8] = 0;\r
-       if (dst[strlen(dst)-4] == '.') dst[strlen(dst)-4] = 0;\r
-       if (ext) strcat(dst, ext);\r
-}\r
-\r
 // <base dir><end>\r
 void emu_make_path(char *buff, const char *end, int size)\r
 {\r
@@ -733,7 +750,7 @@ static void make_config_cfg(char *cfg_buff_512)
 void emu_prep_defconfig(void)\r
 {\r
        memset(&defaultConfig, 0, sizeof(defaultConfig));\r
-       defaultConfig.EmuOpt    = 0x9d | EOPT_RAM_TIMINGS|EOPT_CONFIRM_SAVE|EOPT_EN_CD_LEDS;\r
+       defaultConfig.EmuOpt    = 0x9d | EOPT_RAM_TIMINGS|EOPT_EN_CD_LEDS;\r
        defaultConfig.s_PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80 |\r
                                  POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC|POPT_ACC_SPRITES |\r
                                  POPT_EN_32X|POPT_EN_PWM;\r
@@ -741,6 +758,7 @@ void emu_prep_defconfig(void)
        defaultConfig.s_PicoRegion = 0; // auto\r
        defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP\r
        defaultConfig.s_PicoCDBuffers = 0;\r
+       defaultConfig.confirm_save = EOPT_CONFIRM_SAVE;\r
        defaultConfig.Frameskip = -1; // auto\r
        defaultConfig.volume = 50;\r
        defaultConfig.gamma = 100;\r
@@ -759,9 +777,11 @@ void emu_set_defconfig(void)
        PicoRegionOverride = currentConfig.s_PicoRegion;\r
        PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
        PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
+       p32x_msh2_multiplier = MSH2_MULTI_DEFAULT;\r
+       p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT;\r
 }\r
 \r
-int emu_read_config(int game, int no_defaults)\r
+int emu_read_config(const char *rom_fname, int no_defaults)\r
 {\r
        char cfg[512];\r
        int ret;\r
@@ -769,16 +789,16 @@ int emu_read_config(int game, int no_defaults)
        if (!no_defaults)\r
                emu_set_defconfig();\r
 \r
-       if (!game)\r
+       if (rom_fname == NULL)\r
        {\r
+               // global config\r
                make_config_cfg(cfg);\r
                ret = config_readsect(cfg, NULL);\r
        }\r
        else\r
        {\r
-               char *sect = emu_make_rom_id();\r
+               char *sect = emu_make_rom_id(rom_fname);\r
 \r
-               // try new .cfg way\r
                if (config_slot != 0)\r
                     sprintf(cfg, "game.%i.cfg", config_slot);\r
                else strcpy(cfg,  "game.cfg");\r
@@ -839,7 +859,7 @@ int emu_write_config(int is_game)
                if (config_slot != 0)\r
                     sprintf(cfg, "game.%i.cfg", config_slot);\r
                else strcpy(cfg,  "game.cfg");\r
-               game_sect = emu_make_rom_id();\r
+               game_sect = emu_make_rom_id(rom_fname_loaded);\r
                lprintf("emu_write_config: sect \"%s\"\n", game_sect);\r
        }\r
 \r
@@ -939,14 +959,15 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
        if (is_sram)\r
        {\r
                strcpy(ext, (PicoAHW & PAHW_MCD) ? ".brm" : ".srm");\r
-               romfname_ext(saveFname, (PicoAHW & PAHW_MCD) ? "brm"PATH_SEP : "srm"PATH_SEP, ext);\r
+               romfname_ext(saveFname, sizeof(static_buff),\r
+                       (PicoAHW & PAHW_MCD) ? "brm"PATH_SEP : "srm"PATH_SEP, ext);\r
                if (!load)\r
                        return saveFname;\r
 \r
                if (try_ropen_file(saveFname))\r
                        return saveFname;\r
 \r
-               romfname_ext(saveFname, NULL, ext);\r
+               romfname_ext(saveFname, sizeof(static_buff), NULL, ext);\r
                if (try_ropen_file(saveFname))\r
                        return saveFname;\r
        }\r
@@ -960,15 +981,15 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
                strcat(ext, ext_main);\r
 \r
                if (!load) {\r
-                       romfname_ext(saveFname, "mds" PATH_SEP, ext);\r
+                       romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext);\r
                        return saveFname;\r
                }\r
                else {\r
-                       romfname_ext(saveFname, "mds" PATH_SEP, ext);\r
+                       romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext);\r
                        if (try_ropen_file(saveFname))\r
                                return saveFname;\r
 \r
-                       romfname_ext(saveFname, NULL, ext);\r
+                       romfname_ext(saveFname, sizeof(static_buff), NULL, ext);\r
                        if (try_ropen_file(saveFname))\r
                                return saveFname;\r
 \r
@@ -978,7 +999,7 @@ char *emu_get_save_fname(int load, int is_sram, int slot)
                                sprintf(ext, ".%i", slot);\r
                        strcat(ext, ext_othr);\r
 \r
-                       romfname_ext(saveFname, "mds"PATH_SEP, ext);\r
+                       romfname_ext(saveFname, sizeof(static_buff), "mds"PATH_SEP, ext);\r
                        if (try_ropen_file(saveFname))\r
                                return saveFname;\r
                }\r
@@ -1212,8 +1233,8 @@ static void run_events_ui(unsigned int which)
        {\r
                int do_it = 1;\r
                if ( emu_check_save_file(state_slot) &&\r
-                               (((which & PEV_STATE_LOAD) && (currentConfig.EmuOpt & EOPT_CONFIRM_LOAD)) ||\r
-                                ((which & PEV_STATE_SAVE) && (currentConfig.EmuOpt & EOPT_CONFIRM_SAVE))) )\r
+                       (((which & PEV_STATE_LOAD) && (currentConfig.confirm_save & EOPT_CONFIRM_LOAD)) ||\r
+                        ((which & PEV_STATE_SAVE) && (currentConfig.confirm_save & EOPT_CONFIRM_SAVE))) )\r
                {\r
                        const char *nm;\r
                        char tmp[64];\r