diff options
author | 2021-12-01 14:58:22 +0100 | |
---|---|---|
committer | 2021-12-01 14:58:48 +0100 | |
commit | 890f2eadf4d88d693501d7059dd8ccf7c0ce4e3b (patch) | |
tree | af718e12e4ed90acefb39c86ee4d40c2011649a4 /src/devices/cpu | |
parent | e3256b55435c59edfedeca045b4fa13eef6c9a43 (diff) |
sparclite: add preliminary system support ctrl reg
Diffstat (limited to 'src/devices/cpu')
-rw-r--r-- | src/devices/cpu/sparc/sparc.cpp | 48 | ||||
-rw-r--r-- | src/devices/cpu/sparc/sparc.h | 2 |
2 files changed, 39 insertions, 11 deletions
diff --git a/src/devices/cpu/sparc/sparc.cpp b/src/devices/cpu/sparc/sparc.cpp index 14ced724b5d..fd5913b7170 100644 --- a/src/devices/cpu/sparc/sparc.cpp +++ b/src/devices/cpu/sparc/sparc.cpp @@ -636,14 +636,13 @@ void mb86930_device::device_start() m_alu_op3_assigned[OP3_DIVSCC] = true; m_alu_op3_assigned[OP3_SCAN] = true; + save_item(NAME(m_ssctrl)); save_item(NAME(m_spmr)); save_item(NAME(m_spmr_mask)); save_item(NAME(m_arsr)); save_item(NAME(m_amr)); save_item(NAME(m_wssr)); save_item(NAME(m_last_masked_addr)); - save_item(NAME(m_same_page_waits)); - save_item(NAME(m_other_page_waits)); std::fill_n(&m_arsr[0], 6, 0); std::fill_n(&m_amr[0], 6, 0); @@ -656,6 +655,7 @@ void mb86930_device::device_reset() { sparcv8_device::device_reset(); + m_ssctrl = 0x08; m_spmr = 0; m_spmr_mask = ~0ULL; std::fill_n(&m_wssr[0], 3, 0); @@ -668,6 +668,7 @@ void mb86930_device::device_reset() m_amr[0] = (0x1f << 1); update_addr_masks(); + update_wait_states(); } @@ -869,6 +870,35 @@ void mb86930_device::update_addr_masks() } } +void mb86930_device::update_wait_states() +{ + for (int i = 0; i < 6; i++) + { + const uint8_t shift = (i & 1) ? 19 : 6; + const bool enable = bool(BIT(m_wssr[i >> 1], shift + 2)); + const bool single = bool(BIT(m_wssr[i >> 1], shift + 1)); + //const bool override = bool(BIT(m_wssr[i >> 1], shift + 0)); + + if (!BIT(m_ssctrl, 3) || enable == single) + { + m_other_page_waits[i] = 0; + m_same_page_waits[i] = 0; + } + else if (single && !enable) + { + m_other_page_waits[i] = 1; + m_same_page_waits[i] = 1; + } + else if (!single && enable) + { + const uint8_t count1 = ((m_wssr[i >> 1] >> (shift + 8)) & 0x1f) + 1; + const uint8_t count2 = ((m_wssr[i >> 1] >> (shift + 3)) & 0x1f) + 1; + m_other_page_waits[i] = count1; + m_same_page_waits[i] = BIT(m_ssctrl, 5) ? count2 : count1; + } + } +} + uint32_t mb86930_device::biu_ctrl_r(offs_t offset, uint32_t mem_mask) { uint32_t data = 0; @@ -936,7 +966,7 @@ void mb86930_device::restore_lock_ctrl_w(offs_t offset, uint32_t data, uint32_t uint32_t mb86930_device::system_support_ctrl_r(offs_t offset, uint32_t mem_mask) { - uint32_t data = 0; + uint32_t data = m_ssctrl; LOGMASKED(LOG_SYSTEM_CTRL, "%s: system_ctrl_r: %08x & %08x\n", machine().describe_context(), data, mem_mask); return data; } @@ -944,6 +974,8 @@ uint32_t mb86930_device::system_support_ctrl_r(offs_t offset, uint32_t mem_mask) void mb86930_device::system_support_ctrl_w(offs_t offset, uint32_t data, uint32_t mem_mask) { LOGMASKED(LOG_SYSTEM_CTRL, "%s: system_ctrl_w: %08x & %08x\n", machine().describe_context(), data, mem_mask); + COMBINE_DATA(&m_ssctrl); + update_wait_states(); } @@ -1003,14 +1035,7 @@ void mb86930_device::wait_specifier_w(offs_t offset, uint32_t data, uint32_t mem { LOGMASKED(LOG_WAIT_STATE, "%s: wait_state_w[%d]: %08x & %08x\n", machine().describe_context(), offset, data, mem_mask); COMBINE_DATA(&m_wssr[offset]); - - const uint32_t wait_idx = (offset << 1); - const bool wait_en0 = BIT(m_wssr[offset], 8) && !BIT(m_wssr[offset], 7); - const bool wait_en1 = BIT(m_wssr[offset], 21) && !BIT(m_wssr[offset], 20); - m_same_page_waits[wait_idx] = wait_en0 ? (((m_wssr[offset] >> 9) & 0x1f) + 1) : 0; - m_other_page_waits[wait_idx] = wait_en0 ? (((m_wssr[offset] >> 14) & 0x1f) + 1) : 0; - m_same_page_waits[wait_idx + 1] = wait_en1 ? (((m_wssr[offset] >> 22) & 0x1f) + 1) : 0; - m_other_page_waits[wait_idx + 1] = wait_en1 ? (((m_wssr[offset] >> 27) & 0x1f) + 1) : 0; + update_wait_states(); } @@ -1054,6 +1079,7 @@ void mb86930_device::device_post_load() { sparcv8_device::device_post_load(); update_addr_masks(); + update_wait_states(); } diff --git a/src/devices/cpu/sparc/sparc.h b/src/devices/cpu/sparc/sparc.h index 2f7162c3fbc..a850f2a6a82 100644 --- a/src/devices/cpu/sparc/sparc.h +++ b/src/devices/cpu/sparc/sparc.h @@ -411,10 +411,12 @@ protected: void dcache_data_map(address_map &map); void update_addr_masks(); + void update_wait_states(); devcb_read32::array<6> m_cs_r; devcb_write32::array<6> m_cs_w; + u32 m_ssctrl; u32 m_spmr; u64 m_spmr_mask; u32 m_arsr[6]; |