From c9fc846c46ed7edbd29497ba54cb826f708459e5 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Fri, 5 Aug 2011 18:52:29 +0000 Subject: [PATCH] memory: Fix an endianness issue when doing a device mapping on a big endian bus [O. Galibert] --- src/emu/addrmap.c | 7 ++++--- src/emu/addrmap.h | 2 +- src/emu/memory.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/emu/addrmap.c b/src/emu/addrmap.c index 7239901bd48..78f6317ceba 100644 --- a/src/emu/addrmap.c +++ b/src/emu/addrmap.c @@ -843,7 +843,7 @@ address_map_entry64 *address_map::add(offs_t start, offs_t end, address_map_entr // uplift_submaps - propagate in the device submaps //------------------------------------------------- -void address_map::uplift_submaps(running_machine &machine, device_t &device) +void address_map::uplift_submaps(running_machine &machine, device_t &device, endianness_t endian) { address_map_entry *prev = 0; address_map_entry *entry = m_entrylist.first(); @@ -859,7 +859,7 @@ void address_map::uplift_submaps(running_machine &machine, device_t &device) address_map submap(*mapdevice, entry); // Recursively uplift it if needed - submap.uplift_submaps(machine, *mapdevice); + submap.uplift_submaps(machine, *mapdevice, endian); // Compute the unit repartition characteristics int entry_bits = entry->m_submap_bits; @@ -879,6 +879,7 @@ void address_map::uplift_submaps(running_machine &machine, device_t &device) int slot_offset[8]; int slot_count = 0; int max_slot_count = m_databits / entry_bits; + int slot_xor_mask = endian == ENDIANNESS_LITTLE ? 0 : max_slot_count - 1; UINT64 global_mask = entry->m_read.m_mask; // zero means all @@ -889,7 +890,7 @@ void address_map::uplift_submaps(running_machine &machine, device_t &device) // unitmask_is_appropriate, so one bit is enough for (int slot=0; slot < max_slot_count; slot++) if (global_mask & (1ULL << (slot * entry_bits))) - slot_offset[slot_count++] = slot * entry_bits; + slot_offset[slot_count++] = (slot ^ slot_xor_mask) * entry_bits; // Merge in all the map contents in order while (submap.m_entrylist.count()) diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h index 4078db568f8..ae9e1de27ff 100644 --- a/src/emu/addrmap.h +++ b/src/emu/addrmap.h @@ -441,7 +441,7 @@ public: offs_t m_globalmask; // global mask simple_list m_entrylist; // list of entries - void uplift_submaps(running_machine &machine, device_t &device); + void uplift_submaps(running_machine &machine, device_t &device, endianness_t endian); }; diff --git a/src/emu/memory.c b/src/emu/memory.c index 12c73353740..81080771ab7 100644 --- a/src/emu/memory.c +++ b/src/emu/memory.c @@ -2155,7 +2155,7 @@ void address_space::prepare_map() m_map = global_alloc(address_map(m_device, m_spacenum)); // merge in the submaps - m_map->uplift_submaps(machine(), m_device); + m_map->uplift_submaps(machine(), m_device, endianness()); // extract global parameters specified by the map m_unmap = (m_map->m_unmapval == 0) ? 0 : ~0;