summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/bus/rs232/null_modem.c
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2014-04-16 07:53:39 +0000
committer smf- <smf-@users.noreply.github.com>2014-04-16 07:53:39 +0000
commit72d93bb509f7ba670c27850f58fe10ce09844a93 (patch)
tree37a23297e60928c97d312f4fedc800582b5cb98f /src/emu/bus/rs232/null_modem.c
parent0bd507725175d4694f4e201ebf573e6f28703aae (diff)
Added serial printer, renamed centronics printer to match. Standardised the configuration of rs232 devices. All serial devices are now connected using an rs232 port. [smf]
Diffstat (limited to 'src/emu/bus/rs232/null_modem.c')
-rw-r--r--src/emu/bus/rs232/null_modem.c126
1 files changed, 116 insertions, 10 deletions
diff --git a/src/emu/bus/rs232/null_modem.c b/src/emu/bus/rs232/null_modem.c
index ed67584a106..ea8dfb1c79f 100644
--- a/src/emu/bus/rs232/null_modem.c
+++ b/src/emu/bus/rs232/null_modem.c
@@ -1,23 +1,129 @@
#include "null_modem.h"
-const device_type NULL_MODEM = &device_creator<null_modem_device>;
-
null_modem_device::null_modem_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
: device_t(mconfig, NULL_MODEM, "Null Modem", tag, owner, clock, "null_modem", __FILE__),
+ device_serial_interface(mconfig, *this),
device_rs232_port_interface(mconfig, *this),
- m_bitbanger(*this, "bitbanger")
+ m_stream(*this, "stream"),
+ m_rs232_txbaud(*this, "RS232_TXBAUD"),
+ m_rs232_rxbaud(*this, "RS232_RXBAUD"),
+ m_rs232_startbits(*this, "RS232_STARTBITS"),
+ m_rs232_databits(*this, "RS232_DATABITS"),
+ m_rs232_parity(*this, "RS232_PARITY"),
+ m_rs232_stopbits(*this, "RS232_STOPBITS"),
+ m_input_count(0),
+ m_input_index(0)
{
}
-static MACHINE_CONFIG_FRAGMENT(null_modem_config)
- MCFG_DEVICE_ADD("bitbanger", BITBANGER, 0)
- MCFG_BITBANGER_INPUT_CB(WRITELINE(null_modem_device, read)) /* callback */
- MCFG_BITBANGER_DEFAULT_MODE(BITBANGER_MODEM) /* default mode */
- MCFG_BITBANGER_DEFAULT_BAUD(BITBANGER_9600) /* default output baud */
- MCFG_BITBANGER_DEFAULT_TUNE(BITBANGER_0PERCENT) /* default fine tune adjustment */
+static MACHINE_CONFIG_FRAGMENT(null_modem)
+ MCFG_DEVICE_ADD("stream", BITBANGER, 0)
MACHINE_CONFIG_END
machine_config_constructor null_modem_device::device_mconfig_additions() const
{
- return MACHINE_CONFIG_NAME(null_modem_config);
+ return MACHINE_CONFIG_NAME(null_modem);
+}
+
+static INPUT_PORTS_START(null_modem)
+ MCFG_RS232_BAUD("RS232_TXBAUD", RS232_BAUD_9600, "TX Baud", null_modem_device, update_serial)
+ MCFG_RS232_BAUD("RS232_RXBAUD", RS232_BAUD_9600, "RX Baud", null_modem_device, update_serial)
+ MCFG_RS232_STARTBITS("RS232_STARTBITS", RS232_STARTBITS_1, "Start Bits", null_modem_device, update_serial)
+ MCFG_RS232_DATABITS("RS232_DATABITS", RS232_DATABITS_8, "Data Bits", null_modem_device, update_serial)
+ MCFG_RS232_PARITY("RS232_PARITY", RS232_PARITY_NONE, "Parity", null_modem_device, update_serial)
+ MCFG_RS232_STOPBITS("RS232_STOPBITS", RS232_STOPBITS_1, "Stop Bits", null_modem_device, update_serial)
+INPUT_PORTS_END
+
+ioport_constructor null_modem_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME(null_modem);
+}
+
+void null_modem_device::device_start()
+{
+ m_timer_poll = timer_alloc(TIMER_POLL);
+}
+
+WRITE_LINE_MEMBER(null_modem_device::update_serial)
+{
+ int startbits = convert_startbits(m_rs232_startbits->read());
+ int databits = convert_databits(m_rs232_databits->read());
+ parity_t parity = convert_parity(m_rs232_parity->read());
+ stop_bits_t stopbits = convert_stopbits(m_rs232_stopbits->read());
+
+ set_data_frame(startbits, databits, parity, stopbits);
+
+ int txbaud = convert_baud(m_rs232_txbaud->read());
+ set_tra_rate(txbaud);
+
+ int rxbaud = convert_baud(m_rs232_rxbaud->read());
+ set_rcv_rate(rxbaud);
+
+ output_rxd(1);
+
+ // TODO: make this configurable
+ output_dcd(0);
+ output_dsr(0);
+ output_cts(0);
+}
+
+void null_modem_device::device_reset()
+{
+ update_serial(0);
+ queue();
}
+
+void null_modem_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
+{
+ switch (id)
+ {
+ case TIMER_POLL:
+ queue();
+ break;
+
+ default:
+ device_serial_interface::device_timer(timer, id, param, ptr);
+ }
+}
+
+void null_modem_device::queue()
+{
+ if (is_transmit_register_empty())
+ {
+ if (m_input_index == m_input_count)
+ {
+ m_input_index = 0;
+ m_input_count = m_stream->input(m_input_buffer, sizeof(m_input_buffer));
+ }
+
+ if (m_input_count != 0)
+ {
+ transmit_register_setup(m_input_buffer[m_input_index++]);
+
+ m_timer_poll->adjust(attotime::never);
+ }
+ else
+ {
+ int txbaud = convert_baud(m_rs232_txbaud->read());
+ m_timer_poll->adjust(attotime::from_hz(txbaud));
+ }
+ }
+}
+
+void null_modem_device::tra_callback()
+{
+ output_rxd(transmit_register_get_data_bit());
+}
+
+void null_modem_device::tra_complete()
+{
+ queue();
+}
+
+void null_modem_device::rcv_complete()
+{
+ receive_register_extract();
+ m_stream->output(get_received_char());
+}
+
+const device_type NULL_MODEM = &device_creator<null_modem_device>;