tms1000: added preliminary tms1000c (nw)
This commit is contained in:
parent
83fb614378
commit
1b80b02eb0
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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(); } // "
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user