From a35ca34d96d13c9cc45d0b2456f3e09baa524bb8 Mon Sep 17 00:00:00 2001 From: hap Date: Thu, 9 Dec 2021 14:31:41 +0100 Subject: t11: power fail trap is NMI, added bus error trap --- src/devices/cpu/t11/t11.cpp | 21 +++++++++++++++++---- src/devices/cpu/t11/t11.h | 13 ++++++++++--- src/mame/drivers/im01.cpp | 3 ++- 3 files changed, 29 insertions(+), 8 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; diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h index ff63ef311fe..e2a30ce7cb5 100644 --- a/src/devices/cpu/t11/t11.h +++ b/src/devices/cpu/t11/t11.h @@ -22,6 +22,7 @@ enum class t11_device : public cpu_device { public: + // T11 input lines enum { CP0_LINE = 0, // -AI4 (at PI time) @@ -33,8 +34,12 @@ public: HLT_LINE = 6 // -AI7 (at PI time) }; + // generic hardware traps + static constexpr uint8_t POWER_FAIL = PF_LINE; + static constexpr uint8_t BUS_ERROR = 8; + // construction/destruction - t11_device(const machine_config &mconfig, const char *_tag, device_t *_owner, uint32_t _clock); + t11_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); // configuration helpers void set_initial_mode(const uint16_t mode) { c_initial_mode = mode; } @@ -63,8 +68,8 @@ protected: // device_execute_interface overrides virtual uint32_t execute_min_cycles() const noexcept override { return 12; } virtual uint32_t execute_max_cycles() const noexcept override { return 114; } - virtual uint32_t execute_input_lines() const noexcept override { return 7; } - virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == PF_LINE || inputnum == HLT_LINE; } + virtual uint32_t execute_input_lines() const noexcept override { return 8; } + virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == PF_LINE || inputnum == HLT_LINE || inputnum == BUS_ERROR; } virtual void execute_run() override; virtual void execute_set_input(int inputnum, int state) override; @@ -89,8 +94,10 @@ protected: uint8_t m_cp_state; bool m_vec_active; bool m_pf_active; + bool m_berr_active; bool m_hlt_active; bool m_power_fail; + bool m_bus_error; bool m_ext_halt; int m_icount; memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache; diff --git a/src/mame/drivers/im01.cpp b/src/mame/drivers/im01.cpp index 944aeff96b0..ad750342d23 100644 --- a/src/mame/drivers/im01.cpp +++ b/src/mame/drivers/im01.cpp @@ -18,12 +18,13 @@ TODO: and/or T11 core timing itself is not 100% accurate. - verify actual XTAL, the label couldn't be seen - correct bus conflict between RAM and I/O +- is ИМ-01Т extra RAM chip used at all? ******************************************************************************* Hardware notes: - К1801ВМ1 CPU (PDP-11 derived) @ ~4.61MHz -- 16KB ROM (2*К1809РЕ1), 2KB RAM(К1809РУ1) +- 16KB ROM (2*К1809РЕ1), 2KB RAM(К1809РУ1) (4KB RAM for ИМ-01Т) - K1809BB1 (I/O, counter) - 4-digit VFD 7seg panel(cyan, green window overlay), beeper -- cgit v1.2.3