improve fast forward for cd
[picodrive.git] / platform / common / emu.c
index ebc7c77..0a1b59c 100644 (file)
@@ -151,13 +151,13 @@ void emu_status_msg(const char *format, ...)
 }\r
 \r
 static const char * const biosfiles_us[] = {\r
-       "us_scd1_9210", "us_scd2_9306", "SegaCDBIOS9303", "bios_CD_U"\r
+       "us_scd2_9306", "SegaCDBIOS9303", "us_scd1_9210", "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
+       "eu_mcd2_9306", "eu_mcd2_9303", "eu_mcd1_9210", "bios_CD_E"\r
 };\r
 static const char * const biosfiles_jp[] = {\r
-       "jp_mcd1_9112", "jp_mcd1_9111", "bios_CD_J"\r
+       "jp_mcd2_921222", "jp_mcd1_9112", "jp_mcd1_9111", "bios_CD_J"\r
 };\r
 \r
 static const char *find_bios(int *region, const char *cd_fname)\r
@@ -322,6 +322,10 @@ static void system_announce(void)
 #endif\r
        } else if (PicoAHW & PAHW_PICO) {\r
                sys_name = "Pico";\r
+       } else if ((PicoAHW & (PAHW_32X|PAHW_MCD)) == (PAHW_32X|PAHW_MCD)) {\r
+               sys_name = "32X + Mega CD";\r
+               if ((Pico.m.hardware & 0xc0) == 0x80)\r
+                       sys_name = "32X + Sega CD";\r
        } else if (PicoAHW & PAHW_MCD) {\r
                sys_name = "Mega CD";\r
                if ((Pico.m.hardware & 0xc0) == 0x80)\r
@@ -348,6 +352,8 @@ static void do_region_override(const char *media_fname)
 \r
 int emu_reload_rom(const char *rom_fname_in)\r
 {\r
+       // use setting before rom config is loaded\r
+       int autoload = g_autostateld_opt;\r
        char *rom_fname = NULL;\r
        char ext[5];\r
        enum media_type_e media_type;\r
@@ -491,7 +497,7 @@ int emu_reload_rom(const char *rom_fname_in)
                emu_save_load_game(1, 1);\r
 \r
        // state autoload?\r
-       if (g_autostateld_opt) {\r
+       if (autoload) {\r
                int time, newest = 0, newest_slot = -1;\r
                int slot;\r
 \r
@@ -524,19 +530,20 @@ out:
 \r
 int emu_swap_cd(const char *fname)\r
 {\r
-       cd_img_type cd_type;\r
+       enum cd_img_type cd_type;\r
        int ret = -1;\r
 \r
        cd_type = PicoCdCheck(fname, NULL);\r
        if (cd_type != CIT_NOT_CD)\r
-               ret = Insert_CD(fname, cd_type);\r
+               ret = cdd_load(fname, cd_type);\r
        if (ret != 0) {\r
                menu_update_msg("Load failed, invalid CD image?");\r
                return 0;\r
        }\r
 \r
        strncpy(rom_fname_loaded, fname, sizeof(rom_fname_loaded)-1);\r
-       rom_fname_loaded[sizeof(rom_fname_loaded)-1] = 0;\r
+       rom_fname_loaded[sizeof(rom_fname_loaded) - 1] = 0;\r
+\r
        return 1;\r
 }\r
 \r
@@ -572,7 +579,7 @@ void emu_prep_defconfig(void)
        defaultConfig.EmuOpt    = 0x9d | 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_MCD_GFX |\r
-                                 POPT_EN_SVP_DRC|POPT_ACC_SPRITES |\r
+                                 POPT_EN_DRC|POPT_ACC_SPRITES |\r
                                  POPT_EN_32X|POPT_EN_PWM;\r
        defaultConfig.s_PsndRate = 44100;\r
        defaultConfig.s_PicoRegion = 0; // auto\r
@@ -600,7 +607,6 @@ void emu_set_defconfig(void)
        PsndRate = currentConfig.s_PsndRate;\r
        PicoRegionOverride = currentConfig.s_PicoRegion;\r
        PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder;\r
-       PicoCDBuffers = currentConfig.s_PicoCDBuffers;\r
 }\r
 \r
 int emu_read_config(const char *rom_fname, int no_defaults)\r
@@ -732,8 +738,26 @@ mk_text_out(emu_text_out16_rot, unsigned short, 0xffff,
 \r
 #undef mk_text_out\r
 \r
+void emu_osd_text16(int x, int y, const char *text)\r
+{\r
+       int len = strlen(text) * 8;\r
+       int i, h;\r
+\r
+       len++;\r
+       if (x + len > g_screen_width)\r
+               len = g_screen_width - x;\r
+\r
+       for (h = 0; h < 8; h++) {\r
+               unsigned short *p;\r
+               p = (unsigned short *)g_screen_ptr\r
+                       + x + g_screen_width * (y + h);\r
+               for (i = len; i > 0; i--, p++)\r
+                       *p = (*p >> 2) & 0x39e7;\r
+       }\r
+       emu_text_out16(x, y, text);\r
+}\r
 \r
-void update_movie(void)\r
+static void update_movie(void)\r
 {\r
        int offs = Pico.m.frame_count*3 + 0x40;\r
        if (offs+3 > movie_size) {\r
@@ -949,6 +973,9 @@ void emu_set_fastforward(int set_on)
                currentConfig.EmuOpt = set_EmuOpt;\r
                PsndRerate(1);\r
                is_on = 0;\r
+               // mainly to unbreak pcm\r
+               if (PicoAHW & PAHW_MCD)\r
+                       pcd_state_loaded();\r
        }\r
 }\r
 \r
@@ -1067,9 +1094,9 @@ static void run_events_ui(unsigned int which)
                        char tmp[64];\r
                        int keys, len;\r
 \r
-                       strcpy(tmp, (which & PEV_STATE_LOAD) ? "LOAD STATE?" : "OVERWRITE SAVE?");\r
+                       strcpy(tmp, (which & PEV_STATE_LOAD) ? "LOAD STATE? " : "OVERWRITE SAVE? ");\r
                        len = strlen(tmp);\r
-                       nm = in_get_key_name(-1, -PBTN_MA3);\r
+                       nm = in_get_key_name(-1, -PBTN_MOK);\r
                        snprintf(tmp + len, sizeof(tmp) - len, "(%s=yes, ", nm);\r
                        len = strlen(tmp);\r
                        nm = in_get_key_name(-1, -PBTN_MBACK);\r
@@ -1078,13 +1105,13 @@ static void run_events_ui(unsigned int which)
                        plat_status_msg_busy_first(tmp);\r
 \r
                        in_set_config_int(0, IN_CFG_BLOCKING, 1);\r
-                       while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK))\r
+                       while (in_menu_wait_any(NULL, 50) & (PBTN_MOK | PBTN_MBACK))\r
                                ;\r
-                       while ( !((keys = in_menu_wait_any(NULL, 50)) & (PBTN_MA3|PBTN_MBACK)) )\r
+                       while ( !((keys = in_menu_wait_any(NULL, 50)) & (PBTN_MOK | PBTN_MBACK)))\r
                                ;\r
                        if (keys & PBTN_MBACK)\r
                                do_it = 0;\r
-                       while (in_menu_wait_any(NULL, 50) & (PBTN_MA3|PBTN_MBACK))\r
+                       while (in_menu_wait_any(NULL, 50) & (PBTN_MOK | PBTN_MBACK))\r
                                ;\r
                        in_set_config_int(0, IN_CFG_BLOCKING, 0);\r
                }\r
@@ -1306,7 +1333,6 @@ static void emu_loop_prep(void)
                filter_old = currentConfig.filter;\r
        }\r
 \r
-printf("-- gamma %d\n", currentConfig.gamma);\r
        plat_target_gamma_set(currentConfig.gamma, 0);\r
 \r
        pemu_loop_prep();\r
@@ -1331,10 +1357,6 @@ void emu_loop(void)
 \r
        PicoLoopPrepare();\r
 \r
-       // prepare CD buffer\r
-       if (PicoAHW & PAHW_MCD)\r
-               PicoCDBufferInit();\r
-\r
        plat_video_loop_prepare();\r
        emu_loop_prep();\r
        pemu_sound_start();\r
@@ -1378,6 +1400,8 @@ void emu_loop(void)
                        {\r
                                notice_msg_time = 0;\r
                                plat_status_msg_clear();\r
+                               plat_video_flip();\r
+                               plat_status_msg_clear(); /* Do it again in case of double buffering */\r
                                notice_msg = NULL;\r
                        }\r
                        else {\r
@@ -1406,7 +1430,7 @@ void emu_loop(void)
                        printf("%s\n", fpsbuff);\r
 #else\r
                        if (currentConfig.EmuOpt & EOPT_SHOW_FPS)\r
-                               sprintf(fpsbuff, "%02i/%02i  ", frames_shown, frames_done);\r
+                               snprintf(fpsbuff, 8, "%02i/%02i  ", frames_shown, frames_done);\r
 #endif\r
                        frames_shown = frames_done = 0;\r
                        timestamp_fps_x3 += ms_to_ticks(1000) * 3;\r
@@ -1496,10 +1520,4 @@ void emu_loop(void)
 \r
        pemu_loop_end();\r
        emu_sound_stop();\r
-\r
-       // pemu_loop_end() might want to do 1 frame for bg image,\r
-       // so free CD buffer here\r
-       if (PicoAHW & PAHW_MCD)\r
-               PicoCDBufferFree();\r
 }\r
-\r