mirror of
https://github.com/TomHarte/CLK.git
synced 2025-02-28 06:29:37 +00:00
69 lines
1.1 KiB
C++
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;
|
|
};
|
|
|
|
}
|