Пример #1
0
        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);
            }
        }
Пример #2
0
        private int FindNextMatchingOpCode(OpCodeEnum opCode, int index)
        {
            while (index < _instructions.Count && _instructions[index].OpCode != opCode)
            {
                index++;
            }

            return(index < _instructions.Count ? index : -1);
        }
Пример #3
0
        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]);
            }
        }
Пример #4
0
 public OpCode this[OpCodeEnum codeEnum]
 {
     get
     {
         int index = (int)codeEnum;
         if (index < 0 || index >= codes.Length)
         {
             return(null);
         }
         else
         {
             return(codes[index]);
         }
     }
 }
Пример #5
0
 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;
 }
Пример #6
0
        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);
        }
Пример #7
0
 public bool Equals(OpCodeEnum op)
 {
     return(!NotEqual(op));
 }
Пример #8
0
 private void SwapOpCode(int index, OpCodeEnum newOpcode)
 {
     _instructions[index].OpCode = newOpcode;
 }