Esempio n. 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;
            }
        }
Esempio n. 2
0
 private static void CopyValues(IAddressSpace addressSpace, int from, int to, int length)
 {
     for (var i = length - 1; i >= 0; i--)
     {
         var b = addressSpace.GetByte(0xfe00 + from + i) % 0xff;
         addressSpace.SetByte(0xfe00 + to + i, b);
     }
 }
Esempio n. 3
0
 public void SetByte(int address, int value)
 {
     if (address == 0xff50)
     {
         _dmgBootstrap = 1;
     }
     else
     {
         _addressSpace.SetByte(address, value);
     }
 }
Esempio n. 4
0
        public void Tick()
        {
            if (!_transferInProgress)
            {
                return;
            }
            if (++_ticks < 648 / _speedMode.GetSpeedMode())
            {
                return;
            }

            _transferInProgress = false;
            _restarted          = false;
            _ticks = 0;

            for (var i = 0; i < 0xa0; i++)
            {
                _oam.SetByte(0xfe00 + i, _addressSpace.GetByte(_from + i));
            }
        }
 public void SetByte(int address, int value) => _addressSpace.SetByte(Translate(address), value);