summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2017-11-14 12:28:57 +1100
committer Vas Crabb <vas@vastheman.com>2017-11-14 12:32:02 +1100
commit02e58b6f830103ad1a240cf6bcabc4d91ecceea4 (patch)
treeb4324a1c63f3164ac2b2316170469a1efda33742
parent7111d0c13b1b8588a9dd6a72cb0865d055bd4c55 (diff)
Clean up SMC ethernet a bit: (nw)
* Use logmacro.h to reduce clutter with conditional logging * Reduce scope of local variables * Make some locals const (reduce mutable state) * Idiomatic array fill * Fix soft reset only working when logging is enabled
-rw-r--r--src/devices/machine/smc91c9x.cpp251
1 files changed, 102 insertions, 149 deletions
diff --git a/src/devices/machine/smc91c9x.cpp b/src/devices/machine/smc91c9x.cpp
index b925c8f0154..b94f7a29d1f 100644
--- a/src/devices/machine/smc91c9x.cpp
+++ b/src/devices/machine/smc91c9x.cpp
@@ -22,7 +22,9 @@
DEBUGGING
***************************************************************************/
-#define LOG_ETHERNET (0)
+//#define VERBOSE 1
+#include "logmacro.h"
+
#define DISPLAY_STATS (0)
@@ -137,15 +139,12 @@ void smc91c9x_device::device_start()
void smc91c9x_device::device_reset()
{
- unsigned char i;
- const unsigned char * mac;
-
- std::fill(m_reg, m_reg + sizeof(m_reg), 0);
+ std::fill(std::begin(m_reg), std::end(m_reg), 0);
- std::fill(m_rx, m_rx + sizeof(m_rx), 0);
- std::fill(m_tx, m_tx + sizeof(m_tx), 0);
+ std::fill(std::begin(m_rx), std::end(m_rx), 0);
+ std::fill(std::begin(m_tx), std::end(m_tx), 0);
- std::fill(m_regmask, m_regmask + sizeof(m_regmask), 0);
+ std::fill(std::begin(m_regmask), std::end(m_regmask), 0);
m_irq_state = 0;
m_alloc_count = 0;
@@ -160,15 +159,14 @@ void smc91c9x_device::device_reset()
osd_list_network_adapters();
- mac = (const unsigned char *)get_mac();
+ unsigned char const *const mac = (const unsigned char *)get_mac();
- if ( LOG_ETHERNET )
+ if (VERBOSE & LOG_GENERAL)
{
logerror("MAC : ");
- for ( i = 0 ; i < ETHERNET_ADDR_SIZE ; i++ )
- {
- logerror("%.2X",mac[i]);
- }
+ for (int i = 0; i < ETHERNET_ADDR_SIZE; i++)
+ logerror("%.2X", mac[i]);
+
logerror("\n");
}
@@ -236,14 +234,14 @@ void smc91c9x_device::clear_tx_fifo()
{
tx_fifo_in = 0;
tx_fifo_out = 0;
- std::fill(m_tx, m_tx + sizeof(m_tx), 0);
+ std::fill(std::begin(m_tx), std::end(m_tx), 0);
}
void smc91c9x_device::clear_rx_fifo()
{
rx_fifo_in = 0;
rx_fifo_out = 0;
- std::fill(m_rx, m_rx + sizeof(m_rx), 0);
+ std::fill(std::begin(m_rx), std::end(m_rx), 0);
}
int smc91c9x_device::is_broadcast(uint8_t mac_address[])
@@ -272,8 +270,7 @@ int smc91c9x_device::ethernet_packet_is_for_me(const uint8_t mac_address[])
int i;
uint8_t local_address[ETHERNET_ADDR_SIZE];
- if ( LOG_ETHERNET )
- logerror("\n");
+ LOG("\n");
local_address[0] = (m_reg[EREG_IA0_1]>>0) & 0xFF;
local_address[1] = (m_reg[EREG_IA0_1]>>8) & 0xFF;
@@ -282,7 +279,7 @@ int smc91c9x_device::ethernet_packet_is_for_me(const uint8_t mac_address[])
local_address[4] = (m_reg[EREG_IA4_5]>>0) & 0xFF;
local_address[5] = (m_reg[EREG_IA4_5]>>8) & 0xFF;
- if ( LOG_ETHERNET )
+ if (VERBOSE & LOG_GENERAL)
{
for ( i = 0 ; i < ETHERNET_ADDR_SIZE ; i++ )
{
@@ -297,22 +294,19 @@ int smc91c9x_device::ethernet_packet_is_for_me(const uint8_t mac_address[])
}
// skip Ethernet broadcast packets if RECV_BROAD is not set
- if ( is_broadcast((uint8_t *)mac_address) )
+ if (is_broadcast((uint8_t *)mac_address))
{
- if ( LOG_ETHERNET )
- logerror(" -- Broadcast rx\n");
+ LOG(" -- Broadcast rx\n");
return 2;
}
if (memcmp(mac_address, local_address, ETHERNET_ADDR_SIZE) == 0)
{
- if ( LOG_ETHERNET )
- logerror(" -- Address Match\n");
+ LOG(" -- Address Match\n");
return 1;
}
- if ( LOG_ETHERNET )
- logerror(" -- Not Matching\n");
+ LOG(" -- Not Matching\n");
return 0;
}
@@ -323,36 +317,28 @@ int smc91c9x_device::ethernet_packet_is_for_me(const uint8_t mac_address[])
void smc91c9x_device::recv_cb(uint8_t *data, int length)
{
- uint8_t *packet;
- int isforme,i,dst;
+ LOG("recv_cb : %d/0x%x\n",length,length);
- if ( LOG_ETHERNET )
- logerror("recv_cb : %d/0x%x\n",length,length);
+ int const isforme = ethernet_packet_is_for_me( data );
- isforme = ethernet_packet_is_for_me( data );
-
- if ( isforme==1 && length >= ETHERNET_ADDR_SIZE && LOG_ETHERNET )
+ if (isforme==1 && (length >= ETHERNET_ADDR_SIZE) && (VERBOSE & LOG_GENERAL))
{
logerror("RX: ");
- for ( i = 0 ; i < ETHERNET_ADDR_SIZE ; i++ )
- {
- logerror("%.2X",data[i]);
- }
+ for (int i = 0; i < ETHERNET_ADDR_SIZE; i++)
+ logerror("%.2X", data[i]);
logerror(" ");
- for ( i = 0 ; i < length-ETHERNET_ADDR_SIZE ; i++ )
- {
- logerror("%.2X",data[ETHERNET_ADDR_SIZE+i]);
- }
+ for (int i = 0; i < length-ETHERNET_ADDR_SIZE; i++)
+ logerror("%.2X", data[ETHERNET_ADDR_SIZE + i]);
- logerror(" - IsForMe %d - %d/0x%x bytes\n",isforme,length,length);
+ logerror(" - IsForMe %d - %d/0x%x bytes\n", isforme, length, length);
}
if ( (length < ETHERNET_ADDR_SIZE || !isforme) && !(m_reg[EREG_RCR] & 0x0100) )
{
- if ( LOG_ETHERNET )
- logerror("\n");
+ LOG("\n");
+
// skip packet
return;
}
@@ -363,11 +349,11 @@ void smc91c9x_device::recv_cb(uint8_t *data, int length)
if ( ( length < ( ETHER_BUFFER_SIZE - ( 2+2+2 ) ) ) )
{
- packet = &m_rx[ ( rx_fifo_in & ( ETHER_RX_BUFFERS - 1 ) ) * ETHER_BUFFER_SIZE];
+ uint8_t *const packet = &m_rx[ ( rx_fifo_in & ( ETHER_RX_BUFFERS - 1 ) ) * ETHER_BUFFER_SIZE];
- std::fill(packet, packet + ETHER_BUFFER_SIZE, 0);
+ std::fill_n(packet, ETHER_BUFFER_SIZE, 0);
- dst = 0;
+ int dst = 0;
// build up the packet
@@ -410,15 +396,14 @@ void smc91c9x_device::recv_cb(uint8_t *data, int length)
rx_fifo_in = (rx_fifo_in + 1) & ( ETHER_RX_BUFFERS - 1 );
}
- else{
- if ( LOG_ETHERNET )
- logerror("Rejected ! Fifo Full ?");
+ else
+ {
+ LOG("Rejected ! Fifo Full ?");
}
update_ethernet_irq();
- if ( LOG_ETHERNET )
- logerror("\n");
+ LOG("\n");
}
/***************************************************************************
@@ -431,14 +416,12 @@ void smc91c9x_device::recv_cb(uint8_t *data, int length)
void smc91c9x_device::update_ethernet_irq()
{
- uint8_t mask = m_reg[EREG_INTERRUPT] >> 8;
- uint8_t state = m_reg[EREG_INTERRUPT] & 0xff;
+ uint8_t const mask = m_reg[EREG_INTERRUPT] >> 8;
+ uint8_t const state = m_reg[EREG_INTERRUPT] & 0xff;
/* update the IRQ state */
m_irq_state = ((mask & state) != 0);
- if ( !m_irq_handler.isnull() ) {
- m_irq_handler(m_irq_state ? ASSERT_LINE : CLEAR_LINE);
- }
+ m_irq_handler(m_irq_state ? ASSERT_LINE : CLEAR_LINE);
}
@@ -459,20 +442,18 @@ void smc91c9x_device::update_stats()
int smc91c9x_device::send_frame()
{
- int i;
- uint8_t * tx_buffer;
- int is_broadcast = (m_tx[4] == 0xff && m_tx[5] == 0xff && m_tx[6] == 0xff &&
+ bool const is_broadcast = (m_tx[4] == 0xff && m_tx[5] == 0xff && m_tx[6] == 0xff &&
m_tx[7] == 0xff && m_tx[8] == 0xff && m_tx[9] == 0xff);
tx_fifo_in = ( tx_fifo_in + 1 ) & ( ETHER_TX_BUFFERS - 1 );
- tx_buffer = &m_tx[(tx_fifo_out & (ETHER_TX_BUFFERS-1))* ETHER_BUFFER_SIZE];
+ uint8_t *const tx_buffer = &m_tx[(tx_fifo_out & (ETHER_TX_BUFFERS-1))* ETHER_BUFFER_SIZE];
tx_fifo_out = ((tx_fifo_out + 1)& (ETHER_TX_BUFFERS-1));
/* update the EPH register and stuff it in the first transmit word */
m_reg[EREG_EPH_STATUS] = 0x0001;
- if ( is_broadcast )
+ if (is_broadcast)
m_reg[EREG_EPH_STATUS] |= 0x0040;
tx_buffer[0] = m_reg[EREG_EPH_STATUS];
@@ -488,33 +469,29 @@ int smc91c9x_device::send_frame()
int buffer_len = ((tx_buffer[3] << 8) | tx_buffer[2]) & 0x7ff;
- if ( LOG_ETHERNET )
+ if (VERBOSE & LOG_GENERAL)
{
logerror("TX: ");
- for ( i = 4 ; i < 4+ETHERNET_ADDR_SIZE ; i++ )
- {
- logerror("%.2X",tx_buffer[i]);
- }
+ for (int i = 4; i < (4 + ETHERNET_ADDR_SIZE); i++)
+ logerror("%.2X", tx_buffer[i]);
logerror(" ");
- for ( i = 0 ; i < buffer_len-(ETHERNET_ADDR_SIZE+4) ; i++ )
- {
- logerror("%.2X",tx_buffer[4+ETHERNET_ADDR_SIZE+i]);
- }
+ for (int i = 0; i < (buffer_len - (ETHERNET_ADDR_SIZE + 4)); i++)
+ logerror("%.2X", tx_buffer[4 + ETHERNET_ADDR_SIZE + i]);
- logerror("--- %d/0x%x bytes\n",buffer_len,buffer_len);
+ logerror("--- %d/0x%x bytes\n", buffer_len, buffer_len);
}
if ( buffer_len > 4 )
{
// odd or even sized frame ?
- if ( tx_buffer[buffer_len-1] & 0x20 )
+ if (tx_buffer[buffer_len-1] & 0x20)
buffer_len--;
else
buffer_len -= 2;
- if ( !(m_reg[EREG_TCR] & 0x2002) )
+ if (!(m_reg[EREG_TCR] & 0x2002))
{
// No loopback... Send the frame
if ( !send(&tx_buffer[4], buffer_len-4) )
@@ -542,13 +519,11 @@ void smc91c9x_device::process_command(uint16_t data)
switch ((data >> 4) & 0xF)
{
case ECMD_NOP:
- if ( LOG_ETHERNET )
- logerror(" NOP\n");
+ LOG(" NOP\n");
break;
case ECMD_ALLOCATE:
- if ( LOG_ETHERNET )
- logerror(" ALLOCATE MEMORY FOR TX (%d)\n", (data & 7));
+ LOG(" ALLOCATE MEMORY FOR TX (%d)\n", (data & 7));
m_reg[EREG_PNR_ARR] &= ~0xff00;
m_reg[EREG_PNR_ARR] |= (m_alloc_count++ & 0x7F) << 8;
m_reg[EREG_INTERRUPT] |= 0x0008;
@@ -563,25 +538,21 @@ void smc91c9x_device::process_command(uint16_t data)
interrupts, resets packet FIFO pointers.
*/
- if ( LOG_ETHERNET )
- logerror(" RESET MMU\n");
+ LOG(" RESET MMU\n");
// Flush fifos.
clear_tx_fifo();
clear_rx_fifo();
break;
case ECMD_REMOVE_TOPFRAME_TX:
- if ( LOG_ETHERNET )
- logerror(" REMOVE FRAME FROM TX FIFO\n");
+ LOG(" REMOVE FRAME FROM TX FIFO\n");
break;
case ECMD_REMOVE_TOPFRAME_RX:
- if ( LOG_ETHERNET )
- logerror(" REMOVE FRAME FROM RX FIFO\n");
+ LOG(" REMOVE FRAME FROM RX FIFO\n");
case ECMD_REMOVE_RELEASE_TOPFRAME_RX:
- if ( LOG_ETHERNET )
- logerror(" REMOVE AND RELEASE FRAME FROM RX FIFO (RXI=%d RXO=%d)\n",rx_fifo_in & ( ETHER_RX_BUFFERS - 1 ),rx_fifo_out & ( ETHER_RX_BUFFERS - 1 ));
+ LOG(" REMOVE AND RELEASE FRAME FROM RX FIFO (RXI=%d RXO=%d)\n", rx_fifo_in & (ETHER_RX_BUFFERS - 1), rx_fifo_out & (ETHER_RX_BUFFERS - 1));
m_reg[EREG_INTERRUPT] &= ~EINT_RCV;
@@ -602,13 +573,11 @@ void smc91c9x_device::process_command(uint16_t data)
break;
case ECMD_RELEASE_PACKET:
- if ( LOG_ETHERNET )
- logerror(" RELEASE SPECIFIC PACKET\n");
+ LOG(" RELEASE SPECIFIC PACKET\n");
break;
case ECMD_ENQUEUE_PACKET:
- if ( LOG_ETHERNET )
- logerror(" ENQUEUE TX PACKET\n");
+ LOG(" ENQUEUE TX PACKET\n");
if ( m_link_unconnected )
{
@@ -650,8 +619,7 @@ void smc91c9x_device::process_command(uint16_t data)
break;
case ECMD_RESET_FIFOS:
- if ( LOG_ETHERNET )
- logerror(" RESET TX FIFOS\n");
+ LOG(" RESET TX FIFOS\n");
// Flush fifos.
clear_tx_fifo();
clear_rx_fifo();
@@ -722,8 +690,8 @@ READ16_MEMBER( smc91c9x_device::read )
}
}
- if ( LOG_ETHERNET && offset != EREG_BANK )
- logerror("%s:smc91c9x_r(%s) = %04X & %04X\n", machine().describe_context(), ethernet_regname[offset], result, mem_mask);
+ if (offset != EREG_BANK)
+ LOG("%s:smc91c9x_r(%s) = %04X & %04X\n", machine().describe_context(), ethernet_regname[offset], result, mem_mask);
return result;
}
@@ -736,13 +704,13 @@ WRITE16_MEMBER( smc91c9x_device::write )
{
/* determine the effective register */
offset %= 8;
- if ( offset != EREG_BANK )
+ if (offset != EREG_BANK)
offset += 8 * (m_reg[EREG_BANK] & 7);
/* update the data generically */
- if ( LOG_ETHERNET && offset != 7 && offset < sizeof(m_reg) )
- logerror("%s:smc91c9x_w(%s) = [%04X]<-%04X & (%04X & %04X)\n", machine().describe_context(), ethernet_regname[offset], offset, data, mem_mask , m_regmask[offset]);
+ if (offset != 7 && offset < sizeof(m_reg))
+ LOG("%s:smc91c9x_w(%s) = [%04X]<-%04X & (%04X & %04X)\n", machine().describe_context(), ethernet_regname[offset], offset, data, mem_mask , m_regmask[offset]);
mem_mask &= m_regmask[offset];
COMBINE_DATA(&m_reg[offset]);
@@ -758,18 +726,15 @@ WRITE16_MEMBER( smc91c9x_device::write )
update_ethernet_irq();
}
- if ( LOG_ETHERNET )
- {
- if ( data & 0x2000 ) logerror(" EPH LOOP\n");
- if ( data & 0x1000 ) logerror(" STP SQET\n");
- if ( data & 0x0800 ) logerror(" FDUPLX\n");
- if ( data & 0x0400 ) logerror(" MON_CSN\n");
- if ( data & 0x0100 ) logerror(" NOCRC\n");
- if ( data & 0x0080 ) logerror(" PAD_EN\n");
- if ( data & 0x0004 ) logerror(" FORCOL\n");
- if ( data & 0x0002 ) logerror(" LOOP\n");
- if ( data & 0x0001 ) logerror(" TXENA\n");
- }
+ if (data & 0x2000) LOG(" EPH LOOP\n");
+ if (data & 0x1000) LOG(" STP SQET\n");
+ if (data & 0x0800) LOG(" FDUPLX\n");
+ if (data & 0x0400) LOG(" MON_CSN\n");
+ if (data & 0x0100) LOG(" NOCRC\n");
+ if (data & 0x0080) LOG(" PAD_EN\n");
+ if (data & 0x0004) LOG(" FORCOL\n");
+ if (data & 0x0002) LOG(" LOOP\n");
+ if (data & 0x0001) LOG(" TXENA\n");
break;
case EREG_RCR: /* receive control register */
@@ -785,55 +750,43 @@ WRITE16_MEMBER( smc91c9x_device::write )
clear_rx_fifo();
}
- if ( LOG_ETHERNET )
- {
- if ( data & 0x8000 ) reset();
- if ( data & 0x8000 ) logerror(" SOFT RST\n");
- if ( data & 0x4000 ) logerror(" FILT_CAR\n");
- if ( data & 0x0200 ) logerror(" STRIP CRC\n");
- if ( data & 0x0100 ) logerror(" RXEN\n");
- if ( data & 0x0004 ) logerror(" ALMUL\n");
- if ( data & 0x0002 ) logerror(" PRMS\n");
- if ( data & 0x0001 ) logerror(" RX_ABORT\n");
- }
+ if (data & 0x8000) reset();
+ if (data & 0x8000) LOG(" SOFT RST\n");
+ if (data & 0x4000) LOG(" FILT_CAR\n");
+ if (data & 0x0200) LOG(" STRIP CRC\n");
+ if (data & 0x0100) LOG(" RXEN\n");
+ if (data & 0x0004) LOG(" ALMUL\n");
+ if (data & 0x0002) LOG(" PRMS\n");
+ if (data & 0x0001) LOG(" RX_ABORT\n");
break;
case EREG_CONFIG: /* configuration register */
- if ( LOG_ETHERNET )
- {
- if ( data & 0x1000 ) logerror(" NO WAIT\n");
- if ( data & 0x0400 ) logerror(" FULL STEP\n");
- if ( data & 0x0200 ) logerror(" SET SQLCH\n");
- if ( data & 0x0100 ) logerror(" AUI SELECT\n");
- if ( data & 0x0080 ) logerror(" 16 BIT\n");
- if ( data & 0x0040 ) logerror(" DIS LINK\n");
- if ( data & 0x0004 ) logerror(" INT SEL1\n");
- if ( data & 0x0002 ) logerror(" INT SEL0\n");
- }
+ if (data & 0x1000) LOG(" NO WAIT\n");
+ if (data & 0x0400) LOG(" FULL STEP\n");
+ if (data & 0x0200) LOG(" SET SQLCH\n");
+ if (data & 0x0100) LOG(" AUI SELECT\n");
+ if (data & 0x0080) LOG(" 16 BIT\n");
+ if (data & 0x0040) LOG(" DIS LINK\n");
+ if (data & 0x0004) LOG(" INT SEL1\n");
+ if (data & 0x0002) LOG(" INT SEL0\n");
break;
case EREG_BASE: /* base address register */
- if ( LOG_ETHERNET )
- {
- logerror(" base = $%04X\n", (data & 0xe000) | ((data & 0x1f00) >> 3));
- logerror(" romsize = %d\n", ((data & 0xc0) >> 6));
- logerror(" romaddr = $%05X\n", ((data & 0x3e) << 13));
- }
+ LOG(" base = $%04X\n", (data & 0xe000) | ((data & 0x1f00) >> 3));
+ LOG(" romsize = %d\n", ((data & 0xc0) >> 6));
+ LOG(" romaddr = $%05X\n", ((data & 0x3e) << 13));
break;
case EREG_CONTROL: /* control register */
- if ( LOG_ETHERNET )
- {
- if ( data & 0x4000 ) logerror(" RCV_BAD\n");
- if ( data & 0x2000 ) logerror(" PWRDN\n");
- if ( data & 0x0800 ) logerror(" AUTO RELEASE\n");
- if ( data & 0x0080 ) logerror(" LE ENABLE\n");
- if ( data & 0x0040 ) logerror(" CR ENABLE\n");
- if ( data & 0x0020 ) logerror(" TE ENABLE\n");
- if ( data & 0x0004 ) logerror(" EEPROM SELECT\n");
- if ( data & 0x0002 ) logerror(" RELOAD\n");
- if ( data & 0x0001 ) logerror(" STORE\n");
- }
+ if (data & 0x4000) LOG(" RCV_BAD\n");
+ if (data & 0x2000) LOG(" PWRDN\n");
+ if (data & 0x0800) LOG(" AUTO RELEASE\n");
+ if (data & 0x0080) LOG(" LE ENABLE\n");
+ if (data & 0x0040) LOG(" CR ENABLE\n");
+ if (data & 0x0020) LOG(" TE ENABLE\n");
+ if (data & 0x0004) LOG(" EEPROM SELECT\n");
+ if (data & 0x0002) LOG(" RELOAD\n");
+ if (data & 0x0001) LOG(" STORE\n");
break;
case EREG_MMU_COMMAND: /* command register */