diff options
Diffstat (limited to 'src/emu/diserial.cpp')
-rw-r--r-- | src/emu/diserial.cpp | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/src/emu/diserial.cpp b/src/emu/diserial.cpp index 4f31c91ca02..2d900f27459 100644 --- a/src/emu/diserial.cpp +++ b/src/emu/diserial.cpp @@ -45,21 +45,6 @@ device_serial_interface::device_serial_interface(const machine_config &mconfig, m_tra_clock_state(false), m_rcv_clock_state(false) { - /* if sum of all bits in the byte is even, then the data - has even parity, otherwise it has odd parity */ - for (int i=0; i<256; i++) - { - int sum = 0; - int data = i; - - for (int b=0; b<8; b++) - { - sum+=data & 0x01; - data = data>>1; - } - - m_serial_parity_table[i] = sum & 0x01; - } } device_serial_interface::~device_serial_interface() @@ -317,13 +302,13 @@ void device_serial_interface::receive_register_extract() receive_register_reset(); /* strip off stop bits and parity */ - assert(m_rcv_bit_count >0 && m_rcv_bit_count <= 16); - data = m_rcv_register_data>>(16-m_rcv_bit_count); + assert(m_rcv_bit_count > 0 && m_rcv_bit_count <= 16); + data = m_rcv_register_data >> (16 - m_rcv_bit_count); /* mask off other bits so data byte has 0's in unused bits */ - data &= ~(0xff<<m_df_word_length); + data &= ~(0xff << m_df_word_length); - m_rcv_byte_received = data; + m_rcv_byte_received = data; LOGMASKED(LOG_RX, "Receive data 0x%02x\n", m_rcv_byte_received); if(m_df_parity == PARITY_NONE) @@ -336,12 +321,12 @@ void device_serial_interface::receive_register_extract() switch (m_df_parity) { case PARITY_ODD: - if (parity_received == serial_helper_get_parity(data)) + if (parity_received == BIT(population_count_32(data), 0)) m_rcv_parity_error = true; break; case PARITY_EVEN: - if (parity_received != serial_helper_get_parity(data)) + if (parity_received != BIT(population_count_32(data), 0)) m_rcv_parity_error = true; break; @@ -369,9 +354,8 @@ void device_serial_interface::transmit_register_reset() void device_serial_interface::transmit_register_add_bit(int bit) { /* combine bit */ - m_tra_register_data = m_tra_register_data<<1; - m_tra_register_data &=~1; - m_tra_register_data|=(bit & 0x01); + m_tra_register_data = m_tra_register_data << 1; + m_tra_register_data |= (bit & 0x01); m_tra_bit_count++; } @@ -379,10 +363,9 @@ void device_serial_interface::transmit_register_add_bit(int bit) /* generate data in stream format ready for transfer */ void device_serial_interface::transmit_register_setup(u8 data_byte) { - int i; u8 transmit_data; - if(m_tra_clock && !m_tra_rate.is_never()) + if (m_tra_clock && !m_tra_rate.is_never()) m_tra_clock->adjust(m_tra_rate, 0, m_tra_rate); m_tra_bit_count_transmitted = 0; @@ -390,40 +373,35 @@ void device_serial_interface::transmit_register_setup(u8 data_byte) m_tra_flags &=~TRANSMIT_REGISTER_EMPTY; /* start bit */ - for (i=0; i<m_df_start_bit_count; i++) + for (int i = 0; i < m_df_start_bit_count; i++) { transmit_register_add_bit(0); } /* data bits */ transmit_data = data_byte; - for (i=0; i<m_df_word_length; i++) + for (int i = 0; i < m_df_word_length; i++) { - int databit; - - /* get bit from data */ - databit = transmit_data & 0x01; /* add bit to formatted byte */ - transmit_register_add_bit(databit); - transmit_data = transmit_data>>1; + transmit_register_add_bit(BIT(transmit_data, 0)); + transmit_data >>= 1; } /* parity */ - if (m_df_parity!=PARITY_NONE) + if (m_df_parity != PARITY_NONE) { /* odd or even parity */ u8 parity = 0; switch (m_df_parity) { 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) ^ 1; + // get parity + // if parity[0] = 0, data has even parity - i.e. there is an even number of one bits in the data + // if parity[0] = 1, data has odd parity - i.e. there is an odd number of one bits in the data + parity = BIT(population_count_32(data_byte), 0) ^ 1; break; case PARITY_EVEN: - parity = serial_helper_get_parity(data_byte); + parity = BIT(population_count_32(data_byte), 0); break; case PARITY_MARK: parity = 1; @@ -436,7 +414,7 @@ void device_serial_interface::transmit_register_setup(u8 data_byte) } /* TX stop bit(s) */ - for (i=0; i<m_df_stop_bit_count; i++) + for (int i = 0; i < m_df_stop_bit_count; i++) transmit_register_add_bit(1); } |