tms1000: add read/write prefix to k/r/o devcb names

This commit is contained in:
hap 2022-08-06 19:10:30 +02:00
parent 1c4c29aff6
commit 6fe19f4032
18 changed files with 388 additions and 371 deletions

View File

@ -110,7 +110,7 @@ void tms0270_cpu_device::dynamic_output()
// standard O-output // standard O-output
if (m_o_latch != m_o_latch_prev) if (m_o_latch != m_o_latch_prev)
{ {
write_o_output(m_o_latch); write_o_reg(m_o_latch);
m_o_latch_prev = m_o_latch; m_o_latch_prev = m_o_latch;
} }
} }
@ -118,7 +118,7 @@ void tms0270_cpu_device::dynamic_output()
// standard R-output // standard R-output
if (m_r != m_r_prev) if (m_r != m_r_prev)
{ {
m_write_r(m_r & m_r_mask); write_r_output(m_r);
m_r_prev = m_r; m_r_prev = m_r;
} }
} }

View File

@ -26,7 +26,7 @@ protected:
virtual void device_add_mconfig(machine_config &config) override; virtual void device_add_mconfig(machine_config &config) override;
virtual void write_o_output(u8 index) override { tms1k_base_device::write_o_output(index); } virtual void write_o_reg(u8 index) override { tms1k_base_device::write_o_reg(index); }
virtual u8 read_k_input() override; virtual u8 read_k_input() override;
virtual void dynamic_output() override; virtual void dynamic_output() override;

View File

@ -113,11 +113,11 @@ void tms0970_cpu_device::device_reset()
// i/o handling // i/o handling
void tms0970_cpu_device::write_o_output(u8 index) void tms0970_cpu_device::write_o_reg(u8 index)
{ {
m_o_index = index; m_o_index = index;
m_o = m_spla->read(index); m_o = m_spla->read(index);
m_write_o(m_o & m_o_mask); write_o_output(m_o);
} }
@ -133,6 +133,6 @@ void tms0970_cpu_device::op_setr()
void tms0970_cpu_device::op_tdo() void tms0970_cpu_device::op_tdo()
{ {
// TDO: transfer digits to output // TDO: transfer digits to output
write_o_output(m_a & 0x7); write_o_reg(m_a & 0x7);
m_write_r(m_r & m_r_mask); write_r_output(m_r);
} }

View File

@ -26,7 +26,7 @@ protected:
virtual void device_reset() override; virtual void device_reset() override;
virtual void device_add_mconfig(machine_config &config) override; virtual void device_add_mconfig(machine_config &config) override;
virtual void write_o_output(u8 index) override; virtual void write_o_reg(u8 index) override;
virtual void op_setr() override; virtual void op_setr() override;
virtual void op_tdo() override; virtual void op_tdo() override;

View File

@ -258,5 +258,5 @@ void tms0980_cpu_device::op_sbl()
void tms1980_cpu_device::op_tdo() void tms1980_cpu_device::op_tdo()
{ {
// TDO: transfer accumulator and status(not status_latch!) to O-output // TDO: transfer accumulator and status(not status_latch!) to O-output
write_o_output(m_status << 4 | m_a); write_o_reg(m_status << 4 | m_a);
} }

View File

@ -80,7 +80,7 @@ protected:
// overrides // overrides
virtual void device_add_mconfig(machine_config &config) override; virtual void device_add_mconfig(machine_config &config) override;
virtual void write_o_output(u8 index) override { tms1k_base_device::write_o_output(index); } virtual void write_o_reg(u8 index) override { tms1k_base_device::write_o_reg(index); }
virtual void op_setr() override { tms1k_base_device::op_setr(); } virtual void op_setr() override { tms1k_base_device::op_setr(); }
virtual void op_tdo() override; virtual void op_tdo() override;

View File

@ -80,7 +80,7 @@ void tms1100_cpu_device::op_setr()
// TMS1100 manual simply says that X must be less than 4 // TMS1100 manual simply says that X must be less than 4
u8 index = BIT(m_x, m_x_bits - 1) << 4 | m_y; u8 index = BIT(m_x, m_x_bits - 1) << 4 | m_y;
m_r = m_r | (1 << index); m_r = m_r | (1 << index);
m_write_r(m_r & m_r_mask); write_r_output(m_r);
} }
void tms1100_cpu_device::op_rstr() void tms1100_cpu_device::op_rstr()
@ -88,5 +88,5 @@ void tms1100_cpu_device::op_rstr()
// RSTR: see SETR // RSTR: see SETR
u8 index = BIT(m_x, m_x_bits - 1) << 4 | m_y; u8 index = BIT(m_x, m_x_bits - 1) << 4 | m_y;
m_r = m_r & ~(1 << index); m_r = m_r & ~(1 << index);
m_write_r(m_r & m_r_mask); write_r_output(m_r);
} }

View File

@ -86,14 +86,16 @@ tms1k_base_device::tms1k_base_device(const machine_config &mconfig, device_type
m_byte_bits(byte_bits), m_byte_bits(byte_bits),
m_x_bits(x_bits), m_x_bits(x_bits),
m_stack_levels(stack_levels), m_stack_levels(stack_levels),
m_output_pla_table(nullptr),
m_read_k(*this), m_read_k(*this),
m_write_o(*this), m_write_o(*this),
m_write_r(*this), m_write_r(*this),
m_read_j(*this),
m_read_r(*this),
m_power_off(*this), m_power_off(*this),
m_read_ctl(*this), m_read_ctl(*this),
m_write_ctl(*this), m_write_ctl(*this),
m_write_pdc(*this), m_write_pdc(*this),
m_output_pla_table(nullptr),
m_decode_micro(*this) m_decode_micro(*this)
{ } { }
@ -140,6 +142,8 @@ void tms1k_base_device::device_start()
m_read_k.resolve_safe(0); m_read_k.resolve_safe(0);
m_write_o.resolve_safe(); m_write_o.resolve_safe();
m_write_r.resolve_safe(); m_write_r.resolve_safe();
m_read_j.resolve_safe(0);
m_read_r.resolve_safe(0);
m_power_off.resolve_safe(); m_power_off.resolve_safe();
m_read_ctl.resolve_safe(0); m_read_ctl.resolve_safe(0);
m_write_ctl.resolve_safe(); m_write_ctl.resolve_safe();
@ -281,9 +285,9 @@ void tms1k_base_device::device_reset()
// clear outputs // clear outputs
m_r = 0; m_r = 0;
m_write_r(m_r & m_r_mask); write_r_output(0);
write_o_output(0); write_o_reg(0);
m_write_r(m_r & m_r_mask); write_r_output(0);
m_power_off(0); m_power_off(0);
} }
@ -362,18 +366,12 @@ void tms1k_base_device::read_opcode()
// i/o handling // i/o handling
//------------------------------------------------- //-------------------------------------------------
void tms1k_base_device::write_o_output(u8 index) void tms1k_base_device::write_o_reg(u8 index)
{ {
// a hardcoded table is supported if the output pla is unknown // a hardcoded table is supported if the output pla is unknown
m_o_index = index; m_o_index = index;
m_o = (m_output_pla_table == nullptr) ? m_opla->read(index) : m_output_pla_table[index]; m_o = (m_output_pla_table == nullptr) ? m_opla->read(index) : m_output_pla_table[index];
m_write_o(m_o & m_o_mask); write_o_output(m_o);
}
u8 tms1k_base_device::read_k_input()
{
// K1,2,4,8 (KC test pin is not emulated)
return m_read_k() & 0xf;
} }
void tms1k_base_device::set_cki_bus() void tms1k_base_device::set_cki_bus()
@ -544,26 +542,26 @@ void tms1k_base_device::op_setr()
{ {
// SETR: set one R-output line // SETR: set one R-output line
m_r = m_r | (1 << m_y); m_r = m_r | (1 << m_y);
m_write_r(m_r & m_r_mask); write_r_output(m_r);
} }
void tms1k_base_device::op_rstr() void tms1k_base_device::op_rstr()
{ {
// RSTR: reset one R-output line // RSTR: reset one R-output line
m_r = m_r & ~(1 << m_y); m_r = m_r & ~(1 << m_y);
m_write_r(m_r & m_r_mask); write_r_output(m_r);
} }
void tms1k_base_device::op_tdo() void tms1k_base_device::op_tdo()
{ {
// TDO: transfer accumulator and status latch to O-output // TDO: transfer accumulator and status latch to O-register
write_o_output(m_status_latch << 4 | m_a); write_o_reg(m_status_latch << 4 | m_a);
} }
void tms1k_base_device::op_clo() void tms1k_base_device::op_clo()
{ {
// CLO: clear O-output // CLO: clear O-register
write_o_output(0); write_o_reg(0);
} }
void tms1k_base_device::op_ldx() void tms1k_base_device::op_ldx()

View File

@ -20,14 +20,14 @@
class tms1k_base_device : public cpu_device class tms1k_base_device : public cpu_device
{ {
public: public:
// K input pins // common handlers
auto k() { return m_read_k.bind(); } auto read_k() { return m_read_k.bind(); } // K input pins
auto write_o() { return m_write_o.bind(); } // O/Segment output pins
auto write_r() { return m_write_r.bind(); } // R output pins (also called D on some chips)
// O/Segment output pins // TMS2100 handlers
auto o() { return m_write_o.bind(); } auto read_j() { return m_read_j.bind(); } // J input pins
auto read_r() { return m_read_r.bind(); } // R0-R3 input pins
// R output pins (also called D on some chips)
auto r() { return m_write_r.bind(); }
// OFF request on TMS0980 and up // OFF request on TMS0980 and up
auto power_off() { return m_power_off.bind(); } auto power_off() { return m_power_off.bind(); }
@ -144,8 +144,10 @@ protected:
void next_pc(); void next_pc();
virtual void write_o_output(u8 index); virtual void write_o_reg(u8 index);
virtual u8 read_k_input(); virtual void write_o_output(u16 data) { m_write_o(data & m_o_mask); }
virtual void write_r_output(u32 data) { m_write_r(data & m_r_mask); }
virtual u8 read_k_input() { return m_read_k() & 0xf; }
virtual void set_cki_bus(); virtual void set_cki_bus();
virtual void dynamic_output() { ; } // not used by default virtual void dynamic_output() { ; } // not used by default
virtual void read_opcode(); virtual void read_opcode();
@ -240,14 +242,20 @@ protected:
address_space *m_program; address_space *m_program;
address_space *m_data; address_space *m_data;
const u16 *m_output_pla_table;
devcb_read8 m_read_k; devcb_read8 m_read_k;
devcb_write16 m_write_o; devcb_write16 m_write_o;
devcb_write32 m_write_r; devcb_write32 m_write_r;
devcb_read8 m_read_j;
devcb_read8 m_read_r;
devcb_write_line m_power_off; devcb_write_line m_power_off;
devcb_read8 m_read_ctl; devcb_read8 m_read_ctl;
devcb_write8 m_write_ctl; devcb_write8 m_write_ctl;
devcb_write_line m_write_pdc; devcb_write_line m_write_pdc;
const u16 *m_output_pla_table;
devcb_read32 m_decode_micro; devcb_read32 m_decode_micro;
u32 m_o_mask; u32 m_o_mask;

View File

@ -22,7 +22,11 @@ Extra functions are controlled with the R register (not mapped to pins):
- R24: enable interrupts - R24: enable interrupts
TODO: TODO:
- x - timer interrupt
- external interrupt (INT pin)
- event counter (EC1 pin)
- R0-R3 I/O, TRA opcode
- A/D converter, TADM opcode
*/ */
@ -109,6 +113,14 @@ void tms2100_cpu_device::device_reset()
} }
// i/o handling
u8 tms2100_cpu_device::read_k_input()
{
// select K/J port with R16
return (BIT(m_r, 16) ? m_read_j() : m_read_k()) & 0xf;
}
// opcode deviations // opcode deviations
void tms2100_cpu_device::op_tax() void tms2100_cpu_device::op_tax()
{ {

View File

@ -75,6 +75,8 @@ protected:
virtual std::unique_ptr<util::disasm_interface> create_disassembler() override; virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
virtual u8 read_k_input() override;
virtual void op_tax() override; virtual void op_tax() override;
virtual void op_tra() override; virtual void op_tra() override;
virtual void op_tac() override; virtual void op_tac() override;

View File

@ -4,10 +4,7 @@
TMS1000 family - TMS2400, TMS2470, TMS2600, TMS2670 TMS1000 family - TMS2400, TMS2470, TMS2600, TMS2670
TMS2400 is a TMS2100 with twice more memory (kind of like TMS1400 is to TMS1100) TMS2400 is a TMS2100 with twice more memory (kind of how TMS1400 is to TMS1100)
TODO:
- x
*/ */
@ -70,7 +67,7 @@ void tms2400_cpu_device::device_reset()
// opcode deviations // opcode deviations
void tms2400_cpu_device::op_ldx() void tms2400_cpu_device::op_ldx()
{ {
// LDX: value is still 3 bit even though X is 4 bit // LDX: value is still 3-bit even though X is 4-bit
tms2100_cpu_device::op_ldx(); tms2100_cpu_device::op_ldx();
m_x >>= 1; m_x >>= 1;
} }

View File

@ -313,9 +313,9 @@ void sag_state::sag(machine_config &config)
m_hmcs40_cpu->read_d().set(FUNC(sag_state::hmcs40_read_d)); m_hmcs40_cpu->read_d().set(FUNC(sag_state::hmcs40_read_d));
TMS1670(config, m_tms1k_cpu, 0); TMS1670(config, m_tms1k_cpu, 0);
m_tms1k_cpu->k().set(FUNC(sag_state::tms1k_read_k)); m_tms1k_cpu->read_k().set(FUNC(sag_state::tms1k_read_k));
m_tms1k_cpu->r().set(FUNC(sag_state::tms1k_write_r)); m_tms1k_cpu->write_r().set(FUNC(sag_state::tms1k_write_r));
m_tms1k_cpu->o().set(FUNC(sag_state::tms1k_write_o)); m_tms1k_cpu->write_o().set(FUNC(sag_state::tms1k_write_o));
/* video hardware */ /* video hardware */
PWM_DISPLAY(config, m_display).set_size(8+6, 14); PWM_DISPLAY(config, m_display).set_size(8+6, 14);

File diff suppressed because it is too large Load Diff

View File

@ -1329,9 +1329,9 @@ void tispeak_state::snmath(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS0270(config, m_maincpu, MASTER_CLOCK/2); TMS0270(config, m_maincpu, MASTER_CLOCK/2);
m_maincpu->k().set(FUNC(tispeak_state::snspell_read_k)); m_maincpu->read_k().set(FUNC(tispeak_state::snspell_read_k));
m_maincpu->o().set(FUNC(tispeak_state::snmath_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snmath_write_o));
m_maincpu->r().set(FUNC(tispeak_state::snspell_write_r)); m_maincpu->write_r().set(FUNC(tispeak_state::snspell_write_r));
m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r)); m_maincpu->read_ctl().set("tms5100", FUNC(tms5110_device::ctl_r));
m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w)); m_maincpu->write_ctl().set("tms5100", FUNC(tms5110_device::ctl_w));
@ -1356,7 +1356,7 @@ void tispeak_state::sns_cd2801(machine_config &config)
snmath(config); snmath(config);
// basic machine hardware // basic machine hardware
m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snspell_write_o));
config.set_default_layout(layout_snspell); config.set_default_layout(layout_snspell);
@ -1407,7 +1407,7 @@ void tispeak_state::snread(machine_config &config)
snmath(config); snmath(config);
// basic machine hardware // basic machine hardware
m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snspell_write_o));
config.set_default_layout(layout_snread); config.set_default_layout(layout_snread);
@ -1424,8 +1424,8 @@ void tispeak_state::lantrans(machine_config &config)
snmath(config); snmath(config);
// basic machine hardware // basic machine hardware
m_maincpu->o().set(FUNC(tispeak_state::snspell_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snspell_write_o));
m_maincpu->r().set(FUNC(tispeak_state::lantrans_write_r)); m_maincpu->write_r().set(FUNC(tispeak_state::lantrans_write_r));
config.set_default_layout(layout_snread); config.set_default_layout(layout_snread);
@ -1458,9 +1458,9 @@ void tispeak_state::snspellc(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS1100(config, m_maincpu, MASTER_CLOCK/2); TMS1100(config, m_maincpu, MASTER_CLOCK/2);
m_maincpu->k().set(FUNC(tispeak_state::snspellc_read_k)); m_maincpu->read_k().set(FUNC(tispeak_state::snspellc_read_k));
m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snspellc_write_o));
m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); m_maincpu->write_r().set(FUNC(tispeak_state::snspellc_write_r));
// no visual feedback! // no visual feedback!
@ -1492,9 +1492,9 @@ void tispeak_state::vocaid(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS1100(config, m_maincpu, MASTER_CLOCK/2); TMS1100(config, m_maincpu, MASTER_CLOCK/2);
m_maincpu->k().set(FUNC(tispeak_state::tntell_read_k)); m_maincpu->read_k().set(FUNC(tispeak_state::tntell_read_k));
m_maincpu->o().set(FUNC(tispeak_state::snspellc_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::snspellc_write_o));
m_maincpu->r().set(FUNC(tispeak_state::snspellc_write_r)); m_maincpu->write_r().set(FUNC(tispeak_state::snspellc_write_r));
TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50)); TIMER(config, "ol_timer").configure_periodic(FUNC(tispeak_state::tntell_get_overlay), attotime::from_msec(50));
config.set_default_layout(layout_tntell); config.set_default_layout(layout_tntell);
@ -1523,9 +1523,9 @@ void tispeak_state::k28m2(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS1400(config, m_maincpu, MASTER_CLOCK/2); TMS1400(config, m_maincpu, MASTER_CLOCK/2);
m_maincpu->k().set(FUNC(tispeak_state::k28_read_k)); m_maincpu->read_k().set(FUNC(tispeak_state::k28_read_k));
m_maincpu->o().set(FUNC(tispeak_state::k28_write_o)); m_maincpu->write_o().set(FUNC(tispeak_state::k28_write_o));
m_maincpu->r().set(FUNC(tispeak_state::k28_write_r)); m_maincpu->write_r().set(FUNC(tispeak_state::k28_write_r));
config.set_default_layout(layout_k28m2); config.set_default_layout(layout_k28m2);

View File

@ -328,16 +328,16 @@ void tispellb_state::rev1(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS0270(config, m_maincpu, 350000); // approximation TMS0270(config, m_maincpu, 350000); // approximation
m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); m_maincpu->read_k().set(FUNC(tispellb_state::main_read_k));
m_maincpu->o().set(FUNC(tispellb_state::main_write_o)); m_maincpu->write_o().set(FUNC(tispellb_state::main_write_o));
m_maincpu->r().set(FUNC(tispellb_state::main_write_r)); m_maincpu->write_r().set(FUNC(tispellb_state::main_write_r));
m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r)); m_maincpu->read_ctl().set(FUNC(tispellb_state::rev1_ctl_r));
m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w)); m_maincpu->write_ctl().set(FUNC(tispellb_state::rev1_ctl_w));
TMS1980(config, m_subcpu, 350000); // approximation TMS1980(config, m_subcpu, 350000); // approximation
m_subcpu->k().set(FUNC(tispellb_state::sub_read_k)); m_subcpu->read_k().set(FUNC(tispellb_state::sub_read_k));
m_subcpu->o().set(FUNC(tispellb_state::sub_write_o)); m_subcpu->write_o().set(FUNC(tispellb_state::sub_write_o));
m_subcpu->r().set(FUNC(tispellb_state::sub_write_r)); m_subcpu->write_r().set(FUNC(tispellb_state::sub_write_r));
config.set_perfect_quantum(m_maincpu); config.set_perfect_quantum(m_maincpu);
@ -354,9 +354,9 @@ void tispellb_state::rev2(machine_config &config)
{ {
// basic machine hardware // basic machine hardware
TMS0270(config, m_maincpu, 350000); // approximation TMS0270(config, m_maincpu, 350000); // approximation
m_maincpu->k().set(FUNC(tispellb_state::main_read_k)); m_maincpu->read_k().set(FUNC(tispellb_state::main_read_k));
m_maincpu->o().set(FUNC(tispellb_state::rev2_write_o)); m_maincpu->write_o().set(FUNC(tispellb_state::rev2_write_o));
m_maincpu->r().set(FUNC(tispellb_state::rev2_write_r)); m_maincpu->write_r().set(FUNC(tispellb_state::rev2_write_r));
m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r)); m_maincpu->read_ctl().set(m_tms6100, FUNC(tms6100_device::data_r));
m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w)); m_maincpu->write_ctl().set(m_tms6100, FUNC(tms6100_device::add_w));

View File

@ -448,9 +448,9 @@ void microvision_state::microvision(machine_config &config)
TMS1100(config, m_tms1100, 0); TMS1100(config, m_tms1100, 0);
m_tms1100->set_output_pla(microvision_output_pla[0]); m_tms1100->set_output_pla(microvision_output_pla[0]);
m_tms1100->set_decode_micro().set(FUNC(microvision_state::tms1100_decode_micro)); m_tms1100->set_decode_micro().set(FUNC(microvision_state::tms1100_decode_micro));
m_tms1100->k().set(FUNC(microvision_state::tms1100_k_r)); m_tms1100->read_k().set(FUNC(microvision_state::tms1100_k_r));
m_tms1100->o().set(FUNC(microvision_state::tms1100_o_w)); m_tms1100->write_o().set(FUNC(microvision_state::tms1100_o_w));
m_tms1100->r().set(FUNC(microvision_state::tms1100_r_w)); m_tms1100->write_r().set(FUNC(microvision_state::tms1100_r_w));
I8021(config, m_i8021, 0); I8021(config, m_i8021, 0);
m_i8021->bus_in_cb().set(FUNC(microvision_state::i8021_p0_r)); m_i8021->bus_in_cb().set(FUNC(microvision_state::i8021_p0_r));

View File

@ -197,9 +197,9 @@ void eva11_state::eva(machine_config &config)
{ {
/* basic machine hardware */ /* basic machine hardware */
TMS1000(config, m_maincpu, 640_kHz_XTAL/2); // from TMS5110A CPU CK TMS1000(config, m_maincpu, 640_kHz_XTAL/2); // from TMS5110A CPU CK
m_maincpu->k().set(FUNC(eva11_state::read_k)); m_maincpu->read_k().set(FUNC(eva11_state::read_k));
m_maincpu->o().set(FUNC(eva11_state::write_o)); m_maincpu->write_o().set(FUNC(eva11_state::write_o));
m_maincpu->r().set(FUNC(eva11_state::write_r)); m_maincpu->write_r().set(FUNC(eva11_state::write_r));
eva_sound(config); eva_sound(config);
} }