From 81943ce306c9da64723b168f65456afcb7e8fdce Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 8 Mar 2020 21:54:19 -0400 Subject: upd7810: Add configuration option to disable port pullups for output (nw) --- src/devices/cpu/upd7810/upd7810.cpp | 18 ++++++++++-------- src/devices/cpu/upd7810/upd7810.h | 11 +++++++++++ src/mame/drivers/korgds8.cpp | 1 + 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/devices/cpu/upd7810/upd7810.cpp b/src/devices/cpu/upd7810/upd7810.cpp index 4e845d4e6e1..251006a1107 100644 --- a/src/devices/cpu/upd7810/upd7810.cpp +++ b/src/devices/cpu/upd7810/upd7810.cpp @@ -425,6 +425,11 @@ upd7810_device::upd7810_device(const machine_config &mconfig, device_type type, , m_pf_out_cb(*this) , m_pt_in_cb(*this) , m_program_config("program", ENDIANNESS_LITTLE, 8, 16, 0, internal_map) + , m_pa_pullups(0xff) + , m_pb_pullups(0xff) + , m_pc_pullups(0xff) + , m_pd_pullups(0xff) + , m_pf_pullups(0xff) { } @@ -659,20 +664,17 @@ void upd7810_device::WP(offs_t port, uint8_t data) { case UPD7810_PORTA: m_pa_out = data; -// data = (data & ~m_ma) | (m_pa_in & m_ma); - data = (data & ~m_ma) | (m_ma); // NS20031401 + data = (data & ~m_ma) | (m_pa_pullups & m_ma); m_pa_out_cb(data); break; case UPD7810_PORTB: m_pb_out = data; -// data = (data & ~m_mb) | (m_pb_in & m_mb); - data = (data & ~m_mb) | (m_mb); // NS20031401 + data = (data & ~m_mb) | (m_pb_pullups & m_mb); m_pb_out_cb(data); break; case UPD7810_PORTC: m_pc_out = data; -// data = (data & ~m_mc) | (m_pc_in & m_mc); - data = (data & ~m_mc) | (m_mc); // NS20031401 + data = (data & ~m_mc) | (m_pc_pullups & m_mc); if (m_mcc & 0x01) /* PC0 = TxD output */ data = (data & ~0x01) | (m_txd & 1 ? 0x01 : 0x00); if (m_mcc & 0x02) /* PC1 = RxD input */ @@ -696,7 +698,7 @@ void upd7810_device::WP(offs_t port, uint8_t data) switch (m_mm & 0x07) { case 0x00: /* PD input mode, PF port mode */ - data = m_pd_in; + data = m_pd_pullups; break; case 0x01: /* PD output mode, PF port mode */ data = m_pd_out; @@ -708,7 +710,7 @@ void upd7810_device::WP(offs_t port, uint8_t data) break; case UPD7810_PORTF: m_pf_out = data; - data = (data & ~m_mf) | (m_pf_in & m_mf); + data = (data & ~m_mf) | (m_pf_pullups & m_mf); switch (m_mm & 0x06) { case 0x00: /* PD input/output mode, PF port mode */ diff --git a/src/devices/cpu/upd7810/upd7810.h b/src/devices/cpu/upd7810/upd7810.h index adb0fe88a8e..6e81369617e 100644 --- a/src/devices/cpu/upd7810/upd7810.h +++ b/src/devices/cpu/upd7810/upd7810.h @@ -69,6 +69,12 @@ public: auto pd_out_cb() { return m_pd_out_cb.bind(); } auto pf_out_cb() { return m_pf_out_cb.bind(); } + void set_pa_pullups(uint8_t p) { m_pa_pullups = p; } + void set_pb_pullups(uint8_t p) { m_pb_pullups = p; } + void set_pc_pullups(uint8_t p) { m_pc_pullups = p; } + void set_pd_pullups(uint8_t p) { m_pd_pullups = p; } + void set_pf_pullups(uint8_t p) { m_pf_pullups = p; } + auto pt_in_cb() { return m_pt_in_cb.bind(); } DECLARE_WRITE8_MEMBER(pa_w); @@ -282,6 +288,11 @@ protected: uint8_t m_pc_out; uint8_t m_pd_out; uint8_t m_pf_out; + uint8_t m_pa_pullups; + uint8_t m_pb_pullups; + uint8_t m_pc_pullups; + uint8_t m_pd_pullups; + uint8_t m_pf_pullups; uint8_t m_cr0; /* analog digital conversion register 0 */ uint8_t m_cr1; /* analog digital conversion register 1 */ uint8_t m_cr2; /* analog digital conversion register 2 */ diff --git a/src/mame/drivers/korgds8.cpp b/src/mame/drivers/korgds8.cpp index e564434afb0..b97ea12c1cb 100644 --- a/src/mame/drivers/korgds8.cpp +++ b/src/mame/drivers/korgds8.cpp @@ -203,6 +203,7 @@ void korg_ds8_state::ds8(machine_config &config) m_maincpu->pc_out_cb().set("lcdc", FUNC(hd44780_device::rs_w)).bit(5); m_maincpu->pc_out_cb().append("lcdc", FUNC(hd44780_device::rw_w)).bit(6); m_maincpu->pc_out_cb().append("lcdc", FUNC(hd44780_device::e_w)).bit(7); + m_maincpu->set_pc_pullups(0x0e); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); // µPD4364 + battery -- cgit v1.2.3