示例#1
0
            public void Cycle()
            {
                OpCode     ins  = (OpCode)Code[PC++];
                List <int> args = new List <int>();

                if (false && ins.HasAttribute <OpWithArgumentAttribute>())
                {
                    OpWithArgumentAttribute a = ins.GetAttribute <OpWithArgumentAttribute>();
                    for (int i = 0; i < a.Arguments; ++i)
                    {
                        args.Add(Code[PC++]);
                    }
                }

                switch (ins)
                {
                case OpCode.LEA_CODE:
                    A = Code[BP + Code[PC++]];
                    break;

                case OpCode.LEA_DATA:
                    A = Data[BP + Code[PC++]];
                    break;

                case OpCode.JMP:
                    PC = Code[PC];
                    break;

                case OpCode.JZ:
                    PC = (A == 0) ? Code[PC] : PC + 1;
                    break;

                case OpCode.JNZ:
                    PC = (A != 0) ? Code[PC] : PC + 1;
                    break;

                case OpCode.PUSH:
                    Stack[--SP] = A;
                    break;

                case OpCode.POP:
                    A = Stack[++SP];
                    break;

                case OpCode.ENTER:
                    Stack[--SP] = BP;
                    BP          = SP;
                    SP         -= Code[PC++];
                    break;

                case OpCode.ADJUST:
                    SP -= Code[PC++];
                    break;

                case OpCode.LEAVE:
                    SP = BP;
                    BP = Stack[SP++];
                    PC = Stack[SP++];
                    break;

                case OpCode.DEBUG3:
                    Console.Write("D3 ");
                    for (int i = 0; i < 3; ++i)
                    {
                        Console.Write("{0}", args[i]);
                    }
                    Console.WriteLine();
                    break;

                case OpCode.DEBUG_STATE:
                    Console.WriteLine("Machine State:");
                    Console.WriteLine(" A: {0}  IP: 0x{1:X}  SP: 0x{2:X}  BP: 0x{3:X}",
                                      A, PC, SP, BP);
                    break;
                }
            }
示例#2
0
        public static byte GetLength(this OpCode p)
        {
            var attr = p.GetAttribute <OpCodeInfoAttribute>();

            return(attr.Length);
        }
示例#3
0
            public static bool HasArgument(this OpCode value)
            {
                var attribute = value.GetAttribute <HasArgumentAttribute>();

                return(attribute != null);
            }