pandora: use quad buffering so that ff doesn't tear
[picodrive.git] / platform / common / emu.c
index d0cc988..1573d12 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
@@ -548,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
@@ -561,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
@@ -581,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
@@ -632,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
@@ -640,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
@@ -860,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
@@ -871,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
@@ -1172,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
@@ -1198,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
@@ -1364,10 +1370,8 @@ void emu_loop(void)
                        sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2);\r
                        printf("%s\n", fpsbuff);\r
 #else\r
-                       if (currentConfig.EmuOpt & EOPT_SHOW_FPS) {\r
-                               sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done);\r
-                               if (fpsbuff[5] == 0) { fpsbuff[5] = fpsbuff[6] = ' '; fpsbuff[7] = 0; }\r
-                       }\r
+                       if (currentConfig.EmuOpt & EOPT_SHOW_FPS)\r
+                               sprintf(fpsbuff, "%02i/%02i  ", frames_shown, frames_done);\r
 #endif\r
                        frames_shown = frames_done = 0;\r
                        timestamp_fps += ms_to_ticks(1000);\r
@@ -1426,7 +1430,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 +1449,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