preliminary receiving serial support for MC68901 [smf]

This commit is contained in:
smf- 2013-12-28 01:46:52 +00:00
parent 029b781ead
commit e9b8110811
2 changed files with 25 additions and 33 deletions

View File

@ -409,6 +409,8 @@ void mc68901_device::device_start()
save_item(NAME(m_tsr));
save_item(NAME(m_udr));
save_item(NAME(m_udr_written));
save_item(NAME(m_rcv));
save_item(NAME(m_rcv_pending));
save_item(NAME(m_rxtx_word));
save_item(NAME(m_rxtx_start));
save_item(NAME(m_rxtx_stop));
@ -455,6 +457,7 @@ void mc68901_device::device_reset()
register_w(REGISTER_RSR, 0);
transmit_register_reset();
receive_register_reset();
}
@ -497,6 +500,16 @@ void mc68901_device::tra_complete()
transmit_register_setup(m_udr);
m_udr_written = 0;
m_tsr |= TSR_BUFFER_EMPTY;
if (m_ier & IR_XMIT_BUFFER_EMPTY)
{
take_interrupt(IR_XMIT_BUFFER_EMPTY);
}
}
else
{
m_tsr |= TSR_UNDERRUN_ERROR;
// TODO: transmit error?
}
}
else
@ -506,22 +519,18 @@ void mc68901_device::tra_complete()
}
//-------------------------------------------------
// rcv_callback -
//-------------------------------------------------
void mc68901_device::rcv_callback()
{
receive_register_update_bit(get_in_data_bit());
}
//-------------------------------------------------
// rcv_complete -
//-------------------------------------------------
void mc68901_device::rcv_complete()
{
receive_register_extract();
m_rcv = get_received_char();
//if (m_rcv_pending) TODO: error?
m_rcv_pending = 1;
rx_buffer_full();
}
@ -570,9 +579,7 @@ READ8_MEMBER( mc68901_device::read )
case REGISTER_SCR: return m_scr;
case REGISTER_UCR: return m_ucr;
case REGISTER_RSR:
m_rsr_read = 1;
return m_rsr;
case REGISTER_RSR: return m_rsr;
case REGISTER_TSR:
{
@ -584,17 +591,8 @@ READ8_MEMBER( mc68901_device::read )
}
case REGISTER_UDR:
/* load RSR with latched value */
m_rsr = (m_next_rsr & 0x7c) | (m_rsr & 0x03);
m_next_rsr = 0;
if (m_rsr & 0x78)
{
/* signal receiver error interrupt */
rx_error();
}
return m_udr;
m_rcv_pending = 0;
return m_rcv;
default: return 0;
}
@ -1135,14 +1133,7 @@ WRITE_LINE_MEMBER( mc68901_device::tbi_w )
WRITE_LINE_MEMBER(mc68901_device::write_rx)
{
if (state)
{
input_callback(m_input_state | RX);
}
else
{
input_callback(m_input_state & ~RX);
}
device_serial_interface::rx_w(state);
}
WRITE_LINE_MEMBER(mc68901_device::write_dsr)

View File

@ -134,7 +134,6 @@ protected:
// device_serial_interface overrides
virtual void tra_callback();
virtual void tra_complete();
virtual void rcv_callback();
virtual void rcv_complete();
virtual void input_callback(UINT8 state);
@ -271,6 +270,8 @@ private:
UINT8 m_rsr; /* receiver status register */
UINT8 m_udr; /* USART data register */
int m_udr_written;
UINT8 m_rcv;
int m_rcv_pending;
/* counter timer state */
UINT8 m_tmc[4]; /* timer main counters */