diff options
Diffstat (limited to 'src/devices/cpu/t11/t11.cpp')
-rw-r--r-- | src/devices/cpu/t11/t11.cpp | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/devices/cpu/t11/t11.cpp b/src/devices/cpu/t11/t11.cpp index c4f22b93732..c420d222af4 100644 --- a/src/devices/cpu/t11/t11.cpp +++ b/src/devices/cpu/t11/t11.cpp @@ -52,6 +52,7 @@ t11_device::t11_device(const machine_config &mconfig, device_type type, const ch , m_cp_state(0) , m_vec_active(false) , m_pf_active(false) + , m_berr_active(false) , m_hlt_active(false) , m_out_reset_func(*this) , m_in_iack_func(*this) @@ -222,9 +223,14 @@ void t11_device::t11_check_irqs() return; } - // PF has next-highest priority - int priority = PSW & 0340; - if (m_power_fail && priority != 0340) + // non-maskable hardware traps + if (m_bus_error) + { + m_bus_error = false; + take_interrupt(T11_TIMEOUT); + return; + } + else if (m_power_fail) { m_power_fail = false; take_interrupt(T11_PWRFAIL); @@ -233,7 +239,7 @@ void t11_device::t11_check_irqs() // compare the priority of the CP interrupt to the PSW const struct irq_table_entry *irq = &irq_table[m_cp_state & 15]; - if (irq->priority > priority) + if (irq->priority > (PSW & 0340)) { // call the callback standard_irq_callback(m_cp_state & 15); @@ -404,6 +410,7 @@ void t11_device::device_reset() m_wait_state = 0; m_power_fail = false; + m_bus_error = false; m_ext_halt = false; } @@ -447,6 +454,12 @@ void t11_device::execute_set_input(int irqline, int state) m_pf_active = (state != CLEAR_LINE); break; + case BUS_ERROR: + if (state != CLEAR_LINE && !m_berr_active) + m_bus_error = true; + m_berr_active = (state != CLEAR_LINE); + break; + case HLT_LINE: if (state != CLEAR_LINE && !m_hlt_active) m_ext_halt = true; |