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); }
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); }
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); }
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); }
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); }
//Прямая - 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); }
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); }
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); }
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); }