diff options
-rw-r--r-- | config.c | 1 | ||||
-rw-r--r-- | core.c | 83 | ||||
-rw-r--r-- | core.h | 3 | ||||
-rw-r--r-- | funkey/fk_instant_play.c | 1 | ||||
-rw-r--r-- | main.c | 2 | ||||
-rw-r--r-- | menu.c | 13 | ||||
-rw-r--r-- | options.c | 1 | ||||
-rw-r--r-- | options.h | 1 |
8 files changed, 102 insertions, 3 deletions
@@ -26,6 +26,7 @@ static const struct { CE_NUM(show_cpu), CE_NUM(limit_frames), CE_NUM(enable_drc), + CE_NUM(use_srm), CE_NUM(audio_buffer_size), CE_NUM(scale_size), CE_NUM(scale_filter), @@ -68,8 +68,12 @@ void sram_write(void) { if (!sram_size) { return; } - - content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".sav"); + + if (use_srm == 1) { + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".srm"); + } else { + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".sav"); + } sram_file = fopen(filename, "w"); if (!sram_file) { @@ -98,7 +102,23 @@ void sram_read(void) { return; } - content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".sav"); + if (use_srm == 1) { + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".srm"); + + sram_file = fopen(filename, "r"); + if (!sram_file) { + memset(filename, 0, sizeof(filename)); + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".sav"); + } + } else { + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".sav"); + + sram_file = fopen(filename, "r"); + if (!sram_file) { + memset(filename, 0, sizeof(filename)); + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".srm"); + } + } sram_file = fopen(filename, "r"); if (!sram_file) { @@ -114,6 +134,61 @@ void sram_read(void) { fclose(sram_file); } +void rtc_write(void) { + char filename[MAX_PATH]; + FILE *rtc_file = NULL; + void *rtc; + + size_t rtc_size = current_core.retro_get_memory_size(RETRO_MEMORY_RTC); + if (!rtc_size) { + return; + } + + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".rtc"); + + rtc_file = fopen(filename, "w"); + if (!rtc_file) { + PA_ERROR("Error opening RTC file: %s\n", strerror(errno)); + return; + } + + rtc = current_core.retro_get_memory_data(RETRO_MEMORY_RTC); + + if (!rtc || rtc_size != fwrite(rtc, 1, rtc_size, rtc_file)) { + PA_ERROR("Error writing RTC data to file\n"); + } + + fclose(rtc_file); + + sync(); +} + +void rtc_read(void) { + char filename[MAX_PATH]; + FILE *rtc_file = NULL; + void *rtc; + + size_t rtc_size = current_core.retro_get_memory_size(RETRO_MEMORY_RTC); + if (!rtc_size) { + return; + } + + content_based_name(content, filename, MAX_PATH, save_dir, NULL, ".rtc"); + + rtc_file = fopen(filename, "r"); + if (!rtc_file) { + return; + } + + rtc = current_core.retro_get_memory_data(RETRO_MEMORY_RTC); + + if (!rtc || !fread(rtc, 1, rtc_size, rtc_file)) { + PA_ERROR("Error reading RTC data\n"); + } + + fclose(rtc_file); +} + bool state_allowed(void) { return current_core.retro_serialize_size() > 0; } @@ -675,6 +750,7 @@ int core_load_content(struct content *content) { } sram_read(); + rtc_read(); if (!strcmp(core_name, "fmsx") && current_core.retro_set_controller_port_device) { /* fMSX works best with joypad + keyboard */ @@ -769,6 +845,7 @@ void core_run_frame(void) { void core_unload_content(void) { sram_write(); + rtc_write(); cheats_free(cheats); cheats = NULL; @@ -48,6 +48,9 @@ void save_relative_path(char *buf, size_t len, const char *basename); void sram_read(void); void sram_write(void); +void rtc_read(void); +void rtc_write(void); + bool state_allowed(void); void state_file_name(char *name, size_t size, int slot); bool state_exists(int slot); diff --git a/funkey/fk_instant_play.c b/funkey/fk_instant_play.c index a0d9451..261821b 100644 --- a/funkey/fk_instant_play.c +++ b/funkey/fk_instant_play.c @@ -84,6 +84,7 @@ void FK_Suspend(void) FK_Autosave(); sram_write(); + rtc_write(); save_config(CONFIG_TYPE_AUTO); PA_INFO("Suspending with %s %s %s %s %s\n", SHELL_CMD_INSTANT_PLAY, "save", prog_name, core_path, content->path); @@ -210,6 +210,7 @@ void set_defaults(void) limit_frames = 1; enable_audio = 1; enable_drc = 1; + use_srm = 0; audio_buffer_size = 5; scale_size = SCALE_SIZE_NONE; scale_filter = SCALE_FILTER_NEAREST; @@ -389,6 +390,7 @@ static void perform_emu_action(void) { case EACTION_MENU: toggle_fast_forward(1); /* Force FF off */ sram_write(); + rtc_write(); in_menu = true; #if defined(MMENU) if (mmenu && content && strlen(content->path)) { @@ -538,6 +538,11 @@ static const char h_scale_filter[] = "When stretching, how missing pixels are filled.\n" "Nearest copies the last pixel. Sharp keeps pixels\n" "aligned where possible. Smooth adds a blur effect."; + +static const char h_use_srm[] = + "Use .srm files for SRAM saves, needed for\n" + "compatibility with mainline retroarch saves.\n" + "Save file compression needs to be off in retroarch."; static const char *men_scale_size[] = { "Native", "Aspect", "Full", NULL}; #else @@ -561,6 +566,12 @@ static const char h_scale_filter[] = "are filled. Nearest copies the last\n" "pixel. Sharp tries to keep pixels\n" "aligned. Smooth adds a blur effect."; + +static const char h_use_srm[] = + "Use .srm files for SRAM saves,\n" + "needed for compatibility with mainline\n" + "retroarch saves. Save file compression\n" + "needs to be off in retroarch."; static const char *men_scale_size[] = { "Native", "Aspect", "Full", "Crop", NULL}; #endif @@ -615,6 +626,8 @@ const char *config_label(int id, int *offs) { static menu_entry e_menu_config_options[] = { + mee_onoff_h ("Use .srm saves", 0, use_srm, 1, h_use_srm), + mee_label (""), mee_cust_nosave ("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg), mee_cust_nosave ("Save game config", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg), mee_handler_id_h ("Delete game config", MA_OPT_RMCFG_GAME, mh_rmcfg, h_rm_config_game), @@ -13,6 +13,7 @@ int show_hud; int limit_frames; int enable_audio; int enable_drc; +int use_srm; unsigned audio_buffer_size; enum scale_size scale_size; enum scale_filter scale_filter; @@ -9,6 +9,7 @@ extern int show_hud; extern int limit_frames; extern int enable_audio; extern int enable_drc; +extern int use_srm; extern unsigned audio_buffer_size; extern enum scale_size scale_size; extern enum scale_filter scale_filter; |