diff --git a/content.c b/content.c index a2018c8efe..c99b7c5e09 100644 --- a/content.c +++ b/content.c @@ -351,13 +351,16 @@ static bool load_ram_file(ram_type_t *ram) */ static bool save_ram_file(ram_type_t *ram) { - size_t size = core.retro_get_memory_size(ram->type); - void *data = core.retro_get_memory_data(ram->type); + retro_ctx_memory_info_t mem_info; - if (!data || size == 0) + mem_info.ram = ram; + + core_ctl(CORE_CTL_RETRO_GET_MEMORY, &mem_info); + + if (!mem_info.data || mem_info.size == 0) return false; - if (!retro_write_file(ram->path, data, size)) + if (!retro_write_file(ram->path, mem_info.data, mem_info.size)) { RARCH_ERR("%s.\n", msg_hash_to_str(MSG_FAILED_TO_SAVE_SRAM)); @@ -366,7 +369,7 @@ static bool save_ram_file(ram_type_t *ram) /* In case the file could not be written to, * the fallback function 'dump_to_file_desperate' * will be called. */ - if (!dump_to_file_desperate(data, size, ram->type)) + if (!dump_to_file_desperate(mem_info.data, mem_info.size, ram->type)) { RARCH_WARN("Failed ... Cannot recover save file.\n"); } diff --git a/libretro_version_1.c b/libretro_version_1.c index ced6d463ec..38aa65069b 100644 --- a/libretro_version_1.c +++ b/libretro_version_1.c @@ -174,6 +174,15 @@ bool core_ctl(enum core_ctl_state state, void *data) switch (state) { + case CORE_CTL_RETRO_GET_MEMORY: + { + retro_ctx_memory_info_t *info = (retro_ctx_memory_info_t*)data; + if (!info || !info->ram) + return false; + info->size = core.retro_get_memory_size(info->ram->type); + info->data = core.retro_get_memory_data(info->ram->type); + } + break; case CORE_CTL_RETRO_LOAD_GAME: { retro_ctx_load_content_info_t *load_info = diff --git a/libretro_version_1.h b/libretro_version_1.h index f18132ca9c..fd525bf5b7 100644 --- a/libretro_version_1.h +++ b/libretro_version_1.h @@ -24,6 +24,7 @@ extern "C" { #include <boolean.h> +#include "content.h" #include "libretro.h" enum @@ -82,6 +83,8 @@ enum core_ctl_state */ CORE_CTL_VERIFY_API_VERSION, + CORE_CTL_RETRO_GET_MEMORY, + /** * Initialize system A/V information. **/ @@ -92,6 +95,13 @@ enum core_ctl_state CORE_CTL_RETRO_LOAD_GAME }; +typedef struct retro_ctx_memory_info +{ + void *data; + size_t size; + ram_type_t *ram; +} retro_ctx_memory_info_t; + typedef struct retro_ctx_load_content_info { struct retro_game_info *info;