summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author smf- <smf-@users.noreply.github.com>2013-12-22 19:01:57 +0000
committer smf- <smf-@users.noreply.github.com>2013-12-22 19:01:57 +0000
commit2279ff026a565b7802566a7dc7d33c883424b00c (patch)
tree576a251c17c812e95d604f1502fd2841de1cf05b
parent6c3f17c5956faefd2f1dc026468db2da03eee2bc (diff)
replaced read rx callback in MC68901 with a write handler, which allows multiple chips to be connected together without using glue methods. Removed a load of unused code from MC68901, probably left over when it was converted to use diserial. [smf]
-rw-r--r--src/emu/machine/mc68901.c363
-rw-r--r--src/emu/machine/mc68901.h14
-rw-r--r--src/mame/drivers/micro3d.c5
-rw-r--r--src/mess/drivers/atarist.c13
-rw-r--r--src/mess/drivers/x68k.c1
5 files changed, 40 insertions, 356 deletions
diff --git a/src/emu/machine/mc68901.c b/src/emu/machine/mc68901.c
index c9e8e28841d..065fde94dc7 100644
--- a/src/emu/machine/mc68901.c
+++ b/src/emu/machine/mc68901.c
@@ -176,9 +176,6 @@ const int mc68901_device::GPIO_TIMER[] =
const int mc68901_device::PRESCALER[] = { 0, 4, 10, 16, 50, 64, 100, 200 };
-#define TXD(_data) m_out_so_func(_data);
-
-
//**************************************************************************
// INLINE HELPERS
//**************************************************************************
@@ -222,336 +219,6 @@ inline void mc68901_device::rx_error()
}
}
-inline void mc68901_device::tx_buffer_empty()
-{
- if (m_ier & IR_XMIT_BUFFER_EMPTY)
- {
- take_interrupt(IR_XMIT_BUFFER_EMPTY);
- }
-}
-
-inline void mc68901_device::tx_error()
-{
- if (m_ier & IR_XMIT_ERROR)
- {
- take_interrupt(IR_XMIT_ERROR);
- }
- else
- {
- tx_buffer_empty();
- }
-}
-
-inline int mc68901_device::get_parity_bit(UINT8 b)
-{
- b ^= b >> 4;
- b ^= b >> 2;
- b ^= b >> 1;
- return b & 1;
-}
-
-inline void mc68901_device::serial_receive()
-{
- int rxd;
-
- if (!(m_rsr & RSR_RCV_ENABLE)) return;
-
- rxd = m_in_si_func();
-
- switch (m_rx_state)
- {
- case SERIAL_START:
- if (!rxd)
- {
- m_rsr |= RSR_CHAR_IN_PROGRESS;
- m_rx_bits = 0;
- m_rx_buffer = 0;
- m_rx_state = SERIAL_DATA;
- m_next_rsr = RSR_BREAK;
- }
- break;
-
- case SERIAL_DATA:
- if ((m_next_rsr & RSR_BREAK) && (rxd == 1) && m_rsr_read)
- {
- m_next_rsr &= ~RSR_BREAK;
- }
-
- m_rx_buffer >>= 1;
- m_rx_buffer |= (rxd << 7);
- m_rx_bits++;
-
- if (m_rx_bits == m_rxtx_word)
- {
- if (m_rxtx_word < 8)
- {
- m_rx_buffer >>= (8 - m_rxtx_word);
- }
-
- m_rsr &= ~RSR_CHAR_IN_PROGRESS;
-
- if (m_ucr & UCR_PARITY_ENABLED)
- {
- m_rx_state = SERIAL_PARITY;
- }
- else
- {
- m_rx_state = SERIAL_STOP;
- }
- }
- break;
-
- case SERIAL_PARITY:
- m_rx_parity = rxd;
-
- if (m_rx_parity != (get_parity_bit(m_rx_buffer) ^ ((m_ucr & UCR_PARITY_EVEN) >> 1)))
- {
- m_next_rsr |= RSR_PARITY_ERROR;
- }
-
- m_rx_state = SERIAL_STOP;
- break;
-
- case SERIAL_STOP:
- if (rxd == 1)
- {
- if (!((m_rsr & RSR_SYNC_STRIP_ENABLE) && (m_rx_buffer == m_scr)))
- {
- if (!(m_rsr & RSR_OVERRUN_ERROR))
- {
- if (m_rsr & RSR_BUFFER_FULL)
- {
- // incoming word received but last word in receive buffer has not been read
- m_next_rsr |= RSR_OVERRUN_ERROR;
- }
- else
- {
- // incoming word received and receive buffer is empty
- m_rsr |= RSR_BUFFER_FULL;
- m_udr = m_rx_buffer;
- rx_buffer_full();
- }
- }
- }
- }
- else
- {
- if (m_rx_buffer)
- {
- // non-zero data word not followed by a stop bit
- m_next_rsr |= RSR_FRAME_ERROR;
- }
- }
-
- m_rx_state = SERIAL_START;
- break;
- }
-}
-
-
-inline void mc68901_device::tx_disabled()
-{
- switch (m_tsr & TSR_OUTPUT_MASK)
- {
- case TSR_OUTPUT_HI_Z:
- /* indeterminate state */
- case TSR_OUTPUT_LOW:
- TXD(0);
- break;
-
- case TSR_OUTPUT_HIGH:
- case TSR_OUTPUT_LOOP:
- TXD(1);
- break;
- }
-}
-
-
-inline void mc68901_device::tx_starting()
-{
- if (m_tsr & TSR_XMIT_ENABLE)
- {
- /* enable transmitter */
- TXD(1);
- m_xmit_state = XMIT_ON;
- }
- else
- {
- /* disable transmitter */
- m_tsr |= TSR_END_OF_XMIT;
- m_xmit_state = XMIT_OFF;
- }
-}
-
-
-inline void mc68901_device::tx_break()
-{
- if (m_tsr & TSR_XMIT_ENABLE)
- {
- if (m_tsr & TSR_BREAK)
- {
- /* transmit break */
- TXD(1);
- }
- else
- {
- /* enable transmitter */
- m_xmit_state = XMIT_ON;
- }
- }
- else
- {
- /* disable transmitter */
- m_tsr |= TSR_END_OF_XMIT;
- m_xmit_state = XMIT_OFF;
- }
-}
-
-
-inline void mc68901_device::tx_enabled()
-{
- switch (m_tx_state)
- {
- case SERIAL_START:
- if (m_tsr & TSR_UNDERRUN_ERROR)
- {
- /* buffer underrun condition */
- if (m_tsr & TSR_XMIT_ENABLE)
- {
- /* transmit break */
- TXD(1);
- }
- else
- {
- /* transmitter disabled */
- tx_disabled();
- }
- }
- else
- {
- if (m_tsr & TSR_BUFFER_EMPTY)
- {
- /* transmit buffer is empty, signal underrun error */
- m_tsr |= TSR_UNDERRUN_ERROR;
-
- if (m_tsr & TSR_XMIT_ENABLE)
- {
- /* transmit break */
- TXD(1);
- }
- else
- {
- /* transmitter disabled */
- tx_disabled();
- }
- }
- else
- {
- /* transmit start bit */
- TXD(0);
-
- /* load transmit buffer */
- m_tx_buffer = m_udr;
- m_tx_bits = 0;
-
- /* signal transmit buffer empty */
- m_tsr |= TSR_BUFFER_EMPTY;
- tx_buffer_empty();
-
- /* calculate parity */
- m_tx_parity = get_parity_bit(m_tx_buffer);
-
- /* next bit is data */
- m_tx_state = SERIAL_DATA;
- }
- }
- break;
-
- case SERIAL_DATA:
- /* transmit data bit */
- TXD(m_tx_buffer & 0x01);
-
- /* shift transmit buffer */
- m_tx_buffer >>= 1;
- m_tx_bits++;
-
- if (m_tx_bits == m_rxtx_word)
- {
- /* all data bits transferred */
- if (m_ucr & UCR_PARITY_ENABLED)
- {
- /* next bit is parity */
- m_tx_state = SERIAL_PARITY;
- }
- else
- {
- /* next bit is stop */
- m_tx_state = SERIAL_STOP;
- }
- }
- break;
-
- case SERIAL_PARITY:
- if (m_rxtx_word < 8)
- {
- /* transmit user-defined parity bit from buffer */
- TXD(m_tx_buffer & 0x01);
- }
- else
- {
- /* transmit calculated parity bit */
- TXD(m_tx_parity ^ ((m_ucr & UCR_PARITY_EVEN) >> 1));
- }
-
- /* next bit is stop */
- m_tx_state = SERIAL_STOP;
- break;
-
- case SERIAL_STOP:
- /* transmit stop bit */
- TXD(1);
-
- if (m_tsr & TSR_XMIT_ENABLE)
- {
- /* next bit is start */
- m_tx_state = SERIAL_START;
- }
- else
- {
- if (m_tsr & TSR_AUTO_TURNAROUND)
- {
- /* enable transmitter */
- m_tsr |= TSR_XMIT_ENABLE;
-
- /* next bit is start */
- m_tx_state = SERIAL_START;
- }
- else
- {
- /* disable transmitter */
- m_xmit_state = XMIT_OFF;
- m_tsr |= TSR_END_OF_XMIT;
-
- /* signal transmit error */
- tx_error();
- }
- }
- break;
- }
-}
-
-inline void mc68901_device::serial_transmit()
-{
- switch (m_xmit_state)
- {
- case XMIT_OFF: tx_disabled(); break;
- case XMIT_STARTING: tx_starting(); break;
- case XMIT_BREAK: tx_break(); break;
- case XMIT_ON: tx_enabled(); break;
- }
-}
-
-
inline void mc68901_device::timer_count(int index)
{
if (m_tmc[index] == 0x01)
@@ -691,7 +358,6 @@ void mc68901_device::device_start()
/* resolve callbacks */
m_in_gpio_func.resolve(m_in_gpio_cb, *this);
m_out_gpio_func.resolve(m_out_gpio_cb, *this);
- m_in_si_func.resolve(m_in_si_cb, *this);
m_out_so_func.resolve(m_out_so_cb, *this);
m_out_tao_func.resolve(m_out_tao_cb, *this);
m_out_tbo_func.resolve(m_out_tbo_cb, *this);
@@ -835,10 +501,7 @@ void mc68901_device::tra_complete()
void mc68901_device::rcv_callback()
{
- if (m_in_si_func.isnull())
- receive_register_update_bit(get_in_data_bit());
- else
- receive_register_update_bit(m_in_si_func());
+ receive_register_update_bit(get_in_data_bit());
}
@@ -1439,3 +1102,27 @@ WRITE_LINE_MEMBER( mc68901_device::tbi_w )
{
timer_input(TIMER_B, state);
}
+
+WRITE_LINE_MEMBER(mc68901_device::write_rx)
+{
+ if (state)
+ {
+ input_callback(m_input_state | RX);
+ }
+ else
+ {
+ input_callback(m_input_state & ~RX);
+ }
+}
+
+WRITE_LINE_MEMBER(mc68901_device::write_dsr)
+{
+ if (state)
+ {
+ input_callback(m_input_state | DSR);
+ }
+ else
+ {
+ input_callback(m_input_state & ~DSR);
+ }
+}
diff --git a/src/emu/machine/mc68901.h b/src/emu/machine/mc68901.h
index d203275a2f3..afc9f7c92f0 100644
--- a/src/emu/machine/mc68901.h
+++ b/src/emu/machine/mc68901.h
@@ -87,7 +87,6 @@ struct mc68901_interface
devcb_write_line m_out_tco_cb;
devcb_write_line m_out_tdo_cb;
- devcb_read_line m_in_si_cb;
devcb_write_line m_out_so_cb;
devcb_write_line m_out_rr_cb;
devcb_write_line m_out_tr_cb;
@@ -122,6 +121,9 @@ public:
DECLARE_WRITE_LINE_MEMBER( tai_w );
DECLARE_WRITE_LINE_MEMBER( tbi_w );
+ DECLARE_WRITE_LINE_MEMBER( write_rx );
+ DECLARE_WRITE_LINE_MEMBER( write_dsr );
+
protected:
// device-level overrides
virtual void device_config_complete();
@@ -140,15 +142,6 @@ protected:
void take_interrupt(UINT16 mask);
void rx_buffer_full();
void rx_error();
- void tx_buffer_empty();
- void tx_error();
- int get_parity_bit(UINT8 b);
- void serial_receive();
- void tx_disabled();
- void tx_starting();
- void tx_break();
- void tx_enabled();
- void serial_transmit();
void timer_count(int index);
void timer_input(int index, int value);
void gpio_input(int bit, int state);
@@ -247,7 +240,6 @@ private:
devcb_resolved_read8 m_in_gpio_func;
devcb_resolved_write8 m_out_gpio_func;
- devcb_resolved_read_line m_in_si_func;
devcb_resolved_write_line m_out_so_func;
devcb_resolved_write_line m_out_tao_func;
devcb_resolved_write_line m_out_tbo_func;
diff --git a/src/mame/drivers/micro3d.c b/src/mame/drivers/micro3d.c
index 7b2c4dec722..df402f001fd 100644
--- a/src/mame/drivers/micro3d.c
+++ b/src/mame/drivers/micro3d.c
@@ -319,8 +319,9 @@ static MC68901_INTERFACE( mfp_intf )
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_NULL, /* TDO */
- DEVCB_NULL, /* serial input */
- DEVCB_NULL /* serial output */
+ DEVCB_NULL, /* serial output */
+ DEVCB_NULL,
+ DEVCB_NULL
};
diff --git a/src/mess/drivers/atarist.c b/src/mess/drivers/atarist.c
index 1149df400a4..408fc97cb03 100644
--- a/src/mess/drivers/atarist.c
+++ b/src/mess/drivers/atarist.c
@@ -1946,7 +1946,6 @@ static MC68901_INTERFACE( mfp_intf )
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
- DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx)
};
@@ -2013,7 +2012,6 @@ static MC68901_INTERFACE( atariste_mfp_intf )
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
- DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx)
};
@@ -2079,7 +2077,6 @@ static MC68901_INTERFACE( stbook_mfp_intf )
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(st_state, mfp_tdo_w), /* TDO */
- DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, rx),
DEVCB_DEVICE_LINE_MEMBER(RS232_TAG, serial_port_device, tx)
};
@@ -2388,7 +2385,9 @@ static MACHINE_CONFIG_START( st, st_state )
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
+
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
+ MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
MCFG_SERIAL_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_SERIAL_OUT_RX_HANDLER(WRITELINE(st_state, midi_rx_w))
@@ -2446,7 +2445,9 @@ static MACHINE_CONFIG_START( megast, megast_state )
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", st_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
+
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
+ MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
MCFG_SERIAL_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_SERIAL_OUT_RX_HANDLER(WRITELINE(st_state, midi_rx_w))
@@ -2513,7 +2514,9 @@ static MACHINE_CONFIG_START( ste, ste_state )
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", st_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, st_state::floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
+
MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
+ MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
MCFG_SERIAL_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_SERIAL_OUT_RX_HANDLER(WRITELINE(st_state, midi_rx_w))
@@ -2590,7 +2593,9 @@ static MACHINE_CONFIG_START( stbook, stbook_state )
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":0", atari_floppies, "35dd", 0, st_state::floppy_formats)
MCFG_FLOPPY_DRIVE_ADD(WD1772_TAG ":1", atari_floppies, 0, 0, st_state::floppy_formats)
MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, centronics_intf)
- MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL, NULL)
+
+ MCFG_RS232_PORT_ADD(RS232_TAG, default_rs232_devices, NULL)
+ MCFG_SERIAL_OUT_RX_HANDLER(DEVWRITELINE(MC68901_TAG, mc68901_device, write_rx))
MCFG_SERIAL_PORT_ADD("mdin", midiin_slot, "midiin")
MCFG_SERIAL_OUT_RX_HANDLER(WRITELINE(st_state, midi_rx_w))
diff --git a/src/mess/drivers/x68k.c b/src/mess/drivers/x68k.c
index 8dbaf1ce645..c9dd8149531 100644
--- a/src/mess/drivers/x68k.c
+++ b/src/mess/drivers/x68k.c
@@ -2066,7 +2066,6 @@ static MC68901_INTERFACE( mfp_interface )
DEVCB_NULL, /* TBO */
DEVCB_NULL, /* TCO */
DEVCB_DRIVER_LINE_MEMBER(x68k_state, mfp_tdo_w), /* TDO */
- DEVCB_NULL, /* serial input */
DEVCB_NULL, /* serial output */
DEVCB_NULL,
DEVCB_NULL