summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2019-07-18 13:20:00 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2019-07-18 13:20:00 +0700
commit533320c8407c5219cfbdbac605a1a30c18f9db03 (patch)
tree841918244d4ed85c105aab5403778ded54530f7c
parent5468cb6f3a7d3a81d4b0b96fd45873be355b433d (diff)
mips1: add bus error line (nw)
-rw-r--r--src/devices/cpu/mips/mips1.cpp26
-rw-r--r--src/devices/cpu/mips/mips1.h2
2 files changed, 23 insertions, 5 deletions
diff --git a/src/devices/cpu/mips/mips1.cpp b/src/devices/cpu/mips/mips1.cpp
index a5f99fcc993..eb379a225d0 100644
--- a/src/devices/cpu/mips/mips1.cpp
+++ b/src/devices/cpu/mips/mips1.cpp
@@ -207,6 +207,7 @@ void mips1core_device_base::device_reset()
m_cop0[COP0_Status] = SR_BEV | SR_TS;
m_data_spacenum = 0;
+ m_bus_error = false;
}
void mips1core_device_base::execute_run()
@@ -1069,12 +1070,18 @@ template <typename T, typename U> std::enable_if_t<std::is_convertible<U, std::f
{
if (memory_translate(m_data_spacenum, TRANSLATE_READ, address))
{
- switch (sizeof(T))
+ T const data
+ = (sizeof(T) == 1) ? space(m_data_spacenum).read_byte(address)
+ : (sizeof(T) == 2) ? space(m_data_spacenum).read_word(address)
+ : space(m_data_spacenum).read_dword(address);
+
+ if (m_bus_error)
{
- case 1: apply(T(space(m_data_spacenum).read_byte(address))); break;
- case 2: apply(T(space(m_data_spacenum).read_word(address))); break;
- case 4: apply(T(space(m_data_spacenum).read_dword(address))); break;
+ m_bus_error = false;
+ generate_exception(EXCEPTION_BUSDATA);
}
+ else
+ apply(data);
}
}
@@ -1095,8 +1102,17 @@ bool mips1core_device_base::fetch(u32 address, std::function<void(u32)> &&apply)
{
if (memory_translate(0, TRANSLATE_FETCH, address))
{
- apply(space(0).read_dword(address));
+ u32 const data = space(0).read_dword(address);
+
+ if (m_bus_error)
+ {
+ m_bus_error = false;
+ generate_exception(EXCEPTION_BUSINST);
+
+ return false;
+ }
+ apply(data);
return true;
}
else
diff --git a/src/devices/cpu/mips/mips1.h b/src/devices/cpu/mips/mips1.h
index 3a442fa914c..1e56394ede6 100644
--- a/src/devices/cpu/mips/mips1.h
+++ b/src/devices/cpu/mips/mips1.h
@@ -14,6 +14,7 @@ public:
// input lines
template <unsigned Coprocessor> auto in_brcond() { return m_in_brcond[Coprocessor].bind(); }
+ void berr_w(int state) { m_bus_error = bool(state); }
protected:
mips1core_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock, u32 cpurev, size_t icache_size, size_t dcache_size);
@@ -235,6 +236,7 @@ protected:
// I/O
devcb_read_line m_in_brcond[4];
+ bool m_bus_error;
};
class mips1_device_base : public mips1core_device_base