summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2019-06-12 15:38:12 -0400
committer AJR <ajrhacker@users.noreply.github.com>2019-06-12 15:38:12 -0400
commit3c955e03eaff0be4ecdfb07f8afac4e567650a8f (patch)
tree73fadd25637095ad86ed1e696d0bca12abe3cc50
parentdf17057132a034a964a34dc5d8fc7327adee1d9e (diff)
m68kcpu: Apply byte smearing to PMMU as well (nw)
-rw-r--r--src/devices/cpu/m68000/m68kcpu.cpp128
1 files 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);
};
}