mirror of
https://github.com/holub/mame
synced 2025-06-07 05:13:46 +03:00
t11: power fail trap is NMI, added bus error trap
This commit is contained in:
parent
3928edfe97
commit
a35ca34d96
@ -52,6 +52,7 @@ t11_device::t11_device(const machine_config &mconfig, device_type type, const ch
|
|||||||
, m_cp_state(0)
|
, m_cp_state(0)
|
||||||
, m_vec_active(false)
|
, m_vec_active(false)
|
||||||
, m_pf_active(false)
|
, m_pf_active(false)
|
||||||
|
, m_berr_active(false)
|
||||||
, m_hlt_active(false)
|
, m_hlt_active(false)
|
||||||
, m_out_reset_func(*this)
|
, m_out_reset_func(*this)
|
||||||
, m_in_iack_func(*this)
|
, m_in_iack_func(*this)
|
||||||
@ -222,9 +223,14 @@ void t11_device::t11_check_irqs()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// PF has next-highest priority
|
// non-maskable hardware traps
|
||||||
int priority = PSW & 0340;
|
if (m_bus_error)
|
||||||
if (m_power_fail && priority != 0340)
|
{
|
||||||
|
m_bus_error = false;
|
||||||
|
take_interrupt(T11_TIMEOUT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (m_power_fail)
|
||||||
{
|
{
|
||||||
m_power_fail = false;
|
m_power_fail = false;
|
||||||
take_interrupt(T11_PWRFAIL);
|
take_interrupt(T11_PWRFAIL);
|
||||||
@ -233,7 +239,7 @@ void t11_device::t11_check_irqs()
|
|||||||
|
|
||||||
// compare the priority of the CP interrupt to the PSW
|
// compare the priority of the CP interrupt to the PSW
|
||||||
const struct irq_table_entry *irq = &irq_table[m_cp_state & 15];
|
const struct irq_table_entry *irq = &irq_table[m_cp_state & 15];
|
||||||
if (irq->priority > priority)
|
if (irq->priority > (PSW & 0340))
|
||||||
{
|
{
|
||||||
// call the callback
|
// call the callback
|
||||||
standard_irq_callback(m_cp_state & 15);
|
standard_irq_callback(m_cp_state & 15);
|
||||||
@ -404,6 +410,7 @@ void t11_device::device_reset()
|
|||||||
|
|
||||||
m_wait_state = 0;
|
m_wait_state = 0;
|
||||||
m_power_fail = false;
|
m_power_fail = false;
|
||||||
|
m_bus_error = false;
|
||||||
m_ext_halt = 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);
|
m_pf_active = (state != CLEAR_LINE);
|
||||||
break;
|
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:
|
case HLT_LINE:
|
||||||
if (state != CLEAR_LINE && !m_hlt_active)
|
if (state != CLEAR_LINE && !m_hlt_active)
|
||||||
m_ext_halt = true;
|
m_ext_halt = true;
|
||||||
|
@ -22,6 +22,7 @@ enum
|
|||||||
class t11_device : public cpu_device
|
class t11_device : public cpu_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
// T11 input lines
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
CP0_LINE = 0, // -AI4 (at PI time)
|
CP0_LINE = 0, // -AI4 (at PI time)
|
||||||
@ -33,8 +34,12 @@ public:
|
|||||||
HLT_LINE = 6 // -AI7 (at PI time)
|
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
|
// 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
|
// configuration helpers
|
||||||
void set_initial_mode(const uint16_t mode) { c_initial_mode = mode; }
|
void set_initial_mode(const uint16_t mode) { c_initial_mode = mode; }
|
||||||
@ -63,8 +68,8 @@ protected:
|
|||||||
// device_execute_interface overrides
|
// device_execute_interface overrides
|
||||||
virtual uint32_t execute_min_cycles() const noexcept override { return 12; }
|
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_max_cycles() const noexcept override { return 114; }
|
||||||
virtual uint32_t execute_input_lines() const noexcept override { return 7; }
|
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; }
|
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_run() override;
|
||||||
virtual void execute_set_input(int inputnum, int state) override;
|
virtual void execute_set_input(int inputnum, int state) override;
|
||||||
|
|
||||||
@ -89,8 +94,10 @@ protected:
|
|||||||
uint8_t m_cp_state;
|
uint8_t m_cp_state;
|
||||||
bool m_vec_active;
|
bool m_vec_active;
|
||||||
bool m_pf_active;
|
bool m_pf_active;
|
||||||
|
bool m_berr_active;
|
||||||
bool m_hlt_active;
|
bool m_hlt_active;
|
||||||
bool m_power_fail;
|
bool m_power_fail;
|
||||||
|
bool m_bus_error;
|
||||||
bool m_ext_halt;
|
bool m_ext_halt;
|
||||||
int m_icount;
|
int m_icount;
|
||||||
memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
|
memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
|
||||||
|
@ -18,12 +18,13 @@ TODO:
|
|||||||
and/or T11 core timing itself is not 100% accurate.
|
and/or T11 core timing itself is not 100% accurate.
|
||||||
- verify actual XTAL, the label couldn't be seen
|
- verify actual XTAL, the label couldn't be seen
|
||||||
- correct bus conflict between RAM and I/O
|
- correct bus conflict between RAM and I/O
|
||||||
|
- is ИМ-01Т extra RAM chip used at all?
|
||||||
|
|
||||||
*******************************************************************************
|
*******************************************************************************
|
||||||
|
|
||||||
Hardware notes:
|
Hardware notes:
|
||||||
- К1801ВМ1 CPU (PDP-11 derived) @ ~4.61MHz
|
- К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)
|
- K1809BB1 (I/O, counter)
|
||||||
- 4-digit VFD 7seg panel(cyan, green window overlay), beeper
|
- 4-digit VFD 7seg panel(cyan, green window overlay), beeper
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user