From 8ac0be666e885cb70d98c62f90a5dba4b47b2bff Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Sat, 4 Sep 2010 02:26:32 +0000 Subject: [PATCH] Change shared memory regions to track their size. Added memory_get_shared() functions to retrieve a pointer to a shared region and optionally the size. --- src/emu/memory.c | 74 +++++++++++++++++++++++++++++++++++++++--------- src/emu/memory.h | 4 +++ 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/emu/memory.c b/src/emu/memory.c index 770fc31607f..e6d7205f283 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -224,9 +224,6 @@ // banking constants const int BANK_ENTRY_UNSPECIFIED = -1; -// shares are initially mapped to this invalid pointer -static void *UNMAPPED_SHARE_PTR = ((void *)-1); - // other address map constants const int MEMORY_BLOCK_CHUNK = 65536; // minimum chunk size of allocated memory blocks @@ -392,6 +389,31 @@ private: }; +// ======================> memory_share + +// a memory share contains information about shared memory region +class memory_share +{ +public: + // construction/destruction + memory_share(size_t size, void *ptr = NULL) + : m_ptr(ptr), + m_size(size) { } + + // getters + void *ptr() const { return m_ptr; } + size_t size() const { return m_size; } + + // setters + void set_ptr(void *ptr) { m_ptr = ptr; } + +private: + // internal state + void * m_ptr; // pointer to the memory backing the region + size_t m_size; // size of the shared region +}; + + // ======================> handler_entry // a handler entry contains information about a memory handler @@ -1499,7 +1521,7 @@ struct _memory_private tagmap_t bankmap; // map for fast bank lookups UINT8 banknext; // next bank to allocate - tagmap_t sharemap; // map for share lookups + tagmap_t sharemap; // map for share lookups }; @@ -1675,6 +1697,27 @@ void memory_set_bankptr(running_machine *machine, const char *tag, void *base) } +//------------------------------------------------- +// memory_get_shared - get a pointer to a shared +// memory region by tag +//------------------------------------------------- + +void *memory_get_shared(running_machine &machine, const char *tag) +{ + size_t size; + return memory_get_shared(machine, tag, size); +} + +void *memory_get_shared(running_machine &machine, const char *tag, size_t &length) +{ + memory_share *share = machine.memory_data->sharemap.find(tag); + if (share == NULL) + return NULL; + length = share->size(); + return share->ptr(); +} + + //------------------------------------------------- // memory_dump - dump the internal memory tables // to the given file @@ -1908,10 +1951,6 @@ void address_space::prepare_map() // make a pass over the address map, adjusting for the device and getting memory pointers for (address_map_entry *entry = m_map->m_entrylist.first(); entry != NULL; entry = entry->next()) { - // if we have a share entry, add it to our map - if (entry->m_share != NULL) - m_machine.memory_data->sharemap.add(entry->m_share, UNMAPPED_SHARE_PTR, false); - // computed adjusted addresses first entry->m_bytestart = entry->m_addrstart; entry->m_byteend = entry->m_addrend; @@ -1919,6 +1958,13 @@ void address_space::prepare_map() entry->m_bytemask = entry->m_addrmask; adjust_addresses(entry->m_bytestart, entry->m_byteend, entry->m_bytemask, entry->m_bytemirror); + // if we have a share entry, add it to our map + if (entry->m_share != NULL && m_machine.memory_data->sharemap.find(entry->m_share) == NULL) + { + memory_share *share = auto_alloc(&m_machine, memory_share(entry->m_byteend + 1 - entry->m_bytestart)); + m_machine.memory_data->sharemap.add(entry->m_share, share, false); + } + // if this is a ROM handler without a specified region, attach it to the implicit region if (m_spacenum == ADDRESS_SPACE_0 && entry->m_read.m_type == AMH_ROM && entry->m_region == NULL) { @@ -2274,10 +2320,10 @@ address_map_entry *address_space::block_assign_intersecting(offs_t bytestart, of // if we haven't assigned this block yet, see if we have a mapped shared pointer for it if (entry->m_memory == NULL && entry->m_share != NULL) { - void *shareptr = memdata->sharemap.find(entry->m_share); - if (shareptr != UNMAPPED_SHARE_PTR) + memory_share *share = memdata->sharemap.find(entry->m_share); + if (share != NULL && share->ptr() != NULL) { - entry->m_memory = shareptr; + entry->m_memory = share->ptr(); VPRINTF(("memory range %08X-%08X -> shared_ptr '%s' [%p]\n", entry->m_addrstart, entry->m_addrend, entry->m_share, entry->m_memory)); } } @@ -2292,9 +2338,9 @@ address_map_entry *address_space::block_assign_intersecting(offs_t bytestart, of // if we're the first match on a shared pointer, assign it now if (entry->m_memory != NULL && entry->m_share != NULL) { - void *shareptr = memdata->sharemap.find(entry->m_share); - if (shareptr == UNMAPPED_SHARE_PTR) - memdata->sharemap.add(entry->m_share, entry->m_memory, TRUE); + memory_share *share = memdata->sharemap.find(entry->m_share); + if (share != NULL && share->ptr() == NULL) + share->set_ptr(entry->m_memory); } // keep track of the first unassigned entry diff --git a/src/emu/memory.h b/src/emu/memory.h index f5c617fd184..1c2c4147463 100644 --- a/src/emu/memory.h +++ b/src/emu/memory.h @@ -740,6 +740,10 @@ int memory_get_bank(running_machine *machine, const char *tag) ATTR_NONNULL(1); // set the absolute address of a bank base void memory_set_bankptr(running_machine *machine, const char *tag, void *base) ATTR_NONNULL(1, 3); +// get a pointer to a shared memory region by tag +void *memory_get_shared(running_machine &machine, const char *tag); +void *memory_get_shared(running_machine &machine, const char *tag, size_t &length); + // dump the internal memory tables to the given file void memory_dump(running_machine *machine, FILE *file);