Beispiel #1
0
        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;
            }
        }
Beispiel #2
0
        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;
        }