diff options
Diffstat (limited to 'src/devices/cpu/mips/r4000.cpp')
-rw-r--r-- | src/devices/cpu/mips/r4000.cpp | 52 |
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: |