diff --git a/src/devices/bus/vme/mvme180.cpp b/src/devices/bus/vme/mvme180.cpp index 2e95c4b5962..087780f86cd 100644 --- a/src/devices/bus/vme/mvme180.cpp +++ b/src/devices/bus/vme/mvme180.cpp @@ -67,14 +67,11 @@ void vme_mvme180_card_device::device_add_mconfig(machine_config &config) { MC88100(config, m_cpu, 40_MHz_XTAL / 2); m_cpu->set_addrmap(AS_PROGRAM, &vme_mvme180_card_device::cpu_mem); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_mmu[0]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_mmu[1]; }); - MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x7e); - m_mmu[0]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_i(m_mmu[0]); - - MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x7f); - m_mmu[1]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_d(m_mmu[1]); + MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x7e).set_mbus(m_cpu, AS_PROGRAM); + MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x7f).set_mbus(m_cpu, AS_PROGRAM); SCN2681(config, m_duart, 3.6864_MHz_XTAL); m_duart->irq_cb().set(FUNC(vme_mvme180_card_device::irq_w<6>)); diff --git a/src/devices/bus/vme/mvme181.cpp b/src/devices/bus/vme/mvme181.cpp index 998959cbc32..55d5d601035 100644 --- a/src/devices/bus/vme/mvme181.cpp +++ b/src/devices/bus/vme/mvme181.cpp @@ -96,14 +96,11 @@ void vme_mvme181_card_device::device_add_mconfig(machine_config &config) { MC88100(config, m_cpu, 40_MHz_XTAL / 2); m_cpu->set_addrmap(AS_PROGRAM, &vme_mvme181_card_device::cpu_mem); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_mmu[0]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_mmu[1]; }); - MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x7e); - m_mmu[0]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_i(m_mmu[0]); - - MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x7f); - m_mmu[1]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_d(m_mmu[1]); + MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x7e).set_mbus(m_cpu, AS_PROGRAM); + MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x7f).set_mbus(m_cpu, AS_PROGRAM); DS1315(config, m_rtc, 0); // DS1216 diff --git a/src/devices/bus/vme/mvme187.cpp b/src/devices/bus/vme/mvme187.cpp index 96e8b54eb0d..7fd1633838f 100644 --- a/src/devices/bus/vme/mvme187.cpp +++ b/src/devices/bus/vme/mvme187.cpp @@ -106,14 +106,11 @@ void vme_mvme187_card_device::device_add_mconfig(machine_config &config) { MC88100(config, m_cpu, 50_MHz_XTAL / 2); m_cpu->set_addrmap(AS_PROGRAM, &vme_mvme187_card_device::cpu_mem); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_mmu[0]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_mmu[1]; }); - MC88200(config, m_mmu[0], 50_MHz_XTAL / 2, 0x77); - m_mmu[0]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_i(m_mmu[0]); - - MC88200(config, m_mmu[1], 50_MHz_XTAL / 2, 0x7f); - m_mmu[1]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_d(m_mmu[1]); + MC88200(config, m_mmu[0], 50_MHz_XTAL / 2, 0x77).set_mbus(m_cpu, AS_PROGRAM); + MC88200(config, m_mmu[1], 50_MHz_XTAL / 2, 0x7f).set_mbus(m_cpu, AS_PROGRAM); DS1643(config, m_rtc); diff --git a/src/devices/bus/vme/tp881v.cpp b/src/devices/bus/vme/tp881v.cpp index e4cac6ef524..30cd01a568b 100644 --- a/src/devices/bus/vme/tp881v.cpp +++ b/src/devices/bus/vme/tp881v.cpp @@ -86,14 +86,11 @@ void vme_tp881v_card_device::device_add_mconfig(machine_config &config) { MC88100(config, m_cpu, 40_MHz_XTAL / 2); m_cpu->set_addrmap(AS_PROGRAM, &vme_tp881v_card_device::cpu_mem); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_mmu[0]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_mmu[1]; }); - MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x00); - m_mmu[0]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_i(m_mmu[0]); - - MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x01); - m_mmu[1]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_d(m_mmu[1]); + MC88200(config, m_mmu[0], 40_MHz_XTAL / 2, 0x00).set_mbus(m_cpu, AS_PROGRAM); + MC88200(config, m_mmu[1], 40_MHz_XTAL / 2, 0x01).set_mbus(m_cpu, AS_PROGRAM); // per-jp interrupt controllers // 4MHz input clock, ct3 gives 100Hz clock, ct2 counts at 10kHz diff --git a/src/devices/cpu/m88000/m88000.cpp b/src/devices/cpu/m88000/m88000.cpp index ef088f49a80..73351cfdf2f 100644 --- a/src/devices/cpu/m88000/m88000.cpp +++ b/src/devices/cpu/m88000/m88000.cpp @@ -148,8 +148,8 @@ mc88100_device::mc88100_device(const machine_config &mconfig, const char *tag, d : cpu_device(mconfig, MC88100, tag, owner, clock) , m_code_config("code", ENDIANNESS_BIG, 32, 32, 0) , m_data_config("data", ENDIANNESS_BIG, 32, 32, 0) - , m_cmmu_d(*this, finder_base::DUMMY_TAG) - , m_cmmu_i(*this, finder_base::DUMMY_TAG) + , m_cmmu_code(nullptr) + , m_cmmu_data(nullptr) , m_sb(0) , m_r{ 0 } , m_cr{ 0 } @@ -183,13 +183,13 @@ bool mc88100_device::memory_translate(int spacenum, int intention, offs_t &addre { case TR_READ: case TR_WRITE: - if (m_cmmu_d) - return m_cmmu_d->translate(intention, address, m_cr[PSR] & PSR_MODE); + if (m_cmmu_data) + return m_cmmu_data(address).translate(intention, address, m_cr[PSR] & PSR_MODE); break; case TR_FETCH: - if (m_cmmu_i) - return m_cmmu_i->translate(intention, address, m_cr[PSR] & PSR_MODE); + if (m_cmmu_code) + return m_cmmu_code(address).translate(intention, address, m_cr[PSR] & PSR_MODE); break; } @@ -198,7 +198,7 @@ bool mc88100_device::memory_translate(int spacenum, int intention, offs_t &addre void mc88100_device::device_start() { - space(AS_PROGRAM).specific(m_inst_space); + space(AS_PROGRAM).specific(m_code_space); if (has_configured_map(AS_DATA)) space(AS_DATA).specific(m_data_space); @@ -1525,16 +1525,16 @@ void mc88100_device::fset(unsigned const td, unsigned const d, float64_t const d void mc88100_device::fetch(u32 &address, u32 &inst) { - if (m_cmmu_i) + if (m_cmmu_code) { - std::optional data = m_cmmu_i->read(address & IP_A, m_cr[PSR] & PSR_MODE); + std::optional data = m_cmmu_code(address & IP_A).read(address & IP_A, m_cr[PSR] & PSR_MODE); if (data.has_value()) inst = data.value(); else address |= IP_E; } else - inst = m_inst_space.read_dword(address & IP_A); + inst = m_code_space.read_dword(address & IP_A); } template void mc88100_device::ld(u32 address, unsigned const reg) @@ -1552,11 +1552,11 @@ template void mc88100_device::ld(u32 address, unsigned co address &= ~(sizeof(T) - 1); } - if (m_cmmu_d) + if (m_cmmu_data) { if constexpr (sizeof(T) < 8) { - std::optional const data = m_cmmu_d->read::type>(address, (m_cr[PSR] & PSR_MODE) && !Usr); + std::optional const data = m_cmmu_data(address).read::type>(address, (m_cr[PSR] & PSR_MODE) && !Usr); if (data.has_value() && reg) m_r[reg] = std::is_signed() ? s32(data.value()) : data.value(); @@ -1585,8 +1585,8 @@ template void mc88100_device::ld(u32 address, unsigned co } else { - std::optional const hi = m_cmmu_d->read(address + 0, (m_cr[PSR] & PSR_MODE) && !Usr); - std::optional const lo = m_cmmu_d->read(address + 4, (m_cr[PSR] & PSR_MODE) && !Usr); + std::optional const hi = m_cmmu_data(address + 0).read(address + 0, (m_cr[PSR] & PSR_MODE) && !Usr); + std::optional const lo = m_cmmu_data(address + 4).read(address + 4, (m_cr[PSR] & PSR_MODE) && !Usr); if (lo.has_value() && hi.has_value()) { if (reg != 0) @@ -1673,11 +1673,11 @@ template void mc88100_device::st(u32 address, unsigned co address &= ~(sizeof(T) - 1); } - if (m_cmmu_d) + if (m_cmmu_data) { if constexpr (sizeof(T) < 8) { - if (!m_cmmu_d->write(address, T(m_r[reg]), (m_cr[PSR] & PSR_MODE) && !Usr)) + if (!m_cmmu_data(address).write(address, T(m_r[reg]), (m_cr[PSR] & PSR_MODE) && !Usr)) { m_cr[DMT0] = DMT_EN(address) | DMT_WRITE | DMT_VALID; m_cr[DMT1] = 0; @@ -1701,8 +1701,8 @@ template void mc88100_device::st(u32 address, unsigned co else { bool result = true; - result &= m_cmmu_d->write(address + 0, m_r[(reg + 0) & 31], (m_cr[PSR] & PSR_MODE) && !Usr); - result &= m_cmmu_d->write(address + 4, m_r[(reg + 1) & 31], (m_cr[PSR] & PSR_MODE) && !Usr); + result &= m_cmmu_data(address + 0).write(address + 0, m_r[(reg + 0) & 31], (m_cr[PSR] & PSR_MODE) && !Usr); + result &= m_cmmu_data(address + 4).write(address + 4, m_r[(reg + 1) & 31], (m_cr[PSR] & PSR_MODE) && !Usr); if (!result) { @@ -1762,10 +1762,10 @@ template void mc88100_device::xmem(u32 address, unsigned // save source value T const src = m_r[reg]; - if (m_cmmu_d) + if (m_cmmu_data) { // read destination - std::optional const dst = m_cmmu_d->read(address, (m_cr[PSR] & PSR_MODE) && !Usr); + std::optional const dst = m_cmmu_data(address).read(address, (m_cr[PSR] & PSR_MODE) && !Usr); if (dst.has_value()) { // update register @@ -1773,7 +1773,7 @@ template void mc88100_device::xmem(u32 address, unsigned m_r[reg] = dst.value(); // write destination - if (m_cmmu_d->write(address, src, (m_cr[PSR] & PSR_MODE) && !Usr)) + if (m_cmmu_data(address).write(address, src, (m_cr[PSR] & PSR_MODE) && !Usr)) return; } diff --git a/src/devices/cpu/m88000/m88000.h b/src/devices/cpu/m88000/m88000.h index 2588f821885..8e1d2e9e127 100644 --- a/src/devices/cpu/m88000/m88000.h +++ b/src/devices/cpu/m88000/m88000.h @@ -20,8 +20,8 @@ public: // construction/destruction mc88100_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock); - template void set_cmmu_d(T &&tag) { m_cmmu_d.set_tag(std::forward(tag)); } - template void set_cmmu_i(T &&tag) { m_cmmu_i.set_tag(std::forward(tag)); } + void set_cmmu_code(std::function f) { m_cmmu_code = f; } + void set_cmmu_data(std::function f) { m_cmmu_data = f; } protected: // device_t implementation @@ -64,11 +64,11 @@ private: // address spaces address_space_config m_code_config; address_space_config m_data_config; - memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_inst_space; + memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_code_space; memory_access<32, 2, 0, ENDIANNESS_BIG>::specific m_data_space; - optional_device m_cmmu_d; - optional_device m_cmmu_i; + std::function m_cmmu_code; + std::function m_cmmu_data; // register storage u32 m_xip; // execute instruction pointer diff --git a/src/mame/omron/luna_88k.cpp b/src/mame/omron/luna_88k.cpp index 2faa903769e..75f9db65bf2 100644 --- a/src/mame/omron/luna_88k.cpp +++ b/src/mame/omron/luna_88k.cpp @@ -386,13 +386,11 @@ void luna_88k_state_base::common_config(machine_config &config, XTAL clock) { MC88100(config, m_cpu, clock.value()); m_cpu->set_addrmap(AS_PROGRAM, &luna_88k_state_base::cpu_map); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_cmmu[0]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_cmmu[1]; }); - MC88200(config, m_cmmu[0], clock.value(), 0x07); // cpu0 cmmu i0 - m_cmmu[0]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_i(m_cmmu[0]); - MC88200(config, m_cmmu[1], clock.value(), 0x06); // cpu0 cmmu d0 - m_cmmu[1]->set_mbus(m_cpu, AS_PROGRAM); - m_cpu->set_cmmu_d(m_cmmu[1]); + MC88200(config, m_cmmu[0], clock.value(), 0x07).set_mbus(m_cpu, AS_PROGRAM); // cpu0 cmmu i0 + MC88200(config, m_cmmu[1], clock.value(), 0x06).set_mbus(m_cpu, AS_PROGRAM); // cpu0 cmmu d0 // 6 SIMMs for RAM arranged as three groups of 2? RAM(config, m_ram); diff --git a/src/mame/tektronix/xd88.cpp b/src/mame/tektronix/xd88.cpp index 1c0688effc3..e87ee3cab75 100644 --- a/src/mame/tektronix/xd88.cpp +++ b/src/mame/tektronix/xd88.cpp @@ -72,13 +72,11 @@ void xd88_state::xd88_01(machine_config &config) { MC88100(config, m_cpu, 20'000'000); m_cpu->set_addrmap(AS_PROGRAM, &xd88_state::cpu_map); + m_cpu->set_cmmu_code([this](u32 const address) -> mc88200_device & { return *m_cmmu[4]; }); + m_cpu->set_cmmu_data([this](u32 const address) -> mc88200_device & { return *m_cmmu[0]; }); for (unsigned i = 0; i < std::size(m_cmmu); i++) MC88200(config, m_cmmu[i], 20'000'000, i).set_mbus(m_cpu, AS_PROGRAM); - - // TODO: multiple i&d cmmu's - m_cpu->set_cmmu_d(m_cmmu[0]); - m_cpu->set_cmmu_i(m_cmmu[4]); } ROM_START(xd88_01)