From 3c955e03eaff0be4ecdfb07f8afac4e567650a8f Mon Sep 17 00:00:00 2001 From: AJR Date: Wed, 12 Jun 2019 15:38:12 -0400 Subject: m68kcpu: Apply byte smearing to PMMU as well (nw) --- src/devices/cpu/m68000/m68kcpu.cpp | 128 +++++++++++++++++++------------------ 1 file changed, 67 insertions(+), 61 deletions(-) diff --git a/src/devices/cpu/m68000/m68kcpu.cpp b/src/devices/cpu/m68000/m68kcpu.cpp index f5ebae8a803..f74ef8f279d 100644 --- a/src/devices/cpu/m68000/m68kcpu.cpp +++ b/src/devices/cpu/m68000/m68kcpu.cpp @@ -1443,11 +1443,7 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace) u16 result = m_space->read_byte(address0) << 8; return result | m_space->read_byte(address1); } - - if (WORD_ALIGNED(address)) - return m_space->read_word(address); - u16 result = m_space->read_byte(address) << 8; - return result | m_space->read_byte(address + 1); + return m_space->read_word_unaligned(address); }; m_read32 = [this](offs_t address) -> u32 { @@ -1477,15 +1473,7 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace) return result | m_space->read_byte(address3); } } - if (DWORD_ALIGNED(address)) - return m_space->read_dword(address); - if (WORD_ALIGNED(address)) { - u32 result = m_space->read_word(address) << 16; - return result | m_space->read_word(address + 2); - } - u32 result = m_space->read_byte(address) << 24; - result |= m_space->read_word(address + 1) << 8; - return result | m_space->read_byte(address + 3); + return m_space->read_dword_unaligned(address); }; m_write8 = [this](offs_t address, u8 data) { @@ -1494,77 +1482,95 @@ void m68000_base_device::init32mmu(address_space &space, address_space &ospace) if (m_mmu_tmp_buserror_occurred) return; } - m_space->write_byte(address, data); + m_space->write_dword(address & 0xfffffffcU, dword_from_byte(data), 0xff000000U >> 8 * (address & 3)); }; m_write16 = [this](offs_t address, u16 data) { + u32 address0 = address; if (m_pmmu_enabled) { - u32 address0 = pmmu_translate_addr(address, 0); - if (m_mmu_tmp_buserror_occurred) - return; - if (WORD_ALIGNED(address)) { - m_space->write_word(address0, data); - return; - } - u32 address1 = pmmu_translate_addr(address + 1, 0); + address0 = pmmu_translate_addr(address0, 0); if (m_mmu_tmp_buserror_occurred) return; - m_space->write_byte(address0, data >> 8); - m_space->write_byte(address1, data); - return; } + switch (address & 3) { + case 0: + m_space->write_dword(address0, dword_from_word(data), 0xffff0000U); + break; - if (WORD_ALIGNED(address)) { - m_space->write_word(address, data); - return; + case 1: + m_space->write_dword(address0 - 1, dword_from_unaligned_word(data), 0x00ffff00); + break; + + case 2: + m_space->write_dword(address0 - 2, dword_from_word(data), 0x0000ffff); + break; + + case 3: + { + u32 address1 = address + 1; + if (m_pmmu_enabled) { + address1 = pmmu_translate_addr(address1, 0); + if (m_mmu_tmp_buserror_occurred) + return; + } + m_space->write_dword(address0 - 3, dword_from_unaligned_word(data), 0x000000ff); + m_space->write_dword(address1, dword_from_byte(data & 0x00ff), 0xff000000U); + break; + } } - m_space->write_byte(address, data >> 8); - m_space->write_byte(address + 1, data); }; m_write32 = [this](offs_t address, u32 data) { + u32 address0 = address; if (m_pmmu_enabled) { - u32 address0 = pmmu_translate_addr(address, 0); + address0 = pmmu_translate_addr(address0, 0); if (m_mmu_tmp_buserror_occurred) return; - if ((address +3) & 0xfc) { - // not at page boundary; use default code - address = address0; - } else if (DWORD_ALIGNED(address)) { // 0 - m_space->write_dword(address0, data); - return; - } else { - u32 address2 = pmmu_translate_addr(address+2, 0); + } + switch (address & 3) { + case 0: + m_space->write_dword(address, data, 0xffffffffU); + break; + + case 1: + { + u32 address3 = address + 3; + if (m_pmmu_enabled) { + address3 = pmmu_translate_addr(address3, 0); if (m_mmu_tmp_buserror_occurred) return; - if (WORD_ALIGNED(address)) { // 2 - m_space->write_word(address0, data >> 16); - m_space->write_word(address2, data); - return; - } - u32 address1 = pmmu_translate_addr(address+1, 0); - u32 address3 = pmmu_translate_addr(address+3, 0); + } + m_space->write_dword(address0 - 1, (data & 0xff000000U) | (data & 0xffffff00U) >> 8, 0x00ffffff); + m_space->write_dword(address3, dword_from_byte(data & 0x000000ff), 0xff000000U); + break; + } + + case 2: + { + u32 address2 = address + 2; + if (m_pmmu_enabled) { + address2 = pmmu_translate_addr(address2, 0); if (m_mmu_tmp_buserror_occurred) return; - m_space->write_byte(address0, data >> 24); - m_space->write_word(address1, data >> 8); - m_space->write_byte(address3, data); - return; } + m_space->write_dword(address0 - 2, dword_from_word((data & 0xffff0000U) >> 16), 0x0000ffff); + m_space->write_dword(address2, dword_from_word(data & 0x0000ffff), 0xffff0000U); + break; } - if (DWORD_ALIGNED(address)) { - m_space->write_dword(address, data); - return; + case 3: + { + u32 address1 = address + 1; + if (m_pmmu_enabled) { + address1 = pmmu_translate_addr(address1, 0); + if (m_mmu_tmp_buserror_occurred) + return; + } + m_space->write_dword(address0 - 3, dword_from_unaligned_word((data & 0xffff0000U) >> 16), 0x000000ff); + m_space->write_dword(address1, (data & 0x00ffffff) << 8 | (data & 0xff000000U) >> 24, 0xffffff00U); + break; } - if (WORD_ALIGNED(address)) { - m_space->write_word(address, data >> 16); - m_space->write_word(address + 2, data); - return; } - m_space->write_byte(address, data >> 24); - m_space->write_word(address + 1, data >> 8); - m_space->write_byte(address + 3, data); }; } -- cgit v1.2.3