mirror of
https://github.com/MoleskiCoder/EightBit.git
synced 2024-12-24 21:30:09 +00:00
Merge branch 'master' of https://github.com/MoleskiCoder/EightBit
This commit is contained in:
commit
4f5e231dc4
@ -26,8 +26,7 @@ namespace EightBit {
|
|||||||
|
|
||||||
Signal<Intel8080> ExecutingInstruction;
|
Signal<Intel8080> ExecutingInstruction;
|
||||||
|
|
||||||
bool isInterruptable() const;
|
bool& INT() { return m_interruptLine; }
|
||||||
int interrupt(uint8_t value);
|
|
||||||
|
|
||||||
virtual int execute(uint8_t opcode);
|
virtual int execute(uint8_t opcode);
|
||||||
int step();
|
int step();
|
||||||
@ -38,7 +37,8 @@ namespace EightBit {
|
|||||||
virtual register16_t& HL() override;
|
virtual register16_t& HL() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool m_interrupt;
|
bool m_interruptEnable = false;
|
||||||
|
bool m_interruptLine = false;
|
||||||
InputOutput& m_ports;
|
InputOutput& m_ports;
|
||||||
|
|
||||||
register16_t af;
|
register16_t af;
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
|
|
||||||
EightBit::Intel8080::Intel8080(Bus& bus, InputOutput& ports)
|
EightBit::Intel8080::Intel8080(Bus& bus, InputOutput& ports)
|
||||||
: IntelProcessor(bus),
|
: IntelProcessor(bus),
|
||||||
m_interrupt(false),
|
|
||||||
m_ports(ports) {
|
m_ports(ports) {
|
||||||
bc.word = de.word = hl.word = Mask16;
|
bc.word = de.word = hl.word = Mask16;
|
||||||
}
|
}
|
||||||
@ -27,23 +26,11 @@ EightBit::register16_t& EightBit::Intel8080::HL() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Intel8080::di() {
|
void EightBit::Intel8080::di() {
|
||||||
m_interrupt = false;
|
m_interruptEnable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Intel8080::ei() {
|
void EightBit::Intel8080::ei() {
|
||||||
m_interrupt = true;
|
m_interruptEnable = true;
|
||||||
}
|
|
||||||
|
|
||||||
int EightBit::Intel8080::interrupt(uint8_t value) {
|
|
||||||
if (isInterruptable()) {
|
|
||||||
di();
|
|
||||||
return execute(value);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool EightBit::Intel8080::isInterruptable() const {
|
|
||||||
return m_interrupt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void EightBit::Intel8080::increment(uint8_t& f, uint8_t& operand) {
|
void EightBit::Intel8080::increment(uint8_t& f, uint8_t& operand) {
|
||||||
@ -278,7 +265,17 @@ void EightBit::Intel8080::readPort() {
|
|||||||
int EightBit::Intel8080::step() {
|
int EightBit::Intel8080::step() {
|
||||||
ExecutingInstruction.fire(*this);
|
ExecutingInstruction.fire(*this);
|
||||||
resetCycles();
|
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) {
|
int EightBit::Intel8080::execute(uint8_t opcode) {
|
||||||
|
@ -99,8 +99,6 @@ namespace EightBit {
|
|||||||
fetchWord(MEMPTR());
|
fetchWord(MEMPTR());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual int fetchExecute();
|
|
||||||
|
|
||||||
uint8_t getByte() { return BUS().read(); }
|
uint8_t getByte() { return BUS().read(); }
|
||||||
template<class T> uint8_t getByte(T offset) { return BUS().read(offset); }
|
template<class T> uint8_t getByte(T offset) { return BUS().read(offset); }
|
||||||
|
|
||||||
|
@ -33,9 +33,3 @@ void EightBit::Processor::fetchWord(register16_t& output) {
|
|||||||
output.low = fetchByte();
|
output.low = fetchByte();
|
||||||
output.high = fetchByte();
|
output.high = fetchByte();
|
||||||
}
|
}
|
||||||
|
|
||||||
int EightBit::Processor::fetchExecute() {
|
|
||||||
if (LIKELY(powered()))
|
|
||||||
return execute(fetchByte());
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user