diff options
-rw-r--r-- | core.c | 57 | ||||
-rw-r--r-- | core.h | 3 | ||||
-rw-r--r-- | funkey/fk_instant_play.c | 1 | ||||
-rw-r--r-- | main.c | 1 |
4 files changed, 62 insertions, 0 deletions
@@ -114,6 +114,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 +730,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 +825,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); @@ -389,6 +389,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)) { |