public Instruction(long[] program, string opCode, long p1, long p2, long p3) { _program = program; _opcode = (OpCodeEnum)int.Parse(string.Join("", opCode.TakeLast(2))); var opCodeCharList = opCode.Reverse(); var p1Mode = GetMode(opCodeCharList.Skip(2).FirstOrDefault()); _p1 = new Parameter(p1Mode, p1); if (_opcode == OpCodeEnum.ADD || _opcode == OpCodeEnum.MULTIPLY || _opcode == OpCodeEnum.NONZERO || _opcode == OpCodeEnum.ZERO || _opcode == OpCodeEnum.LESS || _opcode == OpCodeEnum.EQUALS) { var p2Mode = GetMode(opCodeCharList.Skip(3).FirstOrDefault()); _p2 = new Parameter(p2Mode, p2); } if (_opcode == OpCodeEnum.ADD || _opcode == OpCodeEnum.MULTIPLY || _opcode == OpCodeEnum.LESS || _opcode == OpCodeEnum.EQUALS) { var p3Mode = GetMode(opCodeCharList.Skip(4).FirstOrDefault()); _p3 = new Parameter(p3Mode, p3); } }
private int FindNextMatchingOpCode(OpCodeEnum opCode, int index) { while (index < _instructions.Count && _instructions[index].OpCode != opCode) { index++; } return(index < _instructions.Count ? index : -1); }
public bool NotEqual(OpCodeEnum op) { int idx = (int)op; if (op < 0 || idx >= codes.Length) { throw new Exception("Error: idx illegay"); } else { return(this != codes[idx]); } }
public OpCode this[OpCodeEnum codeEnum] { get { int index = (int)codeEnum; if (index < 0 || index >= codes.Length) { return(null); } else { return(codes[index]); } } }
protected OpCode( OpCodeEnum type, byte testFlag, byte setAFlag, OpArgMaskEnum argBMode, OpArgMaskEnum argCMode, OpModeEnum opMode, OPAction action, string name) { this.Type = type; this.TestFlag = testFlag; this.SetAFlag = setAFlag; this.ArgBMode = argBMode; this.ArgCMode = argCMode; this.Action = action; this.OpMode = opMode; this.Name = name; }
private bool SwapAndTest(OpCodeEnum oldOpCode, OpCodeEnum newOpCode, ref int swapIndex) { swapIndex = 0; bool complete = false; // change old opcode to new opcode swapIndex = FindNextMatchingOpCode(oldOpCode, swapIndex); while (swapIndex >= 0 && !complete) { SwapOpCode(swapIndex, newOpCode); if (RunCode() == false) { complete = true; break; } else { SwapOpCode(swapIndex++, oldOpCode); swapIndex = FindNextMatchingOpCode(oldOpCode, swapIndex); } } return(complete); }
public bool Equals(OpCodeEnum op) { return(!NotEqual(op)); }
private void SwapOpCode(int index, OpCodeEnum newOpcode) { _instructions[index].OpCode = newOpcode; }