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; } }