示例#1
0
            private static DataResponse GetBitArrays(string[] args, CompilerEnvironment env)
            {
                var dataResponse = new DataResponse {
                    lowBitArray  = new BitArray(8),
                    highBitArray = new BitArray(8)
                    {
                        [5] = true,
                        [6] = true
                    }
                };

                if (args[0][0] == '#')
                {
                    int num = CompilerSupport.ConvertToInt(args[0].Substring(1));
                    CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, num, Constants.ShortAddressBitsCount);
                    dataResponse.highBitArray[4] = true;
                    return(dataResponse);
                }

                int address = CompilerSupport.ConvertVariableToAddress(args[0], env);

                if (address == -1)
                {
                    throw new CompilationErrorExcepton($"Переменной с именем {args[0]} не существует.", env.GetCurrentLine());
                }
                CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, address, Constants.ShortAddressBitsCount);
                return(dataResponse);
            }
示例#2
0
            private static void POP(string[] args, CompilerEnvironment env)
            {
                if (args.Length != 1)
                {
                    throw new CompilationErrorExcepton("Оператор POP должен принимать 1 аргумент.", env.GetCurrentLine());
                }
                var r = CompilerSupport.ConvertToRegister(args[0]);

                if (!r.HasValue)
                {
                    throw new CompilationErrorExcepton("Аргументом должен быть регистр.", env.GetCurrentLine());
                }
                var registr = r.Value;

                if (!registr.IsDirect)
                {
                    throw new CompilationErrorExcepton("Адресация регистра должна быть прямой.", env.GetCurrentLine());
                }
                var highBitArray = new BitArray(8)
                {
                    [6] = true,
                    [4] = true,
                    [3] = true,
                    [2] = true,
                    [0] = true
                };
                var lowBitArray = new BitArray(8);

                CompilerSupport.FillBitArray(null, lowBitArray, registr.Number, 4);

                env.SetByte(lowBitArray);
                env.SetByte(highBitArray);
            }
示例#3
0
            private static DataResponse GetBitArrays(string[] args, CompilerEnvironment env)
            {
                int register = CompilerSupport.ConvertToInt(args[0]);

                if (register < 0 || register > 127)
                {
                    throw new CompilationErrorExcepton("Номер регистра должен быть числом от 0 до 127", env.GetCurrentLine());
                }
                int bit = CompilerSupport.ConvertToInt(args[1]);

                if (bit < 0 || bit > 7)
                {
                    throw new CompilationErrorExcepton("Номер бита должен быть числом от 0 до 7", env.GetCurrentLine());
                }
                var dataResponse = new DataResponse {
                    lowBitArray  = new BitArray(8),
                    highBitArray = new BitArray(8)
                    {
                        [7] = true,
                        [5] = true
                    }
                };

                CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, register, 7);
                CompilerSupport.FillBitArray(null, dataResponse.highBitArray, bit, 3);
                return(dataResponse);
            }
示例#4
0
            private static DataResponse GetBitArrays(string[] args, CompilerEnvironment env)
            {
                var dataResponse = new DataResponse {
                    lowBitArray  = new BitArray(8),
                    highBitArray = new BitArray(8)
                    {
                        [7] = true
                    }
                };

                int address = CompilerSupport.ConvertVariableToAddress(args[0], env);

                if (address == -1)
                {
                    throw new CompilationErrorExcepton($"Переменной с именем {args[0]} не существует.", env.GetCurrentLine());
                }
                CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, address, Constants.ShortAddressBitsCount);

                int bit = CompilerSupport.ConvertToInt(args[1]);

                if (bit >= 1 << 3 || bit < 0)
                {
                    throw new CompilationErrorExcepton("Номер бита не должен превышать 7", env.GetCurrentLine());
                }
                CompilerSupport.FillBitArray(null, dataResponse.highBitArray, bit, 3);

                return(dataResponse);
            }
示例#5
0
            private static void DJRNZ(string[] args, CompilerEnvironment env)
            {
                if (args.Length != 2)
                {
                    throw new CompilationErrorExcepton("Оператор DJRNZ должен принимать ровно 2 аргумента.", env.GetCurrentLine());
                }

                var R = CompilerSupport.ConvertToRegister(args[0]);

                if (!R.HasValue)
                {
                    throw new CompilationErrorExcepton("Первым аргументом должен быть регистр.", env.GetCurrentLine());
                }
                var register = R.Value;

                if (!register.IsDirect)
                {
                    throw new CompilationErrorExcepton("В этой команде нельзя использовать косвенную адерсацию.", env.GetCurrentLine());
                }
                if (register.Number > 3)
                {
                    throw new CompilationErrorExcepton("В этой команде можно использовать только первые 4 регистра.", env.GetCurrentLine());
                }
                string L       = args[1];
                int    address = CompilerSupport.ConvertLabelToFarAddress(L, env);

                var lowBitArray  = new BitArray(8);
                var highBitArray = new BitArray(8)
                {
                    [2] = (register.Number & 1) != 0,
                    [3] = (register.Number & 2) != 0,
                    [4] = true
                };

                if (address == -1)
                {
                    var memoryForLabel = new CompilerEnvironment.MemoryForLabel {
                        HighBitArray = highBitArray,
                        LowBitArray  = lowBitArray,
                        Address      = env.CurrentAddress
                    };
                    env.SetCommandWithoutLabel(memoryForLabel, L);
                    return;
                }

                CompilerSupport.FillBitArray(highBitArray, lowBitArray, address, Constants.FarAddressBitsCount);
                env.SetByte(lowBitArray);
                env.SetByte(highBitArray);
            }
示例#6
0
 //Прямая - 000
 //@R     - 100
 //@R+    - 001
 //+@R    - 101
 //@R-    - 011
 //-@R    - 111
 private static DataResponse DataResponseFromRegister(string[] args, string op, CompilerEnvironment env, DataResponse dataResponse, CompilerSupport.Register register)
 {
     dataResponse.highBitArray[6] = true;
     dataResponse.highBitArray[4] = true;
     CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, register.Number, 4);
     if (register.IsDirect)
     {
         //Ничего не делаем
     }
     else if (!register.IsChange)
     {
         dataResponse.lowBitArray[4] = true;
     }
     else if (register.IsPostchange && register.IsIncrement)
     {
         dataResponse.lowBitArray[6] = true;
     }
     else if (register.IsPostchange)
     {
         dataResponse.lowBitArray[5] = true;
         dataResponse.lowBitArray[6] = true;
     }
     else if (register.IsIncrement)
     {
         dataResponse.lowBitArray[6] = true;
         dataResponse.lowBitArray[4] = true;
     }
     else
     {
         dataResponse.lowBitArray[6] = true;
         dataResponse.lowBitArray[5] = true;
         dataResponse.lowBitArray[4] = true;
     }
     if (args.Length != 2)
     {
         return(dataResponse);
     }
     if (args[1] == "1")
     {
         dataResponse.lowBitArray[7] = true;
         return(dataResponse);
     }
     if (args[1] != "0")
     {
         throw new CompilationErrorExcepton($"Вторым аргументом у команды {op} может быть только 0 или 1.", env.GetCurrentLine());
     }
     return(dataResponse);
 }
 /// <summary>
 /// Добавляет метку, ссылающуюся на адрес новой команды. Если существуют команды, использующие эту метку, подставляет ее ад
 /// </summary>
 /// <param name="label">Имя метки.</param>
 public void AddAddressLabelToNewCommand(string label)
 {
     _labels.Add(label, _currentAddress + (_defaultCodeSegment << 8));
     if (!_memoryForLabels.ContainsKey(label))
     {
         return;
     }
     foreach (var memoryForLabel in _memoryForLabels[label])
     {
         CompilerSupport.FillBitArray(memoryForLabel.HighBitArray, memoryForLabel.LowBitArray,
                                      _currentAddress, Constants.FarAddressBitsCount);
         _memory[memoryForLabel.Address]     = memoryForLabel.HighBitArray;
         _memory[memoryForLabel.Address + 1] = memoryForLabel.LowBitArray;
     }
     _memoryForLabels.Remove(label);
 }
示例#8
0
            private static void FillAddressAndSetCommand(BitArray highBitArray, BitArray lowBitArray, string label, CompilerEnvironment env)
            {
                int address = CompilerSupport.ConvertLabelToFarAddress(label, env);

                if (address == -1)
                {
                    var memoryForLabel = new CompilerEnvironment.MemoryForLabel {
                        HighBitArray = highBitArray,
                        LowBitArray  = lowBitArray,
                        Address      = env.CurrentAddress
                    };
                    env.SetCommandWithoutLabel(memoryForLabel, label);
                    return;
                }

                CompilerSupport.FillBitArray(highBitArray, lowBitArray, address, Constants.FarAddressBitsCount);

                env.SetByte(lowBitArray);
                env.SetByte(highBitArray);
            }
示例#9
0
            private static DataResponse GetBitArrays(string[] args, string op, CompilerEnvironment env)
            {
                if (args.Length < 0 || args.Length > 2)
                {
                    throw new CompilationErrorExcepton($"Команда {op} принимает 1 или 2 агрумента.", env.GetCurrentLine());
                }
                var dataResponse = new DataResponse {
                    lowBitArray  = new BitArray(8),
                    highBitArray = new BitArray(8)
                };

                var r = CompilerSupport.ConvertToRegister(args[0]);

                if (r.HasValue)
                {
                    return(DataResponseFromRegister(args, op, env, dataResponse, r.Value));
                }
                if (args.Length == 2)
                {
                    throw new CompilationErrorExcepton($"При работе с оперативной памятью команда {op} принимает только 1 аргумент", env.GetCurrentLine());
                }

                dataResponse.highBitArray[6] = true;
                dataResponse.highBitArray[5] = true;
                if (args[0][0] == '#')
                {
                    int num = CompilerSupport.ConvertToInt(args[0].Substring(1));
                    CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, num, Constants.ShortAddressBitsCount);
                    dataResponse.highBitArray[4] = true;
                }
                else
                {
                    var address = CompilerSupport.ConvertVariableToAddress(args[0], env);
                    CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, address, 8);
                }
                return(dataResponse);
            }
            private static DataResponse GetBitArrays(string[] args, string op, CompilerEnvironment env)
            {
                if (args.Length != 1)
                {
                    throw new CompilationErrorExcepton($"Команда {op} принимает 1 агрумент.", env.GetCurrentLine());
                }
                var dataResponse = new DataResponse {
                    lowBitArray  = new ExtendedBitArray(),
                    highBitArray = new ExtendedBitArray()
                };

                var r = CompilerSupport.ConvertToRegister(args[0]);

                if (r.HasValue)
                {
                    if (r.Value.Number > 7)
                    {
                        throw new CompilationErrorExcepton($"Номер регистра не может быть больше 7.", env.GetCurrentLine());
                    }
                    return(DataResponseFromRegister(args, op, env, dataResponse, r.Value));
                }

                dataResponse.highBitArray[6] = true;
                dataResponse.highBitArray[5] = true;
                if (args[0][0] == '#')
                {
                    int num = CompilerSupport.ConvertToInt(args[0].Substring(1));
                    CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, num, Constants.ShortAddressBitsCount);
                    dataResponse.highBitArray[4] = true;
                }
                else
                {
                    var address = CompilerSupport.ConvertVariableToAddress(args[0], env);
                    CompilerSupport.FillBitArray(null, dataResponse.lowBitArray, address, 8);
                }
                return(dataResponse);
            }
示例#11
0
            private static void MOV(string[] args, CompilerEnvironment env)
            {
                if (args.Length != 2)
                {
                    throw new CompilationErrorExcepton("Оператор MOV должен принимать 2 аргументa.", env.GetCurrentLine());
                }
                var r1 = CompilerSupport.ConvertToRegister(args[0]);
                var r2 = CompilerSupport.ConvertToRegister(args[1]);

                if (!r1.HasValue || !r2.HasValue)
                {
                    throw new CompilationErrorExcepton("Аргументом должен быть регистр.", env.GetCurrentLine());
                }
                var registr1 = r1.Value;
                var registr2 = r2.Value;

                if (!registr1.IsDirect || !registr2.IsDirect)
                {
                    throw new CompilationErrorExcepton("Адресация регистра должна быть прямой.", env.GetCurrentLine());
                }
                var highBitArray = new BitArray(8)
                {
                    [6] = true,
                    [4] = true,
                    [3] = true,
                    [2] = true,
                    [1] = true,
                    [0] = true
                };
                var lowBitArray = new BitArray(8);

                CompilerSupport.FillBitArray(null, lowBitArray, (registr2.Number << 4) + registr1.Number, 8);

                env.SetByte(lowBitArray);
                env.SetByte(highBitArray);
            }