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); }
/// <summary> /// Формирование записи "Конец файла" /// </summary> public static IntelHexRecord EndRecord() { // Для расширенного сегмента в поле данных адрес по 64K IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.EndFile, null); return(record); }
/// <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); }
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); }
/// <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); }
/// <summary> /// Формирование записи "Данные" /// </summary> public static IntelHexRecord DataRecord(UInt16 addr, Byte[] data) { IntelHexRecord record = new IntelHexRecord(addr, IntexHexRecordTyp.Data, data); return(record); }
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; }
/// <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; }
/// <summary> /// Формирование записи "Конец файла" /// </summary> public static IntelHexRecord EndRecord() { // Для расширенного сегмента в поле данных адрес по 64K IntelHexRecord record = new IntelHexRecord(0, IntexHexRecordTyp.EndFile, null); return record; }
/// <summary> /// Формирование записи "Данные" /// </summary> public static IntelHexRecord DataRecord(UInt16 addr, Byte[] data) { IntelHexRecord record = new IntelHexRecord(addr, IntexHexRecordTyp.Data, data); return record; }