From 26f240e8b608a783432725d37715597edea64bd7 Mon Sep 17 00:00:00 2001 From: mooglyguy Date: Sat, 29 Sep 2018 03:58:28 +0200 Subject: sun4c: Fixed RAM mirroring with 4 meg sets, and hooked up -ramsize option. [Ryan Holtz] --- src/devices/machine/sun4c_mmu.cpp | 42 +++++++++++++++++++++++++++++++++++---- src/devices/machine/sun4c_mmu.h | 7 +++++-- src/mame/drivers/sun4.cpp | 11 ++++++++-- 3 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/devices/machine/sun4c_mmu.cpp b/src/devices/machine/sun4c_mmu.cpp index 146610044cc..ec226ebb9d5 100644 --- a/src/devices/machine/sun4c_mmu.cpp +++ b/src/devices/machine/sun4c_mmu.cpp @@ -73,6 +73,9 @@ void sun4c_mmu_device::device_start() save_item(NAME(m_page_valid)); save_item(NAME(m_ctx_mask)); save_item(NAME(m_pmeg_mask)); + save_item(NAME(m_ram_set_mask)); + save_item(NAME(m_ram_set_base)); + save_item(NAME(m_populated_ram_words)); } void sun4c_mmu_device::device_reset() @@ -81,6 +84,29 @@ void sun4c_mmu_device::device_reset() m_ram_ptr = (uint32_t *)m_ram->pointer(); m_ram_size = m_ram->size(); m_ram_size_words = m_ram_size >> 2; + const uint32_t num_16meg_sets = m_ram_size / 0x1000000; + const uint32_t leftover_4meg_size = m_ram_size % 0x1000000; + const uint32_t num_4meg_sets = leftover_4meg_size / 0x400000; + uint32_t base = 0; + uint32_t set = 0; + for (; set < num_16meg_sets; set++) + { + m_ram_set_base[set] = base; + m_ram_set_mask[set] = 0x003fffff; + base += 0x1000000 >> 2; + } + for (; set < num_16meg_sets+num_4meg_sets; set++) + { + m_ram_set_base[set] = base; + m_ram_set_mask[set] = 0x000fffff; + base += 0x400000 >> 2; + } + for (; set < 4; set++) + { + m_ram_set_mask[set] = 0; + m_ram_set_base[set] = 0; + } + m_populated_ram_words = (num_16meg_sets + num_4meg_sets) * (0x1000000 >> 2); m_context = 0; m_context_masked = 0; @@ -403,9 +429,13 @@ uint32_t sun4c_mmu_device::insn_data_r(const uint32_t offset, const uint32_t mem { case 0: // type 0 space //return m_type0space->read32(space, tmp, mem_mask); - if (tmp < 0x1000000 >> 2) + if (tmp < m_populated_ram_words) { - return m_ram_ptr[tmp]; + const uint32_t set = (tmp >> 22) & 3; + const uint32_t addr_mask = m_ram_set_mask[set]; + const uint32_t masked_addr = m_ram_set_base[set] + (tmp & addr_mask); + //printf("mask %08x, masked %08x\n", addr_mask, masked_addr); + return m_ram_ptr[masked_addr]; } else if (tmp >= 0x4000000 >> 2 && tmp < 0x10000000 >> 2) { @@ -487,9 +517,13 @@ void sun4c_mmu_device::insn_data_w(const uint32_t offset, const uint32_t data, c switch (entry.type) { case 0: // type 0 - if (tmp < 0x1000000 >> 2) + if (tmp < m_populated_ram_words) { - COMBINE_DATA((m_ram_ptr + tmp)); + const uint32_t set = (tmp >> 22) & 3; + const uint32_t addr_mask = m_ram_set_mask[set]; + const uint32_t masked_addr = m_ram_set_base[set] + (tmp & addr_mask); + COMBINE_DATA((m_ram_ptr + masked_addr)); + //printf("mask %08x, masked %08x\n", addr_mask, masked_addr); } else if (tmp >= 0x4000000 >> 2 && tmp < 0x10000000 >> 2) { diff --git a/src/devices/machine/sun4c_mmu.h b/src/devices/machine/sun4c_mmu.h index a220f221c11..5e81c3e0ce7 100644 --- a/src/devices/machine/sun4c_mmu.h +++ b/src/devices/machine/sun4c_mmu.h @@ -142,8 +142,11 @@ protected: bool m_page_valid[16384]; // Internal MAME device state - uint8_t m_ctx_mask; // SS2 is sun4c but has 16 contexts; most have 8 - uint8_t m_pmeg_mask; // SS2 is sun4c but has 16384 PTEs; most have 8192 + uint8_t m_ctx_mask; // SS2 is sun4c but has 16 contexts; most have 8 + uint8_t m_pmeg_mask; // SS2 is sun4c but has 16384 PTEs; most have 8192 + uint32_t m_ram_set_mask[4]; // Used for mirroring within 4 megabyte sets + uint32_t m_ram_set_base[4]; + uint32_t m_populated_ram_words; emu_timer *m_reset_timer; }; diff --git a/src/mame/drivers/sun4.cpp b/src/mame/drivers/sun4.cpp index 4962b5d58a7..a1978277b0f 100644 --- a/src/mame/drivers/sun4.cpp +++ b/src/mame/drivers/sun4.cpp @@ -1876,7 +1876,9 @@ MACHINE_CONFIG_START(sun4_state::sun4) m_mmu->set_scc(m_scc2); m_maincpu->set_mmu(m_mmu); - RAM(config, RAM_TAG).set_default_size("16M").set_default_value(0x00); + RAM(config, m_ram); + m_ram->set_default_size("16M"); + m_ram->set_default_value(0x00); M48T02(config, TIMEKEEPER_TAG, 0); @@ -1949,7 +1951,8 @@ MACHINE_CONFIG_START(sun4_state::sun4c) m_mmu->set_scc(m_scc2); m_maincpu->set_mmu(m_mmu); - RAM(config, RAM_TAG).set_default_size("16M").set_default_value(0x00); + RAM(config, m_ram).set_default_size("16M").set_default_value(0x00); + m_ram->set_extra_options("4M,8M,12M,16M,20M,24M,28M,32M,36M,40M,48M,52M,64M"); M48T02(config, TIMEKEEPER_TAG, 0); @@ -2016,6 +2019,8 @@ void sun4_state::sun4_20(machine_config &config) { sun4c(config); + m_ram->set_extra_options("4M,8M,12M,16M"); + m_sbus_slot[0]->set_fixed(true); m_sbus_slot[1]->set_fixed(true); m_sbus_slot[2]->set_default_option("bwtwo"); @@ -2026,6 +2031,8 @@ void sun4_state::sun4_40(machine_config &config) { sun4c(config); + m_ram->set_extra_options("4M,8M,12M,16M,20M,24M,32M,36M,48M"); + m_mmu->set_clock(25'000'000); m_maincpu->set_clock(25'000'000); -- cgit v1.2.3