summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/t11/t11.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/cpu/t11/t11.h')
-rw-r--r--src/devices/cpu/t11/t11.h144
1 files changed, 114 insertions, 30 deletions
diff --git a/src/devices/cpu/t11/t11.h b/src/devices/cpu/t11/t11.h
index 842a48e53d3..0ac0a17790a 100644
--- a/src/devices/cpu/t11/t11.h
+++ b/src/devices/cpu/t11/t11.h
@@ -7,51 +7,97 @@
#pragma once
+#include "machine/z80daisy.h"
+
enum
{
T11_R0=1, T11_R1, T11_R2, T11_R3, T11_R4, T11_R5, T11_SP, T11_PC, T11_PSW
};
-#define T11_IRQ0 0 /* IRQ0 */
-#define T11_IRQ1 1 /* IRQ1 */
-#define T11_IRQ2 2 /* IRQ2 */
-#define T11_IRQ3 3 /* IRQ3 */
-
-#define T11_RESERVED 0x000 /* Reserved vector */
-#define T11_TIMEOUT 0x004 /* Time-out/system error vector */
-#define T11_ILLINST 0x008 /* Illegal and reserved instruction vector */
-#define T11_BPT 0x00C /* BPT instruction vector */
-#define T11_IOT 0x010 /* IOT instruction vector */
-#define T11_PWRFAIL 0x014 /* Power fail vector */
-#define T11_EMT 0x018 /* EMT instruction vector */
-#define T11_TRAP 0x01C /* TRAP instruction vector */
-
class t11_device : public cpu_device
{
public:
+ // T11 input lines
+ enum
+ {
+ CP0_LINE = 0, // -AI4 (at PI time)
+ CP1_LINE = 1, // -AI3 (at PI time)
+ CP2_LINE = 2, // -AI2 (at PI time)
+ CP3_LINE = 3, // -AI1 (at PI time)
+ VEC_LINE = 4, // -AI5 (at PI time)
+ PF_LINE = 5, // -AI6 (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
- 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; }
auto out_reset() { return m_out_reset_func.bind(); }
+ auto in_iack() { return m_in_iack_func.bind(); }
protected:
+ enum
+ {
+ T11_RESERVED = 000, // Reserved vector
+ T11_TIMEOUT = 004, // Time-out/system error vector
+ T11_ILLINST = 010, // Illegal and reserved instruction vector
+ T11_BPT = 014, // BPT instruction vector
+ T11_IOT = 020, // IOT instruction vector
+ T11_PWRFAIL = 024, // Power fail vector
+ T11_EMT = 030, // EMT instruction vector
+ T11_TRAP = 034, // TRAP instruction vector
+ // K1801 vectors
+ VM1_EVNT = 0100, // EVNT pin vector
+ VM1_IRQ3 = 0270, // IRQ3 pin vector
+ VM1_HALT = 0160002, // HALT instruction vector
+ VM2_HALT = 0170 // HALT instruction vector
+ };
+ // K1801 microcode constants
+ enum
+ {
+ VM1_STACK = 0177674, // start of HALT mode save area
+ VM1_SEL1 = 0177716, // DIP switch register (read) and HALT mode selector (write)
+ SEL1_HALT = 010,
+ MCIR_ILL = -2,
+ MCIR_SET = -1,
+ MCIR_WAIT = 0,
+ MCIR_NONE = 1,
+ MCIR_HALT = 2,
+ MCIR_IRQ = 3
+ };
+ enum
+ {
+ // DEC command set extensions
+ IS_LEIS = 1 << 0, // MARK, RTT, SOB, SXT, XOR
+ IS_EIS = 1 << 1, // same plus ASH, ASHC, MUL, DIV
+ IS_MFPT = 1 << 2, // MFPT
+ IS_MXPS = 1 << 3, // MFPS, MTPS
+ IS_T11 = 1 << 4, // LEIS without MARK
+ // K1801 command set extensions
+ IS_VM1 = 1 << 5, // START, STEP
+ IS_VM2 = 1 << 6, // same plus RSEL, MxUS, RCPx, WCPx
+ };
+
t11_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
// device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
// device_execute_interface overrides
- virtual uint32_t execute_min_cycles() const override { return 12; }
- virtual uint32_t execute_max_cycles() const override { return 110; }
- virtual uint32_t execute_input_lines() const override { return 4; }
+ virtual uint32_t execute_min_cycles() const noexcept override { return 12; }
+ virtual uint32_t execute_max_cycles() const noexcept override { return 114; }
+ 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;
- virtual uint32_t execute_default_irq_vector(int inputnum) const override { return -1; }
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
@@ -65,17 +111,31 @@ protected:
address_space_config m_program_config;
uint16_t c_initial_mode;
+ uint16_t c_insn_set;
PAIR m_ppc; /* previous program counter */
PAIR m_reg[8];
PAIR m_psw;
- uint16_t m_initial_pc;
- uint8_t m_wait_state;
- uint8_t m_irq_state;
+ uint16_t m_initial_pc;
+ uint8_t m_wait_state;
+ int8_t m_mcir;
+ uint16_t m_vsel;
+ 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;
+ bool m_check_irqs;
+ bool m_trace_trap;
int m_icount;
- address_space *m_program;
- memory_access_cache<1, 0, ENDIANNESS_LITTLE> *m_cache;
- devcb_write_line m_out_reset_func;
+ memory_access<16, 1, 0, ENDIANNESS_LITTLE>::cache m_cache;
+ memory_access<16, 1, 0, ENDIANNESS_LITTLE>::specific m_program;
+
+ devcb_write_line m_out_reset_func;
+ devcb_read8 m_in_iack_func;
inline int ROPCODE();
inline int RBYTE(int addr);
@@ -84,14 +144,19 @@ protected:
inline void WWORD(int addr, int data);
inline void PUSH(int val);
inline int POP();
- void t11_check_irqs();
+
+ virtual void t11_check_irqs();
+ void take_interrupt(uint8_t vector);
+ void trap_to(uint16_t vector);
typedef void ( t11_device::*opcode_func )(uint16_t op);
static const opcode_func s_opcode_table[65536 >> 3];
void op_0000(uint16_t op);
+ void op_0001(uint16_t op);
void halt(uint16_t op);
void illegal(uint16_t op);
+ void illegal4(uint16_t op);
void jmp_rgd(uint16_t op);
void jmp_in(uint16_t op);
void jmp_ind(uint16_t op);
@@ -1130,7 +1195,25 @@ protected:
void sub_ixd_ixd(uint16_t op);
};
-class k1801vm2_device : public t11_device
+class k1801vm1_device : public t11_device, public z80_daisy_chain_interface
+{
+public:
+ // construction/destruction
+ k1801vm1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ // device-level overrides
+ virtual void device_reset() override ATTR_COLD;
+
+ // device_state_interface overrides
+ virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
+
+ virtual void t11_check_irqs() override;
+ void take_interrupt_halt(uint16_t vector);
+};
+
+
+class k1801vm2_device : public t11_device, public z80_daisy_chain_interface
{
public:
// construction/destruction
@@ -1138,7 +1221,7 @@ public:
protected:
// device-level overrides
- virtual void device_reset() override;
+ virtual void device_reset() override ATTR_COLD;
// device_state_interface overrides
virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
@@ -1146,6 +1229,7 @@ protected:
DECLARE_DEVICE_TYPE(T11, t11_device)
+DECLARE_DEVICE_TYPE(K1801VM1, k1801vm1_device)
DECLARE_DEVICE_TYPE(K1801VM2, k1801vm2_device)
#endif // MAME_CPU_T11_T11_H