diff --git a/src/emu/machine/i8251.c b/src/emu/machine/i8251.c index 3e2f3ff5163..8e8edc39164 100644 --- a/src/emu/machine/i8251.c +++ b/src/emu/machine/i8251.c @@ -172,13 +172,13 @@ void i8251_device::transmit_clock() else return; - /* transmit enable? */ + /* transmit enabled? */ if (m_command & (1<<0)) { - /* transmit register full? */ + /* do we have a character to send? */ if ((m_status & I8251_STATUS_TX_READY)==0) { - /* if transmit reg is empty */ + /* is diserial ready for it? */ if (is_transmit_register_empty()) { /* set it up */ @@ -193,18 +193,32 @@ void i8251_device::transmit_clock() } } - /* if transmit is not empty... transmit data */ + /* if diserial has bits to send, make them so */ if (!is_transmit_register_empty()) { UINT8 data = transmit_register_get_data_bit(); - // logerror("I8251\n"); - //transmit_register_send_bit(); + m_tx_busy = true; m_out_txd_func(data); m_connection_state &= ~TX; m_connection_state|=(data<<5); serial_connection_out(); } + + // is transmitter totally done? + if ((m_status & I8251_STATUS_TX_READY) && is_transmit_register_empty()) + { + m_tx_busy = false; + + if (m_disable_tx_pending) + { + LOG(("Applying pending disable\n")); + m_disable_tx_pending = false; + m_command &= ~(1<<0); + set_out_data_bit(1); + update_tx_ready(); + } + } } #if 0 @@ -325,6 +339,7 @@ void i8251_device::device_reset() m_data = 0; m_rxc = m_txc = 0; m_br_factor = 1; + m_tx_busy = m_disable_tx_pending = false; /* update tx empty pin output */ update_tx_empty(); @@ -584,10 +599,30 @@ WRITE8_MEMBER(i8251_device::control_w) if (data & (1<<0)) { LOG(("transmit enable\n")); + + /* if we get a tx enable with a disable pending, cancel the disable */ + m_disable_tx_pending = false; } else { - LOG(("transmit disable\n")); + if (m_tx_busy) + { + if (!m_disable_tx_pending) + { + LOG(("Tx busy, set pending disable\n")); + } + m_disable_tx_pending = true; + m_command |= (1<<0); + } + else + { + LOG(("transmit disable\n")); + if ((data & (1<<0))==0) + { + /* held in high state when transmit disable */ + set_out_data_bit(1); + } + } } @@ -630,12 +665,6 @@ WRITE8_MEMBER(i8251_device::control_w) m_connection_state |= DTR; } - if ((data & (1<<0))==0) - { - /* held in high state when transmit disable */ - set_out_data_bit(1); - } - /* refresh outputs */ serial_connection_out(); @@ -684,7 +713,7 @@ WRITE8_MEMBER(i8251_device::data_w) { m_data = data; - //logerror("write data: %02x\n",data); +// printf("i8251 transmit char: %02x\n",data); /* writing clears */ m_status &=~I8251_STATUS_TX_READY; @@ -705,7 +734,7 @@ WRITE8_MEMBER(i8251_device::data_w) void i8251_device::receive_character(UINT8 ch) { - //logerror("i8251 receive char: %02x\n",ch); +// printf("i8251 receive char: %02x\n",ch); m_data = ch; diff --git a/src/emu/machine/i8251.h b/src/emu/machine/i8251.h index 2cc953e9135..7213b27b922 100644 --- a/src/emu/machine/i8251.h +++ b/src/emu/machine/i8251.h @@ -129,6 +129,7 @@ private: /* data being received */ UINT8 m_data; + bool m_tx_busy, m_disable_tx_pending; }; // device type definition