From fc77338e37b416d1fbf1f17409a81aa8039d3fed Mon Sep 17 00:00:00 2001 From: AJR Date: Thu, 6 May 2021 13:30:47 -0400 Subject: m5074x: Add port pullup configuration --- src/devices/cpu/m6502/m5074x.cpp | 31 ++++++++++++++++--------------- src/devices/cpu/m6502/m5074x.h | 3 ++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/devices/cpu/m6502/m5074x.cpp b/src/devices/cpu/m6502/m5074x.cpp index 46e6fffc9ae..5df0e863a0c 100644 --- a/src/devices/cpu/m6502/m5074x.cpp +++ b/src/devices/cpu/m6502/m5074x.cpp @@ -57,6 +57,7 @@ m5074x_device::m5074x_device(const machine_config &mconfig, device_type type, co m_tmrxlatch(0), m_last_all_ints(0) { + std::fill(std::begin(m_pullups), std::end(m_pullups), 0); } //------------------------------------------------- @@ -315,7 +316,7 @@ uint8_t m5074x_device::ports_r(offs_t offset) return m_ddrs[3]; case 0xa: - return read_port(4); + return read_port(4) & 0x0f; case 0xb: return m_ddrs[4]; @@ -329,53 +330,53 @@ void m5074x_device::ports_w(offs_t offset, uint8_t data) switch (offset) { case 0: // p0 - send_port(0, data & m_ddrs[0]); + send_port(0, (data & m_ddrs[0]) | (m_pullups[0] & ~m_ddrs[0])); m_ports[0] = data; break; case 1: // p0 ddr - send_port(0, m_ports[0] & data); + send_port(0, (m_ports[0] & data) | (m_pullups[0] & ~data)); m_ddrs[0] = data; break; case 2: // p1 - send_port(1, data & m_ddrs[1]); + send_port(1, (data & m_ddrs[1]) | (m_pullups[1] & ~m_ddrs[1])); m_ports[1] = data; break; case 3: // p1 ddr - send_port(1, m_ports[1] & data); + send_port(1, (m_ports[1] & data) | (m_pullups[1] & ~data)); m_ddrs[1] = data; break; case 4: // p2 - send_port(2, data & m_ddrs[2]); + send_port(2, (data & m_ddrs[2]) | (m_pullups[2] & ~m_ddrs[2])); m_ports[2] = data; break; case 5: // p2 ddr - send_port(2, m_ports[2] & data); + send_port(2, (m_ports[2] & data) | (m_pullups[2] & ~data)); m_ddrs[2] = data; break; case 8: // p3 - send_port(3, data & m_ddrs[3]); + send_port(3, (data & m_ddrs[3]) | (m_pullups[3] & ~m_ddrs[3])); m_ports[3] = data; break; case 9: // p3 ddr - send_port(3, m_ports[3] & data); + send_port(3, (m_ports[3] & data) | (m_pullups[3] & ~data)); m_ddrs[3] = data; break; - case 0xa: // p4 - send_port(4, data & m_ddrs[4]); - m_ports[4] = data; + case 0xa: // p4 (4-bit open drain) + send_port(4, (data & m_ddrs[4] & 0x0f) | (m_pullups[4] & ~m_ddrs[4])); + m_ports[4] = data & 0x0f; break; case 0xb: // p4 ddr - send_port(4, m_ports[4] & data); - m_ddrs[4] = data; + send_port(4, (m_ports[4] & data & 0x0f) | (m_pullups[4] & ~data)); + m_ddrs[4] = data & 0x0f; break; } } @@ -496,7 +497,7 @@ void m50753_device::m50753_map(address_map &map) map(0x00e0, 0x00eb).rw(FUNC(m50753_device::ports_r), FUNC(m50753_device::ports_w)); map(0x00ee, 0x00ee).r(FUNC(m50753_device::in_r)); map(0x00ef, 0x00ef).r(FUNC(m50753_device::ad_r)); - map(0x00f2, 0x00f2).w(FUNC(m50753_device::ad_start_w)); + map(0x00f2, 0x00f2).nopr().w(FUNC(m50753_device::ad_start_w)); map(0x00f3, 0x00f3).rw(FUNC(m50753_device::ad_control_r), FUNC(m50753_device::ad_control_w)); map(0x00f5, 0x00f5).rw(FUNC(m50753_device::pwm_control_r), FUNC(m50753_device::pwm_control_w)); map(0x00f9, 0x00ff).rw(FUNC(m50753_device::tmrirq_r), FUNC(m50753_device::tmrirq_w)); diff --git a/src/devices/cpu/m6502/m5074x.h b/src/devices/cpu/m6502/m5074x.h index 8e9a037708a..b7ce310bd6e 100644 --- a/src/devices/cpu/m6502/m5074x.h +++ b/src/devices/cpu/m6502/m5074x.h @@ -40,6 +40,7 @@ public: template auto read_p() { return m_read_p[Bit].bind(); } template auto write_p() { return m_write_p[Bit].bind(); } + template void set_pullups(u8 mask) { m_pullups[Bit] = mask; } uint8_t ports_r(offs_t offset); void ports_w(offs_t offset, uint8_t data); @@ -72,7 +73,7 @@ protected: devcb_read8::array<5> m_read_p; devcb_write8::array<5> m_write_p; - uint8_t m_ports[5], m_ddrs[5]; + uint8_t m_ports[5], m_ddrs[5], m_pullups[5]; uint8_t m_intctrl, m_tmrctrl; uint8_t m_tmr12pre, m_tmr1, m_tmr2, m_tmrxpre, m_tmrx; uint8_t m_tmr1latch, m_tmr2latch, m_tmrxlatch; -- cgit v1.2.3