diff options
author | 2014-01-27 21:49:02 +0000 | |
---|---|---|
committer | 2014-01-27 21:49:02 +0000 | |
commit | aedda1342ce96a9b1d0d2c4d92e06af967fd12ef (patch) | |
tree | de8ea3e7dd953c49249d07dea5fd3ac8995a28f7 /src/emu/machine/6522via.c | |
parent | de6bf3dbbf216d3016bafc278938564fb3e17c44 (diff) |
Clears port a and port b latches at startup, temporarily reverted CA1 timing change as Beezer is extremely sensitive to CB2 timing, temporarily prevented port a read handlers from affecting reading back of output bits (real hardware can do this but some handlers are returning 0 for bits that they aren't driving low). [smf]
Diffstat (limited to 'src/emu/machine/6522via.c')
-rw-r--r-- | src/emu/machine/6522via.c | 55 |
1 files changed, 30 insertions, 25 deletions
diff --git a/src/emu/machine/6522via.c b/src/emu/machine/6522via.c index c84bd3b64b5..69dd2f1bd5c 100644 --- a/src/emu/machine/6522via.c +++ b/src/emu/machine/6522via.c @@ -248,10 +248,13 @@ void via6522_device::device_reset() m_out_a = 0; m_out_ca2 = 1; m_ddr_a = 0; + m_latch_a = 0; + m_out_b = 0; m_out_cb1 = 1; m_out_cb2 = 1; m_ddr_b = 0; + m_latch_b = 0; m_t1cl = 0; m_t1ch = 0; @@ -365,29 +368,31 @@ void via6522_device::device_timer(emu_timer &timer, device_timer_id id, int para switch (id) { case TIMER_SHIFT: - m_out_cb1 = !m_out_cb1; + m_out_cb1 = 0; + m_cb1_handler(m_out_cb1); - if (!m_out_cb1 && (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr))) + if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr)) { shift_out(); } - if (m_out_cb1 && (SI_T2_CONTROL(m_acr) || SI_O2_CONTROL(m_acr))) + m_out_cb1 = 1; + m_cb1_handler(m_out_cb1); + + if (SI_T2_CONTROL(m_acr) || SI_O2_CONTROL(m_acr)) { shift_in(); } - m_cb1_handler(m_out_cb1); - - if (SO_T2_RATE(m_acr) || m_shift_counter || !m_out_cb1) + if (SO_T2_RATE(m_acr) || m_shift_counter) { if (SI_O2_CONTROL(m_acr) || SO_O2_CONTROL(m_acr)) { - m_shift_timer->adjust(clocks_to_attotime(1)); + m_shift_timer->adjust(clocks_to_attotime(2)); } else { - m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2)); + m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2)); } } break; @@ -438,17 +443,19 @@ UINT8 via6522_device::input_pa() /// TODO: REMOVE THIS if (!m_in_a_handler.isnull()) { - m_in_a = m_in_a_handler(0); + if (m_ddr_a != 0xff) + m_in_a = m_in_a_handler(0); + + return (m_out_a & m_ddr_a) + (m_in_a & ~m_ddr_a); } - /* combine input and output values */ return m_in_a & (m_out_a | ~m_ddr_a); } void via6522_device::output_pa() { - UINT8 write_data = (m_out_a & m_ddr_a) | ~m_ddr_a; - m_out_a_handler(write_data); + UINT8 pa = (m_out_a & m_ddr_a) | ~m_ddr_a; + m_out_a_handler(pa); } UINT8 via6522_device::input_pb() @@ -459,24 +466,22 @@ UINT8 via6522_device::input_pb() m_in_b = m_in_b_handler(0); } - UINT8 data = (m_in_b & ~m_ddr_b) | (m_out_b & m_ddr_b); + UINT8 pb = (m_out_b & m_ddr_b) + (m_in_b & ~m_ddr_b); if (T1_SET_PB7(m_acr)) - { - data = (data & 0x7f) | (m_t1_pb7 << 7); - } + pb = (pb & 0x7f) | (m_t1_pb7 << 7); - return data; + return pb; } void via6522_device::output_pb() { - UINT8 write_data = (m_out_b & m_ddr_b) | ~m_ddr_b; - + UINT8 pb = (m_out_b & m_ddr_b) | ~m_ddr_b; + if (T1_SET_PB7(m_acr)) - write_data = (write_data & 0x7f) | (m_t1_pb7 << 7); + pb = (pb & 0x7f) | (m_t1_pb7 << 7); - m_out_b_handler(write_data); + m_out_b_handler(pb); } /*------------------------------------------------- @@ -609,11 +614,11 @@ READ8_MEMBER( via6522_device::read ) clear_int(INT_SR); if (SI_O2_CONTROL(m_acr)) { - m_shift_timer->adjust(clocks_to_attotime(1)); + m_shift_timer->adjust(clocks_to_attotime(2)); } if (SI_T2_CONTROL(m_acr)) { - m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2)); + m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2)); } break; @@ -769,11 +774,11 @@ WRITE8_MEMBER( via6522_device::write ) clear_int(INT_SR); if (SO_O2_CONTROL(m_acr)) { - m_shift_timer->adjust(clocks_to_attotime(1)); + m_shift_timer->adjust(clocks_to_attotime(2)); } if (SO_T2_RATE(m_acr) || SO_T2_CONTROL(m_acr)) { - m_shift_timer->adjust(clocks_to_attotime(m_t2ll + 2)); + m_shift_timer->adjust(clocks_to_attotime((m_t2ll + 2)*2)); } break; |