diff options
Diffstat (limited to 'src/devices/machine/dp8390.cpp')
-rw-r--r-- | src/devices/machine/dp8390.cpp | 105 |
1 files changed, 52 insertions, 53 deletions
diff --git a/src/devices/machine/dp8390.cpp b/src/devices/machine/dp8390.cpp index c096bd7d208..af6bf323dd6 100644 --- a/src/devices/machine/dp8390.cpp +++ b/src/devices/machine/dp8390.cpp @@ -3,7 +3,7 @@ #include "emu.h" #include "dp8390.h" -#define DP8390_BYTE_ORDER(w) ((m_regs.dcr & 3) == 3 ? ((data << 8) | (data >> 8)) : data) +#define DP8390_BYTE_ORDER(w) ((m_regs.dcr & 3) == 3 ? swapendian_int16(data) : data) #define LOOPBACK (!(m_regs.dcr & 8) && (m_regs.tcr & 6)) DEFINE_DEVICE_TYPE(DP8390D, dp8390d_device, "dp8390d", "DP8390D NIC") @@ -19,25 +19,20 @@ rtl8019a_device::rtl8019a_device(const machine_config &mconfig, const char *tag, { } -dp8390_device::dp8390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, TYPE variant, float bandwidth) +dp8390_device::dp8390_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, TYPE variant, u32 bandwidth) : device_t(mconfig, type, tag, owner, clock) , device_network_interface(mconfig, *this, bandwidth) , m_variant(variant) , m_irq_cb(*this) , m_breq_cb(*this) - , m_mem_read_cb(*this) + , m_mem_read_cb(*this, 0) , m_mem_write_cb(*this) , m_reset(0) - , m_cs(false) , m_rdma_active(0) { } void dp8390_device::device_start() { - m_irq_cb.resolve_safe(); - m_breq_cb.resolve_safe(); - m_mem_read_cb.resolve_safe(0); - m_mem_write_cb.resolve_safe(); } void dp8390_device::stop() { @@ -131,12 +126,23 @@ void dp8390_device::recv(uint8_t *buf, int len) { high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; if(buf[0] & 1) { if(!memcmp((const char *)buf, "\xff\xff\xff\xff\xff\xff", 6)) { + // broadcast if(!(m_regs.rcr & 4)) return; - } else if (memcmp((const char *)buf, "\x09\x00\x07\xff\xff\xff", 6) != 0) { // not AppleTalk broadcast - return; // multicast + } else { + // multicast + if(!(m_regs.rcr & 8)) return; + unsigned const crc = util::crc32_creator::simple(buf, 6) >> 26; + if(!BIT(m_regs.mar[crc >> 3], crc & 7)) return; } m_regs.rsr = 0x20; - } else m_regs.rsr = 0; + } else if(m_regs.rcr & 0x10) { + // promiscuous + m_regs.rsr = 0; + } else { + // physical + if(memcmp(m_regs.par, buf, 6)) return; + m_regs.rsr = 0; + } len &= 0xffff; for(i = 0; i < len; i++) { @@ -172,33 +178,29 @@ void dp8390_device::recv_cb(uint8_t *buf, int len) { if(!LOOPBACK) recv(buf, len); } -WRITE_LINE_MEMBER(dp8390_device::dp8390_cs) { - m_cs = state; -} - -WRITE_LINE_MEMBER(dp8390_device::dp8390_reset) { +void dp8390_device::dp8390_reset(int state) { if(!state) device_reset(); } -READ16_MEMBER(dp8390_device::dp8390_r) { - uint16_t data; - if(m_cs) { - uint32_t high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; - if(m_regs.dcr & 1) { - m_regs.crda &= ~1; - data = m_mem_read_cb(high16 + m_regs.crda++); - data |= m_mem_read_cb(high16 + m_regs.crda++) << 8; - m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; - check_dma_complete(); - return DP8390_BYTE_ORDER(data); - } else { - m_regs.rbcr -= (m_regs.rbcr)?1:0; - data = m_mem_read_cb(high16 + m_regs.crda++); - check_dma_complete(); - return data; - } +uint16_t dp8390_device::remote_read() { + uint32_t high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; + if(m_regs.dcr & 1) { + m_regs.crda &= ~1; + uint16_t data = m_mem_read_cb(high16 + m_regs.crda++); + data |= m_mem_read_cb(high16 + m_regs.crda++) << 8; + m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; + check_dma_complete(); + return DP8390_BYTE_ORDER(data); + } else { + m_regs.rbcr -= (m_regs.rbcr)?1:0; + uint16_t data = m_mem_read_cb(high16 + m_regs.crda++); + check_dma_complete(); + return data; } +} +uint8_t dp8390_device::cs_read(offs_t offset) { + uint8_t data; switch((offset & 0x0f)|(m_regs.cr & 0xc0)) { case 0x00: case 0x40: @@ -350,26 +352,24 @@ READ16_MEMBER(dp8390_device::dp8390_r) { return data; } -WRITE16_MEMBER(dp8390_device::dp8390_w) { - if(m_cs) { - uint32_t high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; - if(m_regs.dcr & 1) { - data = DP8390_BYTE_ORDER(data); - m_regs.crda &= ~1; - m_mem_write_cb(high16 + m_regs.crda++, data & 0xff); - m_mem_write_cb(high16 + m_regs.crda++, data >> 8); - m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; - check_dma_complete(); - } else { - data &= 0xff; - m_mem_write_cb(high16 + m_regs.crda++, data); - m_regs.rbcr -= (m_regs.rbcr)?1:0; - check_dma_complete(); - } - return; +void dp8390_device::remote_write(uint16_t data) { + uint32_t high16 = (m_regs.dcr & 4)?m_regs.rsar<<16:0; + if(m_regs.dcr & 1) { + data = DP8390_BYTE_ORDER(data); + m_regs.crda &= ~1; + m_mem_write_cb(high16 + m_regs.crda++, data & 0xff); + m_mem_write_cb(high16 + m_regs.crda++, data >> 8); + m_regs.rbcr -= (m_regs.rbcr < 2)?m_regs.rbcr:2; + check_dma_complete(); + } else { + data &= 0xff; + m_mem_write_cb(high16 + m_regs.crda++, data); + m_regs.rbcr -= (m_regs.rbcr)?1:0; + check_dma_complete(); } +} - data &= 0xff; +void dp8390_device::cs_write(offs_t offset, uint8_t data) { switch((offset & 0x0f)|(m_regs.cr & 0xc0)) { case 0x00: case 0x40: @@ -414,7 +414,6 @@ WRITE16_MEMBER(dp8390_device::dp8390_w) { break; case 0x0c: m_regs.rcr = data; - set_promisc((data & 0x10)?true:false); break; case 0x0d: m_regs.tcr = data; @@ -433,7 +432,7 @@ WRITE16_MEMBER(dp8390_device::dp8390_w) { case 0x45: case 0x46: m_regs.par[(offset & 0x7)-1] = data; - set_mac((const char *)m_regs.par); + set_mac(m_regs.par); break; case 0x47: m_regs.curr = data; |