INTEL HEX - Format przesyłania danych


Trochę historii...

      Zanim ludziska wymyślili sposób zapisu danych na dyskach (czytaj, nośnikach magnetycznych), w użyciu był dosyć prosty i niezawodny sposób. Produkowało się taśmę papierową szerokości jednego cala (kto nie wie, to przypomnę, że jest to 25.4mm) i odpowiednio ją dziurkowało. Zazwyczaj było tak: trzy dziurki, dziurka prowadząca i jeszcze cztery dziurki (bez skojarzeń!). Nie będę wgłębiał się w inne szczegóły w każdym razie powstało szereg kodów używanych do dziurkowania taśm. Oto niektóre z nich: format BNPF, format S (firmy Motorola), szesnastkowy format 6502, itd... itp...

      Jak to bywa w informatyce, każdy sobie a użytkownik na końcu. A co tam, i tak zapłaci. Do tego samego wniosku doszła firma INTEL. Specjaliści uznali że to co już jest, jest beeee.... Zatem do dzieła, kij w mrowisko i trochę się namieszało. Tak powstał format zapisu danych znany pod nazwą INTEL HEX.

Używane są dwa formaty tego typu:

  • INTEL 1 (tu opisany), stosowany dla zbioru danych o wielkości poniżej 64kB
  • INTEL 2 stosowany dla zbioru danych o wielkości powyżej 64kB, nazywany też INTEL-Extended
Pora na Telesfora...

      Jak to działa! Dane grupuje się w swego rodzaju paczki, przed każdą z nich daje się nagłówek, na końcu sumę kontrolną i już wszystko może lecieć w świat. Ustalmy wpierw co chcemy zakodować. Aby daleko nie szukać, niech to będą następujące dane, tu podane dziesiętnie!

      01 04 255 47 38 155 30 200 30 12 10 02 03 09

Jak widać, danych jest 14. Format INTEL dopuszcza, by w jednej paczce było do 255 danych. Standardowo przyjmuje się 16. Dla naszego przykładu przyjmiemy, że w paczce jest 8 danych. Nasze dane utworzą dwie paczki, pierwsza zawierać będzie 8 danych, a druga 6. O tym ile danych zawiera paczka, informuje nagłówek, o czym dalej. Zamieńmy nasze dane (dec) na zapis szesnastkowy bo taki akceptowany jest w formacie INTEL HEX. Wszystkie inne informacje zawarte w nagłówku i samą sumę kontrolną też podaje się w zapisie szesnastkowym!

Paczka pierwsza:

      01 04 FF 2F 26 9B 1E C8

      po ścieśnieniu: 0104FF2F269B1EC8
      i druga: 1E0C0A020309

      Pora opisać nagłówek. Rozpoczyna się dwukropkiem. Po dwukropku podaje się liczbę bajtów w paczce i czterocyfrowy adres załadowania paczki danych, a dalej wskaźnik typu zapisu. Jeżeli są to dane, to wskaźnik ma wartość 00, a jeżeli jest to końcowa (bez danych) paczka, to wskaźnik przyjmuje wartość 01. Ta informacja służy jednocześnie do poinformowania urządzeń (procedur) odbierających nadawane dane, że należy zakończyć transmisję, bo wszystkie dane zostały już przesłane. Dla naszego przykładu, nagłówek dla pierwszej paczki wygląda tak, (przy założeniu, że dane ładować będziemy od adresu $8000):

      :08800000

      : - początek paczki
      08 - osiem danych w paczce
      8000 - adres ładowania (MSB, LSB)
      00 - wskaźnik, chodzi o dane

nagłówek drugiej paczki:

      :06800800

      06 - pozostałe 6 danych
      8008 - adres ładowania danych, pierwsze 8 danych zajmuje już adresy od $8000-$8007
      00 - wskaźnik, chodzi o dane

Pozostało jeszcze omówić sposób obliczania sumy kontrolnej. Oblicza się ją następująco:
  • Wszystko co jest po dwukropku, dodaje się do siebie, (szesnastkowo): 10+80+00+00+00+01... itd...
  • Pomijamy powstałe przeniesienie, pod uwagę bierze się tylko dwie ostatnie cyfry!
  • Tak powstały wynik (dwucyfrowy) odejmuje się od liczby 256 (100 HEX).
Wynikiem odejmowania jest szukana suma kontrolna, którą umieszcza się na końcu paczki.

Tego rodzaju obliczenia należy przepro wadzić dla każdej paczki oddzielnie. Z wyliczeń wynika, że suma kontrolna pierwszej paczki wynosi 9E, a drugiej paczki 30. To samo, ale inaczej:

(suma kontrolna + liczba bajtów danych + MSB adresu + LSB adresu + suma bajtów danych) mod 256=0

Ostatni krok, to paczka zamykająca całość. Wygląda tak:

      :00000001FF

      00 - w paczce jest zero danych (jest pusta)
      0000 - adres ładowania, tu bez znaczenia (zawsze 0000)
      01 - wskaźnik, chodzi o końcową już paczkę, która kończy transmisję
      FF - suma kontrolna

Uwaga! Każda paczka, (jak kto woli, linia), kończyć się musi znakiem końca linii. Dla standardu IBM jest to oczywiście znak końca linii w postaci kodów CR+ LF [DEC] (13, 10). Nie mylić z Atarowskim RETURN (kod 155)! Oczywiście, kody te służą tylko do odróżnienia jednej linii, od drugiej (np w czasie druku). Widać, że format INTEL HEX jest najzwyklejszym plikiem tekstowym, w którym dane zostały odpo wiednio uporządkowane. Można zatem "obrabiać" go przy pomocy dowolnego edytora tekstu.

      A oto, ostateczny już końcowy format naszych danych, przygotowanych do przesłania np. łączem RS-232 z jednego komputera do drugiego, rozpoznającego oczywiście format INTEL HEX:

      :088000000104FF2F269B1EC89E
      :068008001E0C0A02030930
      :00000001FF

      Pomimo tego że standardowo przyjmuje się, by w paczce znajdowało się 16 danych, to wcale tak nie musi być. Dla pewnych plików może być tak, że paczka pierwsza zawiera 10 danych, druga 16, trzecia 8, a o tym, ile danych jest w paczce, informuje nagłówek. Procedury odbierające nadawane dane, powinny być zatem tak zbudowane, by uwzględniać ten fakt!

I druga uwaga. W podanym przykładzie adresy ładowania danych stanowią ciąg, ale wcale tak nie musi być. Jeżeli zachodzi taka potrzeba, to np. pierwsza paczka danych może być ładowana pod adres $8000, druga pod $8050, trzecia pod $8020 itd. Jeżeli w paczkach będzie po 8 danych, widać, że zostaną odpowiednio ulokowane w pamięci, w/g inforamcji zawartej w nagłówku. I ten fakt powinny uwzględniać procedury odbioru danych. Zatem, podane niżej nagłówki kolejnych paczek są poprawnie zbudowane, i w takiej kolejności mogą być przesyłane, (łącznie z danymi!):

      :10800000...dane...
      :0A803000...dane...
      :08702000...dane...
       ...itd.

Końcowe podsumowanie, tym razem w pionie :-). Format INTEL HEX:

      : - musi być, początek linii/paczki
      xx - ilość danych (bajtów) do przesłania w jednej paczce (max. FF)
      xxxx - adres ładowania (MSB, LSB)
      xx - 00 linia (paczka) zawiera dane 01 końcowa paczka, bez danych
      xx... - dane w zapisie HEX,
      xx - suma kontrolna (modulo 256) (FF dla ostatniej paczki!)
      xx - dwa znaki końca linii [DEC] (13,10); [HEX] (0D,0A)

      Ktoś zapyta, po co to komu? Odpowiedź jest prosta jak pytanie. Niektóre komputery właśnie w ten sposób przesyłają dane. Warto zatem wiedzieć jak się to odbywa, bo przecież nasza Atarynka może coś takiego odbierać (łączem RS-232) i radzić sobie z formatem INTEL HEX równie dobrze jak jej starsi bracia, w rodzaju PC czy coś podobnego. Format ten, z powodzeniem stosowany jest do przesyłania danych przez jednoukładowe komputerki budowane na wszechwładnym 8051.

Zenon/DIAL