summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/diserial.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/diserial.cpp')
-rw-r--r--src/emu/diserial.cpp62
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);
}