diff options
Diffstat (limited to 'src/mame/machine/cammu.cpp')
-rw-r--r-- | src/mame/machine/cammu.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/src/mame/machine/cammu.cpp b/src/mame/machine/cammu.cpp index 17ac438931b..c027d2d59e5 100644 --- a/src/mame/machine/cammu.cpp +++ b/src/mame/machine/cammu.cpp @@ -224,13 +224,32 @@ void cammu_device::set_spaces(std::vector<address_space *> spaces) std::copy(spaces.begin(), spaces.end(), std::begin(m_space)); } +bool cammu_device::memory_translate(const u32 ssw, const int spacenum, const int intention, offs_t &address) +{ + // translate the address + translated_t translated = translate_address(ssw, address, BYTE, + (intention & TRANSLATE_TYPE_MASK) == TRANSLATE_READ ? READ : + (intention & TRANSLATE_TYPE_MASK) == TRANSLATE_WRITE ? WRITE : + EXECUTE); + + // check that the requested space number matches the mapped space + if (translated.space != nullptr && translated.space->spacenum() == spacenum) + { + address = translated.address; + + return true; + } + + return false; +} + cammu_device::translated_t cammu_device::translate_address(const u32 ssw, const u32 virtual_address, const access_size size, const access_type mode) { // get effective user/supervisor mode const bool user = mode == EXECUTE ? ssw & SSW_U : ssw & (SSW_U | SSW_UU); // check for alignment faults - if (get_alignment() && !machine().side_effects_disabled()) + if (!machine().side_effects_disabled() && get_alignment()) { if ((mode == EXECUTE && (virtual_address & 0x1)) || (mode != EXECUTE && virtual_address & (size - 1))) { |