// // Interrupts.hpp // Clock Signal // // Created by Thomas Harte on 12/12/2024. // Copyright © 2024 Thomas Harte. All rights reserved. // #pragma once #include "../../../Processors/6502/6502.hpp" namespace Commodore::Plus4 { struct Interrupts { public: struct Delegate { virtual void set_irq_line(bool) = 0; }; Interrupts(Delegate &delegate) : delegate_(delegate) {} enum Flag { Timer3 = 0x40, Timer2 = 0x10, Timer1 = 0x08, Raster = 0x02, }; uint8_t status() const { return status_ | ((status_ & mask_) ? 0x80 : 0x00); } uint8_t mask() const { return mask_; } void set_status(const uint8_t status) { status_ = status & 0x7f; update_output(); } void apply(const uint8_t interrupt) { status_ |= interrupt; update_output(); } void set_mask(const uint8_t mask) { mask_ = mask; update_output(); } private: void update_output() { const bool set = status_ & mask_; if(set != last_set_) { delegate_.set_irq_line(set); last_set_ = set; } } Delegate &delegate_; uint8_t status_; uint8_t mask_; bool last_set_ = false; }; }