diff options
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 |
commit | 2279ff026a565b7802566a7dc7d33c883424b00c (patch) | |
tree | 576a251c17c812e95d604f1502fd2841de1cf05b | |
parent | 6c3f17c5956faefd2f1dc026468db2da03eee2bc (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.c | 363 | ||||
-rw-r--r-- | src/emu/machine/mc68901.h | 14 | ||||
-rw-r--r-- | src/mame/drivers/micro3d.c | 5 | ||||
-rw-r--r-- | src/mess/drivers/atarist.c | 13 | ||||
-rw-r--r-- | src/mess/drivers/x68k.c | 1 |
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 |