Esempio n. 1
0
        private void UpdateWindow()
        {
            if (!this.IsHandleCreated)
            {
                return;
            }

            btnOk.Enabled = false;

            _textVersion++;
            if (_updating)
            {
                return;
            }

            _updating = true;
            string text    = txtCode.Text;
            int    version = _textVersion;

            Task.Run(() => {
                short[] byteCode = DebugApi.AssembleCode(_cpuType, text, (UInt32)_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;

                            case AssemblerSpecialCodes.InvalidOperands: message = "Invalid operands for instruction"; break;

                            case AssemblerSpecialCodes.InvalidLabel: message = "Invalid label name"; 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();
                }));
            });
        }