:Revision=3
:html
<<
128.174
HexFile-Objekt|HexFile
$NoSort
--
Das IP-Objekt <!RW>HexFile erleichtert den Zugriff auf Dateien im Intel-Hex oder Motorola-S-Record Format. 

Prinzipiell knnten diese Dateien durch Filezugriff mit dem IP-Objekt <!RW>FILE bearbeitet werden. <!RW>HexFile vereinfacht den Zugriff jedoch, da die Dekodierung automatisch durchgefhrt wird und direkt die Daten und Adressen abgeholt werden knnen.

Eine Erweiterung um andere Hex-Formate ist bei Bedarf mglich.
Ein Hex-File wird auf einmal eingelesen und bei Erfolg knnen die einzelnen Datenstze (die Zeilen) einzeln fortlaufend abgeholt werden.
>>

<<
128.174.1
Funktionen des HexFile-Objekts|Funktionen
--
>>
<<
128.174.1.1
HexFile.EOF|EOF
--
<!DEF>
function <!TW>HexFile.EOF : real;
<!TXT>
Liefert <!RW>TRUE, wenn das Ende des Hex-Files erreicht wurde, also, wenn der letzte Datensatz abgeholt wurde.
>>
<<
128.174.1.2
HexFile.Error|Error
!128.174.3 - Fehlercodes
!128.174.1.5 - Line
--
<!DEF>
function <!TW>HexFile.Error : real;
<!TXT>
Liefert das Ergebnis der letzten <!RW>HexFile.Open-Aktion.
>>
<<
128.174.1.3
HexFile.Data|Data
--
<!DEF>
function <!TW>HexFile.Data : vector;
<!TXT>
Liefert den aktuellen Datensatz als Vektor. Wenn das <!RW>EOF erreicht ist, so ist der Vektor leer.

Die Adresse, zu der das erste Byte des Vektors gehrt kann mit <!RW>HexFile.Address abgeholt werden.
>>
<<
128.174.1.4
HexFile.Address|Address
--
<!DEF>
function <!TW>HexFile.Address : real;
<!TXT>
Liefert die Adresse des ersten Bytes des aktuellen Datensatzes. Wenn das <!RW>EOF erreicht ist, so ist das Ergebnis immer 0.

Der Datensatz, dessen erstes Byte zu dieser Adresse gehrt kann mit <!RW>HexFile.Data abgeholt werden.
>>
<<
128.174.1.5
HexFile.Line|Line
!128.174.3 - Fehlercodes
!128.174.2 - Error
--
<!DEF>
function <!TW>HexFile.Line : real;
<!TXT>
Liefert die Nummer der Zeile, in der bei <!RW>Hexfile.Open ein Fehler aufgetreten ist.

Sonderflle:
<!STBL>
<!>-1<!>kein Fehler<!>
<!>0<!>Datei leer/nicht gefunden<!>
<!ETBL>
>>
<<
128.174.1.6
HexFile.Get|Get
--
<!DEF>
function <!TW>HexFile.Get (rAddress : real) : real;
<!TXT>
Liefert den Wert des Bytes an der Adresse <!PW>rAddress. Wurde kein Hexfile eingelesen, oder befindet sich an der Adresse kein Byte, wird -1 zurckgegeben.
>>
<<
128.174.2
Prozeduren des HexFile-Objekts|Prozeduren
--
>>
<<
128.174.2.1
HexFile.Open|Open
!128.174.1.2
--
<!DEF>
procedure <!TW>HexFile.Open (sHexFileName : string[; rFormat : real[; rAdrFormat : real]]);
<!TXT>
ffnet die Datei <!PW>sHexFileName und liest ihren Inhalt ein. <!PW>rFormat legt das Format der Hex-Datei fest. Folgende Formate sind definiert:
<!STBL>
<!>0<!>Autodetect (Default)<!>
<!>1<!>Intel-Hex<!>
<!>2<!>Motorola S-Record<!>
<!ETBL>
Bei Autodetect wird das erste Zeichen der ersten nicht leeren Zeile untersucht. Ist dieses Zeichen ein 'S', wird Motorola-S-Record Format vermutet, ansonsten Intel-Hex.

Der Erfolg der Aktion kann ber <!RW>HexFile.Error abgefragt werden.
Bei einem Fehler ist <!RW>EOF sofort <!RW>TRUE. Bei Erfolg wird automatisch <!RW>HexFile.First ausgefhrt.

Mit <!PW>rAdrFormat wird das Adressformat angegeben. Die Werte 0 und 1 sind mglich. Aus Grnden der Awrtskompatibilitt ist 0 der Standard wert mit dem alle Adressen bis 24 bit erkannt werden. Mit 1 werden alle Adressen bis 32 bit erkannt.
>>
<<
128.174.2.2
HexFile.First|First
--
<!DEF>
procedure <!TW>HexFile.First;
<!TXT>
Macht den ersten Datensatz zum aktuellen Datensatz. Kann benutzt werden, um mit dem Programmieren nochmal von vorne zu beginnen, ohne die Datei neu einzulesen.
>>
<<
128.174.2.3
HexFile.Next|Next
--
<!DEF>
procedure <!TW>HexFile.Next;
<!TXT>
Macht den nchsten Datensatz zum aktuellen Datensatz. Wenn versucht wird ber den letzten Satz hinaus zu lesen, wird <!RW>EOF = <!RW>TRUE.
>>
<<
128.174.2.4
HexFile.Clear|Clear
--
<!DEF>
procedure <!TW>HexFile.Clear;
<!TXT>
Entfernt die Daten des Hex-Files aus dem Speicher.
>>
<<
128.174.2.5
HexFile.Set|Set
--
<!DEF>
procedure <!TW>HexFile.Set (rAddress, rByte : real);
<!TXT>
Setzt das Byte an der Adresse <!PW>rAddress auf den Wert <!PW>rByte. Wurde kein Hexfile eingelesen, oder befindet sich an der Adresse kein Byte, passiert nichts.
>>
<<
128.174.2.6
HexFile.Save|Save
--
<!DEF>
procedure <!TW>HexFile.Save (sFileName : string; rFormat : real; sFormatInfo : string);
<!TXT>
Speichert das Hexfile unter dem Namen <!PW>sFileName. Mit Hilfe dieser Prozedure kann ein Hexfile eingelesen, verndert und (auch in einem anderen Format) wieder abgespeichert werden.

 <!PW>rFormat gibt das gewnschte Dateiformat an:
1 : Intel-Hex
2 : Motorola S-Record
0 fr Autodetect ist hier nicht mglich.

 <!PW>sFormatInfo enthlt Zusatzinformationen zum gewnschten Format in der Form:
[ Name=Wert [; Name=Wert [; Name=Wert ...]]

Je nach Format sind unterschiedliche Zusatzinformationen mglich:

<h4>Intel-Hex:</h4>
<!STBL>
<tr bgcolor=f0f0f0><td colspan=2><b>AddressMode=</b><!>
<!>64K<br><!REM>(Default)<!TXT><!>reines 16 Bit Modell, es wird kein extra Address Record geschrieben. Hchste Adresse $FFFF<!>
<!>LINEAR<!>32 Bit Modell, es wird ein Extra Linear Address Record geschrieben. Hchste Adresse $FFFFFFFF<!>
<!>SEGMENTED<!>20 Bit Modell, es wird ein Extra Segmented Address Record geschrieben. Hchste Adresse $000FFFFF<!>
<!ETBL>
<ul indent=13>
<li>Es wird kein Header-Record geschrieben.</li>
<li>Es wird ein End-Record mit Adresse 0000 geschrieben.</li>
</ul>

<h4>Motorola S-Record:</h4>
<!STBL>
<tr bgcolor=f0f0f0><td colspan=2><b>AddressMode=</b><!>
<!>S1 <font size=-2>oder</font> 16<!>Alle Daten werden in S1 Records mit 16 Bit Adressen geschrieben. Hchste Adresse $FFFF. Am Ende wird ein S9 Record geschrieben.<!>
<!>S2 <font size=-2>oder</font> 24<!>Alle Daten werden in S2 Records mit 24 Bit Adressen geschrieben. Hchste Adresse $FFFFFF. Am Ende wird ein S8 Record geschrieben.<!>
<!>S3 <font size=-2>oder</font> 32<!>Alle Daten werden in S2 Records mit 24 Bit Adressen geschrieben. Hchste Adresse $FFFFFFFF. Am Ende wird ein S7 Record geschrieben.<!>
<!>S* <font size=-2>oder</font> Best<!>Abhngig von der Adresse wird der krzest mgliche Record geschrieben. Hchste Adresse $FFFFFFFF. Am Ende wird ein S9 Record geschrieben.<!>
<!ETBL>
<ul indent=13>
<li>Es werden keine S5 Records geschrieben.</li>
<li>Die Adresse im End-Record ist immer 0.</li>
</ul>
>>

<<
128.174.3
Fehlercodes des HexFile-Objekts|Fehlercodes
--
<!STBL>
<!+>Code<!+>Bedeutung<!>
<!c>0<!>alles okay<!>
<!c>1<!>Datei nicht gefunden<!>
<!c>2<!>Fehler beim Laden der Datei<!>
<!c>3<!>Keine Daten in der Datei<!>
<!c>4<!>Fehler im Dateiformat<!>
<!c>5<!>Checksumme falsch<!>
<!c>6<!>Parameter falsch<!>
<!c>7<!>Schreiben in Datei nicht mglich<!>
<!ETBL>
>>

<<
128.174.4
Beispiel
--
<!CODE>
Parameter
  psHexFile : (12, string, 'HexFileName', '');

var
  vHexData : vector;
  rHexAddr : real;

step
  HexFile.Open (psHexFile);        // File einlesen
  if HexFile.Error =0 then begin
    while not HexFile.EOF do begin   // bis zum File-Ende
      vHexData:=HexFile.Data;        // Daten holen
      rHexAddr:=HexFile.Address;     // Adresse holen

      ????  ?????                    // Programmieren mit den
      ???????                        // Daten in rHexAddr und
      ??? ????                       // vHexData durchfhren

      HexFile.Next;                  // nchster Datensatz
    end;
    SetValue (0);                    // OK!
  end
  else begin
    SetValue (HexFile.Error);
  end;
end.
<!TXT>
>>
<<
128.174.5
Untersttzte Hex-File-Formate|File-Formate
--
>>
<<
128.174.5.1
Intel HEX Format (.HEX)|Intel-Hex
--
Diese Format besteht aus einem 8-bit HEX-File. Jeder Datensatz beginnt mit einem ':' (1), danach folgt der Kopf, das Datenfeld und die Prfsumme. Jedes Byte wird mit zwei ASCII-Zeichen als HexadezimalZahl im Bereich 00 bis FF angegeben. (High-Nibble first).

Ein Datensatz hat folgenden Aufbau:

<!CODE>
:BBAAAATTHHHH....HHHCC
<!TXT>

wobei:

<!CODE>
BB   gibt die Anzahl der Bytes im Datenfeld an (0..255)
AAAA gibt den Adressoffset fr das Datenfeld an
TT   legt die Art des Datensatzen fest:
     00 - Data record
     01 - End of file record (2)
     02 - Extended segment address record 
     03 - Start segment address record   (3)
     04 - Extended linear address record 
     05 - Start linear address record    (3)
HH   Bytes des Datenbereiches, Anzahl wie von BB angegeben
CC   Prfsumme 
<!TXT>
<ol indent=20>
<li>Zeilen, die nicht mit ':' beginnen werden ignoriert!</li>
<li>Zeilen nach dem End of file record werden ignoriert!</li>
<li>die beiden Start...records werden nicht untersttzt und fhren zu einem Fehler!</li>
</ol>
>>
<<
128.174.5.2
Motorola S-Record-Format|S-Record
--
Das Motorola S-Record Format besteht aus Zeilen (Records) mit folgenden Aufbau:

<!CODE><b>
S<font color=maroon>T</font><font color=green>LL</font><font color=navy>AA..AA</font><font color=purple>DDDD..DDDD<font color=teal>CC</font>
</b><!TXT>

Wobei:
<ul indent=13>
<li>Das erste Zeichen immer ein 'S' ist -> S-Record</li>

<li>T : Typ gibt die Art des Records an. Eine einzelne Ziffer.</li>

<li>LL : Lnge besteht aus zwei Hex-Ziffern und gibt die Anzahl der nachfolgenden Bytes (nicht Buchstaben!) im Record an. Gezhlt wird die Lnge der Adresse, der Daten und der Checksumme.</li>

<li>AA..AA : Adresse besteht aus 4, 6 oder 8 Hex-Ziffern (2, 3 oder 4 Byte bzw. 16-, 24- oder 32 Bit Adresse).</li>

<li>DD..DD : Daten sind Datenbytes, besetehend aus jeweils zwei Hex-Ziffern.</li>

<li>CC : Checksumme ist das Einerkomplement des niederwertigsten Bytes der Summe der vorhergegangenen Bytes (incl. Lnge, Adresse und Daten). Anders ausgesdrckt, werden alle Datenbytes (Lnge, Adresse, Daten und Checksumme) aufaddiert, muss das Ergebnis modulo 256 immer 255 sein.</li>
</ul>

Recordtypen und deren Verarbeitung
<!STBL>
<!+>Typ<!c>Bedeutung<!>
<!c>S0<!>Start-Record, wird ignoriert<!>
<!c>S1<!>Daten-Record mit 16 Bit Adresse<!>
<!c>S2<!>Daten-Record mit 24 Bit Adresse<!>
<!c>S3<!>Daten-Record mit 32 Bit Adresse<!>
<!c>S5<!>Zhler-Record, wird ignoriert<!>
<!c>S7<!>Blockende-Record fr Daten-Records mit 32 Bit Adressen<!>
<!c>S8<!>Blockende-Record fr Daten-Records mit 24 Bit Adressen<!>
<!c>S9<!>Blockende-Record fr Daten-Records mit 16 Bit Adressen<!>
<!ETBL>

Die Records S4 und S6 sind nicht erlaubt. Die Records S7, S8, S9 drfen nur nach den jeweils passenden Daten-Records folgen (z.B. S9 nach S1).
>>
