public void Run() { while (_pc >= 0) { Fetch(); Decode(); Execute(); if (_interruptJump.Count > 0) { SoftwareInterruptRequest request = _interruptJump.OrderBy(i=>i.Priority).FirstOrDefault(); if (request != null && (_currentInterrupt == null || (_currentInterrupt.Priority < request.Priority))) { PushExecutionStack(); _interruptJump.Remove(request); _currentInterrupt = request; _pc = request.JumpAddress; } } if (_pc == -1 && _interruptReturnAddress.Count > 0) { PopExecutionStack(); } } }
private void OnSoftwareInterruptTriggered(SoftwareInterruptRequest irq) { SoftwareInterruptTriggered.SafeTrigger(this, new InterruptEventArgs(irq)); }
private void PopExecutionStack() { _pc = _interruptReturnAddress.Pop(); _currentInterrupt = _interruptReturnStack.Pop(); }