X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Femu.c;h=a075abdf01620dedc36a65ce7f42c0642f77ddaf;hb=0c9ae59222a6fa9af18dcc072fdfb06cfca124d6;hp=370242dc951feb4ef5c5ca02f192bd5fbe087636;hpb=6c026031a80434cda8499e2208538e0155466d6b;p=libpicofe.git diff --git a/common/emu.c b/common/emu.c index 370242d..a075abd 100644 --- a/common/emu.c +++ b/common/emu.c @@ -92,6 +92,36 @@ static void get_ext(const char *file, char *ext) strlwr_(ext); } +static void fname_ext(char *dst, int dstlen, const char *prefix, const char *ext, const char *fname) +{ + int prefix_len = 0; + const char *p; + + *dst = 0; + if (prefix) { + int len = plat_get_root_dir(dst, dstlen); + strcpy(dst + len, prefix); + prefix_len = len + strlen(prefix); + } + + p = fname + strlen(fname) - 1; + for (; p >= fname && *p != PATH_SEP_C; p--) + ; + p++; + strncpy(dst + prefix_len, p, dstlen - prefix_len - 1); + + dst[dstlen - 8] = 0; + if (dst[strlen(dst) - 4] == '.') + dst[strlen(dst) - 4] = 0; + if (ext) + strcat(dst, ext); +} + +static void romfname_ext(char *dst, int dstlen, const char *prefix, const char *ext) +{ + fname_ext(dst, dstlen, prefix, ext, rom_fname_loaded); +} + void emu_status_msg(const char *format, ...) { va_list vl; @@ -365,7 +395,7 @@ static int extract_text(char *dest, const unsigned char *src, int len, int swab) return p - dest; } -static char *emu_make_rom_id(void) +static char *emu_make_rom_id(const char *fname) { static char id_string[3+0xe*3+0x3*3+0x30*3+3]; int pos, swab = 1; @@ -374,15 +404,25 @@ static char *emu_make_rom_id(void) strcpy(id_string, "CD|"); swab = 0; } - else strcpy(id_string, "MD|"); + else if (PicoAHW & PAHW_SMS) + strcpy(id_string, "MS|"); + else strcpy(id_string, "MD|"); pos = 3; - pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial - id_string[pos] = '|'; pos++; - pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region - id_string[pos] = '|'; pos++; - pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name - id_string[pos] = 0; + if (!(PicoAHW & PAHW_SMS)) { + pos += extract_text(id_string + pos, id_header + 0x80, 0x0e, swab); // serial + id_string[pos] = '|'; pos++; + pos += extract_text(id_string + pos, id_header + 0xf0, 0x03, swab); // region + id_string[pos] = '|'; pos++; + pos += extract_text(id_string + pos, id_header + 0x50, 0x30, swab); // overseas name + id_string[pos] = 0; + if (pos > 5) + return id_string; + pos = 3; + } + + // can't find name in ROM, use filename + fname_ext(id_string + 3, sizeof(id_string) - 3, NULL, NULL, fname); return id_string; } @@ -464,25 +504,25 @@ int emu_reload_rom(char *rom_fname) // check for both gmv and rom int dummy; FILE *movie_file = fopen(rom_fname, "rb"); - if(!movie_file) { + if (!movie_file) { me_update_msg("Failed to open movie."); return 0; } fseek(movie_file, 0, SEEK_END); movie_size = ftell(movie_file); fseek(movie_file, 0, SEEK_SET); - if(movie_size < 64+3) { + if (movie_size < 64+3) { me_update_msg("Invalid GMV file."); fclose(movie_file); return 0; } movie_data = malloc(movie_size); - if(movie_data == NULL) { + if (movie_data == NULL) { me_update_msg("low memory."); fclose(movie_file); return 0; } - fread(movie_data, 1, movie_size, movie_file); + dummy = fread(movie_data, 1, movie_size, movie_file); fclose(movie_file); if (strncmp((char *)movie_data, "Gens Movie TEST", 15) != 0) { me_update_msg("Invalid GMV file."); @@ -530,8 +570,8 @@ int emu_reload_rom(char *rom_fname) // valid CD image, check for BIOS.. // we need to have config loaded at this point - ret = emu_read_config(1, 0); - if (!ret) emu_read_config(0, 0); + ret = emu_read_config(rom_fname, 0); + if (!ret) emu_read_config(NULL, 0); cfg_loaded = 1; if (PicoRegionOverride) { @@ -593,8 +633,8 @@ int emu_reload_rom(char *rom_fname) if (!(PicoAHW & PAHW_MCD)) memcpy(id_header, rom_data + 0x100, sizeof(id_header)); if (!cfg_loaded) { - ret = emu_read_config(1, 0); - if (!ret) emu_read_config(0, 0); + ret = emu_read_config(rom_fname, 0); + if (!ret) emu_read_config(NULL, 0); } emu_make_path(static_buff, "carthw.cfg", sizeof(static_buff)); @@ -681,29 +721,6 @@ int emu_swap_cd(const char *fname) return 1; } -static void romfname_ext(char *dst, const char *prefix, const char *ext) -{ - char *p; - int prefix_len = 0; - - // make save filename - p = rom_fname_loaded + strlen(rom_fname_loaded) - 1; - for (; p >= rom_fname_loaded && *p != PATH_SEP_C; p--); p++; - *dst = 0; - if (prefix) { - int len = plat_get_root_dir(dst, 512); - strcpy(dst + len, prefix); - prefix_len = len + strlen(prefix); - } -#ifdef UIQ3 - else p = rom_fname_loaded; // backward compatibility -#endif - strncpy(dst + prefix_len, p, 511-prefix_len); - dst[511-8] = 0; - if (dst[strlen(dst)-4] == '.') dst[strlen(dst)-4] = 0; - if (ext) strcat(dst, ext); -} - // void emu_make_path(char *buff, const char *end, int size) { @@ -730,6 +747,28 @@ static void make_config_cfg(char *cfg_buff_512) cfg_buff_512[511] = 0; } +void emu_prep_defconfig(void) +{ + memset(&defaultConfig, 0, sizeof(defaultConfig)); + defaultConfig.EmuOpt = 0x9d | EOPT_RAM_TIMINGS|EOPT_EN_CD_LEDS; + defaultConfig.s_PicoOpt = POPT_EN_STEREO|POPT_EN_FM|POPT_EN_PSG|POPT_EN_Z80 | + POPT_EN_MCD_PCM|POPT_EN_MCD_CDDA|POPT_EN_SVP_DRC|POPT_ACC_SPRITES | + POPT_EN_32X|POPT_EN_PWM; + defaultConfig.s_PsndRate = 44100; + defaultConfig.s_PicoRegion = 0; // auto + defaultConfig.s_PicoAutoRgnOrder = 0x184; // US, EU, JP + defaultConfig.s_PicoCDBuffers = 0; + defaultConfig.confirm_save = EOPT_CONFIRM_SAVE; + defaultConfig.Frameskip = -1; // auto + defaultConfig.volume = 50; + defaultConfig.gamma = 100; + defaultConfig.scaling = 0; + defaultConfig.turbo_rate = 15; + + // platform specific overrides + pemu_prep_defconfig(); +} + void emu_set_defconfig(void) { memcpy(¤tConfig, &defaultConfig, sizeof(currentConfig)); @@ -738,9 +777,11 @@ void emu_set_defconfig(void) PicoRegionOverride = currentConfig.s_PicoRegion; PicoAutoRgnOrder = currentConfig.s_PicoAutoRgnOrder; PicoCDBuffers = currentConfig.s_PicoCDBuffers; + p32x_msh2_multiplier = MSH2_MULTI_DEFAULT; + p32x_ssh2_multiplier = SSH2_MULTI_DEFAULT; } -int emu_read_config(int game, int no_defaults) +int emu_read_config(const char *rom_fname, int no_defaults) { char cfg[512]; int ret; @@ -748,16 +789,16 @@ int emu_read_config(int game, int no_defaults) if (!no_defaults) emu_set_defconfig(); - if (!game) + if (rom_fname == NULL) { + // global config make_config_cfg(cfg); ret = config_readsect(cfg, NULL); } else { - char *sect = emu_make_rom_id(); + char *sect = emu_make_rom_id(rom_fname); - // try new .cfg way if (config_slot != 0) sprintf(cfg, "game.%i.cfg", config_slot); else strcpy(cfg, "game.cfg"); @@ -786,7 +827,7 @@ int emu_read_config(int game, int no_defaults) } } - plat_validate_config(); + pemu_validate_config(); // some sanity checks #ifdef PSP @@ -818,7 +859,7 @@ int emu_write_config(int is_game) if (config_slot != 0) sprintf(cfg, "game.%i.cfg", config_slot); else strcpy(cfg, "game.cfg"); - game_sect = emu_make_rom_id(); + game_sect = emu_make_rom_id(rom_fname_loaded); lprintf("emu_write_config: sect \"%s\"\n", game_sect); } @@ -918,14 +959,15 @@ char *emu_get_save_fname(int load, int is_sram, int slot) if (is_sram) { strcpy(ext, (PicoAHW & PAHW_MCD) ? ".brm" : ".srm"); - romfname_ext(saveFname, (PicoAHW & PAHW_MCD) ? "brm"PATH_SEP : "srm"PATH_SEP, ext); + romfname_ext(saveFname, sizeof(static_buff), + (PicoAHW & PAHW_MCD) ? "brm"PATH_SEP : "srm"PATH_SEP, ext); if (!load) return saveFname; if (try_ropen_file(saveFname)) return saveFname; - romfname_ext(saveFname, NULL, ext); + romfname_ext(saveFname, sizeof(static_buff), NULL, ext); if (try_ropen_file(saveFname)) return saveFname; } @@ -939,15 +981,15 @@ char *emu_get_save_fname(int load, int is_sram, int slot) strcat(ext, ext_main); if (!load) { - romfname_ext(saveFname, "mds" PATH_SEP, ext); + romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext); return saveFname; } else { - romfname_ext(saveFname, "mds" PATH_SEP, ext); + romfname_ext(saveFname, sizeof(static_buff), "mds" PATH_SEP, ext); if (try_ropen_file(saveFname)) return saveFname; - romfname_ext(saveFname, NULL, ext); + romfname_ext(saveFname, sizeof(static_buff), NULL, ext); if (try_ropen_file(saveFname)) return saveFname; @@ -957,7 +999,7 @@ char *emu_get_save_fname(int load, int is_sram, int slot) sprintf(ext, ".%i", slot); strcat(ext, ext_othr); - romfname_ext(saveFname, "mds"PATH_SEP, ext); + romfname_ext(saveFname, sizeof(static_buff), "mds"PATH_SEP, ext); if (try_ropen_file(saveFname)) return saveFname; } @@ -1008,13 +1050,16 @@ int emu_save_load_game(int load, int sram) sram_size = SRam.size; sram_data = SRam.data; } - if (!sram_data) return 0; // SRam forcefully disabled for this game + if (sram_data == NULL) + return 0; // SRam forcefully disabled for this game if (load) { sramFile = fopen(saveFname, "rb"); - if(!sramFile) return -1; - fread(sram_data, 1, sram_size, sramFile); + if (!sramFile) + return -1; + ret = fread(sram_data, 1, sram_size, sramFile); + ret = ret > 0 ? 0 : -1; fclose(sramFile); if ((PicoAHW & PAHW_MCD) && (PicoOpt&POPT_EN_MCD_RAMCART)) memcpy32((int *)Pico_mcd->bram, (int *)sram_data, 0x2000/4); @@ -1092,7 +1137,7 @@ static void emu_tray_close(void) void emu_32x_startup(void) { - plat_video_toggle_renderer(0, 1, 0); + plat_video_toggle_renderer(0, 0); system_announce(); } @@ -1188,8 +1233,8 @@ static void run_events_ui(unsigned int which) { int do_it = 1; if ( emu_check_save_file(state_slot) && - (((which & PEV_STATE_LOAD) && (currentConfig.EmuOpt & EOPT_CONFIRM_LOAD)) || - ((which & PEV_STATE_SAVE) && (currentConfig.EmuOpt & EOPT_CONFIRM_SAVE))) ) + (((which & PEV_STATE_LOAD) && (currentConfig.confirm_save & EOPT_CONFIRM_LOAD)) || + ((which & PEV_STATE_SAVE) && (currentConfig.confirm_save & EOPT_CONFIRM_SAVE))) ) { const char *nm; char tmp[64]; @@ -1223,9 +1268,9 @@ static void run_events_ui(unsigned int which) PicoStateProgressCB = NULL; } } - if ((which & PEV_SWITCH_RND) && !(PicoAHW & PAHW_32X)) + if (which & PEV_SWITCH_RND) { - plat_video_toggle_renderer(1, 0, 0); + plat_video_toggle_renderer(1, 0); } if (which & (PEV_SSLOT_PREV|PEV_SSLOT_NEXT)) { @@ -1323,6 +1368,8 @@ void emu_init(void) mkdir_path(path, pos, "srm"); mkdir_path(path, pos, "brm"); + pprof_init(); + make_config_cfg(path); config_readlrom(path); @@ -1349,6 +1396,8 @@ void emu_finish(void) #endif } + pprof_finish(); + PicoExit(); } @@ -1408,6 +1457,8 @@ void emu_loop(void) unsigned int timestamp; int diff, diff_lim; + pprof_start(main); + timestamp = get_ticks(); if (reset_timing) { reset_timing = 0; @@ -1446,6 +1497,7 @@ void emu_loop(void) } bench_fps += frames_shown; sprintf(fpsbuff, "%02i/%02i/%02i", frames_shown, bench_fps_s, (bf[0]+bf[1]+bf[2]+bf[3])>>2); + printf("%s\n", fpsbuff); #else if (currentConfig.EmuOpt & EOPT_SHOW_FPS) { sprintf(fpsbuff, "%02i/%02i", frames_shown, frames_done); @@ -1463,17 +1515,15 @@ void emu_loop(void) { if ((currentConfig.EmuOpt & EOPT_NO_FRMLIMIT) && currentConfig.Frameskip >= 0) pframes_done = 0; - else { + else pframes_done -= target_fps; - /* don't allow it to drift during heavy slowdowns */ - if (pframes_done < -5) { - reset_timing = 1; - continue; - } - if (pframes_done < -2) - pframes_done = -2; + if (pframes_done < -2) { + /* don't drag more than 2 frames behind */ + pframes_done = -2; + timestamp_base = timestamp - 2 * target_frametime; } - timestamp_base += ms_to_ticks(1000); + else + timestamp_base += ms_to_ticks(1000); } diff = timestamp - timestamp_base; @@ -1498,19 +1548,20 @@ void emu_loop(void) else if (diff > diff_lim) { /* no time left for this frame - skip */ - if (diff - diff_lim >= ms_to_ticks(200)) { - /* if too much behind, reset instead */ - reset_timing = 1; + /* limit auto frameskip to 8 */ + if (frames_done / 8 <= frames_shown) { + emu_update_input(); + skip_frame(diff < diff_lim + target_frametime * 16); + pframes_done++; frames_done++; continue; } - emu_update_input(); - skip_frame(diff < diff_lim + target_frametime * 2); - pframes_done++; frames_done++; - continue; } emu_update_input(); PicoFrame(); + pemu_finalize_frame(fpsbuff, notice_msg); + + // plat_video_flip(); /* frame limiter */ if (!reset_timing && !(currentConfig.EmuOpt & (EOPT_NO_FRMLIMIT|EOPT_EXT_FRMLIMIT))) @@ -1528,9 +1579,13 @@ void emu_loop(void) } } - pemu_update_display(fpsbuff, notice_msg); + // XXX: for some plats it might be better to flip before vsync + // (due to shadow registers in display hw) + plat_video_flip(); pframes_done++; frames_done++; frames_shown++; + + pprof_end(main); } emu_set_fastforward(0);