1
0
mirror of https://github.com/TomHarte/CLK.git synced 2025-08-08 14:25:05 +00:00

Started filling an appropriate mask variable with the interrupt request status right now. Which is step one towards implementing interrupts.

This commit is contained in:
Thomas Harte
2017-06-01 20:34:52 -04:00
parent aab637c9e7
commit 5b43cefb85

View File

@@ -182,6 +182,14 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
int number_of_cycles_; int number_of_cycles_;
enum Interrupt: uint8_t {
IRQ = 0x01,
NMI = 0x02,
BUSREQ = 0x04,
};
uint8_t request_status_;
bool irq_line_;
uint8_t operation_; uint8_t operation_;
RegisterPair temp16_; RegisterPair temp16_;
uint8_t temp8_; uint8_t temp8_;
@@ -1337,10 +1345,12 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
case MicroOp::EI: case MicroOp::EI:
iff1_ = iff2_ = true; iff1_ = iff2_ = true;
if(irq_line_) request_status_ |= Interrupt::IRQ;
break; break;
case MicroOp::DI: case MicroOp::DI:
iff1_ = iff2_ = false; iff1_ = iff2_ = false;
request_status_ &= ~Interrupt::IRQ;
break; break;
case MicroOp::IM: case MicroOp::IM:
@@ -1570,21 +1580,33 @@ template <class T> class Processor: public MicroOpScheduler<MicroOp> {
} }
/*! /*!
Sets the logical value of the interrupt line at @c time_offset cycles from now. Sets the logical value of the interrupt line.
*/ */
void set_interrupt_line(bool value, int time_offset) { void set_interrupt_line(bool value) {
// IRQ requests are level triggered and masked.
irq_line_ = value;
if(irq_line_ && iff1_) {
request_status_ |= Interrupt::IRQ;
} else {
request_status_ &= ~Interrupt::IRQ;
}
} }
/*! /*!
Sets the logical value of the non-maskable interrupt line at @c time_offset cycles from now. Sets the logical value of the non-maskable interrupt line.
*/ */
void set_non_maskable_interrupt_line(bool value, int time_offset) { void set_non_maskable_interrupt_line(bool value) {
// NMIs are edge triggered and cannot be masked.
if(value) request_status_ |= Interrupt::NMI;
} }
/*! /*!
Sets the logical value of the bus request line at @c time_offset cycles from now. Sets the logical value of the bus request line.
*/ */
void set_bus_request_line(bool value, int time_offset) { void set_bus_request_line(bool value) {
// Bus requests are level triggered and cannot be masked.
if(value) request_status_ |= Interrupt::BUSREQ;
else request_status_ &= ~Interrupt::BUSREQ;
} }
/*! /*!