1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-02-28 06:29:37 +00:00
CLK/Machines/Commodore/Plus4/Interrupts.hpp
2024-12-12 22:07:51 -05:00

69 lines
1.1 KiB
C++

//
// 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;
};
}