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

Attempts to implement interrupt latches and clears.

This commit is contained in:
Thomas Harte
2021-06-18 22:59:41 -04:00
parent 9a0022cfcb
commit 6af6f21868

View File

@@ -106,7 +106,7 @@ class ConcreteMachine:
const auto nick = nick_.last_valid(); const auto nick = nick_.last_valid();
const bool nick_interrupt_line = nick->get_interrupt_line(); const bool nick_interrupt_line = nick->get_interrupt_line();
if(nick_interrupt_line && !previous_nick_interrupt_line_) { if(nick_interrupt_line && !previous_nick_interrupt_line_) {
// TODO: apply interrupt. set_interrupt(Interrupt::Nick, nick_.last_sequence_point_overrun());
} }
previous_nick_interrupt_line_ = nick_interrupt_line; previous_nick_interrupt_line_ = nick_interrupt_line;
} }
@@ -127,8 +127,7 @@ class ConcreteMachine:
case 0xb3: *cycle.value = pages_[3]; break; case 0xb3: *cycle.value = pages_[3]; break;
case 0xb4: case 0xb4:
printf("TODO: interrupt enable/reset read\n"); *cycle.value = interrupt_mask_ | interrupt_state_;
*cycle.value = 0xff;
break; break;
case 0xb5: case 0xb5:
if(active_key_line_ < key_lines_.size()) { if(active_key_line_ < key_lines_.size()) {
@@ -167,7 +166,9 @@ class ConcreteMachine:
break; break;
case 0xb4: case 0xb4:
printf("TODO: interrupt enable/reset write %02x\n", *cycle.value); interrupt_mask_ = *cycle.value & 0x55;
interrupt_state_ &= ~*cycle.value;
update_interrupts();
break; break;
case 0xb5: case 0xb5:
active_key_line_ = *cycle.value & 0xf; active_key_line_ = *cycle.value & 0xf;
@@ -276,6 +277,23 @@ class ConcreteMachine:
key_lines_.fill(0xff); key_lines_.fill(0xff);
} }
// MARK: - Interrupts
// TODO: include an error.
enum class Interrupt: uint8_t {
Nick = 0x20
};
uint8_t interrupt_mask_ = 0x00, interrupt_state_ = 0x00;
void set_interrupt(Interrupt mask, HalfCycles offset = HalfCycles(0)) {
interrupt_state_ |= uint8_t(mask);
update_interrupts(offset);
}
void update_interrupts(HalfCycles offset = HalfCycles(0)) {
z80_.set_interrupt_line((interrupt_state_ >> 1) & interrupt_mask_, offset);
}
// MARK: - Chips. // MARK: - Chips.
CPU::Z80::Processor<ConcreteMachine, false, false> z80_; CPU::Z80::Processor<ConcreteMachine, false, false> z80_;
JustInTimeActor<Nick, HalfCycles, 444923, 125000> nick_; JustInTimeActor<Nick, HalfCycles, 444923, 125000> nick_;