aboutsummaryrefslogtreecommitdiff
path: root/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'core.c')
-rw-r--r--core.c83
1 files changed, 80 insertions, 3 deletions
diff --git a/core.c b/core.c
index 6f28d28..2a1cf5b 100644
--- a/core.c
+++ b/core.c
@@ -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;