summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2017-11-27 19:44:34 +0100
committer hap <happppp@users.noreply.github.com>2017-11-27 19:44:46 +0100
commit1b80b02eb0dcbe7b10a6ee95540a00069e3dba34 (patch)
tree73a4c2beae37599111374615a68380e4c49dfa8e
parent83fb61437819f7b533c7bcab145208f65a34ca46 (diff)
tms1000: added preliminary tms1000c (nw)
-rw-r--r--src/devices/cpu/tms1000/tms1000.cpp16
-rw-r--r--src/devices/cpu/tms1000/tms1000.h14
-rw-r--r--src/devices/cpu/tms1000/tms1400.cpp55
-rw-r--r--src/devices/cpu/tms1000/tms1400.h6
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.cpp56
-rw-r--r--src/devices/cpu/tms1000/tms1k_base.h3
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();