cpu/cpu - Handle halt mode
This commit is contained in:
parent
077f834c28
commit
5cabe03d25
2 changed files with 12 additions and 1 deletions
11
cpu/cpu.cpp
11
cpu/cpu.cpp
|
@ -56,7 +56,10 @@ void Cpu::step()
|
||||||
{
|
{
|
||||||
if(!handleInterrupts()) // if no isr has been called, decode an instruction
|
if(!handleInterrupts()) // if no isr has been called, decode an instruction
|
||||||
{
|
{
|
||||||
executeInstruction();
|
if (halted)
|
||||||
|
processed_mcycles += 4;
|
||||||
|
else
|
||||||
|
executeInstruction();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,6 +80,8 @@ void Cpu::reset()
|
||||||
state.IME = IME_OFF;
|
state.IME = IME_OFF;
|
||||||
state.IE = 0;
|
state.IE = 0;
|
||||||
state.IF = 0;
|
state.IF = 0;
|
||||||
|
|
||||||
|
halted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
u8 Cpu::readPC8()
|
u8 Cpu::readPC8()
|
||||||
|
@ -225,6 +230,10 @@ bool Cpu::handleInterrupts()
|
||||||
// servicable interrupts (assuming IME is on)
|
// servicable interrupts (assuming IME is on)
|
||||||
u8 si = state.IE & state.IF & INT_MASK;
|
u8 si = state.IE & state.IF & INT_MASK;
|
||||||
|
|
||||||
|
// Once there's an interrupt we exit halt mode
|
||||||
|
if (si)
|
||||||
|
halted = false;
|
||||||
|
|
||||||
if (state.IME == IME_SCHEDULED)
|
if (state.IME == IME_SCHEDULED)
|
||||||
state.IME = IME_ON;
|
state.IME = IME_ON;
|
||||||
else if (state.IME == IME_ON && si != 0)
|
else if (state.IME == IME_ON && si != 0)
|
||||||
|
|
|
@ -91,6 +91,8 @@ struct Cpu_state {
|
||||||
u8 IE;
|
u8 IE;
|
||||||
u8 IF;
|
u8 IF;
|
||||||
|
|
||||||
|
bool halted;
|
||||||
|
|
||||||
void setAF(u16 v);
|
void setAF(u16 v);
|
||||||
u16 getAF();
|
u16 getAF();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue