mirror of
https://github.com/holub/mame
synced 2025-10-05 08:41:31 +03:00
z80sio: First stab at WRDY emulation; some logging improvements (nw)
This commit is contained in:
parent
b66a551f42
commit
5ad509e4b2
@ -679,7 +679,8 @@ void z80sio_channel::tra_complete()
|
||||
|
||||
// empty transmit buffer
|
||||
m_rr0 |= RR0_TX_BUFFER_EMPTY;
|
||||
|
||||
if ((m_wr1 & WR1_WRDY_ENABLE) && !(m_wr1 & WR1_WRDY_ON_RX_TX))
|
||||
set_ready(true);
|
||||
if (m_wr1 & WR1_TX_INT_ENABLE)
|
||||
m_uart->trigger_interrupt(m_index, INT_TRANSMIT);
|
||||
}
|
||||
@ -774,6 +775,20 @@ void z80sio_channel::update_rts()
|
||||
set_dtr((m_wr5 & WR5_DTR) ? 0 : 1);
|
||||
}
|
||||
|
||||
void z80sio_channel::set_ready(bool ready)
|
||||
{
|
||||
// WAIT mode not supported yet
|
||||
if (!(m_wr1 & WR1_WRDY_FUNCTION))
|
||||
return;
|
||||
|
||||
logerror("Channel %sready\n", ready ? "" : "not ");
|
||||
|
||||
if (m_index == z80sio_device::CHANNEL_A)
|
||||
m_uart->m_out_wrdya_cb(ready ? 0 : 1);
|
||||
else
|
||||
m_uart->m_out_wrdyb_cb(ready ? 0 : 1);
|
||||
}
|
||||
|
||||
//-------------------------------------------------
|
||||
// get_stop_bits - get number of stop bits
|
||||
//-------------------------------------------------
|
||||
@ -1094,6 +1109,16 @@ void z80sio_channel::do_sioreg_wr1(uint8_t data)
|
||||
LOG("Z80SIO \"%s\" Channel %c : Receiver Interrupt on All Characters\n", owner()->tag(), 'A' + m_index);
|
||||
break;
|
||||
}
|
||||
|
||||
if (data & WR1_WRDY_ENABLE)
|
||||
{
|
||||
if (data & WR1_WRDY_ON_RX_TX)
|
||||
set_ready((m_rr0 & RR0_RX_CHAR_AVAILABLE) != 0);
|
||||
else
|
||||
set_ready((m_rr0 & RR0_TX_BUFFER_EMPTY) != 0);
|
||||
}
|
||||
else
|
||||
set_ready(false);
|
||||
}
|
||||
|
||||
void z80sio_channel::do_sioreg_wr2(uint8_t data)
|
||||
@ -1206,14 +1231,17 @@ void z80sio_channel::data_write(uint8_t data)
|
||||
|
||||
// empty transmit buffer
|
||||
m_rr0 |= RR0_TX_BUFFER_EMPTY;
|
||||
|
||||
if ((m_wr1 & WR1_WRDY_ENABLE) && !(m_wr1 & WR1_WRDY_ON_RX_TX))
|
||||
set_ready(true);
|
||||
if (m_wr1 & WR1_TX_INT_ENABLE)
|
||||
m_uart->trigger_interrupt(m_index, INT_TRANSMIT);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGTX(" Transmitter %s, data byte dropped\n", m_wr5 & WR5_TX_ENABLE ? "not enabled" : "not emptied");
|
||||
LOGTX(" Transmitter not %s, data byte %02x pending\n", m_wr5 & WR5_TX_ENABLE ? "emptied" : "enabled", m_tx_data);
|
||||
m_rr0 &= ~RR0_TX_BUFFER_EMPTY;
|
||||
if ((m_wr1 & WR1_WRDY_ENABLE) && !(m_wr1 & WR1_WRDY_ON_RX_TX))
|
||||
set_ready(false);
|
||||
}
|
||||
|
||||
m_rr1 &= ~RR1_ALL_SENT;
|
||||
@ -1250,6 +1278,8 @@ void z80sio_channel::advance_rx_fifo()
|
||||
{
|
||||
// no more characters available in the FIFO
|
||||
m_rr0 &= ~RR0_RX_CHAR_AVAILABLE;
|
||||
if ((m_wr1 & WR1_WRDY_ENABLE) && (m_wr1 & WR1_WRDY_ON_RX_TX))
|
||||
set_ready(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1297,6 +1327,8 @@ void z80sio_channel::receive_data()
|
||||
}
|
||||
|
||||
m_rr0 |= RR0_RX_CHAR_AVAILABLE;
|
||||
if ((m_wr1 & WR1_WRDY_ENABLE) && (m_wr1 & WR1_WRDY_ON_RX_TX))
|
||||
set_ready(true);
|
||||
if (!m_rx_fifo_depth)
|
||||
m_rr1 |= uint8_t(rx_error);
|
||||
|
||||
@ -1471,7 +1503,6 @@ WRITE_LINE_MEMBER( z80sio_channel::rxc_w )
|
||||
if ((get_rx_word_length() + ((m_wr4 & WR4_PARITY_ENABLE) ? 1 : 0) + 1) == m_rx_bit)
|
||||
{
|
||||
// this is the stop bit - framing error adds a half bit period
|
||||
LOGBIT("%s() \"%s \"Channel %c Received Data Bit %d\n", FUNCNAME, owner()->tag(), 'A' + m_index, m_rxd);
|
||||
m_rx_count = m_rxd ? 0 : clocks;
|
||||
m_rx_bit = 0;
|
||||
|
||||
@ -1480,6 +1511,8 @@ WRITE_LINE_MEMBER( z80sio_channel::rxc_w )
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGBIT("%s() \"%s \"Channel %c Received Data Bit %d\n", FUNCNAME, owner()->tag(), 'A' + m_index, m_rxd);
|
||||
|
||||
// wait a whole bit period for the next bit
|
||||
m_rx_count = clocks;
|
||||
++m_rx_bit;
|
||||
|
@ -283,9 +283,9 @@ protected:
|
||||
WR1_RX_INT_FIRST = 0x08,
|
||||
WR1_RX_INT_ALL_PARITY = 0x10,
|
||||
WR1_RX_INT_ALL = 0x18,
|
||||
WR1_WRDY_ON_RX_TX = 0x20, // not supported
|
||||
WR1_WRDY_FUNCTION = 0x40, // not supported
|
||||
WR1_WRDY_ENABLE = 0x80 // not supported
|
||||
WR1_WRDY_ON_RX_TX = 0x20,
|
||||
WR1_WRDY_FUNCTION = 0x40, // WAIT not supported
|
||||
WR1_WRDY_ENABLE = 0x80
|
||||
};
|
||||
|
||||
enum
|
||||
@ -364,6 +364,7 @@ protected:
|
||||
void update_rts();
|
||||
void set_dtr(int state);
|
||||
void set_rts(int state);
|
||||
void set_ready(bool ready);
|
||||
|
||||
int get_clock_mode();
|
||||
stop_bits_t get_stop_bits();
|
||||
|
Loading…
Reference in New Issue
Block a user