summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2021-12-01 14:58:22 +0100
committer hap <happppp@users.noreply.github.com>2021-12-01 14:58:48 +0100
commit890f2eadf4d88d693501d7059dd8ccf7c0ce4e3b (patch)
treeaf718e12e4ed90acefb39c86ee4d40c2011649a4 /src/devices/cpu
parente3256b55435c59edfedeca045b4fa13eef6c9a43 (diff)
sparclite: add preliminary system support ctrl reg
Diffstat (limited to 'src/devices/cpu')
-rw-r--r--src/devices/cpu/sparc/sparc.cpp48
-rw-r--r--src/devices/cpu/sparc/sparc.h2
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];