示例#1
0
文件: Cpu.cs 项目: Creou/OISCVM
        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();
                }
            }
        }
示例#2
0
 private void OnSoftwareInterruptTriggered(SoftwareInterruptRequest irq)
 {
     SoftwareInterruptTriggered.SafeTrigger(this, new InterruptEventArgs(irq));
 }
示例#3
0
文件: Cpu.cs 项目: Creou/OISCVM
 private void PopExecutionStack()
 {
     _pc = _interruptReturnAddress.Pop();
     _currentInterrupt = _interruptReturnStack.Pop();
 }