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 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); }
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); }