summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/3c503.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/3c503.cpp')
-rw-r--r--src/devices/bus/isa/3c503.cpp52
1 files changed, 28 insertions, 24 deletions
diff --git a/src/devices/bus/isa/3c503.cpp b/src/devices/bus/isa/3c503.cpp
index 34202e2246d..34a9f970740 100644
--- a/src/devices/bus/isa/3c503.cpp
+++ b/src/devices/bus/isa/3c503.cpp
@@ -3,14 +3,16 @@
#include "emu.h"
#include "3c503.h"
+#include "multibyte.h"
+
#define SADDR 0xcc000
void el2_3c503_device::device_add_mconfig(machine_config &config)
{
DP8390D(config, m_dp8390, 0);
m_dp8390->irq_callback().set(FUNC(el2_3c503_device::el2_3c503_irq_w));
- m_dp8390->mem_read_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_r));
- m_dp8390->mem_write_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_w));
+ m_dp8390->mem_read_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_read));
+ m_dp8390->mem_write_callback().set(FUNC(el2_3c503_device::el2_3c503_mem_write));
}
DEFINE_DEVICE_TYPE(EL2_3C503, el2_3c503_device, "el2_3c503", "3C503 Network Adapter")
@@ -24,16 +26,19 @@ el2_3c503_device::el2_3c503_device(const machine_config& mconfig, const char* ta
}
void el2_3c503_device::device_start() {
- char mac[7];
+ uint8_t mac[6];
uint32_t num = machine().rand();
memset(m_prom, 0x57, 16);
- sprintf(mac, "\x02\x60\x8c%c%c%c", (num >> 16) & 0xff, (num >> 8) & 0xff, num & 0xff);
+ mac[0] = 0x02;
+ mac[1] = 0x60;
+ mac[2] = 0x8c;
+ put_u24be(mac+3, num);
memcpy(m_prom, mac, 6);
memset(m_rom, 0, 8*1024); // empty
m_dp8390->set_mac(mac);
set_isa_device();
- m_isa->install_device(0x0300, 0x030f, read8_delegate(FUNC(el2_3c503_device::el2_3c503_loport_r), this), write8_delegate(FUNC(el2_3c503_device::el2_3c503_loport_w), this));
- m_isa->install_device(0x0700, 0x070f, read8_delegate(FUNC(el2_3c503_device::el2_3c503_hiport_r), this), write8_delegate(FUNC(el2_3c503_device::el2_3c503_hiport_w), this));
+ m_isa->install_device(0x0300, 0x030f, read8sm_delegate(*this, FUNC(el2_3c503_device::el2_3c503_loport_r)), write8sm_delegate(*this, FUNC(el2_3c503_device::el2_3c503_loport_w)));
+ m_isa->install_device(0x0700, 0x070f, read8sm_delegate(*this, FUNC(el2_3c503_device::el2_3c503_hiport_r)), write8sm_delegate(*this, FUNC(el2_3c503_device::el2_3c503_hiport_w)));
// TODO: This is wrong, fix if anything actually uses it
// DMA can change in runtime
@@ -48,14 +53,14 @@ void el2_3c503_device::device_start() {
}
void el2_3c503_device::device_reset() {
- memcpy(m_prom, m_dp8390->get_mac(), 6);
+ memcpy(m_prom, &m_dp8390->get_mac()[0], 6);
memset(&m_regs, 0, sizeof(m_regs));
m_regs.bcfr = 0x80; // port 0x300
m_regs.pcfr = 0x20; // address 0xcc000
m_regs.ctrl = 0x0a;
m_irq_state = CLEAR_LINE;
m_isa->unmap_bank(SADDR, SADDR + 0x1fff);
- m_isa->install_bank(SADDR, SADDR + 0x1fff, "3c503 rom", m_rom);
+ m_isa->install_bank(SADDR, SADDR + 0x1fff, m_rom);
}
void el2_3c503_device::set_irq(int state) {
@@ -107,11 +112,10 @@ void el2_3c503_device::dack_w(int line, uint8_t data) {
el2_3c503_mem_write(m_regs.da++, data);
}
-READ8_MEMBER(el2_3c503_device::el2_3c503_loport_r) {
+uint8_t el2_3c503_device::el2_3c503_loport_r(offs_t offset) {
switch((m_regs.ctrl >> 2) & 3) {
case 0:
- m_dp8390->dp8390_cs(CLEAR_LINE);
- return m_dp8390->dp8390_r(space, offset, mem_mask);
+ return m_dp8390->cs_read(offset);
case 1:
return m_prom[offset];
case 2:
@@ -122,11 +126,10 @@ READ8_MEMBER(el2_3c503_device::el2_3c503_loport_r) {
return 0;
}
-WRITE8_MEMBER(el2_3c503_device::el2_3c503_loport_w) {
+void el2_3c503_device::el2_3c503_loport_w(offs_t offset, uint8_t data) {
switch((m_regs.ctrl >> 2) & 3) {
case 0:
- m_dp8390->dp8390_cs(CLEAR_LINE);
- return m_dp8390->dp8390_w(space, offset, data, mem_mask);
+ return m_dp8390->cs_write(offset, data);
case 1:
case 2:
logerror("3c503: invalid attempt to write to prom\n");
@@ -137,7 +140,7 @@ WRITE8_MEMBER(el2_3c503_device::el2_3c503_loport_w) {
}
}
-READ8_MEMBER(el2_3c503_device::el2_3c503_hiport_r) {
+uint8_t el2_3c503_device::el2_3c503_hiport_r(offs_t offset) {
switch(offset) {
case 0:
return m_regs.pstr;
@@ -169,15 +172,15 @@ READ8_MEMBER(el2_3c503_device::el2_3c503_hiport_r) {
return (m_regs.vptr & 0x0f) << 4;
case 14:
if(!(m_regs.ctrl & 0x80)) return 0xff;
- return el2_3c503_mem_r(space, machine().side_effects_disabled() ? m_regs.da : m_regs.da++, mem_mask);
+ return el2_3c503_mem_read(machine().side_effects_disabled() ? m_regs.da : m_regs.da++);
case 15:
if(!(m_regs.ctrl & 0x80)) return 0xff;
- return el2_3c503_mem_r(space, machine().side_effects_disabled() ? m_regs.da : m_regs.da++, mem_mask);
+ return el2_3c503_mem_read(machine().side_effects_disabled() ? m_regs.da : m_regs.da++);
}
return 0;
}
-WRITE8_MEMBER(el2_3c503_device::el2_3c503_hiport_w) {
+void el2_3c503_device::el2_3c503_hiport_w(offs_t offset, uint8_t data) {
switch(offset) {
case 0:
m_regs.pstr = data; // pstr and pspr are supposed to be set same as 8390 pstart and pstop
@@ -193,13 +196,13 @@ WRITE8_MEMBER(el2_3c503_device::el2_3c503_hiport_w) {
m_isa->unmap_bank(SADDR, SADDR + 0x1fff);
switch(data & 0xf) {
case 0:
- m_isa->install_bank(SADDR, SADDR + 0x1fff, "3c503 rom", m_rom);
+ m_isa->install_bank(SADDR, SADDR + 0x1fff, m_rom);
break;
case 9:
- m_isa->install_bank(SADDR, SADDR + 0x1fff, "3c503 ram", m_board_ram);
+ m_isa->install_bank(SADDR, SADDR + 0x1fff, m_board_ram);
break;
default:
- m_isa->install_bank(SADDR, SADDR + 0x1fff, "3c503 no map", m_rom);
+ m_isa->install_bank(SADDR, SADDR + 0x1fff, m_rom);
break;
}
}
@@ -247,6 +250,7 @@ WRITE8_MEMBER(el2_3c503_device::el2_3c503_hiport_w) {
default:
logerror("3c503: trying to set multiple drqs %X\n", data);
}
+ break;
case 9:
if(m_regs.ctrl & 0x80) logerror("3c503: changing dma address during dma is undefined\n");
m_regs.da = (data << 8) | (m_regs.da & 0xff);
@@ -268,18 +272,18 @@ WRITE8_MEMBER(el2_3c503_device::el2_3c503_hiport_w) {
return;
case 14:
if(!(m_regs.ctrl & 0x80)) return;
- el2_3c503_mem_w(space, m_regs.da++, data, mem_mask);
+ el2_3c503_mem_write(m_regs.da++, data);
return;
case 15:
if(!(m_regs.ctrl & 0x80)) return;
- el2_3c503_mem_w(space, m_regs.da++, data, mem_mask);
+ el2_3c503_mem_write(m_regs.da++, data);
return;
default:
logerror("3c503: invalid high register write %02x\n", offset);
}
}
-WRITE_LINE_MEMBER(el2_3c503_device::el2_3c503_irq_w) {
+void el2_3c503_device::el2_3c503_irq_w(int state) {
m_irq_state = state;
if(!(m_regs.gacfr & 0x80)) set_irq(state);
}