diff options
author | 2017-11-27 19:44:34 +0100 | |
---|---|---|
committer | 2017-11-27 19:44:46 +0100 | |
commit | 1b80b02eb0dcbe7b10a6ee95540a00069e3dba34 (patch) | |
tree | 73a4c2beae37599111374615a68380e4c49dfa8e | |
parent | 83fb61437819f7b533c7bcab145208f65a34ca46 (diff) |
tms1000: added preliminary tms1000c (nw)
-rw-r--r-- | src/devices/cpu/tms1000/tms1000.cpp | 16 | ||||
-rw-r--r-- | src/devices/cpu/tms1000/tms1000.h | 14 | ||||
-rw-r--r-- | src/devices/cpu/tms1000/tms1400.cpp | 55 | ||||
-rw-r--r-- | src/devices/cpu/tms1000/tms1400.h | 6 | ||||
-rw-r--r-- | src/devices/cpu/tms1000/tms1k_base.cpp | 56 | ||||
-rw-r--r-- | src/devices/cpu/tms1000/tms1k_base.h | 3 |
6 files changed, 89 insertions, 61 deletions
diff --git a/src/devices/cpu/tms1000/tms1000.cpp b/src/devices/cpu/tms1000/tms1000.cpp index 5aa2ecf8272..813f1da99f8 100644 --- a/src/devices/cpu/tms1000/tms1000.cpp +++ b/src/devices/cpu/tms1000/tms1000.cpp @@ -2,12 +2,13 @@ // copyright-holders:hap /* - TMS1000 family - TMS1000, TMS1070, TMS1040, TMS1200, TMS1700, TMS1730, + TMS1000 family - TMS1000, TMS1000C, TMS1070, TMS1040, TMS1200, TMS1700, TMS1730, and second source Motorola MC141000, MC141200. TODO: - add TMS1270 (10 O pins, how does that work?) - - add TMS1000C, TMS1200C (CMOS, and 3-level stack) + - add TMS1200C (has L input pins like TMS1600) + - add HALT input pin for TMS1000C */ @@ -32,6 +33,10 @@ DEFINE_DEVICE_TYPE(TMS1200, tms1200_cpu_device, "tms1200", "TMS1200") // 40-p DEFINE_DEVICE_TYPE(TMS1700, tms1700_cpu_device, "tms1700", "TMS1700") // 28-pin DIP, RAM/ROM size halved, 9 R pins DEFINE_DEVICE_TYPE(TMS1730, tms1730_cpu_device, "tms1730", "TMS1730") // 20-pin DIP, same die as TMS1700, package has less pins: 6 R pins, 5 O pins (output PLA is still 8-bit, O1,O3,O5 unused) +// CMOS versions (3-level stack, HALT pin) +DEFINE_DEVICE_TYPE(TMS1000C, tms1000c_cpu_device, "tms1000c", "TMS1000C") // 28-pin SDIP, 10 R pins + +// 2nd source Motorola chips DEFINE_DEVICE_TYPE(MC141000, mc141000_cpu_device, "mc141000", "MC141000") // CMOS, pin-compatible with TMS1000(reverse polarity) DEFINE_DEVICE_TYPE(MC141200, mc141200_cpu_device, "mc141200", "MC141200") // CMOS, 40-pin DIP, 16 R pins @@ -91,6 +96,11 @@ tms1730_cpu_device::tms1730_cpu_device(const machine_config &mconfig, const char { } +tms1000c_cpu_device::tms1000c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : tms1000_cpu_device(mconfig, TMS1000C, tag, owner, clock, 8, 10, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4)) +{ +} + mc141000_cpu_device::mc141000_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : tms1000_cpu_device(mconfig, MC141000, tag, owner, clock, 8, 11, 6, 8, 2, 10, ADDRESS_MAP_NAME(program_10bit_8), 6, ADDRESS_MAP_NAME(data_64x4)) { @@ -103,7 +113,7 @@ mc141200_cpu_device::mc141200_cpu_device(const machine_config &mconfig, const ch // machine configs - MACHINE_CONFIG_MEMBER(tms1000_cpu_device::device_add_mconfig) +MACHINE_CONFIG_MEMBER(tms1000_cpu_device::device_add_mconfig) // microinstructions PLA, output PLA MCFG_PLA_ADD("mpla", 8, 16, 30) diff --git a/src/devices/cpu/tms1000/tms1000.h b/src/devices/cpu/tms1000/tms1000.h index 8db0fd6f64e..9e969dfc356 100644 --- a/src/devices/cpu/tms1000/tms1000.h +++ b/src/devices/cpu/tms1000/tms1000.h @@ -62,6 +62,19 @@ public: }; +class tms1000c_cpu_device : public tms1000_cpu_device +{ +public: + tms1000c_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + // overrides + virtual void op_br() override { op_br3(); } // 3-level stack + virtual void op_call() override { op_call3(); } // " + virtual void op_retn() override { op_retn3(); } // " +}; + + class mc141000_cpu_device : public tms1000_cpu_device { public: @@ -76,6 +89,7 @@ public: DECLARE_DEVICE_TYPE(TMS1000, tms1000_cpu_device) +DECLARE_DEVICE_TYPE(TMS1000C, tms1000c_cpu_device) DECLARE_DEVICE_TYPE(TMS1070, tms1070_cpu_device) DECLARE_DEVICE_TYPE(TMS1040, tms1040_cpu_device) DECLARE_DEVICE_TYPE(TMS1200, tms1200_cpu_device) diff --git a/src/devices/cpu/tms1000/tms1400.cpp b/src/devices/cpu/tms1000/tms1400.cpp index 470136a16e5..4c392ec7599 100644 --- a/src/devices/cpu/tms1000/tms1400.cpp +++ b/src/devices/cpu/tms1000/tms1400.cpp @@ -88,58 +88,3 @@ void tms1400_cpu_device::device_reset() // small differences in 00-3f area m_fixed_decode[0x0b] = F_TPC; } - - -// opcode deviations -void tms1400_cpu_device::op_br() -{ - // BR/BL: conditional branch - if (m_status) - { - m_pa = m_pb; // don't care about clatch - m_ca = m_cb; - m_pc = m_opcode & m_pc_mask; - } -} - -void tms1400_cpu_device::op_call() -{ - // CALL/CALLL: conditional call - if (m_status) - { - // 3-level stack, mask clatch 3 bits (no need to mask others) - m_clatch = (m_clatch << 1 | 1) & 7; - - m_sr = m_sr << m_pc_bits | m_pc; - m_pc = m_opcode & m_pc_mask; - - m_ps = m_ps << 4 | m_pa; - m_pa = m_pb; - - m_cs = m_cs << 2 | m_ca; - m_ca = m_cb; - } - else - { - m_pb = m_pa; - m_cb = m_ca; - } -} - -void tms1400_cpu_device::op_retn() -{ - // RETN: return from subroutine - if (m_clatch & 1) - { - m_clatch >>= 1; - - m_pc = m_sr & m_pc_mask; - m_sr >>= m_pc_bits; - - m_pa = m_pb = m_ps & 0xf; - m_ps >>= 4; - - m_ca = m_cb = m_cs & 3; - m_cs >>= 2; - } -} diff --git a/src/devices/cpu/tms1000/tms1400.h b/src/devices/cpu/tms1000/tms1400.h index 59462360457..e6213f028fc 100644 --- a/src/devices/cpu/tms1000/tms1400.h +++ b/src/devices/cpu/tms1000/tms1400.h @@ -26,9 +26,9 @@ protected: virtual void device_reset() override; virtual void device_add_mconfig(machine_config &config) override; - virtual void op_br() override; - virtual void op_call() override; - virtual void op_retn() override; + virtual void op_br() override { op_br3(); } // 3-level stack + virtual void op_call() override { op_call3(); } // " + virtual void op_retn() override { op_retn3(); } // " virtual void op_setr() override { tms1k_base_device::op_setr(); } // no anomaly with MSB of X register virtual void op_rstr() override { tms1k_base_device::op_rstr(); } // " diff --git a/src/devices/cpu/tms1000/tms1k_base.cpp b/src/devices/cpu/tms1000/tms1k_base.cpp index b7ce7aa3b87..eb389fc6bc9 100644 --- a/src/devices/cpu/tms1000/tms1k_base.cpp +++ b/src/devices/cpu/tms1000/tms1k_base.cpp @@ -404,6 +404,62 @@ void tms1k_base_device::op_retn() } +// TMS1400/TMS1000C 3-level stack version + +void tms1k_base_device::op_br3() +{ + // BR/BL: conditional branch + if (m_status) + { + m_pa = m_pb; // don't care about clatch + m_ca = m_cb; + m_pc = m_opcode & m_pc_mask; + } +} + +void tms1k_base_device::op_call3() +{ + // CALL/CALLL: conditional call + if (m_status) + { + // mask clatch 3 bits (no need to mask others) + m_clatch = (m_clatch << 1 | 1) & 7; + + m_sr = m_sr << m_pc_bits | m_pc; + m_pc = m_opcode & m_pc_mask; + + m_ps = m_ps << 4 | m_pa; + m_pa = m_pb; + + m_cs = m_cs << 2 | m_ca; + m_ca = m_cb; + } + else + { + m_pb = m_pa; + m_cb = m_ca; + } +} + +void tms1k_base_device::op_retn3() +{ + // RETN: return from subroutine + if (m_clatch & 1) + { + m_clatch >>= 1; + + m_pc = m_sr & m_pc_mask; + m_sr >>= m_pc_bits; + + m_pa = m_pb = m_ps & 0xf; + m_ps >>= 4; + + m_ca = m_cb = m_cs & 3; + m_cs >>= 2; + } +} + + // handle other: // TMS1000/common diff --git a/src/devices/cpu/tms1000/tms1k_base.h b/src/devices/cpu/tms1000/tms1k_base.h index 4fb9f353178..bac76452da9 100644 --- a/src/devices/cpu/tms1000/tms1k_base.h +++ b/src/devices/cpu/tms1000/tms1k_base.h @@ -182,6 +182,9 @@ protected: virtual void op_br(); virtual void op_call(); virtual void op_retn(); + virtual void op_br3(); + virtual void op_call3(); + virtual void op_retn3(); virtual void op_sbit(); virtual void op_rbit(); |