diff --git a/Intel8080/inc/Intel8080.h b/Intel8080/inc/Intel8080.h index 092cd13..bebca62 100644 --- a/Intel8080/inc/Intel8080.h +++ b/Intel8080/inc/Intel8080.h @@ -26,8 +26,7 @@ namespace EightBit { Signal ExecutingInstruction; - bool isInterruptable() const; - int interrupt(uint8_t value); + bool& INT() { return m_interruptLine; } virtual int execute(uint8_t opcode); int step(); @@ -38,7 +37,8 @@ namespace EightBit { virtual register16_t& HL() override; private: - bool m_interrupt; + bool m_interruptEnable = false; + bool m_interruptLine = false; InputOutput& m_ports; register16_t af; diff --git a/Intel8080/src/Intel8080.cpp b/Intel8080/src/Intel8080.cpp index 92b039f..2a17c0e 100644 --- a/Intel8080/src/Intel8080.cpp +++ b/Intel8080/src/Intel8080.cpp @@ -3,7 +3,6 @@ EightBit::Intel8080::Intel8080(Bus& bus, InputOutput& ports) : IntelProcessor(bus), - m_interrupt(false), m_ports(ports) { bc.word = de.word = hl.word = Mask16; } @@ -27,23 +26,11 @@ EightBit::register16_t& EightBit::Intel8080::HL() { } void EightBit::Intel8080::di() { - m_interrupt = false; + m_interruptEnable = false; } void EightBit::Intel8080::ei() { - m_interrupt = true; -} - -int EightBit::Intel8080::interrupt(uint8_t value) { - if (isInterruptable()) { - di(); - return execute(value); - } - return 0; -} - -bool EightBit::Intel8080::isInterruptable() const { - return m_interrupt; + m_interruptEnable = true; } void EightBit::Intel8080::increment(uint8_t& f, uint8_t& operand) { @@ -278,7 +265,17 @@ void EightBit::Intel8080::readPort() { int EightBit::Intel8080::step() { ExecutingInstruction.fire(*this); resetCycles(); - return fetchExecute(); + if (LIKELY(powered())) { + uint8_t instruction; + if (UNLIKELY(INT() && m_interruptEnable)) { + INT() = false; + di(); + instruction = BUS().DATA(); + } else { + instruction = fetchByte(); + } + return execute(instruction); + } } int EightBit::Intel8080::execute(uint8_t opcode) { diff --git a/inc/Processor.h b/inc/Processor.h index 46c0b12..6fdd763 100644 --- a/inc/Processor.h +++ b/inc/Processor.h @@ -99,8 +99,6 @@ namespace EightBit { fetchWord(MEMPTR()); } - virtual int fetchExecute(); - uint8_t getByte() { return BUS().read(); } template uint8_t getByte(T offset) { return BUS().read(offset); } diff --git a/src/Processor.cpp b/src/Processor.cpp index be1c117..f692162 100644 --- a/src/Processor.cpp +++ b/src/Processor.cpp @@ -33,9 +33,3 @@ void EightBit::Processor::fetchWord(register16_t& output) { output.low = fetchByte(); output.high = fetchByte(); } - -int EightBit::Processor::fetchExecute() { - if (LIKELY(powered())) - return execute(fetchByte()); - return 0; -}