public Z80(Device d) { _d = d; _cycles = 0; _r = new Registers(); _ime = InterruptMasterEnable.Disabled; _halted = false; }
void Reti() { _ime = InterruptMasterEnable.Enabled; Ret(); }
void Ei() { _ime = InterruptMasterEnable.Enabling; }
void Di() { _ime = InterruptMasterEnable.Disabled; }
public int Step() { _cycles = 0; if (!_halted) { var opcode = DecodeInstruction(); Decode(opcode); } else { InternalDelay(); } if (_d.IRQ.CanServiceInterrupts) { _halted = false; if (_ime == InterruptMasterEnable.Enabled) { if (_d.IRQ.CanHandleInterrupt(InterruptFlags.VBL)) { Restart(0x40); _ime = InterruptMasterEnable.Disabled; _d.IRQ.DisableInterrupt(InterruptFlags.VBL); } else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.STAT)) { Restart(0x48); _ime = InterruptMasterEnable.Disabled; _d.IRQ.DisableInterrupt(InterruptFlags.STAT); } else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Timer)) { Restart(0x50); _ime = InterruptMasterEnable.Disabled; _d.IRQ.DisableInterrupt(InterruptFlags.Timer); } else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Serial)) { Restart(0x58); _ime = InterruptMasterEnable.Disabled; _d.IRQ.DisableInterrupt(InterruptFlags.Serial); } else if (_d.IRQ.CanHandleInterrupt(InterruptFlags.Joypad)) { Restart(0x60); _ime = InterruptMasterEnable.Disabled; _d.IRQ.DisableInterrupt(InterruptFlags.Joypad); } } } if (_cycles >= 4 && _ime == InterruptMasterEnable.Enabling) { _ime = InterruptMasterEnable.Enabled; } return(_cycles); }