7.2.2 Intel HEX file Specification
Hexmate reads and processes HEX files, in particular, those files conforming to the Hexadecimal Object File Format developed by Intel®. Other forms of HEX files and other file formats cannot be processed by Hexmate. The information in this section describes the HEX file specification, as interpreted by Hexmate when processing input files.
Intel HEX files store binary program data using ASCII characters. One character is used
to store each nibble of the binary data, so for example the byte value 0xFE would be
stored in a HEX file as the ASCII byte 0x46 (representing the most significant nibble of
the value, F
) followed by 0x45 (E
). If you view a HEX
file with a text editor, it will show these two bytes as the characters
FE
, since it assumes the data is ASCII and maps it accordingly for
display. Upper case hexadecimal letters are typically used in HEX files, but Hexmate
will accept either case.
A HEX file consists of a number of records, with at most one record per line.
:
) character.
Any other characters encountered at the beginning of a line are interpreted by Hexmate
as a comment until either a colon or new-line character is encountered. A line in a HEX
file is valid if it is:- entirely a valid record (described below)
- blank (only contains a new-line character)
- entirely a comment (contains any characters excluding those that define a valid record)
- a comment followed by a valid record
Once a Record Mark has been encountered in a line, it and all the following characters on that line are assumed to be part of a record. The record will be checked for syntactical correctness and any errors will be reported, but with one exception: Should a record following a comment be malformed, then the whole line will be treated as a comment and no errors will be reported.
Record Mark | Data Length | Address Offset | Record Type | Data/Argument | Checksum |
---|---|---|---|---|---|
: |
LL |
OOOO |
TT |
DDDD...DDDD |
CC |
The Data Length field follows the Record Mark and is a one-byte (two ASCII character) value indicating the length of the Data/Argument field in the record. This specification is required, since the length of the Data/Argument field is not fixed, and it can vary from one record to the next.
A two-byte (four character) Address Offset field follows. If a record is one that
contains program data, the value in this field (and potentially information contained in
other records) indicates the address at which to start programming the data in the
device; otherwise, it is not used and contains the character sequence
0000
. The correct Address Offset must be specified with each record
that holds data; the location for data cannot “flow on” from any previous record in the
file. The mandatory inclusion of an address with each record allows records to be placed
in the file in any order, subject to some limitations, described later.
Note that the Address Offset field, as its name implies, specifies an address offset, not an absolute address. The base address to which the offset applies is specified by special record types, discussed later in this section; however Hexmate assumes that this base address is 0 if no such special records have been previously encountered in the file.
Record Type Characters | Record Name | Purpose |
---|---|---|
00 |
Data Record | Contains data bytes to be programmed into the device. |
01 |
End-of-file Record | Indicates the final record in the file. |
02 |
Extended Segment Address Record | Contains the Upper Segment Base Address. |
03 |
Start Segment Address Record | Contains the execution start address when using Extended Segment Address Record data. |
04 |
Extended Linear Address Record | Contains the Linear Base Address. |
05 |
Start Linear Address Record | Contains the execution start address when using Linear Address Record data. |
A multi-purpose, variable-length Data/Argument field follows the Record Type field for most record types. This field is used to store the data to be programmed for type 0 records, store a base address for type 2 and 4 records, and store a start address for type 3 and 5 records. This field is not present for type 1 records. For type 0 Data Records, the length of the Data/Argument field is permitted to range from 1 to 255 bytes (2 to 510 characters), and this length can vary from one Data Record to the next. The bytes of data in this field assume consecutive addresses, indexed from the first byte, which has the Address Offset specified in the record.
A Checksum field makes up the last byte (2 characters) in the record for all record types and this value is used by Hexmate to minimize the chance of corrupted data being programmed. Record checksums are calculated as an 8-bit two's compliment of the summation of each byte (in its binary form) in that record, starting from the Record Length byte to the last byte in the Data/Argument Field.
:04000000FEEFFFF020
This
line begins with a colon (:
), signaling the start of a record. There is
no comment present on the line. The next two characters (04
) indicate
the length of the Data/Argument field in this record to be 4 bytes (8 characters). The
following 4 bolded characters (0000
) form the Address Offset,
that being the value 0. This is followed by two characters (00
) being
the record type, indicating that this is a Data Record containing bytes to be
programmed. The following 8 characters of data, FEEFFFF0
, are
underlined. These represent the bytes of data 0xFE, 0xEF, 0xFF, and 0xF0. These bytes
have address offsets of 0 through 3, respectively. Finally, there are two characters
representing the checksum value, 20
. This value is obtained by first
summing the bytes 0x04, 0x00, 0x00, 0x00, 0xFE, 0xEF, 0xFF, and 0xF0 contained in the
record, which yields the value 0x3E0. The 8-bit two's compliment of this value is
0x20.;configured for basic mode
:04000000FDEF0FF011
:0C1FF400B88100EF00F00001FAEF0FF0E0
:00000001FF
Device family | Program memory addressing size |
---|---|
8-bit Baseline, Mid-range, and Enhanced Mid-range PIC | 2 bytes (word) |
PIC18 | 1 byte |
8-bit AVR | 2 bytes (word) |
PIC24 | 2 bytes (word) |
dsPIC with 24-bit instruction set | 2 bytes (word) |
dsPIC with 32-bit instruction set | 1 byte |
PIC32 and SAM | 1 byte |
-addressing
option (see 7.2.3.10 Addressing Hexmate Option) can assist with
this mapping when specifying options.:0401FC00E040FEFFE2
HEX file address | HEX file data | Device Address | Device Data |
---|---|---|---|
0x1FC | 0xE0 | 0xFE | 0x40E0 |
0x1FD | 0x40 | ||
0x1FE | 0xFE | 0xFF | 0xFFFE |
0x1FF | 0xFF |