private void UpdateWindow() { if (!this.IsHandleCreated) { return; } btnOk.Enabled = false; btnExecute.Enabled = false; _textVersion++; if (_updating) { return; } _updating = true; string text = txtCode.Text; int version = _textVersion; Task.Run(() => { short[] byteCode = InteropEmu.DebugAssembleCode(text, _startAddress); this.BeginInvoke((Action)(() => { _updating = false; if (_textVersion != version) { UpdateWindow(); } List <byte> convertedByteCode = new List <byte>(); List <ErrorDetail> errorList = new List <ErrorDetail>(); string[] codeLines = text.Replace("\r", "").Split('\n'); int line = 1; foreach (short s in byteCode) { if (s >= 0) { convertedByteCode.Add((byte)s); } else if (s == (int)AssemblerSpecialCodes.EndOfLine) { line++; } else if (s < (int)AssemblerSpecialCodes.EndOfLine) { string message = "unknown error"; switch ((AssemblerSpecialCodes)s) { case AssemblerSpecialCodes.ParsingError: message = "Invalid syntax"; break; case AssemblerSpecialCodes.OutOfRangeJump: message = "Relative jump is out of range (-128 to 127)"; break; case AssemblerSpecialCodes.LabelRedefinition: message = "Cannot redefine an existing label"; break; case AssemblerSpecialCodes.MissingOperand: message = "Operand is missing"; break; case AssemblerSpecialCodes.OperandOutOfRange: message = "Operand is out of range (invalid value)"; break; case AssemblerSpecialCodes.InvalidHex: message = "Hexadecimal string is invalid"; break; case AssemblerSpecialCodes.InvalidSpaces: message = "Operand cannot contain spaces"; break; case AssemblerSpecialCodes.TrailingText: message = "Invalid text trailing at the end of line"; break; case AssemblerSpecialCodes.UnknownLabel: message = "Unknown label"; break; case AssemblerSpecialCodes.InvalidInstruction: message = "Invalid instruction"; break; case AssemblerSpecialCodes.InvalidBinaryValue: message = "Invalid binary value"; break; } errorList.Add(new ErrorDetail() { Message = message + " - " + codeLines[line - 1], LineNumber = line }); line++; } } _hasParsingErrors = errorList.Count > 0; lstErrors.BeginUpdate(); lstErrors.Items.Clear(); lstErrors.Items.AddRange(errorList.ToArray()); lstErrors.EndUpdate(); ctrlHexBox.ByteProvider = new StaticByteProvider(convertedByteCode.ToArray()); UpdateButtons(); })); }); }