// Check for interrupts before opcode fetching
u8 IE=memory.high[GBMemory::I_IE];
//logger.trace("IME=", int(IME), " IE=", int(IE));
+
+ // bugfix (blargg test 02-halt): cpu exits from halt state if there is an interrupt flag raised,
+ // even if interrupts are globally disabled
+ u8 IF = memory.high[GBMemory::I_IF];
+ if (HALT && IF) HALT=false;
+
if (IME && IE)
{
- u8 IF = memory.high[GBMemory::I_IF];
//logger.trace("Dispatching interrupts: IE=", int(IE), " IF=", int(IF));
if (IF)
{
IF &= (~IRQ_VBLANK);
do_call(0x40);
logger.trace("VBLANK IRQ");
- HALT=false;
}
else if ((IF & IRQ_LCD_STAT) && (IE & IRQ_LCD_STAT))
{
IF &= (~IRQ_LCD_STAT);
do_call(0x48);
logger.trace("LCD STAT IRQ");
- HALT=false;
}
else if ((IF & IRQ_TIMER) && (IE & IRQ_TIMER))
{
IF &= (~IRQ_TIMER);
do_call(0x50);
logger.trace("TIMER IRQ");
- HALT=false;
}
else if ((IF & IRQ_SERIAL) && (IE & IRQ_SERIAL))
{
IF &= (~IRQ_SERIAL);
do_call(0x58);
logger.trace("SERIAL IRQ");
- HALT=false;
}
else if ((IF & IRQ_JOYPAD) && (IE & IRQ_JOYPAD))
{
IF &= (~IRQ_JOYPAD);
do_call(0x60);
logger.trace("JOYPAD IRQ");
- HALT=false;
}
}
memory.high[GBMemory::I_IF] = IF;