From 671ba32470a9aee7a72180c750170855f0fd9b1f Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Mon, 18 Nov 2013 21:05:30 +0000 Subject: [PATCH] diserial: Remove defines, cleanup clocks/timers, add sync support [O. Galibert] --- src/emu/diserial.c | 107 +++++++++++++++++++--------- src/emu/diserial.h | 122 ++++++++++++-------------------- src/emu/imagedev/midiin.c | 7 +- src/emu/imagedev/midiout.c | 7 +- src/emu/imagedev/midiout.h | 1 + src/emu/imagedev/serial.c | 10 +-- src/emu/machine/i8251.c | 30 ++++---- src/emu/machine/i8251.h | 1 + src/emu/machine/im6402.c | 33 ++++----- src/emu/machine/im6402.h | 1 + src/emu/machine/ins8250.c | 27 ++++--- src/emu/machine/ins8250.h | 2 +- src/emu/machine/mc2661.c | 35 +++------ src/emu/machine/mc2661.h | 4 +- src/emu/machine/mc68901.c | 33 +++------ src/emu/machine/mc68901.h | 3 - src/emu/machine/microtch.c | 10 ++- src/emu/machine/microtch.h | 1 + src/emu/machine/mos6551.c | 26 ++++--- src/emu/machine/mos6551.h | 1 + src/emu/machine/n68681.c | 17 +++-- src/emu/machine/n68681.h | 1 + src/emu/machine/z80dart.c | 60 +++++++++------- src/emu/machine/z80dart.h | 1 + src/emu/machine/z80sti.c | 4 +- src/mame/machine/midikbd.c | 2 +- src/mess/drivers/atarist.c | 3 +- src/mess/drivers/pc.c | 2 +- src/mess/drivers/rainbow.c | 2 +- src/mess/drivers/thomson.c | 6 +- src/mess/drivers/x68k.c | 3 +- src/mess/machine/esqpanel.c | 7 +- src/mess/machine/esqpanel.h | 1 + src/mess/machine/isa_sblaster.c | 10 ++- src/mess/machine/keyboard.c | 18 +++-- src/mess/machine/keyboard.h | 1 + src/mess/machine/ser_mouse.c | 6 ++ src/mess/machine/ser_mouse.h | 4 +- src/mess/machine/terminal.c | 10 +-- src/mess/machine/thomson.c | 16 ++--- src/mess/machine/wangpckb.c | 4 +- src/mess/machine/zx8302.c | 6 +- 42 files changed, 351 insertions(+), 294 deletions(-) diff --git a/src/emu/diserial.c b/src/emu/diserial.c index b03bf8d8d6e..e7c70aa94c3 100644 --- a/src/emu/diserial.c +++ b/src/emu/diserial.c @@ -40,6 +40,8 @@ device_serial_interface::device_serial_interface(const machine_config &mconfig, } m_rcv_clock = NULL; m_tra_clock = NULL; + m_rcv_clock_state = false; + m_tra_clock_state = false; m_tra_rate = attotime::never; m_rcv_rate = attotime::never; m_tra_flags = 0; @@ -54,15 +56,12 @@ device_serial_interface::~device_serial_interface() { } -//------------------------------------------------- -// interface_pre_start - work to be done prior to -// actually starting a device -//------------------------------------------------- - void device_serial_interface::interface_pre_start() { - m_rcv_clock = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_serial_interface::rcv_timer), this)); - m_tra_clock = device().machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(device_serial_interface::tra_timer), this)); + m_rcv_clock = device().timer_alloc(RCV_TIMER_ID); + m_tra_clock = device().timer_alloc(TRA_TIMER_ID); + m_rcv_clock_state = false; + m_tra_clock_state = false; } void device_serial_interface::set_rcv_rate(attotime rate) @@ -79,7 +78,7 @@ void device_serial_interface::set_tra_rate(attotime rate) m_tra_clock->adjust(attotime::never); } -void device_serial_interface::tra_clock() +void device_serial_interface::tra_edge() { tra_callback(); if(is_transmit_register_empty()) @@ -89,12 +88,7 @@ void device_serial_interface::tra_clock() } } -void device_serial_interface::tra_timer(void *ptr, int param) -{ - tra_clock(); -} - -void device_serial_interface::rcv_clock() +void device_serial_interface::rcv_edge() { rcv_callback(); if(is_receive_register_full()) @@ -104,20 +98,49 @@ void device_serial_interface::rcv_clock() } } -void device_serial_interface::rcv_timer(void *ptr, int param) +WRITE_LINE_MEMBER(device_serial_interface::tx_clock_w) { - rcv_clock(); + if(state != m_tra_clock_state) { + m_tra_clock_state = state; + if(m_tra_clock_state) + tra_edge(); + } } -void device_serial_interface::set_data_frame(int num_data_bits, int stop_bit_count, int parity_code) +WRITE_LINE_MEMBER(device_serial_interface::rx_clock_w) +{ + if(state != m_rcv_clock_state) { + m_rcv_clock_state = state; + if(!m_rcv_clock_state) + rcv_edge(); + } +} + +WRITE_LINE_MEMBER(device_serial_interface::clock_w) +{ + tx_clock_w(state); + rx_clock_w(state); +} + +void device_serial_interface::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) { + case TRA_TIMER_ID: tx_clock_w(!m_tra_clock_state); break; + case RCV_TIMER_ID: rx_clock_w(!m_rcv_clock_state); break; + } +} + + +void device_serial_interface::set_data_frame(int num_data_bits, int stop_bit_count, int parity_code, bool synchronous) { m_df_word_length = num_data_bits; m_df_stop_bit_count = stop_bit_count; m_df_parity = parity_code; + m_synchronous = synchronous; m_rcv_bit_count = m_df_word_length + m_df_stop_bit_count; - if (m_df_parity != SERIAL_PARITY_NONE) + if (m_df_parity != PARITY_NONE) { m_rcv_bit_count++; } @@ -127,8 +150,16 @@ void device_serial_interface::receive_register_reset() { m_rcv_bit_count_received = 0; m_rcv_flags &=~RECEIVE_REGISTER_FULL; - m_rcv_flags &=~RECEIVE_REGISTER_SYNCHRONISED; - m_rcv_flags |= RECEIVE_REGISTER_WAITING_FOR_START_BIT; + if (m_synchronous) + { + m_rcv_flags |= RECEIVE_REGISTER_SYNCHRONISED; + m_rcv_flags &=~RECEIVE_REGISTER_WAITING_FOR_START_BIT; + } + else + { + m_rcv_flags &=~RECEIVE_REGISTER_SYNCHRONISED; + m_rcv_flags |= RECEIVE_REGISTER_WAITING_FOR_START_BIT; + } } WRITE_LINE_MEMBER(device_serial_interface::rx_w) @@ -165,7 +196,7 @@ void device_serial_interface::receive_register_update_bit(int bit) /* update bit count received */ m_rcv_bit_count_received++; - /* asyncrhonouse mode */ + /* asynchronous mode */ if (m_rcv_flags & RECEIVE_REGISTER_WAITING_FOR_START_BIT) { /* the previous bit is stored in uart.receive char bit 0 */ @@ -216,7 +247,7 @@ void device_serial_interface::receive_register_extract() m_rcv_byte_received = data; - if(m_df_parity == SERIAL_PARITY_NONE) + if(m_df_parity == PARITY_NONE) return; //unsigned char computed_parity; @@ -229,13 +260,13 @@ void device_serial_interface::receive_register_extract() switch (m_df_parity) { /* check parity */ - case SERIAL_PARITY_ODD: - case SERIAL_PARITY_EVEN: + case PARITY_ODD: + case PARITY_EVEN: { /* compute parity for received bits */ //computed_parity = serial_helper_get_parity(data); - if (m_df_parity == SERIAL_PARITY_ODD) + if (m_df_parity == PARITY_ODD) { /* odd parity */ @@ -250,8 +281,8 @@ void device_serial_interface::receive_register_extract() } break; - case SERIAL_PARITY_MARK: - case SERIAL_PARITY_SPACE: + case PARITY_MARK: + case PARITY_SPACE: //computed_parity = parity_received; break; } @@ -289,8 +320,9 @@ void device_serial_interface::transmit_register_setup(UINT8 data_byte) m_tra_bit_count = 0; m_tra_flags &=~TRANSMIT_REGISTER_EMPTY; - /* start bit */ - transmit_register_add_bit(0); + if (!m_synchronous) + /* start bit */ + transmit_register_add_bit(0); /* data bits */ transmit_data = data_byte; @@ -306,24 +338,24 @@ void device_serial_interface::transmit_register_setup(UINT8 data_byte) } /* parity */ - if (m_df_parity!=SERIAL_PARITY_NONE) + if (m_df_parity!=PARITY_NONE) { /* odd or even parity */ unsigned char parity = 0; switch(m_df_parity) { - case SERIAL_PARITY_EVEN: - case SERIAL_PARITY_ODD: + case PARITY_EVEN: + case PARITY_ODD: /* get parity */ /* if parity = 0, data has even parity - i.e. there is an even number of one bits in the data */ /* if parity = 1, data has odd parity - i.e. there is an odd number of one bits in the data */ parity = serial_helper_get_parity(data_byte); break; - case SERIAL_PARITY_MARK: + case PARITY_MARK: parity = 1; break; - case SERIAL_PARITY_SPACE: + case PARITY_SPACE: parity = 0; break; } @@ -362,7 +394,7 @@ UINT8 device_serial_interface::transmit_register_send_bit() UINT8 data = transmit_register_get_data_bit(); /* set tx data bit */ - m_connection_state &=~SERIAL_STATE_TX_DATA; + m_connection_state &= ~TX; m_connection_state|=(data<<5); /* state out through connection */ @@ -457,6 +489,11 @@ void serial_source_device::device_start() { } +void serial_source_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} + void serial_source_device::input_callback(UINT8 state) { m_input_state = state; diff --git a/src/emu/diserial.h b/src/emu/diserial.h index 15ae3fbc424..a8170a3c736 100644 --- a/src/emu/diserial.h +++ b/src/emu/diserial.h @@ -7,85 +7,43 @@ #ifndef __DISERIAL_H__ #define __DISERIAL_H__ -//************************************************************************** -// TYPE DEFINITIONS -//************************************************************************** -/* parity selections */ -/* if all the bits are added in a byte, if the result is: - even -> parity is even - odd -> parity is odd -*/ -enum -{ - SERIAL_PARITY_NONE, /* no parity. a parity bit will not be in the transmitted/received data */ - SERIAL_PARITY_ODD, /* odd parity */ - SERIAL_PARITY_EVEN, /* even parity */ - SERIAL_PARITY_MARK, /* one parity */ - SERIAL_PARITY_SPACE /* zero parity */ -}; - -/* - CTS = Clear to Send. (INPUT) - Other end of connection is ready to accept data - - - NOTE: - - This output is active low on serial chips (e.g. 0 is CTS is set), - but here it is active high! -*/ -#define SERIAL_STATE_CTS 0x0001 - -/* - RTS = Request to Send. (OUTPUT) - This end is ready to send data, and requests if the other - end is ready to accept it - - NOTE: - - This output is active low on serial chips (e.g. 0 is RTS is set), - but here it is active high! -*/ -#define SERIAL_STATE_RTS 0x0002 - -/* - DSR = Data Set ready. (INPUT) - Other end of connection has data - - - NOTE: - - This output is active low on serial chips (e.g. 0 is DSR is set), - but here it is active high! -*/ -#define SERIAL_STATE_DSR 0x0004 - -/* - DTR = Data terminal Ready. (OUTPUT) - TX contains new data. - - NOTE: - - This output is active low on serial chips (e.g. 0 is DTR is set), - but here it is active high! -*/ -#define SERIAL_STATE_DTR 0x0008 -/* RX = Recieve data. (INPUT) */ -#define SERIAL_STATE_RX_DATA 0x00010 -/* TX = Transmit data. (OUTPUT) */ -#define SERIAL_STATE_TX_DATA 0x00020 - // ======================> device_serial_interface class device_serial_interface : public device_interface { public: + /* parity selections */ + /* if all the bits are added in a byte, if the result is: + even -> parity is even + odd -> parity is odd + */ + enum + { + PARITY_NONE, /* no parity. a parity bit will not be in the transmitted/received data */ + PARITY_ODD, /* odd parity */ + PARITY_EVEN, /* even parity */ + PARITY_MARK, /* one parity */ + PARITY_SPACE /* zero parity */ + }; + + /* Communication lines. Beware, everything is active high */ + enum + { + CTS = 0x0001, /* Clear to Send. (INPUT) Other end of connection is ready to accept data */ + RTS = 0x0002, /* Request to Send. (OUTPUT) This end is ready to send data, and requests if the other */ + /* end is ready to accept it */ + DSR = 0x0004, /* Data Set ready. (INPUT) Other end of connection has data */ + DTR = 0x0008, /* Data terminal Ready. (OUTPUT) TX contains new data. */ + RX = 0x0010, /* Recieve data. (INPUT) */ + TX = 0x0020 /* TX = Transmit data. (OUTPUT) */ + }; + // construction/destruction device_serial_interface(const machine_config &mconfig, device_t &device); virtual ~device_serial_interface(); virtual void input_callback(UINT8 state) = 0; - void set_data_frame(int num_data_bits, int stop_bit_count, int parity_code); + void set_data_frame(int num_data_bits, int stop_bit_count, int parity_code, bool synchronous); void receive_register_reset(); void receive_register_update_bit(int bit); @@ -101,8 +59,9 @@ public: void set_rate(UINT32 clock, int div) { set_rcv_rate(clock, div); set_tra_rate(clock, div); } void set_rate(int baud) { set_rcv_rate(baud); set_tra_rate(baud); } - void tra_clock(); - void rcv_clock(); + DECLARE_WRITE_LINE_MEMBER(tx_clock_w); + DECLARE_WRITE_LINE_MEMBER(rx_clock_w); + DECLARE_WRITE_LINE_MEMBER(clock_w); void transmit_register_reset(); void transmit_register_add_bit(int bit); @@ -112,8 +71,8 @@ public: UINT8 serial_helper_get_parity(UINT8 data) { return m_serial_parity_table[data]; } - UINT8 get_in_data_bit() { return ((m_input_state & SERIAL_STATE_RX_DATA)>>4) & 1; } - void set_out_data_bit(UINT8 data) { m_connection_state &=~SERIAL_STATE_TX_DATA; m_connection_state |=(data<<5); } + UINT8 get_in_data_bit() { return ((m_input_state & RX)>>4) & 1; } + void set_out_data_bit(UINT8 data) { m_connection_state &= ~TX; m_connection_state |=(data<<5); } void serial_connection_out(); @@ -136,9 +95,12 @@ protected: // interface-level overrides virtual void interface_pre_start(); + + // Must be called from device_timer in the underlying device + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + private: - void tra_timer(void *ptr, int param); - void rcv_timer(void *ptr, int param); + enum { TRA_TIMER_ID = 10000, RCV_TIMER_ID }; UINT8 m_serial_parity_table[256]; @@ -149,6 +111,8 @@ private: UINT8 m_df_parity; // number of stop bits UINT8 m_df_stop_bit_count; + // synchronous or not + bool m_synchronous; // Receive register /* data */ @@ -178,12 +142,17 @@ private: attotime m_tra_rate; UINT8 m_rcv_line; + bool m_tra_clock_state, m_rcv_clock_state; + device_serial_interface *m_other_connection; + + void tra_edge(); + void rcv_edge(); }; class serial_source_device : public device_t, - public device_serial_interface + public device_serial_interface { public: // construction/destruction @@ -194,6 +163,7 @@ public: protected: // device-level overrides virtual void device_start(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); }; extern const device_type SERIAL_SOURCE; diff --git a/src/emu/imagedev/midiin.c b/src/emu/imagedev/midiin.c index 182fc148cf5..92d7baec251 100644 --- a/src/emu/imagedev/midiin.c +++ b/src/emu/imagedev/midiin.c @@ -46,7 +46,7 @@ void midiin_device::device_reset() // we don't Rx, we Tx at 31250 8-N-1 set_rcv_rate(0); set_tra_rate(31250); - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); } /*------------------------------------------------- @@ -73,6 +73,11 @@ void midiin_device::device_config_complete(void) void midiin_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { + if (id) { + device_serial_interface::device_timer(timer, id, param, ptr); + return; + } + UINT8 buf[8192*4]; int bytesRead; diff --git a/src/emu/imagedev/midiout.c b/src/emu/imagedev/midiout.c index f7d7afaabb0..f13f7099ea8 100644 --- a/src/emu/imagedev/midiout.c +++ b/src/emu/imagedev/midiout.c @@ -40,7 +40,12 @@ void midiout_device::device_reset() // we don't Tx, we Rx at 31250 8-N-1 set_rcv_rate(31250); set_tra_rate(0); - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); +} + +void midiout_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); } /*------------------------------------------------- diff --git a/src/emu/imagedev/midiout.h b/src/emu/imagedev/midiout.h index 428c376436b..e261805f274 100644 --- a/src/emu/imagedev/midiout.h +++ b/src/emu/imagedev/midiout.h @@ -52,6 +52,7 @@ protected: // device-level overrides virtual void device_start(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); virtual void device_config_complete(); diff --git a/src/emu/imagedev/serial.c b/src/emu/imagedev/serial.c index cfe2ffa4cf3..d3a63c75c97 100644 --- a/src/emu/imagedev/serial.c +++ b/src/emu/imagedev/serial.c @@ -51,7 +51,7 @@ void serial_image_device::device_config_complete() m_baud_rate = 2400; m_data_bits = 8; m_stop_bits = 2; - m_parity = SERIAL_PARITY_NONE; + m_parity = PARITY_NONE; m_transmit_on_start = FALSE; m_tag_connected = NULL; } @@ -80,17 +80,17 @@ void serial_image_device::input_callback(UINT8 state) void serial_image_device::device_start() { - set_data_frame(m_data_bits, m_stop_bits,m_parity); + set_data_frame(m_data_bits, m_stop_bits, m_parity, false); m_timer = machine().scheduler().timer_alloc(FUNC(serial_device_baud_rate_callback), this); /* signal to other end it is clear to send! */ /* data is initially high state */ /* set /rts */ - m_connection_state |= SERIAL_STATE_RTS; + m_connection_state |= RTS; /* signal to other end data is ready to be accepted */ /* set /dtr */ - m_connection_state |= SERIAL_STATE_DTR; + m_connection_state |= DTR; set_out_data_bit(1); serial_connection_out(); @@ -241,7 +241,7 @@ void serial_image_device::timer_callback() } /* other side says it is clear to send? */ - if (m_connection_state & SERIAL_STATE_CTS) + if (m_connection_state & CTS) { /* send bit */ transmit_register_send_bit(); diff --git a/src/emu/machine/i8251.c b/src/emu/machine/i8251.c index ff67bfe9acf..b86a08bd035 100644 --- a/src/emu/machine/i8251.c +++ b/src/emu/machine/i8251.c @@ -40,7 +40,7 @@ void i8251_device::input_callback(UINT8 state) m_input_state = state; /* did cts change state? */ - if (changed & SERIAL_STATE_CTS) + if (changed & CTS) { /* yes */ /* update tx ready */ @@ -208,7 +208,7 @@ void i8251_device::transmit_clock() //transmit_register_send_bit(); m_out_txd_func(data); - m_connection_state &=~SERIAL_STATE_TX_DATA; + m_connection_state &= ~TX; m_connection_state|=(data<<5); serial_connection_out(); } @@ -265,7 +265,7 @@ void i8251_device::update_tx_ready() if ((m_command & (1<<0))!=0) { /* other side has rts set (comes in as CTS at this side) */ - if (m_input_state & SERIAL_STATE_CTS) + if (m_input_state & CTS) { if (m_status & I8251_STATUS_TX_EMPTY) { @@ -313,7 +313,7 @@ void i8251_device::device_reset() set_out_data_bit(1); /* assumption, rts is set to 1 */ - m_connection_state &= ~SERIAL_STATE_RTS; + m_connection_state &= ~RTS; serial_connection_out(); transmit_register_reset(); @@ -406,7 +406,7 @@ WRITE8_MEMBER(i8251_device::control_w) LOG(("Character length: %d\n", (((data>>2) & 0x03)+5))); - int parity = SERIAL_PARITY_NONE; + int parity = PARITY_NONE; if (data & (1<<4)) { @@ -415,12 +415,12 @@ WRITE8_MEMBER(i8251_device::control_w) if (data & (1<<5)) { LOG(("even parity\n")); - parity = SERIAL_PARITY_EVEN; + parity = PARITY_EVEN; } else { LOG(("odd parity\n")); - parity = SERIAL_PARITY_ODD; + parity = PARITY_ODD; } } else @@ -478,7 +478,7 @@ WRITE8_MEMBER(i8251_device::control_w) stop_bit_count = 2; break; } - set_data_frame(word_length,stop_bit_count,parity); + set_data_frame(word_length,stop_bit_count,parity,false); switch (data & 0x03) { @@ -624,17 +624,17 @@ WRITE8_MEMBER(i8251_device::control_w) 1 = transmit enable */ - m_connection_state &=~SERIAL_STATE_RTS; + m_connection_state &= ~RTS; if (data & (1<<5)) { /* rts set to 0 */ - m_connection_state |= SERIAL_STATE_RTS; + m_connection_state |= RTS; } - m_connection_state &=~SERIAL_STATE_DTR; + m_connection_state &= ~DTR; if (data & (1<<1)) { - m_connection_state |= SERIAL_STATE_DTR; + m_connection_state |= DTR; } if ((data & (1<<0))==0) @@ -741,3 +741,9 @@ READ8_MEMBER(i8251_device::data_r) update_rx_ready(); return m_data; } + + +void i8251_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} diff --git a/src/emu/machine/i8251.h b/src/emu/machine/i8251.h index 1d7189455ea..e9c8006529f 100644 --- a/src/emu/machine/i8251.h +++ b/src/emu/machine/i8251.h @@ -93,6 +93,7 @@ protected: virtual void device_start(); virtual void device_config_complete(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); void update_rx_ready(); void update_tx_ready(); diff --git a/src/emu/machine/im6402.c b/src/emu/machine/im6402.c index 163d691d1d8..429fc42e7d1 100644 --- a/src/emu/machine/im6402.c +++ b/src/emu/machine/im6402.c @@ -182,6 +182,10 @@ void im6402_device::device_reset() set_tre(ASSERT_LINE); } +void im6402_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} //------------------------------------------------- // tra_callback - @@ -255,7 +259,8 @@ void im6402_device::input_callback(UINT8 state) { m_input_state = state; - rcv_clock(); // HACK for Wang PC keyboard + rx_clock_w(1); // HACK for Wang PC keyboard + rx_clock_w(0); } @@ -293,13 +298,8 @@ WRITE_LINE_MEMBER( im6402_device::rrc_w ) { if (state) { - m_rrc_count++; - - if (m_rrc_count == 16) - { - rcv_clock(); - m_rrc_count = 0; - } + rx_clock_w(m_rrc_count < 8); + m_rrc_count = (m_rrc_count + 1) & 15; } } @@ -312,13 +312,8 @@ WRITE_LINE_MEMBER( im6402_device::trc_w ) { if (state) { - m_trc_count++; - - if (m_trc_count == 16) - { - tra_clock(); - m_trc_count = 0; - } + tx_clock_w(m_trc_count < 8); + m_trc_count = (m_trc_count + 1) & 15; } } @@ -381,11 +376,11 @@ WRITE_LINE_MEMBER( im6402_device::crl_w ) float stop_bits = 1 + (m_sbs ? ((word_length == 5) ? 0.5 : 1) : 0); int parity_code; - if (m_pi) parity_code = SERIAL_PARITY_NONE; - else if (m_epe) parity_code = SERIAL_PARITY_EVEN; - else parity_code = SERIAL_PARITY_ODD; + if (m_pi) parity_code = PARITY_NONE; + else if (m_epe) parity_code = PARITY_EVEN; + else parity_code = PARITY_ODD; - set_data_frame(word_length, stop_bits, parity_code); + set_data_frame(word_length, stop_bits, parity_code, false); } } diff --git a/src/emu/machine/im6402.h b/src/emu/machine/im6402.h index 84c18b15a58..f0f64839a27 100644 --- a/src/emu/machine/im6402.h +++ b/src/emu/machine/im6402.h @@ -119,6 +119,7 @@ protected: virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); + void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_serial_interface overrides virtual void tra_callback(); diff --git a/src/emu/machine/ins8250.c b/src/emu/machine/ins8250.c index 3c42c7a6a12..355c82872c6 100644 --- a/src/emu/machine/ins8250.c +++ b/src/emu/machine/ins8250.c @@ -242,23 +242,23 @@ WRITE8_MEMBER( ins8250_uart_device::ins8250_w ) switch ((m_regs.lcr>>3) & 7) { case 1: - tmp = SERIAL_PARITY_ODD; + tmp = PARITY_ODD; break; case 3: - tmp = SERIAL_PARITY_EVEN; + tmp = PARITY_EVEN; break; case 5: - tmp = SERIAL_PARITY_MARK; + tmp = PARITY_MARK; break; case 7: - tmp = SERIAL_PARITY_SPACE; + tmp = PARITY_SPACE; break; default: - tmp = SERIAL_PARITY_NONE; + tmp = PARITY_NONE; break; } // if 5 data bits and stb = 1, stop bits is supposed to be 1.5 - set_data_frame((m_regs.lcr & 3) + 5, (m_regs.lcr & 4)?2:1, tmp); + set_data_frame((m_regs.lcr & 3) + 5, (m_regs.lcr & 4)?2:1, tmp, false); break; case 4: if ( ( m_regs.mcr & 0x1f ) != ( data & 0x1f ) ) @@ -539,6 +539,12 @@ void ins8250_uart_device::device_config_complete() } } +void ns16550_device::device_start() +{ + m_timeout = timer_alloc(); + ins8250_uart_device::device_start(); +} + void ns16550_device::device_reset() { memset(&m_rfifo, '\0', sizeof(m_rfifo)); @@ -551,8 +557,13 @@ void ns16550_device::device_reset() void ns16550_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - trigger_int(COM_INT_PENDING_CHAR_TIMEOUT); - m_timeout->adjust(attotime::never); + if(id) + device_serial_interface::device_timer(timer, id, param, ptr); + else + { + trigger_int(COM_INT_PENDING_CHAR_TIMEOUT); + m_timeout->adjust(attotime::never); + } } void ns16550_device::push_tx(UINT8 data) diff --git a/src/emu/machine/ins8250.h b/src/emu/machine/ins8250.h index 45545cfd706..a7925e79b15 100644 --- a/src/emu/machine/ins8250.h +++ b/src/emu/machine/ins8250.h @@ -104,7 +104,7 @@ class ns16550_device : public ins8250_uart_device public: ns16550_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); protected: - virtual void device_start() { m_timeout = timer_alloc(); ins8250_uart_device::device_start(); } + virtual void device_start(); virtual void device_reset(); virtual void rcv_complete(); virtual void tra_complete(); diff --git a/src/emu/machine/mc2661.c b/src/emu/machine/mc2661.c index c9298413459..6ac0b63fb60 100644 --- a/src/emu/machine/mc2661.c +++ b/src/emu/machine/mc2661.c @@ -339,11 +339,11 @@ WRITE8_MEMBER( mc2661_device::write ) case STOP_BITS_2: stop_bits = 2; break; } - if (!MODE_PARITY) parity_code = SERIAL_PARITY_NONE; - else if (MODE_PARITY_EVEN) parity_code = SERIAL_PARITY_EVEN; - else parity_code = SERIAL_PARITY_ODD; + if (!MODE_PARITY) parity_code = PARITY_NONE; + else if (MODE_PARITY_EVEN) parity_code = PARITY_EVEN; + else parity_code = PARITY_ODD; - set_data_frame(word_length, stop_bits, parity_code); + set_data_frame(word_length, stop_bits, parity_code, false); } m_mode_index++; @@ -366,27 +366,6 @@ WRITE8_MEMBER( mc2661_device::write ) } } - -//------------------------------------------------- -// rxc_w - receiver clock -//------------------------------------------------- - -WRITE_LINE_MEMBER( mc2661_device::rxc_w ) -{ - rcv_clock(); -} - - -//------------------------------------------------- -// txc_w - transmitter clock -//------------------------------------------------- - -WRITE_LINE_MEMBER( mc2661_device::txc_w ) -{ - tra_clock(); -} - - //------------------------------------------------- // dsr_w - data set ready //------------------------------------------------- @@ -453,3 +432,9 @@ READ_LINE_MEMBER( mc2661_device::txemt_r ) { return (m_sr & STATUS_TXEMT) ? ASSERT_LINE : CLEAR_LINE; } + + +void mc2661_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} diff --git a/src/emu/machine/mc2661.h b/src/emu/machine/mc2661.h index d3f2cd9ba56..aa263db0ce3 100644 --- a/src/emu/machine/mc2661.h +++ b/src/emu/machine/mc2661.h @@ -86,9 +86,6 @@ public: DECLARE_READ8_MEMBER( read ); DECLARE_WRITE8_MEMBER( write ); - DECLARE_WRITE_LINE_MEMBER( rxc_w ); - DECLARE_WRITE_LINE_MEMBER( txc_w ); - DECLARE_WRITE_LINE_MEMBER( dsr_w ); DECLARE_WRITE_LINE_MEMBER( dcd_w ); DECLARE_WRITE_LINE_MEMBER( cts_w ); @@ -101,6 +98,7 @@ protected: virtual void device_config_complete(); virtual void device_start(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_serial_interface overrides virtual void tra_callback(); diff --git a/src/emu/machine/mc68901.c b/src/emu/machine/mc68901.c index 62559ee469c..c9e8e28841d 100644 --- a/src/emu/machine/mc68901.c +++ b/src/emu/machine/mc68901.c @@ -800,7 +800,10 @@ void mc68901_device::device_reset() void mc68901_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - timer_count(id); + if(id >= TIMER_A && id <= TIMER_D) + timer_count(id); + else + device_serial_interface::device_timer(timer, id, param, ptr); } @@ -1227,7 +1230,7 @@ void mc68901_device::register_w(offs_t offset, UINT8 data) case REGISTER_UCR: { - int parity_code = SERIAL_PARITY_NONE; + int parity_code = PARITY_NONE; if (data & UCR_PARITY_ENABLED) { @@ -1235,13 +1238,13 @@ void mc68901_device::register_w(offs_t offset, UINT8 data) { if (LOG) logerror("MC68901 '%s' Parity : Even\n", tag()); - parity_code = SERIAL_PARITY_EVEN; + parity_code = PARITY_EVEN; } else { if (LOG) logerror("MC68901 '%s' Parity : Odd\n", tag()); - parity_code = SERIAL_PARITY_ODD; + parity_code = PARITY_ODD; } } else @@ -1259,11 +1262,13 @@ void mc68901_device::register_w(offs_t offset, UINT8 data) if (LOG) logerror("MC68901 '%s' Word Length : %u bits\n", tag(), m_rxtx_word); + bool sync = false; switch (data & 0x18) { case UCR_START_STOP_0_0: m_rxtx_start = 0; m_rxtx_stop = 0; + sync = true; if (LOG) logerror("MC68901 '%s' Start Bits : 0, Stop Bits : 0, Format : synchronous\n", tag()); break; case UCR_START_STOP_1_1: @@ -1292,7 +1297,7 @@ void mc68901_device::register_w(offs_t offset, UINT8 data) if (LOG) logerror("MC68901 '%s' Rx/Tx Clock Divisor : 1\n", tag()); } - set_data_frame(m_rxtx_word, m_rxtx_stop, parity_code); + set_data_frame(m_rxtx_word, m_rxtx_stop, parity_code, sync); m_ucr = data; } @@ -1434,21 +1439,3 @@ WRITE_LINE_MEMBER( mc68901_device::tbi_w ) { timer_input(TIMER_B, state); } - - -WRITE_LINE_MEMBER( mc68901_device::rc_w ) -{ - if (state) - { - rcv_clock(); - } -} - - -WRITE_LINE_MEMBER( mc68901_device::tc_w ) -{ - if (state) - { - tra_clock(); - } -} diff --git a/src/emu/machine/mc68901.h b/src/emu/machine/mc68901.h index 4927273ebd0..d203275a2f3 100644 --- a/src/emu/machine/mc68901.h +++ b/src/emu/machine/mc68901.h @@ -122,9 +122,6 @@ public: DECLARE_WRITE_LINE_MEMBER( tai_w ); DECLARE_WRITE_LINE_MEMBER( tbi_w ); - DECLARE_WRITE_LINE_MEMBER( rc_w ); - DECLARE_WRITE_LINE_MEMBER( tc_w ); - protected: // device-level overrides virtual void device_config_complete(); diff --git a/src/emu/machine/microtch.c b/src/emu/machine/microtch.c index 293f4597e51..21bb0b34f3d 100644 --- a/src/emu/machine/microtch.c +++ b/src/emu/machine/microtch.c @@ -292,7 +292,7 @@ microtouch_serial_device::microtouch_serial_device(const machine_config &mconfig void microtouch_serial_device::device_start() { microtouch_device::device_start(); - set_data_frame(8, 1, SERIAL_PARITY_NONE); //8N1? + set_data_frame(8, 1, PARITY_NONE, false); //8N1? set_tra_rate(clock()); set_rcv_rate(clock()); m_out_stx_func.resolve_safe(); @@ -302,6 +302,14 @@ void microtouch_serial_device::device_start() save_item(NAME(m_output)); } +void microtouch_serial_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + if(id) + device_serial_interface::device_timer(timer, id, param, ptr); + else + microtouch_device::device_timer(timer, id, param, ptr); +} + void microtouch_serial_device::tx(UINT8 data) { m_output = data; diff --git a/src/emu/machine/microtch.h b/src/emu/machine/microtch.h index b1cb4e0e224..73d2c4ecdfb 100644 --- a/src/emu/machine/microtch.h +++ b/src/emu/machine/microtch.h @@ -77,6 +77,7 @@ public: DECLARE_WRITE_LINE_MEMBER(rx) { device_serial_interface::rx_w(state); } protected: virtual void device_start(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); virtual void tx(UINT8 data); virtual void input_callback(UINT8 state) { m_input_state = state; } virtual void tra_callback(); diff --git a/src/emu/machine/mos6551.c b/src/emu/machine/mos6551.c index 00f80ab1c38..db6d370e9a6 100644 --- a/src/emu/machine/mos6551.c +++ b/src/emu/machine/mos6551.c @@ -114,6 +114,12 @@ void mos6551_device::device_reset() } +void mos6551_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} + + //------------------------------------------------- // tra_callback - //------------------------------------------------- @@ -223,7 +229,7 @@ void mos6551_device::update_serial() int num_data_bits = 8; int stop_bit_count = 1; - int parity_code = SERIAL_PARITY_NONE; + int parity_code = PARITY_NONE; switch (m_ctrl & CTRL_WL_MASK) { @@ -233,22 +239,22 @@ void mos6551_device::update_serial() case CTRL_WL_5: num_data_bits = 5; break; } - set_data_frame(num_data_bits, stop_bit_count, parity_code); + set_data_frame(num_data_bits, stop_bit_count, parity_code, false); } if (m_cmd & CMD_DTR) - m_connection_state |= SERIAL_STATE_DTR; + m_connection_state |= DTR; else - m_connection_state &= ~SERIAL_STATE_DTR; + m_connection_state &= ~DTR; - m_write_dtr((m_connection_state & SERIAL_STATE_DTR) ? 0 : 1); + m_write_dtr((m_connection_state & DTR) ? 0 : 1); if ((m_cmd & CMD_TC_MASK) == CMD_TC_RTS_HI) - m_connection_state &= ~SERIAL_STATE_RTS; + m_connection_state &= ~RTS; else - m_connection_state |= SERIAL_STATE_RTS; + m_connection_state |= RTS; - m_write_rts((m_connection_state & SERIAL_STATE_RTS) ? 0 : 1); + m_write_rts((m_connection_state & RTS) ? 0 : 1); serial_connection_out(); } @@ -366,8 +372,8 @@ WRITE_LINE_MEMBER( mos6551_device::rxd_w ) WRITE_LINE_MEMBER( mos6551_device::rxc_w ) { - rcv_clock(); - tra_clock(); + rx_clock_w(state); + tx_clock_w(state); } diff --git a/src/emu/machine/mos6551.h b/src/emu/machine/mos6551.h index 9312f09e4eb..43d28cbfe33 100644 --- a/src/emu/machine/mos6551.h +++ b/src/emu/machine/mos6551.h @@ -90,6 +90,7 @@ protected: // device-level overrides virtual void device_start(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_serial_interface overrides virtual void tra_callback(); diff --git a/src/emu/machine/n68681.c b/src/emu/machine/n68681.c index 0cb152c4ce4..65247dbaf0f 100644 --- a/src/emu/machine/n68681.c +++ b/src/emu/machine/n68681.c @@ -533,6 +533,11 @@ void duart68681_channel::device_reset() CSR = 0; } +void duart68681_channel::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} + // serial device virtual overrides void duart68681_channel::rcv_complete() { @@ -810,27 +815,27 @@ void duart68681_channel::recalc_framing() case 0: // with parity if (MR1 & 4) { - parity = SERIAL_PARITY_ODD; + parity = PARITY_ODD; } else { - parity = SERIAL_PARITY_EVEN; + parity = PARITY_EVEN; } break; case 1: // force parity if (MR1 & 4) { - parity = SERIAL_PARITY_MARK; + parity = PARITY_MARK; } else { - parity = SERIAL_PARITY_SPACE; + parity = PARITY_SPACE; } break; case 2: // no parity - parity = SERIAL_PARITY_NONE; + parity = PARITY_NONE; break; case 3: // multidrop mode @@ -840,7 +845,7 @@ void duart68681_channel::recalc_framing() //printf("ch %d MR1 %02x MR2 %02x => %d bits / char, %d stop bits, parity %d\n", m_ch, MR1, MR2, (MR1 & 3)+5, stopbits, parity); - set_data_frame((MR1 & 3)+5, stopbits, parity); + set_data_frame((MR1 & 3)+5, stopbits, parity, false); } void duart68681_channel::write_CR(UINT8 data) diff --git a/src/emu/machine/n68681.h b/src/emu/machine/n68681.h index 6c94a0a3998..dc19e368f98 100644 --- a/src/emu/machine/n68681.h +++ b/src/emu/machine/n68681.h @@ -41,6 +41,7 @@ public: // device-level overrides virtual void device_start(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_serial overrides virtual void rcv_complete(); // Rx completed receiving byte diff --git a/src/emu/machine/z80dart.c b/src/emu/machine/z80dart.c index 18586d83964..beabd129dff 100644 --- a/src/emu/machine/z80dart.c +++ b/src/emu/machine/z80dart.c @@ -240,7 +240,6 @@ void z80dart_device::device_reset() m_chanB->reset(); } - //------------------------------------------------- // z80daisy_irq_state - get interrupt status //------------------------------------------------- @@ -568,6 +567,11 @@ void z80dart_channel::device_reset() } } +void z80dart_channel::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} + //------------------------------------------------- // tra_callback - @@ -679,7 +683,7 @@ void z80dart_channel::input_callback(UINT8 state) m_input_state = state; - if (changed & SERIAL_STATE_CTS) + if (changed & CTS) { cts_w(state); } @@ -1221,16 +1225,18 @@ WRITE_LINE_MEMBER( z80dart_channel::sync_w ) WRITE_LINE_MEMBER( z80dart_channel::rxc_w ) { - int clocks = get_clock_mode(); - - if (!state) return; - //LOG(("Z80DART \"%s\" Channel %c : Receiver Clock Pulse\n", m_owner->tag(), m_index + 'A')); - - if (++m_rx_clock == clocks) + int clocks = get_clock_mode(); + if (clocks == 1) + rx_clock_w(state); + else if(state) { - m_rx_clock = 0; - rcv_clock(); + rx_clock_w(m_rx_clock < clocks/2); + + m_rx_clock++; + if (m_rx_clock == clocks) + m_rx_clock = 0; + } } @@ -1241,16 +1247,18 @@ WRITE_LINE_MEMBER( z80dart_channel::rxc_w ) WRITE_LINE_MEMBER( z80dart_channel::txc_w ) { - int clocks = get_clock_mode(); - - if (!state) return; - //LOG(("Z80DART \"%s\" Channel %c : Transmitter Clock Pulse\n", m_owner->tag(), m_index + 'A')); - - if (++m_tx_clock == clocks) + int clocks = get_clock_mode(); + if (clocks == 1) + tx_clock_w(state); + else if(state) { - m_tx_clock = 0; - tra_clock(); + tx_clock_w(m_tx_clock < clocks/2); + + m_tx_clock++; + if (m_tx_clock == clocks) + m_tx_clock = 0; + } } @@ -1275,17 +1283,17 @@ void z80dart_channel::update_serial() int num_data_bits = get_rx_word_length(); int stop_bit_count = get_stop_bits(); - int parity_code = SERIAL_PARITY_NONE; + int parity_code = PARITY_NONE; if (m_wr[1] & WR4_PARITY_ENABLE) { if (m_wr[1] & WR4_PARITY_EVEN) - parity_code = SERIAL_PARITY_EVEN; + parity_code = PARITY_EVEN; else - parity_code = SERIAL_PARITY_ODD; + parity_code = PARITY_ODD; } - set_data_frame(num_data_bits, stop_bit_count, parity_code); + set_data_frame(num_data_bits, stop_bit_count, parity_code, false); } @@ -1300,9 +1308,9 @@ void z80dart_channel::set_dtr(int state) m_out_dtr_func(m_dtr); if (state) - m_connection_state &= ~SERIAL_STATE_DTR; + m_connection_state &= ~DTR; else - m_connection_state |= SERIAL_STATE_DTR; + m_connection_state |= DTR; serial_connection_out(); } @@ -1317,9 +1325,9 @@ void z80dart_channel::set_rts(int state) m_out_rts_func(state); if (state) - m_connection_state &= ~SERIAL_STATE_RTS; + m_connection_state &= ~RTS; else - m_connection_state |= SERIAL_STATE_RTS; + m_connection_state |= RTS; serial_connection_out(); } diff --git a/src/emu/machine/z80dart.h b/src/emu/machine/z80dart.h index 1a4cf981c7a..cbf1341b172 100644 --- a/src/emu/machine/z80dart.h +++ b/src/emu/machine/z80dart.h @@ -255,6 +255,7 @@ public: // device-level overrides virtual void device_start(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // device_serial_interface overrides virtual void tra_callback(); diff --git a/src/emu/machine/z80sti.c b/src/emu/machine/z80sti.c index d2b3208f271..d8b47d64a8d 100644 --- a/src/emu/machine/z80sti.c +++ b/src/emu/machine/z80sti.c @@ -742,7 +742,7 @@ WRITE_LINE_MEMBER( z80sti_device::i7_w ) { gpip_input(7, state); } WRITE_LINE_MEMBER( z80sti_device::rc_w ) { - rcv_clock(); + rx_clock_w(state); } @@ -752,5 +752,5 @@ WRITE_LINE_MEMBER( z80sti_device::rc_w ) WRITE_LINE_MEMBER( z80sti_device::tc_w ) { - tra_clock(); + tx_clock_w(state); } diff --git a/src/mame/machine/midikbd.c b/src/mame/machine/midikbd.c index fa5bb0bc1c5..967f4e4ffa3 100644 --- a/src/mame/machine/midikbd.c +++ b/src/mame/machine/midikbd.c @@ -76,7 +76,7 @@ void midi_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, in void midi_keyboard_device::device_start() { - set_data_frame(8, 1, SERIAL_PARITY_NONE); //8N1? + set_data_frame(8, 1, PARITY_NONE, false); //8N1? set_tra_rate(clock()); m_out_tx_func.resolve_safe(); m_head = m_tail = 0; diff --git a/src/mess/drivers/atarist.c b/src/mess/drivers/atarist.c index cee4d3660b8..3755095a0d9 100644 --- a/src/mess/drivers/atarist.c +++ b/src/mess/drivers/atarist.c @@ -1955,8 +1955,7 @@ READ8_MEMBER( st_state::mfp_gpio_r ) WRITE_LINE_MEMBER( st_state::mfp_tdo_w ) { - m_mfp->rc_w(state); - m_mfp->tc_w(state); + m_mfp->clock_w(state); } static MC68901_INTERFACE( mfp_intf ) diff --git a/src/mess/drivers/pc.c b/src/mess/drivers/pc.c index 10a2ee32b44..cb2e1c335dc 100644 --- a/src/mess/drivers/pc.c +++ b/src/mess/drivers/pc.c @@ -1378,7 +1378,7 @@ static const cassette_interface mc1502_cassette_interface = static const serial_image_interface mc1502_serial = { - 9600, 8, 1, SERIAL_PARITY_NONE, 1, "upd8251" + 9600, 8, 1, device_serial_interface::PARITY_NONE, 1, "upd8251" }; static MACHINE_CONFIG_START( ibmpcjr, tandy_pc_state ) diff --git a/src/mess/drivers/rainbow.c b/src/mess/drivers/rainbow.c index 173c4901a13..5359553a0f2 100644 --- a/src/mess/drivers/rainbow.c +++ b/src/mess/drivers/rainbow.c @@ -428,7 +428,7 @@ void rainbow_state::machine_reset() m_z80_halted = true; m_kbd_tx_ready = m_kbd_rx_ready = false; - m_kbd8251->input_callback(SERIAL_STATE_CTS); // raise clear to send + m_kbd8251->input_callback(device_serial_interface::CTS); // raise clear to send m_KBD = 0; diff --git a/src/mess/drivers/thomson.c b/src/mess/drivers/thomson.c index 7a9a3851702..a32cd516583 100644 --- a/src/mess/drivers/thomson.c +++ b/src/mess/drivers/thomson.c @@ -604,17 +604,17 @@ const cassette_interface mo5_cassette_interface = const serial_image_interface to7_cc90232_config = { - 2400, 7, 2, SERIAL_PARITY_NONE, 1, "to7_io" + 2400, 7, 2, device_serial_interface::PARITY_NONE, 1, "to7_io" }; const serial_image_interface to7_rf57932_config = { - 2400, 7, 2, SERIAL_PARITY_NONE, 1, "acia" + 2400, 7, 2, device_serial_interface::PARITY_NONE, 1, "acia" }; const serial_image_interface to7_modem_config = { - 2400, 7, 2, SERIAL_PARITY_NONE, 1, NULL + 2400, 7, 2, device_serial_interface::PARITY_NONE, 1, NULL }; /* ------------ driver ------------ */ diff --git a/src/mess/drivers/x68k.c b/src/mess/drivers/x68k.c index 3bef277201e..8dbaf1ce645 100644 --- a/src/mess/drivers/x68k.c +++ b/src/mess/drivers/x68k.c @@ -2051,8 +2051,7 @@ ADDRESS_MAP_END WRITE_LINE_MEMBER( x68k_state::mfp_tdo_w ) { - m_mfpdev->tc_w(state); - m_mfpdev->rc_w(state); + m_mfpdev->clock_w(state); } static MC68901_INTERFACE( mfp_interface ) diff --git a/src/mess/machine/esqpanel.c b/src/mess/machine/esqpanel.c index 44dcc3bfefd..9aa584fdaa2 100644 --- a/src/mess/machine/esqpanel.c +++ b/src/mess/machine/esqpanel.c @@ -66,7 +66,7 @@ void esqpanel_device::device_reset() // panel comms is at 62500 baud (double the MIDI rate), 8N2 set_rcv_rate(62500); set_tra_rate(62500); - set_data_frame(8, 2, SERIAL_PARITY_NONE); + set_data_frame(8, 2, PARITY_NONE, false); m_tx_busy = false; m_xmit_read = m_xmit_write = 0; @@ -74,6 +74,11 @@ void esqpanel_device::device_reset() m_bButtonLightSecondByte = false; } +void esqpanel_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + device_serial_interface::device_timer(timer, id, param, ptr); +} + void esqpanel_device::rcv_complete() // Rx completed receiving byte { receive_register_extract(); diff --git a/src/mess/machine/esqpanel.h b/src/mess/machine/esqpanel.h index e4bc497b616..09691f0a478 100644 --- a/src/mess/machine/esqpanel.h +++ b/src/mess/machine/esqpanel.h @@ -71,6 +71,7 @@ protected: virtual void device_start(); virtual void device_reset(); virtual void device_config_complete(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); // serial overrides virtual void rcv_complete(); // Rx completed receiving byte diff --git a/src/mess/machine/isa_sblaster.c b/src/mess/machine/isa_sblaster.c index c561eeaef4a..5d86d0729ae 100644 --- a/src/mess/machine/isa_sblaster.c +++ b/src/mess/machine/isa_sblaster.c @@ -1284,9 +1284,8 @@ void sb_device::device_reset() m_rx_waiting = m_tx_waiting = 0; // MIDI is 31250 baud, 8-N-1 - set_rcv_rate(31250); - set_tra_rate(31250); - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_rate(31250); + set_data_frame(8, 1, PARITY_NONE, false); } UINT8 sb_device::dack_r(int line) @@ -1423,6 +1422,11 @@ void sb_device::dack_w(int line, UINT8 data) void sb_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr) { // printf("DMA timer expire\n"); + if (tid) + { + device_serial_interface::device_timer(timer, tid, param, ptr); + return; + } UINT16 lsample, rsample; switch (m_dsp.flags) { diff --git a/src/mess/machine/keyboard.c b/src/mess/machine/keyboard.c index f271d8ab895..d1c777e5b19 100644 --- a/src/mess/machine/keyboard.c +++ b/src/mess/machine/keyboard.c @@ -436,7 +436,7 @@ void serial_keyboard_device::device_start() m_slot = m_owner && 1; m_timer = timer_alloc(); set_tra_rate(baud); - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); } INPUT_CHANGED_MEMBER(serial_keyboard_device::update_frame) @@ -459,21 +459,29 @@ void serial_keyboard_device::device_reset() switch(val & 0x30) { case 0x10: - set_data_frame(7, 1, SERIAL_PARITY_EVEN); + set_data_frame(7, 1, PARITY_EVEN, false); break; case 0x00: default: - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); break; case 0x20: - set_data_frame(8, 2, SERIAL_PARITY_NONE); + set_data_frame(8, 2, PARITY_NONE, false); break; case 0x30: - set_data_frame(8, 1, SERIAL_PARITY_EVEN); + set_data_frame(8, 1, PARITY_EVEN, false); break; } } +void serial_keyboard_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + if (id) + device_serial_interface::device_timer(timer, id, param, ptr); + else + generic_keyboard_device::device_timer(timer, id, param, ptr); +} + void serial_keyboard_device::send_key(UINT8 code) { if(is_transmit_register_empty()) diff --git a/src/mess/machine/keyboard.h b/src/mess/machine/keyboard.h index 8b935c18970..f752f63f2fc 100644 --- a/src/mess/machine/keyboard.h +++ b/src/mess/machine/keyboard.h @@ -94,6 +94,7 @@ protected: virtual void device_start(); virtual void device_config_complete(); virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); virtual void tra_callback(); virtual void tra_complete(); virtual void input_callback(UINT8 state) { m_input_state = state; } diff --git a/src/mess/machine/ser_mouse.c b/src/mess/machine/ser_mouse.c index e1b41aef7ff..b62f4d6f3b9 100644 --- a/src/mess/machine/ser_mouse.c +++ b/src/mess/machine/ser_mouse.c @@ -72,6 +72,12 @@ void serial_mouse_device::tra_callback() **************************************************************************/ void serial_mouse_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { + if (id) + { + device_serial_interface::device_timer(timer, id, param, ptr); + return; + } + static int ox = 0, oy = 0; int nx,ny; int dx, dy, nb; diff --git a/src/mess/machine/ser_mouse.h b/src/mess/machine/ser_mouse.h index 476e7c8acb6..9bda1cc1d1c 100644 --- a/src/mess/machine/ser_mouse.h +++ b/src/mess/machine/ser_mouse.h @@ -52,7 +52,7 @@ public: virtual void dtr_w(UINT8 state) { m_dtr = state; check_state(); } virtual void rts_w(UINT8 state) { m_rts = state; check_state(); m_old_rts = state; } protected: - virtual void set_frame() { set_data_frame(7, 2, SERIAL_PARITY_NONE); } + virtual void set_frame() { set_data_frame(7, 2, PARITY_NONE, false); } virtual void mouse_trans(int dx, int dy, int nb, int mbc); virtual void device_reset() {m_old_rts = 0; serial_mouse_device::device_reset();} private: @@ -68,7 +68,7 @@ public: virtual void dtr_w(UINT8 state) { m_dtr = state; check_state(); } virtual void rts_w(UINT8 state) { m_rts = state; check_state(); } protected: - virtual void set_frame() { set_data_frame(8, 2, SERIAL_PARITY_NONE); } + virtual void set_frame() { set_data_frame(8, 2, PARITY_NONE, false); } virtual void mouse_trans(int dx, int dy, int nb, int mbc); private: void check_state() { set_mouse_enable((m_dtr && m_rts)?true:false); } diff --git a/src/mess/machine/terminal.c b/src/mess/machine/terminal.c index 5516e8f66bf..7da5ffba895 100644 --- a/src/mess/machine/terminal.c +++ b/src/mess/machine/terminal.c @@ -481,7 +481,7 @@ void serial_terminal_device::device_start() m_timer = timer_alloc(); set_rcv_rate(baud); set_tra_rate(baud); - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); } INPUT_CHANGED_MEMBER(serial_terminal_device::update_frame) @@ -505,17 +505,17 @@ void serial_terminal_device::device_reset() switch(val & 0x30) { case 0x10: - set_data_frame(7, 1, SERIAL_PARITY_EVEN); + set_data_frame(7, 1, PARITY_EVEN, false); break; case 0x00: default: - set_data_frame(8, 1, SERIAL_PARITY_NONE); + set_data_frame(8, 1, PARITY_NONE, false); break; case 0x20: - set_data_frame(8, 2, SERIAL_PARITY_NONE); + set_data_frame(8, 2, PARITY_NONE, false); break; case 0x30: - set_data_frame(8, 1, SERIAL_PARITY_EVEN); + set_data_frame(8, 1, PARITY_EVEN, false); break; } } diff --git a/src/mess/machine/thomson.c b/src/mess/machine/thomson.c index 07c845d944b..734a1bcfe9e 100644 --- a/src/mess/machine/thomson.c +++ b/src/mess/machine/thomson.c @@ -686,9 +686,9 @@ WRITE8_MEMBER( to7_io_line_device::porta_out ) LOG_IO(( "%s %f to7_io_porta_out: tx=%i, dtr=%i\n", machine().describe_context(), machine().time().as_double(), tx, dtr )); if ( dtr ) - m_connection_state |= SERIAL_STATE_DTR; + m_connection_state |= device_serial_interface::DTR; else - m_connection_state &= ~SERIAL_STATE_DTR; + m_connection_state &= ~device_serial_interface::DTR; set_out_data_bit(tx); serial_connection_out(); @@ -700,11 +700,11 @@ READ8_MEMBER( to7_io_line_device::porta_in ) { centronics_device *printer = machine().device("centronics"); int cts = 1; - int dsr = ( m_input_state & SERIAL_STATE_DSR ) ? 0 : 1; + int dsr = ( m_input_state & device_serial_interface::DSR ) ? 0 : 1; int rd = get_in_data_bit(); if ( machine().driver_data()->to7_io_mode() == TO7_IO_RS232 ) - cts = m_input_state & SERIAL_STATE_CTS ? 0 : 1; + cts = m_input_state & device_serial_interface::CTS ? 0 : 1; else cts = !printer->busy_r(); @@ -738,7 +738,7 @@ void to7_io_line_device::input_callback(UINT8 state) { m_input_state = state; - LOG_IO(( "%f to7_io_in_callback: cts=%i dsr=%i rd=%i\n", machine().time().as_double(), (state & SERIAL_STATE_CTS) ? 1 : 0, (state & SERIAL_STATE_DSR) ? 1 : 0, (int)get_in_data_bit() )); + LOG_IO(( "%f to7_io_in_callback: cts=%i dsr=%i rd=%i\n", machine().time().as_double(), (state & device_serial_interface::CTS) ? 1 : 0, (state & device_serial_interface::DSR) ? 1 : 0, (int)get_in_data_bit() )); } @@ -775,9 +775,9 @@ void to7_io_line_device::device_reset() LOG (( "to7_io_reset called\n" )); if (io_pia) io_pia->set_port_a_z_mask(0x03 ); - m_input_state = SERIAL_STATE_CTS; - m_connection_state &= ~SERIAL_STATE_DTR; - m_connection_state |= SERIAL_STATE_RTS; /* always ready to send */ + m_input_state = device_serial_interface::CTS; + m_connection_state &= ~device_serial_interface::DTR; + m_connection_state |= device_serial_interface::RTS; /* always ready to send */ set_out_data_bit(1); serial_connection_out(); } diff --git a/src/mess/machine/wangpckb.c b/src/mess/machine/wangpckb.c index 0a74670b4e2..6b9d8a1dddc 100644 --- a/src/mess/machine/wangpckb.c +++ b/src/mess/machine/wangpckb.c @@ -417,7 +417,7 @@ void wangpc_keyboard_device::device_start() // set serial callbacks m_maincpu->i8051_set_serial_tx_callback(WRITE8_DELEGATE(wangpc_keyboard_device, mcs51_tx_callback)); m_maincpu->i8051_set_serial_rx_callback(READ8_DELEGATE(wangpc_keyboard_device, mcs51_rx_callback)); - set_data_frame(8, 2, SERIAL_PARITY_NONE); + set_data_frame(8, 2, PARITY_NONE, false); } @@ -441,7 +441,7 @@ void wangpc_keyboard_device::device_reset() void wangpc_keyboard_device::input_callback(UINT8 state) { - int bit = (state & SERIAL_STATE_RX_DATA) ? 1 : 0; + int bit = (state & RX) ? 1 : 0; receive_register_update_bit(bit); diff --git a/src/mess/machine/zx8302.c b/src/mess/machine/zx8302.c index b7fa503ee01..6b518c25ffc 100644 --- a/src/mess/machine/zx8302.c +++ b/src/mess/machine/zx8302.c @@ -270,6 +270,10 @@ void zx8302_device::device_timer(emu_timer &timer, device_timer_id id, int param transmit_ipc_data(); break; + + default: + device_serial_interface::device_timer(timer, id, param, ptr); + break; } } @@ -402,7 +406,7 @@ WRITE8_MEMBER( zx8302_device::control_w ) m_baudx4_timer->adjust(attotime::zero, 0, attotime::from_hz(baudx4)); set_tra_rate(baud); - set_data_frame(8, 2, SERIAL_PARITY_NONE); + set_data_frame(8, 2, PARITY_NONE, false); }