Пример #1
0
 public void Write(CoreInteger integer, uint address)
 {
     SetOutput(address, integer.LowByte);
     integer.Write(memory, address);
 }
Пример #2
0
        public void Step()
        {
            var ci = memory.GetInstruction(PC);

            int val = 0;

            if (ci.InRange)
            {
                val = memory.GetCoreInteger(ci.Target);
            }

            int aval = A;

            memory.ResetOutputs();

            tracer?.Invoke(ci.OpCode, ci.Target, A, (uint)val);

            switch (ci.OpCode)
            {
            case OpCode.ADD:
                int result = A + val;
                if (result >= 0xFFFF)
                {
                    CR = true;
                }
                else
                {
                    CR = false;
                }
                A = result;
                break;

            case OpCode.SUB:
                A = A - val;
                break;

            case OpCode.MUL:
                A = A * val;
                break;

            case OpCode.DIV:
                A = A / val;
                break;

            case OpCode.LDA:
                A = val;
                break;

            case OpCode.STA:
                if (ci.InRange)
                {
                    memory.Write(A, ci.Target);
                }
                break;

            case OpCode.JMP:
                if (ci.InRange)
                {
                    PC = ci.Target - 4;
                }
                break;

            case OpCode.CMA:
                if (ci.InRange)
                {
                    var memval = memory.GetCoreInteger(ci.Target);
                    if (A > memval)
                    {
                        CC = Comparison.Greater;
                    }
                    else if (memval == A)
                    {
                        CC = Comparison.Equal;
                    }
                    else
                    {
                        CC = Comparison.Less;
                    }
                }
                else
                {
                    CC = Comparison.Equal;
                }
                break;

            case OpCode.JLT:
                if (ci.InRange && CC == Comparison.Less)
                {
                    PC = ci.Target - 4;
                }
                break;

            case OpCode.JEQ:
                if (ci.InRange && CC == Comparison.Equal)
                {
                    PC = ci.Target - 4;
                }
                break;

            case OpCode.JGT:
                if (ci.InRange && CC == Comparison.Greater)
                {
                    PC = ci.Target - 4;
                }
                break;

            case OpCode.HLT:
                Halted = true;
                break;
            }

            PC += 4;
        }
Пример #3
0
 public Instruction(CoreInteger upper, CoreInteger lower)
 {
     this.upper = upper;
     this.lower = lower;
 }