summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/dp8390.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/dp8390.cpp')
-rw-r--r--src/devices/machine/dp8390.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/devices/machine/dp8390.cpp b/src/devices/machine/dp8390.cpp
index 2ed12551e78..af6bf323dd6 100644
--- a/src/devices/machine/dp8390.cpp
+++ b/src/devices/machine/dp8390.cpp
@@ -126,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++) {
@@ -403,7 +414,6 @@ void dp8390_device::cs_write(offs_t offset, uint8_t data) {
break;
case 0x0c:
m_regs.rcr = data;
- set_promisc((data & 0x10)?true:false);
break;
case 0x0d:
m_regs.tcr = data;