diff options
Diffstat (limited to 'src/devices/machine/6821pia.cpp')
-rw-r--r-- | src/devices/machine/6821pia.cpp | 32 |
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); } |