private void HandleInterrupt() { switch (State) { case State.IRQ_READ_IF: _interruptFlag = _addressSpace.GetByte(0xff0f); State = State.IRQ_READ_IE; break; case State.IRQ_READ_IE: _interruptEnabled = _addressSpace.GetByte(0xffff); _requestedIrq = null; foreach (var irq in InterruptManager.InterruptType.Values()) { if ((_interruptFlag & _interruptEnabled & (1 << irq.Ordinal)) != 0) { _requestedIrq = irq; break; } } if (_requestedIrq == null) { State = State.OPCODE; } else { State = State.IRQ_PUSH_1; _interruptManager.ClearInterrupt(_requestedIrq); _interruptManager.DisableInterrupts(false); } break; case State.IRQ_PUSH_1: Registers.DecrementSp(); _addressSpace.SetByte(Registers.SP, (Registers.PC & 0xff00) >> 8); State = State.IRQ_PUSH_2; break; case State.IRQ_PUSH_2: Registers.DecrementSp(); _addressSpace.SetByte(Registers.SP, Registers.PC & 0x00ff); State = State.IRQ_JUMP; break; case State.IRQ_JUMP: Registers.PC = _requestedIrq.Handler; _requestedIrq = null; State = State.OPCODE; break; } }
public void ClearState() { _opcode1 = 0; _opcode2 = 0; CurrentOpcode = null; _ops = null; _operand[0] = 0x00; _operand[1] = 0x00; _operandIndex = 0; _opIndex = 0; _opContext = 0; _interruptFlag = 0; _interruptEnabled = 0; _requestedIrq = null; }