示例#1
0
        public void PcShouldNotAdvance()
        {
            var clock = new Mock <IClock>();

            clock.Setup(x => x.AddConnectedComponent(It.IsAny <IClockConnectedComponent>()));

            var bus         = new Mock <IBus>();
            var controlUnit = new Mock <IControlUnit>();

            ControlLine countEnableLine = new ControlLine(ControlLineId.PC_ENABLE);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_ENABLE)).Returns(countEnableLine);

            ControlLine busOutputLine = new ControlLine(ControlLineId.PC_OUT);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_OUT)).Returns(busOutputLine);

            ControlLine busInputLine = new ControlLine(ControlLineId.PC_IN);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_IN)).Returns(busInputLine);

            var pc = new ProgramCounter(clock.Object, bus.Object, controlUnit.Object);

            byte v1 = pc.Value;

            pc.OnRisingEdge();
            byte v2 = pc.Value;

            Assert.Equal(v1, v2);
        }
示例#2
0
        public void PcReadFromBus()
        {
            byte expectedValue = 0xF0;

            var clock = new Mock <IClock>();

            clock.Setup(x => x.AddConnectedComponent(It.IsAny <IClockConnectedComponent>()));

            var bus = new Mock <IBus>();

            bus.SetupGet(x => x.Value).Returns(expectedValue);

            var controlUnit = new Mock <IControlUnit>();

            ControlLine countEnableLine = new ControlLine(ControlLineId.PC_ENABLE);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_ENABLE)).Returns(countEnableLine);

            ControlLine busOutputLine = new ControlLine(ControlLineId.PC_OUT);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_OUT)).Returns(busOutputLine);

            ControlLine busInputLine = new ControlLine(ControlLineId.PC_IN);

            controlUnit.Setup(x => x.GetControlLine(ControlLineId.PC_IN)).Returns(busInputLine);

            busInputLine.State = true;

            var pc = new ProgramCounter(clock.Object, bus.Object, controlUnit.Object);

            pc.OnRisingEdge();

            Assert.Equal(expectedValue, pc.Value);
        }
示例#3
0
        public void IsSetReturned()
        {
            var pc = new ProgramCounter();

            pc.Set(15);
            Assert.AreEqual(15, pc.Next());
        }
示例#4
0
        // On Re-entrant (i.e while awaiting)
        public NodeRunResult OnAwaiting(ref ProgramCounter pc)
        {
            var input = Console.ReadKey().KeyChar;

            Console.WriteLine();

            // TODO Flesh this out a little more it's a touch error prone
            if (input == '1')
            {
                SelectChild(pc, 0);
                return(NodeRunResult.PushChildN);
            }
            if (input == '2')
            {
                SelectChild(pc, 1);
                return(NodeRunResult.PushChildN);
            }
            if (input == '3')
            {
                SelectChild(pc, 2);
                return(NodeRunResult.PushChildN);
            }
            if (input == 'X' || input == 'x')
            {
                return(NodeRunResult.NextCommand);
            }

            return(NodeRunResult.Await);
        }
示例#5
0
        public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
        {
            var i = 0;

            foreach (var n in Children)
            {
                if (n is OptionNode)
                {
                    var o = n as OptionNode;
                    if (o.RemoveOnSelect && pd.HasRemovedOption(o.Id))
                    {
                    }
                    else
                    {
                        i++;
                        Console.WriteLine(o.Text);
                    }
                }
            }
            // If there are no options return nextnode
            if (i == 0)
            {
                return(NodeRunResult.NextCommand);
            }

            {
                return(OnAwaiting(ref pc));
            }
        }
示例#6
0
        // On Re-entrant (i.e while awaiting)
        public NodeRunResult OnAwaiting(ref ProgramCounter pc)
        {
            var input = Console.ReadKey().KeyChar;

            Console.WriteLine();

            // TODO Flesh this out a little more
            // TODO Mark as remove on selected if flag set
            if (input == '1')
            {
                pc.ReturnRegisterInt32 = 0;
                return(NodeRunResult.PushChildN);
            }
            if (input == '2')
            {
                pc.ReturnRegisterInt32 = 1;
                return(NodeRunResult.PushChildN);
            }
            if (input == '3')
            {
                pc.ReturnRegisterInt32 = 2;
                return(NodeRunResult.PushChildN);
            }
            if (input == 'X' || input == 'x')
            {
                return(NodeRunResult.NextCommand);
            }

            return(NodeRunResult.Await);
        }
示例#7
0
        public void IsSetIncremented()
        {
            var pc = new ProgramCounter();

            pc.Set(15);
            pc.Next();
            Assert.AreEqual(16, pc.Next());
        }
示例#8
0
        public void IsSecondOne()
        {
            var pc = new ProgramCounter();

            pc.Next();

            Assert.AreEqual(1, pc.Next());
        }
示例#9
0
        public Processor(MemoryMap memory)
        {
            this.Memory           = memory;
            instructions          = new InstructionSet();
            extraCodeInstructions = new ExtraCodeInstructionSet();

            // configure registers

            // main registers?
            A  = memory.AddRegister <Accumulator>(0x00);
            L  = memory.AddRegister <ErasableMemory>(0x01);
            Q  = memory.AddRegister <FullRegister>(0x02);
            EB = memory.AddRegister <ErasableBankRegister>(0x03);
            FB = memory.AddRegister <FixedBankRegister>(0x4);
            Z  = memory.AddRegister <ProgramCounter>(0x05);
            BB = memory.AddRegister <BothBanksRegister>(0x06);

            //memory[0x7] = 0; // this is always set to 0, TODO: need to hard code?

            // interrupt helper registers
            ARUPT = memory.AddRegister <ErasableMemory>(0x08);
            LRUPT = memory.AddRegister <ErasableMemory>(0x09);
            QRUPT = memory.AddRegister <ErasableMemory>(0x0A);
            // 0XB, 0XC are spares. not used?
            ZRUPT  = memory.AddRegister <ErasableMemory>(0x0D);
            BBRUPT = memory.AddRegister <ErasableMemory>(0x0E);
            BRUPT  = memory.AddRegister <ErasableMemory>(0x0F);

            // editing registers
            CYR  = memory.AddRegister <CycleRightRegister>(0x10);
            SR   = memory.AddRegister <ShiftRightRegister>(0x11);
            CYL  = memory.GetWord(0x12);
            EDOP = memory.GetWord(0x13);

            // time registers
            TIME2 = memory.GetWord(0x14);
            TIME1 = memory.GetWord(0x15);
            TIME3 = memory.GetWord(0x16);
            TIME4 = memory.GetWord(0x17);
            TIME5 = memory.GetWord(0x18);
            TIME6 = memory.GetWord(0x19);

            // orientation registers
            CDUX  = memory.AddRegister <ErasableMemory>(0x1A);
            CDUY  = memory.AddRegister <ErasableMemory>(0x1B);
            CDUZ  = memory.AddRegister <ErasableMemory>(0x1C);
            OPTY  = memory.AddRegister <ErasableMemory>(0x1D);
            OPTX  = memory.AddRegister <ErasableMemory>(0x1E);
            PIPAX = memory.AddRegister <ErasableMemory>(0x1F);
            PIPAY = memory.AddRegister <ErasableMemory>(0x20);
            PIPAZ = memory.AddRegister <ErasableMemory>(0x21);
            // LM Only Pitch, Yaw, and Roll registers

            INLINK = memory.AddRegister <ErasableMemory>(0x25);

            // prime Z to start at the boot interrupt
            Z.Write(new OnesCompliment(0x800));
        }
示例#10
0
 public Controller(ProgramCounter pcin, Ram ramin, register ain, register bin, Alu aluin, OutputRegister orin)
 {
     pc  = pcin;
     ram = ramin;
     A   = ain;
     B   = bin;
     alu = aluin;
     or  = orin;
 }
        public void CallingMoveScriptWhenNoScriptHasBeenSetUpThrowsAnException()
        {
            var programCounter = new ProgramCounter();

            Action act = () => programCounter.MoveScriptPointer(2);

            act.Should().Throw <Exception>()
            .WithMessage("Program Counter does not have a script.");
        }
示例#12
0
        public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
        {
            if (RemoveOnSelect)
            {
                pd.RemoveOption(this.Id);
            }

            pc.ReturnRegisterInt32 = 0;
            return(NodeRunResult.PushChildN);
        }
        public void ProgramCounterIncrements()
        {
            SignalBus      signals        = new SignalBus();
            ProgramCounter programCounter = new ProgramCounter(null, signals);

            signals.CE = true;

            programCounter.ReadFromBus();

            Assert.AreEqual(1, programCounter.Value);
        }
 public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
 {
     if (pd.HasRunOnceOnly(this.Id))
     {
         return(NodeRunResult.PushChildFalse);
     }
     else
     {
         pd.MarkOnceOnly(this.Id);
         return(NodeRunResult.PushChildTrue);
     }
 }
示例#15
0
 public void Reset()
 {
     InstructionCounter.Reset();
     ProgramCounter.Reset();
     A.Reset();
     B.Reset();
     Flags.Reset();
     Instruction.Reset();
     MemoryAddress.Reset();
     Output.Reset();
     Sum.Reset();
 }
示例#16
0
 public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
 {
     // Console.WriteLine("Node wait: " + Counter);
     if (Counter < WaitTimeMilliseconds)
     {
         Counter += pd.DeltaTime;
         return(NodeRunResult.Await);
     }
     //Console.WriteLine("Node wait done");
     //Thread.Sleep(WaitTimeMilliseconds); // Not good implementation
     return(NodeRunResult.NextCommand);
 }
        public void ProgramCounterWraps()
        {
            SignalBus      signals        = new SignalBus();
            ProgramCounter programCounter = new ProgramCounter(null, signals);

            programCounter.Value = 15;
            signals.CE           = true;

            programCounter.ReadFromBus();

            Assert.AreEqual(0, programCounter.Value);
        }
        public void ProgramCounterOutputs()
        {
            DataBus        bus            = new DataBus();
            SignalBus      signals        = new SignalBus();
            ProgramCounter programCounter = new ProgramCounter(bus, signals);

            programCounter.Value = 15;
            signals.CO           = true;

            programCounter.WriteToBus();

            Assert.AreEqual(15, bus.Value);
        }
示例#19
0
 private void SelectChild(ProgramCounter pc, int index)
 {
     if (index < Children.Count)
     {
         if (Children[index] is OptionNode)
         {
             var c = Children[index] as OptionNode;
             if (c.ReturnOnSelect)
             {
                 this.ReturnOnSelect = true;
             }
         }
         pc.ReturnRegisterInt32 = index;
     }
 }
示例#20
0
 static bool StoreByte(int value)
 {
     if (value > 0xff)
     {
         LogError(currentFileName, null, "Value too big, expeced byte!");
         return(false);
     }
     if (ProgramCounter > 0xffff)
     {
         LogError(currentFileName, null, "Program Counter out of range: " + ProgramCounter.ToString("X4"));
         return(false);
     }
     Memory[ProgramCounter++] = (byte)value;
     return(true);
 }
示例#21
0
        static CPU()
        {
            RegisterFile = new GenericMemory(16);
            DataMemory   = new GenericMemory(16);
            PC           = new ProgramCounter();
            Instructions = new InstructionMemory();
            IsReady      = false;

            _clockCycle = 0;
            _isStalled  = false;

            InstructionQueue   = new Queue <Instruction>();
            AwaitingRegisters  = new HashSet <int>();
            ForwardedRegisters = new Dictionary <int, int>();
        }
示例#22
0
        public void Interrupt(byte interrupt)
        {
            if (InterruptDescriptorTablePointer == null)
            {
#if DEBUG
                Console.WriteLine("Aborted, int: " + interrupt.ToString("X"));
#endif
                Abort();
            }
            else
            {
                ProgramCounter.CallInterrupt(interrupt);
            }

            throw new InterruptSignal(interrupt);
        }
示例#23
0
        private void RunInterrupt(ushort programCounterLocation, int cycles)
        {
            PushToStack((ProgramCounter >> 8).ApplyLowMask());
            PushToStack(ProgramCounter.ApplyLowMask());

            RemoveFlag(CpuFlag.Break);
            SetFlag(CpuFlag.Unused);
            SetFlag(CpuFlag.DisableInterrupts);

            PushToStack((byte)StatusRegister);

            AbsoluteAddress = programCounterLocation;

            SetProgramCounter();

            Cycles = cycles;
        }
示例#24
0
        public Processor(Dictionary <byte, AssemblerInstruction> instructions)
        {
            this.Context       = null;
            RegistersContainer = new Dictionary <byte, IRegister>(RegistersCount);
            InstructionSet     = instructions;

            flags = 0;
            abort = false;

            for (byte r = 0; r < RegistersCount; r++)
            {
                RegistersContainer.Add(r, new Register <T>());
            }

            StackPointer   = new StackPointer(this, new Register <uint>(), 0, 0);
            ProgramCounter = new ProgramCounter <uint>(this, new Register <uint>());
        }
示例#25
0
文件: Processor.cs 项目: KPU-RISC/KPU
 /// <summary>
 /// Displays the current state of the processor.
 /// </summary>
 public void DumpState()
 {
     Console.WriteLine("State:");
     Console.WriteLine("\tProgram Counter: " + ProgramCounter.GetString());
     Console.WriteLine("\tInstruction: " + Instruction.GetString());
     Console.WriteLine("\tOpcode: " + Instruction.GetOpCode().ToString());
     Console.WriteLine("\tA:  " + a.GetString());
     Console.WriteLine("\tB:  " + b.GetString());
     Console.WriteLine("\tC:  " + c.GetString());
     Console.WriteLine("\tD:  " + D.GetString());
     Console.WriteLine("\tE:  " + E.GetString());
     Console.WriteLine("\tF:  " + F.GetString());
     Console.WriteLine("\tG:  " + G.GetString());
     Console.WriteLine("\tH:  " + H.GetString());
     Console.WriteLine("\tXL: " + XL.GetString());
     Console.WriteLine("\tXH: " + XH.GetString());
     Console.WriteLine("");
 }
示例#26
0
        public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
        {
            var i = 0;

            if (ReturnOnSelect)
            {
                // We selected an option which results in a return
            }
            else
            {
                foreach (var n in Children)
                {
                    if (n is OptionNode)
                    {
                        var o = n as OptionNode;


                        // TODO this could be shifted into the compiler at somestage.
                        if (this.RemoveOnSelect == true)
                        {
                            o.RemoveOnSelect = true;
                        }

                        if (o.RemoveOnSelect && pd.HasRemovedOption(o.Id))
                        {
                        }
                        else
                        {
                            i++;
                            Console.WriteLine(o.Text);
                        }
                    }
                }
            }
            // If there are no options return nextnode
            if (i == 0)
            {
                return(NodeRunResult.NextCommand);
            }

            {
                return(OnAwaiting(ref pc));
            }
        }
示例#27
0
 /**
  * @brief Links all the component so they
  *        can be used in micro instructions.
  */
 public void LinkCPUcomponents(
     ProgramCounter PC, MemoryAddressRegister MAR,
     MemoryDataRegister MDR, InstructionRegister IR,
     GeneralPurposeRegisterA GPA, GeneralPurposeRegisterB GPB,
     ProcessStatusRegister PSR,
     MemoryListControl memory, ArithmeticLogicUnit ALU,
     Clock clock, BusControl busSystem)
 {
     this.PC        = PC;
     this.MAR       = MAR;
     this.MDR       = MDR;
     this.IR        = IR;
     this.GPA       = GPA;
     this.GPB       = GPB;
     this.PSR       = PSR;
     this.memory    = memory;
     this.ALU       = ALU;
     this.clock     = clock;
     this.busSystem = busSystem;
 }
示例#28
0
        // TODO The variables need to be added to program data
        public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
        {
            if (pd.ScriptVariableTable.HasVariable(variableId))
            {
                Console.WriteLine("TODO Provide variable");
                var context = new ExpressionContext(new HostSymbolTable()); // TODO This should be provided from somewhere.
                context.scriptVariabeTable = pd.ScriptVariableTable;        // TODO Should be provided


                var result = pd.expressionRunner.Evaluate(expression, context);


                // TODO What if the return value of an expression is expected to be a string?
                pd.ScriptVariableTable.SetVariable(variableId, result.ToString());
            }
            else
            {
                // Error invalid variable (Should never be unknown because should be checked at compiletime.
            }

            return(NodeRunResult.NextCommand);
        }
        public override NodeRunResult Run(ref ProgramCounter pc, ref ProgramData pd)
        {
            Console.WriteLine("TODO Eval Expression");

            var value = true;                                           //pd.ScriptVariableTable.GetValueBool("$bTalked_to_man");

            var context = new ExpressionContext(new HostSymbolTable()); // TODO This should be provided from somewhere.

            context.scriptVariabeTable = pd.ScriptVariableTable;        // TODO Should be provided


            var result = pd.expressionRunner.Evaluate(Expression, context);

            if (result == 1)
            {
                return(NodeRunResult.PushChildTrue);
            }
            else
            {
                return(NodeRunResult.PushChildFalse);
            }
        }
示例#30
0
        public void Clk()
        {
            if (Clock.IsHalted)
            {
                return;
            }

            signals.Reset();

            Operation operation = GetOperation(Instruction.Value);

            operation.Clk();
            InstructionCounter.Clk();

            RAM.WriteToBus();
            Instruction.WriteToBus();
            ProgramCounter.WriteToBus();
            MemoryAddress.WriteToBus();
            Sum.WriteToBus();
            A.WriteToBus();
            B.WriteToBus();
            Flags.WriteToBus();
            Output.WriteToBus();

            RAM.ReadFromBus();
            Instruction.ReadFromBus();
            ProgramCounter.ReadFromBus();
            MemoryAddress.ReadFromBus();
            Sum.ReadFromBus();
            A.ReadFromBus();
            B.ReadFromBus();
            Flags.ReadFromBus();
            Output.ReadFromBus();

            if (signals.HLT)
            {
                Clock.IsHalted = true;
            }
        }