diff --git a/dynamic.c b/dynamic.c index e89bdfa18d..320bba474a 100644 --- a/dynamic.c +++ b/dynamic.c @@ -1213,6 +1213,42 @@ bool rarch_environment_cb(unsigned cmd, void *data) system->ports.size = i; break; } + + case RETRO_ENVIRONMENT_SET_MEMORY_MAPS: + { + unsigned i; + const struct retro_memory_map *mmaps = + (const struct retro_memory_map*)data; + + RARCH_LOG("Environ SET_MEMORY_MAPS.\n"); + RARCH_LOG(" flags ptr offset start select disconn len addrspace\n"); + + for (i = 0; i < mmaps->num_descriptors; i++) + { + const struct retro_memory_descriptor *desc = + &mmaps->descriptors[i]; + + RARCH_LOG("Memory map: %u\n", i + 1); + RARCH_LOG(" %08X %p %08X %08X %08X %08X %08X %s\n", + desc->flags, desc->ptr, desc->offset, desc->start, + desc->select, desc->disconnect, desc->len, + desc->addrspace ? desc->addrspace : ""); + } + + free((void*)system->mmaps.descriptors); + system->mmaps.num_descriptors = 0; + + system->mmaps.descriptors = (struct retro_memory_descriptor*) + calloc(mmaps->num_descriptors, sizeof(*system->mmaps.descriptors)); + + if (!system->mmaps.descriptors) + return false; + + memcpy((void*)system->mmaps.descriptors, mmaps->descriptors, + mmaps->num_descriptors * sizeof(*system->mmaps.descriptors)); + system->mmaps.num_descriptors = mmaps->num_descriptors; + break; + } case RETRO_ENVIRONMENT_SET_GEOMETRY: { diff --git a/runloop.c b/runloop.c index 63e4e2d889..7e42d10147 100644 --- a/runloop.c +++ b/runloop.c @@ -717,13 +717,20 @@ bool runloop_ctl(enum runloop_ctl_state state, void *data) if (runloop_system.subsystem.data) free(runloop_system.subsystem.data); runloop_system.subsystem.data = NULL; + runloop_system.subsystem.size = 0; + if (runloop_system.ports.data) free(runloop_system.ports.data); - runloop_system.subsystem.size = 0; - runloop_system.ports.data = NULL; - runloop_system.ports.size = 0; - runloop_key_event = NULL; - runloop_frontend_key_event = NULL; + runloop_system.ports.data = NULL; + runloop_system.ports.size = 0; + + if (runloop_system.mmaps.descriptors) + free((void *)runloop_system.mmaps.descriptors); + runloop_system.mmaps.descriptors = NULL; + runloop_system.mmaps.num_descriptors = 0; + + runloop_key_event = NULL; + runloop_frontend_key_event = NULL; audio_driver_unset_callback(); memset(&runloop_system, 0, sizeof(rarch_system_info_t)); diff --git a/system.h b/system.h index a878b1d624..ad7f656789 100644 --- a/system.h +++ b/system.h @@ -54,6 +54,8 @@ typedef struct rarch_system_info struct retro_controller_info *data; unsigned size; } ports; + + struct retro_memory_map mmaps; } rarch_system_info_t; #ifdef __cplusplus