public static DogeILScript Parse(byte[] code)
        {
            List <DogeILOPCall> opCodes = new List <DogeILOPCall>();

            for (int i = 0; i < code.Length; i++)
            {
                DogeILOPCode opCode         = (DogeILOPCode)code[i];
                int          parameterCount = DogeILConstants.GetParameterCount(opCode);
                long[]       parameters     = new long[parameterCount];
                for (int j = 0; j < parameterCount; j++)
                {
                    parameters[j] = BitConverter.ToInt64(code[(i + (j * 4))..(i + (j * 4) + 4)]);
        public static int GetParameterCount(DogeILOPCode code)
        {
            switch (code)
            {
            case DogeILOPCode.Add:
            case DogeILOPCode.Subtract:
            case DogeILOPCode.Multiply:
            case DogeILOPCode.Divide:
            case DogeILOPCode.LogicalAnd:
            case DogeILOPCode.LogicalOr:
            case DogeILOPCode.BinaryAnd:
            case DogeILOPCode.BinaryOr:
            case DogeILOPCode.Xor:
            case DogeILOPCode.LessThan:
            case DogeILOPCode.GreaterThan:
            case DogeILOPCode.LessOrEqualThan:
            case DogeILOPCode.GreaterOrEqualThan:
            case DogeILOPCode.Equal:
            case DogeILOPCode.NotEqual:
                return(3);

            case DogeILOPCode.PutInRegister:
            case DogeILOPCode.PutInMemory:
            case DogeILOPCode.SetRegister:
            case DogeILOPCode.SetMemory:
                return(2);

            case DogeILOPCode.Goto:
                return(1);

            case DogeILOPCode.If:
                return(2);

            default:
                throw new ArgumentOutOfRangeException($"DogeILOPCode {code} is not known");
            }
        }
 public DogeILOPCall(DogeILOPCode opCode, long[] parameters)
 {
     OPCode     = opCode;
     Parameters = parameters;
 }