/// <summary> /// Чтение данных по указанному адресу с заполнением недостающих данных /// </summary> /// <returns></returns> public Byte[] ReadBufferFill(UInt32 addr, int size, Byte fill) { Byte[] data = null; while (size > 0) { // Поиск расположения данных в 64к регионах IntelHexRegion region = SearchRegion(addr); Byte[] block; int readSize; // Регион не существует для текущего адреса if (region != null) { // Чтение данных block = region.ReadFill(addr, size, fill); readSize = block.Length; } else { readSize = (size > IntelHexRegion.REGION_SIZE) ? IntelHexRegion.REGION_SIZE : size; block = Mem.Set(readSize, fill); } // Добавление данных к существующему буферу data = Mem.Concat(data, block); addr += (UInt32)readSize; size -= readSize; } // end while (перебор всего размера) return(data); }
/// <summary> /// Запись данные по указанному адресу /// </summary> public void WriteBuffer(UInt32 addr, Byte[] data) { // Поиск расположения данных в 64к регионах IntelHexRegion region = SearchRegion(addr); // Регион не существует для текущего адреса if (region == null) { // Создание региона region = CreateRegion(addr); } int totalSize = data.Length; int writeSize = region.Write(addr, data); if (writeSize != 0 && writeSize < totalSize) { // Буфер записан не весь: Часть переноситься на другой регион data = Mem.Clone(data, writeSize, totalSize - writeSize); addr += (UInt32)writeSize; // Запись следующего региона WriteBuffer(addr, data); } }
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> private IntelHexRegion CreateRegion(UInt32 addr) { UInt32 baseAddr = MathEx.GetAlignAddr(addr, IntelHexRegion.REGION_SIZE); IntelHexRegion region = new IntelHexRegion(baseAddr); _regions.Add(region); _regions.Sort(); return(region); }
/// <summary> /// Реализация сравнения (по начальному адресу) /// </summary> /// <param name="obj"></param> /// <returns></returns> int IComparable.CompareTo(Object obj) { IntelHexRegion region = (IntelHexRegion)obj; if (this.AddrStart > region.AddrStart) { return(1); } if (this.AddrStart < region.AddrStart) { return(-1); } return(0); }
/// <summary> /// Удаление данных /// </summary> /// <param name="addr"></param> /// <param name="size"></param> public void RemoveBuffer(UInt32 addr, int size) { while (size > 0) { // Поиск расположения данных в 64к регионах IntelHexRegion region = SearchRegion(addr); int removeSize; // Регион не существует для текущего адреса if (region != null) { // Удаление данных из региона removeSize = region.Remove(addr, size); if (removeSize == 0) { // Данных нет для удаления: Переход к следующему региону removeSize = IntelHexRegion.REGION_SIZE; } else { // Данные удалены из региона: Возможно регион тоже нужно удалить // т.к. он может уже не содержать данных if (region.IsEmpty) { RemoveRegion(region); } } } else { // Регион не существует: Переход к следующему адресу через регион removeSize = IntelHexRegion.REGION_SIZE; } size -= removeSize; addr += (UInt32)removeSize; } // end while (поиск адресов) }
/// <summary> /// Чтение данных по указанному адресу /// </summary> public Byte[] ReadBuffer(UInt32 addr, int size, out String error) { error = ""; // Поиск расположения данных в 64к регионах IntelHexRegion region = SearchRegion(addr); // Регион не существует для текущего адреса if (region == null) { error = IntelHexRegion.ErrorAddrText(addr); return(null); } Byte[] data = region.Read(addr, size); // Адрес не существует if (data == null) { return(null); } int readSize = data.Length; if (readSize != 0 && readSize < size) { // Буфер прочитан не весь: Часть переноситься на другой регион addr += (UInt32)readSize; Byte[] remain = ReadBuffer(addr, size - readSize, out error); if (remain == null) { return(null); } data = Mem.Concat(data, remain); } return(data); }
/// <summary> /// Удаление региона /// </summary> /// <param name="region"></param> private void RemoveRegion(IntelHexRegion region) { _regions.Remove(region); _regions.Sort(); }
/// <summary> /// Создание региона для определенного адреса и добавление его в список /// </summary> private IntelHexRegion CreateRegion(UInt32 addr) { UInt32 baseAddr = MathEx.GetAlignAddr(addr, IntelHexRegion.REGION_SIZE); IntelHexRegion region = new IntelHexRegion(baseAddr); _regions.Add(region); _regions.Sort(); return region; }