diff options
Diffstat (limited to 'src/emu/dipty.c')
-rw-r--r-- | src/emu/dipty.c | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/emu/dipty.c b/src/emu/dipty.c new file mode 100644 index 00000000000..1d188f95d0a --- /dev/null +++ b/src/emu/dipty.c @@ -0,0 +1,85 @@ +// license:BSD-3-Clause +// copyright-holders:F.Ulivi +/*************************************************************************** + + dipty.h + + Device PTY interface + +***************************************************************************/ + +#include "emu.h" +#include "osdcore.h" + +device_pty_interface::device_pty_interface(const machine_config &mconfig, device_t &device) + : device_interface(device, "pty"), + m_pty_master(NULL), + m_slave_name(), + m_opened(false) +{ +} + +device_pty_interface::~device_pty_interface() +{ +} + +bool device_pty_interface::open(void) +{ + if (!m_opened) { + char buffer[ 128 ]; + + if (osd_openpty(&m_pty_master , buffer , sizeof(buffer)) == FILERR_NONE) { + m_opened = true; + m_slave_name.assign(buffer); + } else { + m_opened = false; + m_pty_master = NULL; + } + } + + return m_opened; +} + +void device_pty_interface::close(void) +{ + if (m_opened) { + osd_close(m_pty_master); + m_opened = false; + } +} + +bool device_pty_interface::is_open(void) const +{ + return m_opened; +} + +ssize_t device_pty_interface::read(UINT8 *rx_chars , size_t count) +{ + UINT32 actual_bytes; + + if (m_opened && osd_read(m_pty_master, rx_chars, 0, count, &actual_bytes) == FILERR_NONE) { + return actual_bytes; + } else { + return -1; + } +} + +void device_pty_interface::write(UINT8 tx_char) +{ + UINT32 actual_bytes; + + if (m_opened) { + osd_write(m_pty_master, &tx_char, 0, 1, &actual_bytes); + } +} + +bool device_pty_interface::is_slave_connected(void) const +{ + // TODO: really check for slave status + return m_opened; +} + +const char *device_pty_interface::slave_name(void) const +{ + return m_slave_name.c_str(); +} |