void wangpc_keyboard_device::device_reset() { receive_register_reset(); transmit_register_reset(); m_txd_handler(1); }
void mos6551_device::tra_callback() { if (m_txd_handler.isnull()) transmit_register_send_bit(); else m_txd_handler(transmit_register_get_data_bit()); }
void ym3802_device::transmit_clk() { if(m_reg[REG_TCR] & 0x01) // Tx Enable { if(!m_tx_fifo.empty()) { if (is_transmit_register_empty()) { transmit_register_setup(m_tx_fifo.front()); // start to send first byte in FIFO m_tx_fifo.pop(); // and remove it from the FIFO if(m_tx_fifo.empty()) set_irq(IRQ_FIFOTX_EMPTY); } } /* if diserial has bits to send, make them so */ if (!is_transmit_register_empty()) { uint8_t data = transmit_register_get_data_bit(); m_tx_busy = true; m_txd_handler(data); } if (m_tx_fifo.empty() && is_transmit_register_empty()) m_tx_busy = false; } }
void wangpc_keyboard_device::tra_callback() { int bit = transmit_register_get_data_bit(); if (LOG) logerror("KB '%s' Transmit Bit %u\n", tag(), bit); m_txd_handler(transmit_register_get_data_bit()); }
void i8251_device::update_tx_empty() { if (m_status & I8251_STATUS_TX_EMPTY) { /* tx is in marking state (high) when tx empty! */ m_txd_handler(1); } m_txempty_handler((m_status & I8251_STATUS_TX_EMPTY) != 0); }
void i8251_device::transmit_clock() { m_txc_count++; if (m_txc_count != m_br_factor) return; m_txc_count = 0; if (is_transmit_register_empty()) { if ((m_status & I8251_STATUS_TX_READY) == 0 && (is_tx_enabled() || (m_flags & I8251_DELAYED_TX_EN) != 0)) start_tx(); else m_status |= I8251_STATUS_TX_EMPTY; update_tx_ready(); update_tx_empty(); } /* if diserial has bits to send, make them so */ if (!is_transmit_register_empty()) { uint8_t data = transmit_register_get_data_bit(); m_txd_handler(data); } #if 0 /* hunt mode? */ /* after each bit has been shifted in, it is compared against the current sync byte */ if (BIT(m_command, 7)) { /* data matches sync byte? */ if (m_data == m_sync_bytes[m_sync_byte_offset]) { /* sync byte matches */ /* update for next sync byte? */ m_sync_byte_offset++; /* do all sync bytes match? */ if (m_sync_byte_offset == m_sync_byte_count) { /* ent hunt mode */ m_command &= ~(1<<7); } } else { /* if there is no match, reset */ m_sync_byte_offset = 0; } } #endif }
void i8251_device::device_reset() { LOG("I8251: Reset\n"); /* what is the default setup when the 8251 has been reset??? */ /* i8251 datasheet explains the state of tx pin at reset */ /* tx is set to 1 */ m_txd_handler(1); /* assumption */ m_rts_handler(1); m_dtr_handler(1); transmit_register_reset(); receive_register_reset(); m_flags = 0; /* expecting mode byte */ m_flags |= I8251_EXPECTING_MODE; /* not expecting a sync byte */ m_flags &= ~I8251_EXPECTING_SYNC_BYTE; /* no character to read by cpu */ /* transmitter is ready and is empty */ m_status = I8251_STATUS_TX_EMPTY | I8251_STATUS_TX_READY; m_mode_byte = 0; m_command = 0; m_rx_data = 0; m_tx_data = 0; m_rxc_count = m_txc_count = 0; m_br_factor = 1; /* update tx empty pin output */ update_tx_empty(); /* update rx ready pin output */ update_rx_ready(); /* update tx ready pin output */ update_tx_ready(); }
void psxsio_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) { verboselog( *this, 2, "sio tick\n" ); if( m_tx_bits == 0 && ( m_control & SIO_CONTROL_TX_ENA ) != 0 && ( m_status & SIO_STATUS_TX_EMPTY ) == 0 ) { m_tx_bits = 8; m_tx_shift = m_tx_data; if( type() == PSX_SIO0 ) { m_rx_bits = 8; m_rx_shift = 0; } m_status |= SIO_STATUS_TX_EMPTY; m_status |= SIO_STATUS_TX_RDY; } if( m_tx_bits != 0 ) { if( type() == PSX_SIO0 ) { m_sck_handler(0); } m_txd_handler( m_tx_shift & 1 ); m_tx_shift >>= 1; m_tx_bits--; if( type() == PSX_SIO0 ) { m_sck_handler(1); } if( m_tx_bits == 0 && ( m_control & SIO_CONTROL_TX_IENA ) != 0 ) { sio_interrupt(); } } if( m_rx_bits != 0 ) { m_rx_shift = ( m_rx_shift >> 1 ) | ( m_rxd << 7 ); m_rx_bits--; if( m_rx_bits == 0 ) { if( ( m_status & SIO_STATUS_RX_RDY ) != 0 ) { m_status |= SIO_STATUS_OVERRUN; } else { m_rx_data = m_rx_shift; m_status |= SIO_STATUS_RX_RDY; } if( ( m_control & SIO_CONTROL_RX_IENA ) != 0 ) { sio_interrupt(); } } }
void i8251_device::transmit_clock() { m_txc_count++; if (m_txc_count == m_br_factor) m_txc_count = 0; else return; /* transmit enabled? */ if (m_command & (1<<0)) { /* do we have a character to send? */ if ((m_status & I8251_STATUS_TX_READY)==0) { /* is diserial ready for it? */ if (is_transmit_register_empty()) { /* set it up */ transmit_register_setup(m_data); /* i8251 transmit reg now empty */ m_status |=I8251_STATUS_TX_EMPTY; /* ready for next transmit */ m_status |=I8251_STATUS_TX_READY; update_tx_empty(); update_tx_ready(); } } /* if diserial has bits to send, make them so */ if (!is_transmit_register_empty()) { UINT8 data = transmit_register_get_data_bit(); m_tx_busy = true; m_txd_handler(data); } // 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); m_txd_handler(1); update_tx_ready(); } } } #if 0 /* hunt mode? */ /* after each bit has been shifted in, it is compared against the current sync byte */ if (m_command & (1<<7)) { /* data matches sync byte? */ if (m_data == m_sync_bytes[m_sync_byte_offset]) { /* sync byte matches */ /* update for next sync byte? */ m_sync_byte_offset++; /* do all sync bytes match? */ if (m_sync_byte_offset == m_sync_byte_count) { /* ent hunt mode */ m_command &=~(1<<7); } } else { /* if there is no match, reset */ m_sync_byte_offset = 0; } } #endif }