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; } }
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); } }
public void SetByte(int address, int value) { if (address == 0xff50) { _dmgBootstrap = 1; } else { _addressSpace.SetByte(address, value); } }
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);