tune flip calls and frame setup
[picodrive.git] / platform / common / emu.c
index bce9b78..4098bd2 100644 (file)
@@ -10,7 +10,7 @@
 #include <stdlib.h>\r
 #include <string.h>\r
 #include <stdarg.h>\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
 #include <unistd.h>\r
 #endif\r
 \r
 #include <pico/pico_int.h>\r
 #include <pico/patch.h>\r
 \r
+#ifndef _WIN32\r
+#define PATH_SEP      "/"\r
+#define PATH_SEP_C    '/'\r
+#else\r
+#define PATH_SEP      "\\"\r
+#define PATH_SEP_C    '\\'\r
+#endif\r
 \r
 #define STATUS_MSG_TIMEOUT 2000\r
 \r
 void *g_screen_ptr;\r
 \r
-#if !SCREEN_SIZE_FIXED\r
-int g_screen_width  = SCREEN_WIDTH;\r
-int g_screen_height = SCREEN_HEIGHT;\r
-#endif\r
+int g_screen_width  = 320;\r
+int g_screen_height = 240;\r
 \r
 char *PicoConfigFile = "config.cfg";\r
 currentConfig_t currentConfig, defaultConfig;\r
 int state_slot = 0;\r
 int config_slot = 0, config_slot_current = 0;\r
 int pico_pen_x = 320/2, pico_pen_y = 240/2;\r
-int pico_inp_mode = 0;\r
+int pico_inp_mode;\r
+int flip_after_sync;\r
 int engineState = PGS_Menu;\r
 \r
 static short __attribute__((aligned(4))) sndBuffer[2*44100/50];\r
@@ -144,9 +150,15 @@ void emu_status_msg(const char *format, ...)
        notice_msg_time = plat_get_ticks_ms();\r
 }\r
 \r
-static const char * const biosfiles_us[] = { "us_scd1_9210", "us_scd2_9306", "SegaCDBIOS9303" };\r
-static const char * const biosfiles_eu[] = { "eu_mcd1_9210", "eu_mcd2_9306", "eu_mcd2_9303"   };\r
-static const char * const biosfiles_jp[] = { "jp_mcd1_9112", "jp_mcd1_9111" };\r
+static const char * const biosfiles_us[] = {\r
+       "us_scd1_9210", "us_scd2_9306", "SegaCDBIOS9303", "bios_CD_U"\r
+};\r
+static const char * const biosfiles_eu[] = {\r
+       "eu_mcd1_9210", "eu_mcd2_9306", "eu_mcd2_9303", "bios_CD_E"\r
+};\r
+static const char * const biosfiles_jp[] = {\r
+       "jp_mcd1_9112", "jp_mcd1_9111", "bios_CD_J"\r
+};\r
 \r
 static const char *find_bios(int *region, const char *cd_fname)\r
 {\r
@@ -529,7 +541,8 @@ void emu_prep_defconfig(void)
        memset(&defaultConfig, 0, sizeof(defaultConfig));\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_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_MCD_GFX |\r
+                                 POPT_EN_SVP_DRC|POPT_ACC_SPRITES |\r
                                  POPT_EN_32X|POPT_EN_PWM;\r
        defaultConfig.s_PsndRate = 44100;\r
        defaultConfig.s_PicoRegion = 0; // auto\r
@@ -541,6 +554,8 @@ void emu_prep_defconfig(void)
        defaultConfig.gamma = 100;\r
        defaultConfig.scaling = 0;\r
        defaultConfig.turbo_rate = 15;\r
+       defaultConfig.msh2_khz = PICO_MSH2_HZ / 1000;\r
+       defaultConfig.ssh2_khz = PICO_SSH2_HZ / 1000;\r
 \r
        // platform specific overrides\r
        pemu_prep_defconfig();\r
@@ -554,8 +569,6 @@ 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(const char *rom_fname, int no_defaults)\r
@@ -574,33 +587,29 @@ int emu_read_config(const char *rom_fname, int no_defaults)
        }\r
        else\r
        {\r
-               char *sect = emu_make_rom_id(rom_fname);\r
+               char ext[16];\r
+               int vol;\r
 \r
                if (config_slot != 0)\r
-                    sprintf(cfg, "game.%i.cfg", config_slot);\r
-               else strcpy(cfg,  "game.cfg");\r
-\r
-               ret = -1;\r
-               if (config_havesect(cfg, sect))\r
-               {\r
-                       // read user's config\r
-                       int vol = currentConfig.volume;\r
-                       emu_set_defconfig();\r
-                       ret = config_readsect(cfg, sect);\r
-                       currentConfig.volume = vol; // make vol global (bah)\r
-               }\r
+                       snprintf(ext, sizeof(ext), ".%i.cfg", config_slot);\r
                else\r
+                       strcpy(ext, ".cfg");\r
+\r
+               fname_ext(cfg, sizeof(cfg), "cfg"PATH_SEP, ext, rom_fname);\r
+\r
+               // read user's config\r
+               vol = currentConfig.volume;\r
+               ret = config_readsect(cfg, NULL);\r
+               currentConfig.volume = vol; // make vol global (bah)\r
+\r
+               if (ret != 0)\r
                {\r
                        // read global config, and apply game_def.cfg on top\r
                        make_config_cfg(cfg);\r
                        config_readsect(cfg, NULL);\r
-                       emu_make_path(cfg, "game_def.cfg", sizeof(cfg));\r
-                       ret = config_readsect(cfg, sect);\r
-               }\r
 \r
-               if (ret == 0)\r
-               {\r
-                       lprintf("loaded cfg from sect \"%s\"\n", sect);\r
+                       emu_make_path(cfg, "game_def.cfg", sizeof(cfg));\r
+                       ret = config_readsect(cfg, emu_make_rom_id(rom_fname));\r
                }\r
        }\r
 \r
@@ -625,7 +634,7 @@ int emu_read_config(const char *rom_fname, int no_defaults)
 \r
 int emu_write_config(int is_game)\r
 {\r
-       char cfg[512], *game_sect = NULL;\r
+       char cfg[512];\r
        int ret, write_lrom = 0;\r
 \r
        if (!is_game)\r
@@ -633,17 +642,20 @@ int emu_write_config(int is_game)
                make_config_cfg(cfg);\r
                write_lrom = 1;\r
        } else {\r
+               char ext[16];\r
+\r
                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(rom_fname_loaded);\r
-               lprintf("emu_write_config: sect \"%s\"\n", game_sect);\r
+                       snprintf(ext, sizeof(ext), ".%i.cfg", config_slot);\r
+               else\r
+                       strcpy(ext, ".cfg");\r
+\r
+               romfname_ext(cfg, sizeof(cfg), "cfg"PATH_SEP, ext);\r
        }\r
 \r
        lprintf("emu_write_config: %s ", cfg);\r
-       ret = config_writesect(cfg, game_sect);\r
+       ret = config_write(cfg);\r
        if (write_lrom) config_writelrom(cfg);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
        sync();\r
 #endif\r
        lprintf((ret == 0) ? "(ok)\n" : "(failed)\n");\r
@@ -853,7 +865,7 @@ int emu_save_load_game(int load, int sram)
                                ret = fwrite(sram_data, 1, sram_size, sramFile);\r
                                ret = (ret != sram_size) ? -1 : 0;\r
                                fclose(sramFile);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                                sync();\r
 #endif\r
                        }\r
@@ -864,7 +876,7 @@ int emu_save_load_game(int load, int sram)
        {\r
                ret = PicoState(saveFname, !load);\r
                if (!ret) {\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                        if (!load) sync();\r
 #endif\r
                        emu_status_msg(load ? "STATE LOADED" : "STATE SAVED");\r
@@ -916,9 +928,6 @@ void emu_32x_startup(void)
 {\r
        plat_video_toggle_renderer(0, 0); // HACK\r
        system_announce();\r
-\r
-       // force mode change event\r
-       rendstatus_old = -1;\r
 }\r
 \r
 void emu_reset_game(void)\r
@@ -1168,6 +1177,7 @@ void emu_init(void)
        mkdir_path(path, pos, "mds");\r
        mkdir_path(path, pos, "srm");\r
        mkdir_path(path, pos, "brm");\r
+       mkdir_path(path, pos, "cfg");\r
 \r
        pprof_init();\r
 \r
@@ -1194,7 +1204,7 @@ void emu_finish(void)
                char cfg[512];\r
                make_config_cfg(cfg);\r
                config_writelrom(cfg);\r
-#ifndef NO_SYNC\r
+#ifdef __GP2X__\r
                sync();\r
 #endif\r
        }\r
@@ -1286,10 +1296,6 @@ void emu_loop(void)
 \r
        fpsbuff[0] = 0;\r
 \r
-       /* make sure we are in correct mode */\r
-       Pico.m.dirtyPal = 1;\r
-       rendstatus_old = -1;\r
-\r
        PicoLoopPrepare();\r
 \r
        // prepare CD buffer\r
@@ -1426,7 +1432,8 @@ void emu_loop(void)
                PicoFrame();\r
                pemu_finalize_frame(fpsbuff, notice_msg);\r
 \r
-               // plat_video_flip();\r
+               if (!flip_after_sync)\r
+                       plat_video_flip();\r
 \r
                /* frame limiter */\r
                if (!reset_timing && !(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT)))\r
@@ -1444,9 +1451,8 @@ void emu_loop(void)
                        }\r
                }\r
 \r
-               // XXX: for some plats it might be better to flip before vsync\r
-               // (due to shadow registers in display hw)\r
-               plat_video_flip();\r
+               if (flip_after_sync)\r
+                       plat_video_flip();\r
 \r
                pframes_done++; frames_done++; frames_shown++;\r
 \r