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