From f529af1f43ed0fabb78f2e7909157d90c5ab57b5 Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Fri, 10 Sep 2010 16:33:35 +0000 Subject: [PATCH] Align large memory blocks to 4k boundaries. --- src/emu/memory.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/src/emu/memory.c b/src/emu/memory.c index 64cbd501adb..2c9672db15c 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -280,9 +280,9 @@ private: memory_block * m_next; // next memory block in the list running_machine & m_machine; // need the machine to free our memory address_space & m_space; // which address space are we associated with? - bool m_isallocated; // did we allocate this ourselves? offs_t m_bytestart, m_byteend; // byte-normalized start/end for verifying a match UINT8 * m_data; // pointer to the data for this block + UINT8 * m_allocated; // pointer to the actually allocated block }; @@ -1961,6 +1961,7 @@ void address_space::prepare_map() // 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) { + VPRINTF(("Creating share '%s' of length 0x%X\n", entry->m_share, entry->m_byteend + 1 - entry->m_bytestart)); 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); } @@ -2326,6 +2327,10 @@ address_map_entry *address_space::block_assign_intersecting(offs_t bytestart, of 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)); } + else + { + VPRINTF(("memory range %08X-%08X -> shared_ptr '%s' but not found\n", entry->m_addrstart, entry->m_addrend, entry->m_share)); + } } // otherwise, look for a match in this block @@ -2340,7 +2345,10 @@ address_map_entry *address_space::block_assign_intersecting(offs_t bytestart, of { memory_share *share = memdata->sharemap.find(entry->m_share); if (share != NULL && share->ptr() == NULL) + { share->set_ptr(entry->m_memory); + VPRINTF(("setting shared_ptr '%s' = %p\n", entry->m_share, entry->m_memory)); + } } // keep track of the first unassigned entry @@ -4053,13 +4061,26 @@ memory_block::memory_block(address_space &space, offs_t bytestart, offs_t byteen : m_next(NULL), m_machine(space.m_machine), m_space(space), - m_isallocated(memory == NULL), m_bytestart(bytestart), m_byteend(byteend), - m_data((memory != NULL) ? reinterpret_cast(memory) : auto_alloc_array_clear(&space.m_machine, UINT8, byteend + 1 - bytestart)) + m_data(reinterpret_cast(memory)), + m_allocated(NULL) { VPRINTF(("block_allocate('%s',%s,%08X,%08X,%p)\n", space.device().tag(), space.name(), bytestart, byteend, memory)); + // allocate a block if needed + if (m_data == NULL) + { + offs_t length = byteend + 1 - bytestart; + if (length < 4096) + m_allocated = m_data = auto_alloc_array_clear(&space.m_machine, UINT8, length); + else + { + m_allocated = auto_alloc_array_clear(&space.m_machine, UINT8, length + 0xfff); + m_data = reinterpret_cast((reinterpret_cast(m_allocated) + 0xfff) & ~0xfff); + } + } + // register for saving, but only if we're not part of a memory region const region_info *region; for (region = space.m_machine.m_regionlist.first(); region != NULL; region = region->next()) @@ -4086,8 +4107,8 @@ memory_block::memory_block(address_space &space, offs_t bytestart, offs_t byteen memory_block::~memory_block() { - if (m_isallocated) - auto_free(&m_machine, m_data); + if (m_allocated != NULL) + auto_free(&m_machine, m_allocated); }