Exemple #1
0
        public Boolean Save(String filename, out String error, int width = SAVE_HEX_WIDTH)
        {
            if (Regions.Count == 0)
            {
                error = "Нет регионов с данными"; return(false);
            }

            error = "";
            String result = "";

            // Формирование строк для каждого региона
            for (int i = 0; i < Regions.Count; i++)
            {
                IntelHexRegion region = Regions[i];

                String temp = region.ToText(width);

                result += temp;
            }

            // Добавление записи "Конец файла"
            IntelHexRecord record = IntelHexRecord.EndRecord();

            result += record.Text + "\r\n";

            // Сохранение результата в файл
            Files.WriteText(filename, result);

            return(true);
        }
Exemple #2
0
        /// <summary>
        /// Формирование записи "Конец файла"
        /// </summary>
        public static IntelHexRecord EndRecord()
        {
            // Для расширенного сегмента в поле данных адрес по 64K
            IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.EndFile, null);

            return(record);
        }
Exemple #3
0
        /// <summary>
        /// Формирование записи "Сегмент (расширенный)"
        /// </summary>
        public static IntelHexRecord SegmentRecord(UInt32 addr)
        {
            // Для расширенного сегмента в поле данных адрес по 64K
            UInt16 addrSegment = (UInt16)(addr >> 16);

            Byte[] data = addrSegment.ToBufferEx(Endianess.Big);

            IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.LinearAddr, data);

            return(record);
        }
Exemple #4
0
        public Boolean Load(String filename, out String error)
        {
            error = "";

            _regions = new List <IntelHexRegion>();

            // Проверка существования файла
            if (Files.IsExists(filename) == false)
            {
                error = "Файл не существует"; return(false);
            }

            // Чтение файла
            String text = Files.ReadText(filename);

            if (text == null)
            {
                error = "Ошибка чтения файла"; return(false);
            }

            // Разделение текста на записи (разделитель #13#10)
            String[] lines = text.SplitEx("\r\n");

            if (lines.Length == 0)
            {
                error = "Файл не IntelHex формата"; return(false);
            }

            List <IntelHexRecord> records = new List <IntelHexRecord>();

            // Проверка контрольных суммы записей
            for (int i = 0; i < lines.Length; i++)
            {
                String line = lines[i];

                IntelHexRecord record = new IntelHexRecord(line);

                if (record.IsValid == false)
                {
                    error = String.Format("Неверный формат. Строка {0}", i + 1);

                    return(false);
                }

                records.Add(record);
            }

            // Добавление записей в регионы (с автоматическим созданием регионов)
            UInt32 baseAddr = 0;

            for (int i = 0; i < records.Count; i++)
            {
                IntelHexRecord record = records[i];

                if (record.IsData)
                {
                    // Запись: данные
                    WriteBuffer(baseAddr + record.Addr, record.Data);
                }
                else if (record.IsSegment)
                {
                    // Запись: сегмент -> установка нового базового адреса
                    baseAddr = record.AddrSegment;
                }
            }

            // Проверка
            if (Regions.Count == 0)
            {
                error = String.Format("Не найдено ни одного региона"); return(false);
            }

            // Сортировка регионов по возрастанию адреса
            Regions.Sort();

            return(true);
        }
Exemple #5
0
        /// <summary>
        /// Преобразование региона в текстовое представление
        /// </summary>
        /// <returns></returns>
        public String ToText(int width)
        {
            String result = "";

            // Формирование записи "Регион" (для 0-го адреса описание региона не добавляется)
            if (AddrStart != 0)
            {
                IntelHexRecord recordSegment = IntelHexRecord.SegmentRecord(AddrStart);
                result = recordSegment.Text + "\r\n";
            }

            Byte[]  buffer = new Byte[width];
            int     count  = 0;
            int     addr   = -1;
            Boolean flag   = false;

            for (int i = 0; i < REGION_SIZE; i++)
            {
                if (_present[i] != 0)
                {
                    // Сохранение адреса начала блока
                    if (addr == -1)
                    {
                        addr = i;
                    }
                    // Сохранение байта в буфер
                    buffer[count++] = _buffer[i];

                    if (count >= width || (i == (REGION_SIZE - 1)))
                    {
                        // Набрана строка: Формирование записи
                        flag = true;
                    }
                } // end if (байт присутствует)
                else
                {
                    // Нет данных
                    if (addr != -1)
                    {
                        // Если предыдущие данные были -> Формирование записи
                        flag = true;
                    }
                }

                if (flag)
                {
                    // Набрана строка: Формирование записи
                    flag = false;
                    // Выделение данных из буфера (если количество меньше)
                    Byte[] data = Mem.Clone(buffer, 0, count);
                    // Формирование записи
                    IntelHexRecord recordData = IntelHexRecord.DataRecord((UInt16)addr, data);

                    // Добавление текстового представления к результату
                    result += recordData.Text + "\r\n";

                    // Сброс адреса и счетчика байт
                    addr  = -1;
                    count = 0;
                }
            } // end for (перебор всех байт в регионе)

            return(result);
        }
Exemple #6
0
        /// <summary>
        /// Формирование записи "Данные"
        /// </summary>
        public static IntelHexRecord DataRecord(UInt16 addr, Byte[] data)
        {
            IntelHexRecord record = new IntelHexRecord(addr, IntexHexRecordTyp.Data, data);

            return(record);
        }
Exemple #7
0
        public Boolean Load(String filename, out String error)
        {
            error = "";

            _regions = new List<IntelHexRegion>();

            // Проверка существования файла
            if (Files.IsExists(filename) == false)
            {
                error = "Файл не существует"; return false;
            }

            // Чтение файла
            String text = Files.ReadText(filename);
            if (text == null)
            {
                error = "Ошибка чтения файла"; return false;
            }

            // Разделение текста на записи (разделитель #13#10)
            String[] lines = text.SplitEx("\r\n");

            if (lines.Length == 0)
            {
                error = "Файл не IntelHex формата"; return false;
            }

            List<IntelHexRecord> records = new List<IntelHexRecord>();

            // Проверка контрольных суммы записей
            for (int i = 0; i < lines.Length; i++)
            {
                String line = lines[i];

                IntelHexRecord record = new IntelHexRecord(line);

                if (record.IsValid == false)
                {
                    error = String.Format("Неверный формат. Строка {0}", i + 1);

                    return false;
                }

                records.Add(record);
            }

            // Добавление записей в регионы (с автоматическим созданием регионов)
            UInt32 baseAddr = 0;
            for (int i = 0; i < records.Count; i++)
            {
                IntelHexRecord record = records[i];

                if (record.IsData)
                {
                    // Запись: данные
                    WriteBuffer(baseAddr + record.Addr, record.Data);
                }
                else if (record.IsSegment)
                {
                    // Запись: сегмент -> установка нового базового адреса
                    baseAddr = record.AddrSegment;
                }
            }

            // Проверка
            if (Regions.Count == 0)
            {
                error = String.Format("Не найдено ни одного региона"); return false;
            }

            // Сортировка регионов по возрастанию адреса
            Regions.Sort();

            return true;
        }
Exemple #8
0
        /// <summary>
        /// Формирование записи "Сегмент (расширенный)"
        /// </summary>
        public static IntelHexRecord SegmentRecord(UInt32 addr)
        {
            // Для расширенного сегмента в поле данных адрес по 64K
            UInt16 addrSegment = (UInt16)(addr >> 16);

            Byte[] data = addrSegment.ToBufferEx(Endianess.Big);

            IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.LinearAddr, data);

            return record;
        }
Exemple #9
0
        /// <summary>
        /// Формирование записи "Конец файла"
        /// </summary>
        public static IntelHexRecord EndRecord()
        {
            // Для расширенного сегмента в поле данных адрес по 64K
            IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.EndFile, null);

            return record;
        }
Exemple #10
0
        /// <summary>
        /// Формирование записи "Данные"
        /// </summary>
        public static IntelHexRecord DataRecord(UInt16 addr, Byte[] data)
        {
            IntelHexRecord record = new IntelHexRecord(addr, IntexHexRecordTyp.Data, data);

            return record;
        }