summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/microdec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/microdec.cpp')
-rw-r--r--src/mame/drivers/microdec.cpp75
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))