From 83fb61437819f7b533c7bcab145208f65a34ca46 Mon Sep 17 00:00:00 2001 From: AJR Date: Mon, 27 Nov 2017 13:12:29 -0500 Subject: [PATCH] et3400: Add "Segment Test" input --- src/mame/drivers/et3400.cpp | 68 ++++++++++++++++++++++++++----------- 1 file changed, 49 insertions(+), 19 deletions(-) diff --git a/src/mame/drivers/et3400.cpp b/src/mame/drivers/et3400.cpp index e581889261b..e3d140c5c63 100644 --- a/src/mame/drivers/et3400.cpp +++ b/src/mame/drivers/et3400.cpp @@ -25,6 +25,7 @@ ETA-3400 Memory I/O Accessory #include "emu.h" #include "cpu/m6800/m6800.h" +#include "machine/74259.h" #include "machine/6821pia.h" #include "bus/rs232/rs232.h" #include "imagedev/cassette.h" @@ -41,27 +42,31 @@ public: : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") , m_pia(*this, "pia") + , m_displatch(*this, "displatch%u", 1) , m_rs232(*this, "rs232") , m_cass(*this, "cassette") { } DECLARE_READ8_MEMBER(keypad_r); DECLARE_WRITE8_MEMBER(display_w); + template DECLARE_WRITE8_MEMBER(led_w); DECLARE_READ8_MEMBER(pia_ar); DECLARE_WRITE8_MEMBER(pia_aw); DECLARE_READ8_MEMBER(pia_br); DECLARE_WRITE8_MEMBER(pia_bw); DECLARE_WRITE_LINE_MEMBER(reset_key_w); + DECLARE_WRITE_LINE_MEMBER(segment_test_w); private: required_device m_maincpu; required_device m_pia; + required_device_array m_displatch; required_device m_rs232; required_device m_cass; }; -READ8_MEMBER( et3400_state::keypad_r ) +READ8_MEMBER(et3400_state::keypad_r) { uint8_t data = 0xff; @@ -75,45 +80,44 @@ READ8_MEMBER( et3400_state::keypad_r ) return data; } -WRITE8_MEMBER( et3400_state::display_w ) +WRITE8_MEMBER(et3400_state::display_w) +{ + // A6-A4 decoded by IC22 (74LS42); D0 inverted by one gate of IC21 (74S00) + uint8_t digit = (offset >> 4) & 7; + if (digit >= 1 && digit <= 6) + m_displatch[digit - 1]->write_bit(offset & 7, !BIT(data, 0)); +} + +template +WRITE8_MEMBER(et3400_state::led_w) { /* This computer sets each segment, one at a time. */ - - static const uint8_t segments[8]={0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x80}; - uint8_t digit = (offset >> 4) & 7; - uint8_t segment = segments[offset & 7]; - uint8_t segdata = output().get_digit_value(digit); - - if (data & 1) - segdata |= segment; - else - segdata &= ~segment; - + uint8_t segdata = BITSWAP8(~data, 7, 0, 1, 2, 3, 4, 5, 6); output().set_digit_value(digit, segdata); } // d1,2,3 = Baud rate // d4 = gnd // d7 = rs232 in -READ8_MEMBER( et3400_state::pia_ar ) +READ8_MEMBER(et3400_state::pia_ar) { return ioport("BAUD")->read() | (m_rs232->rxd_r() << 7); } // d0 = rs232 out -WRITE8_MEMBER( et3400_state::pia_aw ) +WRITE8_MEMBER(et3400_state::pia_aw) { m_rs232->write_txd(BIT(data, 0)); } // d7 = cass in -READ8_MEMBER( et3400_state::pia_br ) +READ8_MEMBER(et3400_state::pia_br) { return (m_cass->input() > +0.0) << 7; } // d0 = cass out -WRITE8_MEMBER( et3400_state::pia_bw ) +WRITE8_MEMBER(et3400_state::pia_bw) { m_cass->output(BIT(data, 0) ? -1.0 : +1.0); } @@ -133,6 +137,16 @@ WRITE_LINE_MEMBER(et3400_state::reset_key_w) { // delivered through MC6875 (or 74LS241 on ET-3400A) m_maincpu->set_input_line(INPUT_LINE_RESET, state ? CLEAR_LINE : ASSERT_LINE); + + // PIA also uses reset line + if (!state) + m_pia->reset(); +} + +WRITE_LINE_MEMBER(et3400_state::segment_test_w) +{ + for (int d = 0; d < 6; d++) + m_displatch[d]->clear_w(state); } /* Input ports */ @@ -172,8 +186,11 @@ static INPUT_PORTS_START( et3400 ) PORT_DIPSETTING( 0x04, "4800" ) PORT_DIPSETTING( 0x02, "9600" ) - PORT_START("RESET") // RESET is directly below 2, but electrically separate from key matrix + PORT_START("RESET") // RESET is directly next to 0, but electrically separate from key matrix PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_STOP) PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, et3400_state, reset_key_w) + + PORT_START("TEST") // No input mechanism for "Segment Test" defined other than shorting pins together + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Segment Test") PORT_WRITE_LINE_DEVICE_MEMBER(DEVICE_SELF, et3400_state, segment_test_w) INPUT_PORTS_END @@ -203,6 +220,19 @@ static MACHINE_CONFIG_START( et3400 ) MCFG_RS232_PORT_ADD("rs232", default_rs232_devices, "terminal") MCFG_DEVICE_CARD_DEVICE_INPUT_DEFAULTS("terminal", terminal) + MCFG_DEVICE_ADD("displatch1", LS259, 0) // IC28 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<1>)) + MCFG_DEVICE_ADD("displatch2", LS259, 0) // IC27 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<2>)) + MCFG_DEVICE_ADD("displatch3", LS259, 0) // IC26 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<3>)) + MCFG_DEVICE_ADD("displatch4", LS259, 0) // IC25 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<4>)) + MCFG_DEVICE_ADD("displatch5", LS259, 0) // IC24 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<5>)) + MCFG_DEVICE_ADD("displatch6", LS259, 0) // IC23 + MCFG_ADDRESSABLE_LATCH_PARALLEL_OUT_CB(WRITE8(et3400_state, led_w<6>)) + MCFG_CASSETTE_ADD("cassette") MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED) MCFG_SPEAKER_STANDARD_MONO("mono") @@ -222,4 +252,4 @@ ROM_END /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */ -COMP( 1976, et3400, 0, 0, et3400, et3400, et3400_state, 0, "Heath Inc", "Heathkit ET-3400", 0 ) +COMP( 1976, et3400, 0, 0, et3400, et3400, et3400_state, 0, "Heath Company", "Heathkit Model ET-3400 Microprocessor Trainer", 0 )