From 26d9b02c5ec14dcf7d89c202b7789f9b01301ff1 Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 17 Jan 2019 22:20:41 -0500 Subject: v100: Add RS232 ports (nw) --- src/mame/drivers/v100.cpp | 51 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/src/mame/drivers/v100.cpp b/src/mame/drivers/v100.cpp index 82f840cc00b..6a58c9d1a09 100644 --- a/src/mame/drivers/v100.cpp +++ b/src/mame/drivers/v100.cpp @@ -12,12 +12,14 @@ ***********************************************************************************************************************************/ #include "emu.h" +#include "bus/rs232/rs232.h" #include "cpu/z80/z80.h" #include "machine/com8116.h" #include "machine/er1400.h" #include "machine/i8214.h" #include "machine/i8251.h" #include "machine/i8255.h" +#include "machine/input_merger.h" #include "video/tms9927.h" #include "screen.h" @@ -35,6 +37,7 @@ public: , m_usart(*this, "usart%u", 1) , m_earom(*this, "earom") , m_picu(*this, "picu") + , m_modem(*this, "modem") , m_p_chargen(*this, "chargen") , m_videoram(*this, "videoram") , m_key_row(*this, "ROW%u", 0) @@ -43,7 +46,7 @@ public: void v100(machine_config &config); private: - DECLARE_READ8_MEMBER(earom_r); + u8 status_r(); DECLARE_WRITE8_MEMBER(port30_w); DECLARE_READ8_MEMBER(keyboard_r); DECLARE_WRITE8_MEMBER(key_row_w); @@ -51,7 +54,7 @@ private: DECLARE_WRITE8_MEMBER(picu_w); template DECLARE_WRITE_LINE_MEMBER(picu_r_w); IRQ_CALLBACK_MEMBER(irq_ack); - DECLARE_WRITE8_MEMBER(ppi_porta_w); + void ppi_porta_w(u8 data); u32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); @@ -66,16 +69,18 @@ private: required_device_array m_usart; required_device m_earom; required_device m_picu; + required_device m_modem; required_region_ptr m_p_chargen; required_shared_ptr m_videoram; optional_ioport_array<16> m_key_row; u8 m_active_row; + bool m_video_enable; }; u32 v100_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - if (m_vtac->screen_reset()) + if (m_vtac->screen_reset() || !m_video_enable) { bitmap.fill(rgb_t::black(), cliprect); return 0; @@ -145,17 +150,22 @@ void v100_state::machine_start() { m_picu->inte_w(1); m_picu->etlg_w(1); - - m_usart[0]->write_cts(0); m_usart[1]->write_cts(0); m_active_row = 0; + m_video_enable = false; save_item(NAME(m_active_row)); + save_item(NAME(m_video_enable)); } -READ8_MEMBER(v100_state::earom_r) +u8 v100_state::status_r() { - return m_earom->data_r(); + u8 status = 0xc0; + status |= m_earom->data_r(); + status |= m_modem->dcd_r() << 1; + status |= m_modem->si_r() << 2; // SCCD (pin 12) + status |= m_modem->ri_r() << 3; + return status; } WRITE8_MEMBER(v100_state::port30_w) @@ -198,11 +208,13 @@ IRQ_CALLBACK_MEMBER(v100_state::irq_ack) return (m_picu->a_r() << 1) | 0xf0; } -WRITE8_MEMBER(v100_state::ppi_porta_w) +void v100_state::ppi_porta_w(u8 data) { m_vtac->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0); m_screen->set_clock_scale(BIT(data, 5) ? 0.5 : 1.0); + m_video_enable = !BIT(data, 7); + //logerror("Writing %02X to PPI port A\n", data); } @@ -221,7 +233,7 @@ void v100_state::io_map(address_map &map) map(0x12, 0x13).rw("usart1", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x14, 0x15).rw("usart2", FUNC(i8251_device::read), FUNC(i8251_device::write)); map(0x16, 0x16).w("brg2", FUNC(com8116_device::stt_str_w)); - map(0x20, 0x20).r(FUNC(v100_state::earom_r)); + map(0x20, 0x20).r(FUNC(v100_state::status_r)); map(0x30, 0x30).w(FUNC(v100_state::port30_w)); map(0x40, 0x40).rw(FUNC(v100_state::keyboard_r), FUNC(v100_state::key_row_w)); map(0x48, 0x48).w(FUNC(v100_state::port48_w)); @@ -351,12 +363,22 @@ void v100_state::v100(machine_config &config) m_maincpu->set_irq_acknowledge_callback(FUNC(v100_state::irq_ack)); I8251(config, m_usart[0], 47.736_MHz_XTAL / 20); + m_usart[0]->txd_handler().set(m_modem, FUNC(rs232_port_device::write_txd)); + m_usart[0]->dtr_handler().set(m_modem, FUNC(rs232_port_device::write_dtr)); + m_usart[0]->rts_handler().set(m_modem, FUNC(rs232_port_device::write_rts)); + //m_usart[0]->rxrdy_handler().set(FUNC(v100_state::picu_r_w<4>)).invert(); + + input_merger_device &acts(INPUT_MERGER_ALL_HIGH(config, "acts")); + acts.output_handler().set(m_usart[0], FUNC(i8251_device::write_cts)); com8116_device &brg1(COM8116_020(config, "brg1", 1.8432_MHz_XTAL)); brg1.fr_handler().set(m_usart[0], FUNC(i8251_device::write_rxc)); brg1.ft_handler().set(m_usart[0], FUNC(i8251_device::write_txc)); I8251(config, m_usart[1], 47.736_MHz_XTAL / 20); + m_usart[1]->txd_handler().set("aux", FUNC(rs232_port_device::write_txd)); + m_usart[1]->dtr_handler().set("aux", FUNC(rs232_port_device::write_dtr)); + //m_usart[1]->txrdy_handler().set(FUNC(v100_state::picu_r_w<2>)).invert(); com8116_device &brg2(COM8116_020(config, "brg2", 1.8432_MHz_XTAL)); brg2.fr_handler().set(m_usart[1], FUNC(i8251_device::write_rxc)); @@ -383,8 +405,19 @@ void v100_state::v100(machine_config &config) ppi.out_pb_callback().append(m_earom, FUNC(er1400_device::c1_w)).bit(4).invert(); ppi.out_pc_callback().set(m_earom, FUNC(er1400_device::data_w)).bit(6).invert(); ppi.out_pc_callback().append(m_earom, FUNC(er1400_device::clock_w)).bit(0).invert(); + ppi.out_pc_callback().append(m_modem, FUNC(rs232_port_device::write_spds)).bit(4); + ppi.out_pc_callback().append("acts", FUNC(input_merger_device::in_w<1>)).bit(7); ER1400(config, m_earom); + + RS232_PORT(config, m_modem, default_rs232_devices, "loopback"); // EIA port + m_modem->rxd_handler().set(m_usart[0], FUNC(i8251_device::write_rxd)); + m_modem->cts_handler().set("acts", FUNC(input_merger_device::in_w<0>)); + m_modem->dcd_handler().set(m_usart[0], FUNC(i8251_device::write_dsr)); + + rs232_port_device &aux(RS232_PORT(config, "aux", default_rs232_devices, nullptr)); // optional printer port + aux.rxd_handler().set(m_usart[1], FUNC(i8251_device::write_rxd)); + aux.dcd_handler().set(m_usart[1], FUNC(i8251_device::write_dsr)); // printer busy } -- cgit v1.2.3