summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/mips/r4000.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/mips/r4000.cpp')
-rw-r--r--src/devices/cpu/mips/r4000.cpp52
1 files changed, 8 insertions, 44 deletions
diff --git a/src/devices/cpu/mips/r4000.cpp b/src/devices/cpu/mips/r4000.cpp
index 8b220b2b67f..dac528ee1e6 100644
--- a/src/devices/cpu/mips/r4000.cpp
+++ b/src/devices/cpu/mips/r4000.cpp
@@ -91,7 +91,7 @@ r4000_base_device::r4000_base_device(const machine_config &mconfig, device_type
: cpu_device(mconfig, type, tag, owner, clock)
, m_program_config_le("program", ENDIANNESS_LITTLE, 64, 32)
, m_program_config_be("program", ENDIANNESS_BIG, 64, 32)
- , m_ll_watch(nullptr)
+ , m_ll_active(false)
, m_fcr0(0x00000500U)
{
m_cp0[CP0_PRId] = prid;
@@ -200,11 +200,7 @@ void r4000_base_device::device_reset()
m_cp0_timer_zero = total_cycles();
- if (m_ll_watch)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
+ m_ll_active = false;
m_cp0[CP0_WatchLo] = 0;
m_cp0[CP0_WatchHi] = 0;
@@ -1033,24 +1029,10 @@ void r4000_base_device::cpu_execute(u32 const op)
load_linked<s32>(ADDR(m_r[RSREG], s16(op)),
[this, op](u64 address, s32 data)
{
- // remove existing tap
- if (m_ll_watch)
- m_ll_watch->remove();
-
m_r[RTREG] = data;
m_cp0[CP0_LLAddr] = u32(address >> 4);
- // install write tap
- // FIXME: physical address truncation
- m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "ll",
- [this, hi(bool(BIT(address, 2)))](offs_t offset, u64 &data, u64 mem_mask)
- {
- if (hi ? ACCESSING_BITS_32_63 : ACCESSING_BITS_0_31)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
- });
+ m_ll_active = true;
m_ll_addr = ADDR(m_r[RSREG], s16(op));
});
break;
@@ -1066,20 +1048,10 @@ void r4000_base_device::cpu_execute(u32 const op)
[this, op](u64 address, u64 data)
{
// remove existing tap
- if (m_ll_watch)
- m_ll_watch->remove();
-
m_r[RTREG] = data;
m_cp0[CP0_LLAddr] = u32(address >> 4);
- // install write tap
- // FIXME: address truncation
- m_ll_watch = space(0).install_write_tap(offs_t(address & ~7), offs_t(address | 7), "lld",
- [this](offs_t offset, u64 &data, u64 mem_mask)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- });
+ m_ll_active = true;
m_ll_addr = ADDR(m_r[RSREG], s16(op));
});
break;
@@ -1097,10 +1069,9 @@ void r4000_base_device::cpu_execute(u32 const op)
});
break;
case 0x38: // SC
- if (m_ll_watch && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
+ if (m_ll_active && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
{
- m_ll_watch->remove();
- m_ll_watch = nullptr;
+ m_ll_active = false;
store<u32>(ADDR(m_r[RSREG], s16(op)), u32(m_r[RTREG]));
m_r[RTREG] = 1;
@@ -1116,11 +1087,8 @@ void r4000_base_device::cpu_execute(u32 const op)
break;
//case 0x3b: // *
case 0x3c: // SCD
- if (m_ll_watch && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
+ if (m_ll_active && m_ll_addr == ADDR(m_r[RSREG], s16(op)))
{
- m_ll_watch->remove();
- m_ll_watch = nullptr;
-
store<u64>(ADDR(m_r[RSREG], s16(op)), m_r[RTREG]);
m_r[RTREG] = 1;
}
@@ -1358,11 +1326,7 @@ void r4000_base_device::cp0_execute(u32 const op)
SR &= ~SR_EXL;
}
- if (m_ll_watch)
- {
- m_ll_watch->remove();
- m_ll_watch = nullptr;
- }
+ m_ll_active = false;
break;
default: