summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-03-08 21:54:19 -0400
committer AJR <ajrhacker@users.noreply.github.com>2020-03-08 21:55:57 -0400
commit81943ce306c9da64723b168f65456afcb7e8fdce (patch)
tree695d1741041ecbd7cd08f9ab12f035e4d88637b2 /src/devices
parent682053d2e1949f0a0237e50d4d0fc13abcd68c2b (diff)
upd7810: Add configuration option to disable port pullups for output (nw)
Diffstat (limited to 'src/devices')
-rw-r--r--src/devices/cpu/upd7810/upd7810.cpp18
-rw-r--r--src/devices/cpu/upd7810/upd7810.h11
2 files changed, 21 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 */