summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/machine/serial.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/machine/serial.c')
-rw-r--r--src/mess/machine/serial.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/src/mess/machine/serial.c b/src/mess/machine/serial.c
new file mode 100644
index 00000000000..123a988cd31
--- /dev/null
+++ b/src/mess/machine/serial.c
@@ -0,0 +1,136 @@
+#include "emu.h"
+#include "serial.h"
+
+const device_type SERIAL_PORT = &device_creator<serial_port_device>;
+
+device_serial_port_interface::device_serial_port_interface(const machine_config &mconfig, device_t &device)
+ : device_slot_card_interface(mconfig, device)
+{
+ m_rbit = FALSE;
+ m_tbit = FALSE;
+}
+
+device_serial_port_interface::~device_serial_port_interface()
+{
+}
+
+serial_port_device::serial_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, SERIAL_PORT, "Serial Port", tag, owner, clock),
+ device_slot_interface(mconfig, *this),
+ m_dev(NULL)
+{
+}
+
+serial_port_device::serial_port_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock)
+ : device_t(mconfig, type, name, tag, owner, clock),
+ device_slot_interface(mconfig, *this),
+ m_dev(NULL)
+{
+}
+
+serial_port_device::~serial_port_device()
+{
+}
+
+void serial_port_device::device_config_complete()
+{
+ const serial_port_interface *intf = reinterpret_cast<const serial_port_interface *>(static_config());
+ if (intf != NULL)
+ {
+ *static_cast<serial_port_interface *>(this) = *intf;
+ }
+ else
+ {
+ memset(&m_out_rx_cb, 0, sizeof(m_out_rx_cb));
+ }
+ m_dev = dynamic_cast<device_serial_port_interface *>(get_card_device());
+}
+
+void serial_port_device::device_start()
+{
+ m_out_rx_func.resolve(m_out_rx_cb, *this);
+}
+
+const device_type RS232_PORT = &device_creator<rs232_port_device>;
+
+device_rs232_port_interface::device_rs232_port_interface(const machine_config &mconfig, device_t &device)
+ : device_serial_port_interface(mconfig, device)
+{
+ m_dtr = FALSE;
+ m_rts = FALSE;
+ m_dcd = FALSE;
+ m_dsr = FALSE;
+ m_ri = FALSE;
+ m_cts = FALSE;
+}
+
+device_rs232_port_interface::~device_rs232_port_interface()
+{
+}
+
+rs232_port_device::rs232_port_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : serial_port_device(mconfig, RS232_PORT, "RS232 Port", tag, owner, clock)
+{
+}
+
+rs232_port_device::~rs232_port_device()
+{
+}
+
+void rs232_port_device::device_config_complete()
+{
+ const rs232_port_interface *intf = reinterpret_cast<const rs232_port_interface *>(static_config());
+ if (intf != NULL)
+ {
+ *static_cast<rs232_port_interface *>(this) = *intf;
+ memcpy(&(serial_port_interface::m_out_rx_cb), &(rs232_port_interface::m_out_rx_cb), sizeof(rs232_port_interface::m_out_rx_cb));
+ }
+ else
+ {
+ memset(&(serial_port_interface::m_out_rx_cb), 0, sizeof(serial_port_interface::m_out_rx_cb));
+ memset(&m_out_dcd_cb, 0, sizeof(m_out_dcd_cb));
+ memset(&m_out_dsr_cb, 0, sizeof(m_out_dsr_cb));
+ memset(&m_out_ri_cb, 0, sizeof(m_out_ri_cb));
+ memset(&m_out_cts_cb, 0, sizeof(m_out_cts_cb));
+ }
+ m_dev = dynamic_cast<device_rs232_port_interface *>(get_card_device());
+ serial_port_device::m_dev = dynamic_cast<device_serial_port_interface *>(get_card_device());
+ loopdtr = 0;
+ looprts = 0;
+}
+
+void rs232_port_device::device_start()
+{
+ serial_port_device::device_start();
+ m_out_dcd_func.resolve(m_out_dcd_cb, *this);
+ m_out_dsr_func.resolve(m_out_dsr_cb, *this);
+ m_out_ri_func.resolve(m_out_ri_cb, *this);
+ m_out_cts_func.resolve(m_out_cts_cb, *this);
+}
+
+// XXX:make loopback handshaking optional if needed
+WRITE_LINE_MEMBER( rs232_port_device::dtr_w )
+{
+ if(m_dev)
+ return m_dev->dtr_w(state);
+
+ if(serial_port_device::m_dev)
+ {
+ loopdtr = state;
+ out_dcd(state);
+ out_dsr(state);
+ }
+}
+
+WRITE_LINE_MEMBER( rs232_port_device::rts_w )
+{
+ if(m_dev)
+ return m_dev->rts_w(state);
+
+ if(serial_port_device::m_dev)
+ {
+ looprts = state;
+ out_cts(state);
+ }
+}
+