Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }
Ejemplo n.º 3
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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
        /// <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);
        }
Ejemplo n.º 6
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 (поиск адресов)
        }
Ejemplo n.º 7
0
        /// <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);
        }
Ejemplo n.º 8
0
 /// <summary>
 /// Удаление региона
 /// </summary>
 /// <param name="region"></param>
 private void RemoveRegion(IntelHexRegion region)
 {
     _regions.Remove(region);
     _regions.Sort();
 }
Ejemplo n.º 9
0
 /// <summary>
 /// Удаление региона
 /// </summary>
 /// <param name="region"></param>
 private void RemoveRegion(IntelHexRegion region)
 {
     _regions.Remove(region);
     _regions.Sort();
 }
Ejemplo n.º 10
0
        /// <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;
        }