diff options
Diffstat (limited to 'src/devices/bus/isa/3c503.cpp')
-rw-r--r-- | src/devices/bus/isa/3c503.cpp | 52 |
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); } |