# HEX (Intel)

HEX (Intel) est un format de fichier, utilisé pour structurer de l'information destinée à des microcontrôleurs, des EEPROM ou d'autres composants programmables. C'est un des formats les plus anciens pour cette utilisation, étant utilisé depuis les années 1970.

## Format

Le format est un fichier texte, avec chaque ligne contenant des valeurs hexadécimales avec une adresse absolue ou une adresse décalée.
Le format peut être décrit comme un ensemble de lignes de texte. Chaque ligne respecte la syntaxe suivante :
où :
* BB est le nombre d'octets de données dans la ligne (en hexadécimal)
* AAAA est l'adresse absolue (ou relative) du début de la ligne
* TT est le champ spécifiant le type
* HH...HHHH est le champ des données
* CC est l'octet de checksum. C'est le complément à deux de la somme des valeurs binaires des octets de tous les autres champs. (Les calculs sont faits sur 8 bits, en ignorant les retenues.)
Il y a six valeurs possibles pour le champ de type (TT) :
* 00, données, contient les données et l'adresse 16 bit.
* 01, Fin du fichier, pour terminer le fichier. Pas de données après ce champ. Doit être la dernière ligne du fichier et donc ce champ n'est permis qu'une seule fois par fichier. Usuellement ':00000001FF'. Originellement End Of File record peut contenir une adresse de départ pour le programme devant être chargé, e.g. :00AB2F0125 ferait un saut à l'adresse AB2F. C'était utile quand les programmes étaient chargés par des cartes perforées.
* 02, champ d'adresse étendue, permet de définir l'adresse de base du segment. Utilisé quand une adresse 16 bits n'est pas suffisante, et ressemble au mode d'adressage du 80x86. L'adresse spécifiée par le champ 02 est multipliée par 16 (décalée de 4 bits vers la gauche) et additionnée aux adresses contenues dans les champs de type 00. Cela permet d'adresser 1 mégaoctet. Si le champ d'adresse correspondant est 0000, et le nombre d'octets est 02 (le segment est 16 bits). L'octet hexadécimal du segment est toujours 0.
* 03, Start Segment Address Record. Pour les processeurs 80x86, il spécifie le contenu initial des registres CS:IP. Le champ d'adresse est alors 0000, le nombre d'octets est 04, les deux premiers octets sont la valeur de CS (Code Segment), et les deux suivants la valeur de IP (Instruction Pointer).
* 04, Extended Linear Address Record, autorise un mode d'adressage sur 32 bits. Le champ d'adresse AAAA est 0000, le champ nombre d'octets BB est 02. Les deux octets présents représentent les 16 bits de poids fort des adresses 32, quand ils sont combinés avec le type TT à 00.
* 05, Start Linear Address Record. Le champ d'adresse AAAA est 0000, le champ nombre d'octets BB est 04. Les 4 octets de données représentent la valeur 32-bit chargée dans le registre EIP (Extended Instruction Pointer) du 80386 et processeurs suivants.
On rencontre divers sous-formats :
* I8HEX ou INTEL 8, format 8 bit d'origine. Utilise uniquement le champ TT de valeur 00 ou 01.
* I16HEX or INTEL 16, format 16 bit. Ajoute l'usage des champs TT de valeur 02 et 03.
* I32HEX or INTEL 32, format 32 bit. Ajoute l'usage des champs TT de valeur 04 et 05.
Pour vérifier la validité des données, il suffit de faire la somme de tous les octets représentés, à partir des deux-points jusqu'à la fin de ligne (checksum inclus: BB+AA+AA+TT+HH+...+CC): le résultat attendu est 0 (modulo 256).

## Exemple

* Code de départ
* Nombre d'octets
* Adresse
* type de champ
* Données
* Checksum