summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/6821pia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/6821pia.cpp')
-rw-r--r--src/devices/machine/6821pia.cpp32
1 files changed, 13 insertions, 19 deletions
diff --git a/src/devices/machine/6821pia.cpp b/src/devices/machine/6821pia.cpp
index 4171b9c6f82..bee109d4d34 100644
--- a/src/devices/machine/6821pia.cpp
+++ b/src/devices/machine/6821pia.cpp
@@ -52,7 +52,7 @@ pia6821_device::pia6821_device(const machine_config &mconfig, const char *tag, d
m_cb2_handler(*this),
m_irqa_handler(*this),
m_irqb_handler(*this), m_in_a(0),
- m_in_ca1(0), m_in_ca2(0), m_out_a(0), m_out_ca2(0), m_port_a_z_mask(0), m_ddr_a(0),
+ m_in_ca1(0), m_in_ca2(0), m_out_a(0), m_out_ca2(0), m_ddr_a(0),
m_ctl_a(0), m_irq_a1(0), m_irq_a2(0),
m_irq_a_state(0), m_in_b(0),
m_in_cb1(0), m_in_cb2(0), m_out_b(0), m_out_cb2(0), m_last_out_cb2_z(0), m_ddr_b(0),
@@ -90,7 +90,6 @@ void pia6821_device::device_start()
save_item(NAME(m_in_ca2));
save_item(NAME(m_out_a));
save_item(NAME(m_out_ca2));
- save_item(NAME(m_port_a_z_mask));
save_item(NAME(m_ddr_a));
save_item(NAME(m_ctl_a));
save_item(NAME(m_irq_a1));
@@ -137,7 +136,6 @@ void pia6821_device::device_reset()
m_in_ca2 = true;
m_out_a = 0;
m_out_ca2 = 0;
- m_port_a_z_mask = 0;
m_ddr_a = 0;
m_ctl_a = 0;
m_irq_a1 = 0;
@@ -226,8 +224,8 @@ uint8_t pia6821_device::get_in_a_value()
}
else
{
- // mark all pins disconnected
- m_port_a_z_mask = 0xff;
+ // assume pins are disconnected and simulate the internal pullups.
+ port_a_data = 0xff;
if (!m_logged_port_a_not_connected && (m_ddr_a != 0xff))
{
@@ -237,12 +235,12 @@ uint8_t pia6821_device::get_in_a_value()
}
}
- // - connected pins are always read
- // - disconnected pins read the output buffer in output mode
- // - disconnected pins are HI in input mode
- ret = (~m_port_a_z_mask & port_a_data) |
- ( m_port_a_z_mask & m_ddr_a & m_out_a) |
- ( m_port_a_z_mask & ~m_ddr_a);
+ // For port A, when the port is in output mode other devices can drive the
+ // pins too. If the device pulls the voltage on the lines enough,a read of
+ // the output register will show the external device value on the driven pins.
+ ret = (~m_ddr_a & port_a_data) // input pins
+ | (m_ddr_a & m_out_a & ~m_a_input_overrides_output_mask) // normal output pins
+ | (m_ddr_a & port_a_data & m_a_input_overrides_output_mask); // overridden output pins
return ret;
}
@@ -888,14 +886,13 @@ void pia6821_device::write(offs_t offset, uint8_t data)
// set_a_input
//-------------------------------------------------
-void pia6821_device::set_a_input(uint8_t data, uint8_t z_mask)
+void pia6821_device::set_a_input(uint8_t data)
{
assert_always(m_in_a_handler.isnull(), "pia6821_device::set_a_input() called when m_in_a_handler set");
LOG("Set PIA input port A = %02X\n", data);
m_in_a = data;
- m_port_a_z_mask = z_mask;
m_in_a_pushed = true;
}
@@ -906,7 +903,7 @@ void pia6821_device::set_a_input(uint8_t data, uint8_t z_mask)
void pia6821_device::write_porta(uint8_t data)
{
- set_a_input(data, 0);
+ set_a_input(data);
}
@@ -916,14 +913,11 @@ void pia6821_device::write_porta(uint8_t data)
void pia6821_device::write_porta_line(int line, bool state)
{
- if (!m_in_a_pushed)
- m_port_a_z_mask = 0xff;
-
uint8_t mask = 1 << line;
if (state)
- set_a_input(m_in_a | mask, m_port_a_z_mask & ~mask);
+ set_a_input(m_in_a | mask);
else
- set_a_input(m_in_a & ~mask, m_port_a_z_mask & ~mask);
+ set_a_input(m_in_a & ~mask);
}