From 2ba0364850d179a1c3afc372baeaff5462285ea8 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Wed, 8 May 2019 15:02:07 -0400 Subject: [PATCH] Adds the shift register interrupt. --- .../Implementation/6522Implementation.hpp | 19 +++++++++++++++++-- .../6522/Implementation/6522Storage.hpp | 1 + 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Components/6522/Implementation/6522Implementation.hpp b/Components/6522/Implementation/6522Implementation.hpp index 9dbdba037..7ae73cabf 100644 --- a/Components/6522/Implementation/6522Implementation.hpp +++ b/Components/6522/Implementation/6522Implementation.hpp @@ -84,7 +84,10 @@ template void MOS6522::set_register(int address, uint8_t value) break; // Shift - case 0xa: registers_.shift = value; break; + case 0xa: + registers_.shift = value; + shift_bits_remaining_ = 8; + break; // Control case 0xb: @@ -175,7 +178,9 @@ template uint8_t MOS6522::get_register(int address) { return registers_.timer[1] & 0x00ff; case 0x9: return registers_.timer[1] >> 8; - case 0xa: return registers_.shift; + case 0xa: + shift_bits_remaining_ = 8; + return registers_.shift; case 0xb: return registers_.auxiliary_control; case 0xc: return registers_.peripheral_control; @@ -363,11 +368,21 @@ template void MOS6522::set_control_line_output(Port port, Line l template void MOS6522::shift_in() { registers_.shift = uint8_t((registers_.shift << 1) | (control_inputs_[1].lines[1] ? 1 : 0)); + --shift_bits_remaining_; + if(!shift_bits_remaining_) { + registers_.interrupt_flags |= InterruptFlag::ShiftRegister; + reevaluate_interrupts(); + } } template void MOS6522::shift_out() { set_control_line_output(Port::B, Line::Two, registers_.shift & 0x80); registers_.shift <<= 1; + --shift_bits_remaining_; + if(!shift_bits_remaining_) { + registers_.interrupt_flags |= InterruptFlag::ShiftRegister; + reevaluate_interrupts(); + } } } diff --git a/Components/6522/Implementation/6522Storage.hpp b/Components/6522/Implementation/6522Storage.hpp index 66fa6e322..2a995c84a 100644 --- a/Components/6522/Implementation/6522Storage.hpp +++ b/Components/6522/Implementation/6522Storage.hpp @@ -50,6 +50,7 @@ class MOS6522Storage { bool timer_is_running_[2] = {false, false}; bool last_posted_interrupt_status_ = false; + int shift_bits_remaining_ = 8; enum InterruptFlag: uint8_t { CA2ActiveEdge = 1 << 0,