diff options
Diffstat (limited to 'src/mame/drivers/microdec.cpp')
-rw-r--r-- | src/mame/drivers/microdec.cpp | 75 |
1 files changed, 44 insertions, 31 deletions
diff --git a/src/mame/drivers/microdec.cpp b/src/mame/drivers/microdec.cpp index d9c301d9ffd..09ce564d016 100644 --- a/src/mame/drivers/microdec.cpp +++ b/src/mame/drivers/microdec.cpp @@ -29,7 +29,9 @@ ToDo: #include "emu.h" #include "cpu/z80/z80.h" #include "machine/upd765.h" -#include "machine/terminal.h" +#include "machine/clock.h" +#include "machine/i8251.h" +#include "bus/rs232/rs232.h" #include "softlist.h" @@ -38,17 +40,15 @@ class microdec_state : public driver_device public: microdec_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) - , m_terminal(*this, "terminal") , m_maincpu(*this, "maincpu") + , m_uart1(*this, "uart1") + , m_uart2(*this, "uart2") , m_fdc(*this, "fdc") , m_floppy0(*this, "fdc:0") , m_floppy(nullptr) - { - } + { } - DECLARE_READ8_MEMBER(status_r); - DECLARE_READ8_MEMBER(keyin_r); - void kbd_put(u8 data); + DECLARE_WRITE_LINE_MEMBER(clock_tick); DECLARE_READ8_MEMBER(portf5_r); DECLARE_READ8_MEMBER(portf6_r); DECLARE_WRITE8_MEMBER(portf6_w); @@ -56,32 +56,21 @@ public: DECLARE_WRITE8_MEMBER(portf7_w); DECLARE_WRITE8_MEMBER(portf8_w); DECLARE_DRIVER_INIT(microdec); + private: - uint8_t m_term_data; uint8_t m_portf8; bool m_fdc_rdy; virtual void machine_reset() override; virtual void machine_start() override; - required_device<generic_terminal_device> m_terminal; required_device<cpu_device> m_maincpu; + required_device<i8251_device> m_uart1; + required_device<i8251_device> m_uart2; required_device<upd765a_device> m_fdc; required_device<floppy_connector> m_floppy0; floppy_image_device *m_floppy; }; -READ8_MEMBER( microdec_state::status_r ) -{ - return (m_term_data) ? 3 : 1; -} - -READ8_MEMBER( microdec_state::keyin_r ) -{ - uint8_t ret = m_term_data; - m_term_data = 0; - return ret; -} - /* d0-2 : motor on signals from f8 d3 : ack (cent) @@ -149,8 +138,10 @@ static ADDRESS_MAP_START(microdec_io, AS_IO, 8, microdec_state) AM_RANGE(0xf7, 0xf7) AM_READWRITE(portf7_r,portf7_w) AM_RANGE(0xf8, 0xf8) AM_WRITE(portf8_w) AM_RANGE(0xfa, 0xfb) AM_DEVICE("fdc", upd765a_device, map) - AM_RANGE(0xfc, 0xfc) AM_READ(keyin_r) AM_DEVWRITE("terminal", generic_terminal_device, write) - AM_RANGE(0xfd, 0xfd) AM_READ(status_r) + AM_RANGE(0xfc, 0xfc) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w) + AM_RANGE(0xfd, 0xfd) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w) + AM_RANGE(0xfe, 0xfe) AM_DEVREADWRITE("uart2", i8251_device, data_r, data_w) + AM_RANGE(0xff, 0xff) AM_DEVREADWRITE("uart2", i8251_device, status_r, control_w) // AM_RANGE(0xf0, 0xf3) 8253 PIT (md3 only) used as a baud rate generator for serial ports // AM_RANGE(0xf4, 0xf4) Centronics data // AM_RANGE(0xf5, 0xf5) motor check (md1/2) @@ -180,12 +171,6 @@ void microdec_state::machine_reset() membank("bankr0")->set_entry(1); // point at rom membank("bankw0")->set_entry(0); // always write to ram m_maincpu->set_input_line_vector(0, 0x7f); - m_term_data = 0; -} - -void microdec_state::kbd_put(u8 data) -{ - m_term_data = data; } static SLOT_INTERFACE_START( microdec_floppies ) @@ -201,6 +186,14 @@ DRIVER_INIT_MEMBER( microdec_state, microdec ) membank("bankw0")->configure_entry(0, &main[0x1000]); } +WRITE_LINE_MEMBER( microdec_state::clock_tick ) +{ + m_uart1->write_txc(state); + m_uart1->write_rxc(state); + m_uart2->write_txc(state); + m_uart2->write_rxc(state); +} + static MACHINE_CONFIG_START( microdec ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz) @@ -208,8 +201,28 @@ static MACHINE_CONFIG_START( microdec ) MCFG_CPU_IO_MAP(microdec_io) /* video hardware */ - MCFG_DEVICE_ADD("terminal", GENERIC_TERMINAL, 0) - MCFG_GENERIC_TERMINAL_KEYBOARD_CB(PUT(microdec_state, kbd_put)) + MCFG_DEVICE_ADD("uart_clock", CLOCK, 153600) + MCFG_CLOCK_SIGNAL_HANDLER(WRITELINE(microdec_state, clock_tick)) + + MCFG_DEVICE_ADD("uart1", I8251, 0) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232a", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232a", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232a", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232a", default_rs232_devices, "terminal") + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart1", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart1", i8251_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart1", i8251_device, write_cts)) + + MCFG_DEVICE_ADD("uart2", I8251, 0) + MCFG_I8251_TXD_HANDLER(DEVWRITELINE("rs232b", rs232_port_device, write_txd)) + MCFG_I8251_DTR_HANDLER(DEVWRITELINE("rs232b", rs232_port_device, write_dtr)) + MCFG_I8251_RTS_HANDLER(DEVWRITELINE("rs232b", rs232_port_device, write_rts)) + + MCFG_RS232_PORT_ADD("rs232b", default_rs232_devices, nullptr) + MCFG_RS232_RXD_HANDLER(DEVWRITELINE("uart2", i8251_device, write_rxd)) + MCFG_RS232_DSR_HANDLER(DEVWRITELINE("uart2", i8251_device, write_dsr)) + MCFG_RS232_CTS_HANDLER(DEVWRITELINE("uart2", i8251_device, write_cts)) MCFG_UPD765A_ADD("fdc", true, true) MCFG_UPD765_INTRQ_CALLBACK(INPUTLINE("maincpu", INPUT_LINE_IRQ0)) |