Provided by: srecord_1.58-1_amd64 bug

NAME

       srec_intel - Intel Hexadecimal object file format specification

DESCRIPTION

       This format is also known as the Intel MCS‐86 Object format.

       This  document  describes  the hexadecimal object file format for the Intel 8‐bit, 16‐bit,
       and 32‐bit  microprocessors.   The  hexadecimal  format  is  suitable  as  input  to  PROM
       programmers or hardware emulators.

       Hexadecimal  object file format is a way of representing an absolute binary object file in
       ASCII.  Because the file is in ASCII instead of binary, it is possible to store  the  file
       is  non‐binary  medium  such  as  paper‐tape,  punch cards, etc.; and the file can also be
       displayed on CRT terminals, line printers, etc..  The 8‐bit hexadecimal object file format
       allows  for  the  placement of code and data within the 16‐bit linear address space of the
       Intel 8‐bit processors.  The 16‐bit hexadecimal format allows  for  the  20‐bit  segmented
       address space of the Intel 16‐bit processors.  And the 32‐bit format allows for the 32‐bit
       linear address space of the Intel 32‐bit processors.

       --address-length=2   “i8hex”    16‐bit
       --address-length=3   “i16hex”   20‐bit   segmented
       --address-length=4   “i32hex”   32‐bit   linear

       The hexadecimal representation of binary is coded in ASCII alphanumeric  characters.   For
       example,  the  8‐bit  binary value 0011‐1111 is 3F in hexadecimal.  To code this in ASCII,
       one 8‐bit byte containing the ASCII code for the character '3' (0011‐0011 or 0x33) and one
       8‐bit  byte  containing  the)  ASCII  code  for  the character 'F' (0100‐0110 or 0x46) are
       required.  For each byte value, the high‐order hexadecimal digit is always the first digit
       of the pair of hexadecimal digits.  This representation (ASCII hexadecimal) requires twice
       as many bytes as the binary representation.

       A hexadecimal object file is blocked into records, each of which contains the record type,
       length, memory load address and checksum in addition to the data.  There are currently six
       (6) different types of records that are defined, not all combinations of these records are
       meaningful, however.  The record are:

       • Data Record (8‐, 16‐, or 32‐bit formats)

       • End of File Record (8‐, 16‐, or 32‐bit formats)

       • Extended Segment Address Record (16‐ or 32‐bit formats)

       • Start Segment Address Record (16‐ or 32‐bit formats)

       • Extended Linear Address Record (32‐bit format only)

       • Start Linear Address Record (32‐bit format only)

   General Record Format
       ┌───────┬────────┬────────┬────────┬────────┬────────┐
       │Record │ Record │ Load   │ Record │ Data   │ Check  │
       │Mark   │ Length │ Offset │ Type   │        │ sum    │
       └───────┴────────┴────────┴────────┴────────┴────────┘
       Record Mark.
               Each  record  begins  with a Record Mark field containing 0x3A, the ASCII code for
               the colon (“:”) character.

       Record Length
               Each record has a Record Length field which  specifies  the  number  of  bytes  of
               information or data which follows the Record Type field of the record.  This field
               is one byte, represented as two hexadecimal characters.  The maximum value of  the
               Record Length field is hexadecimal 'FF' or 255.

       Load Offset
               Each  record  has  a  Load  Offset  field which specifies the 16‐bit starting load
               offset of the data bytes, therefore this field is only used for Data Records.   In
               other  records where this field is not used, it should be coded as four ASCII zero
               characters (“0000” or 0x30303030).  This field is two byte,  represented  as  four
               hexadecimal characters.

       Record Type
               Each  record  has  a  Record  Type  field  which specifies the record type of this
               record.  The Record Type field is used  to  interpret  the  remaining  information
               within  the  record.   This  field  is  one  byte,  represented as two hexadecimal
               characters.  The encoding for all the current record types are:

               0  Data Record

               1  End of File Record

               2  Extended Segment Address Record

               3  Start Segment Address Record

               4  Extended Linear Address Record

               5  Start Linear Address Record

       Data    Each record has a variable length Data field, it consists of zero  or  more  bytes
               encoded  as pairs of hexadecimal digits.  The interpretation of this field depends
               on the Record Type field.

       Checksum
               Each record ends with  a  Checksum  field  that  contains  the  ASCII  hexadecimal
               representation  of  the  two's  complement  of   the  8‐bit bytes that result from
               converting each pair of ASCII hexadecimal digits to one byte of binary,  from  and
               including  the  Record  Length  field  to  and including the last byte of the Data
               field.  Therefore, the sum of all the ASCII pairs in a record after converting  to
               binary, from the Record Length field to and including the Checksum field, is zero.

   Extended Linear Address Record
       (32‐bit format only)

       ┌────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
       │Record  │ Record  │ Load    │ Record  │ ULBA (2 │  Check  │
       │Mark    │ Length  │ Offset  │ Type    │ bytes)  │  sum    │
       │(“:”)   │ (2)     │ (0)     │ (4)     │         │         │
       └────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
       The 32‐bit Extended Linear Address Record is used to specify bits 16‐31 of the Linear Base
       Address (LBA), where bits 0‐15 of the LBA are zero.  Bits 16‐31 of the LBA are referred to
       as the Upper Linear Base Address (ULBA).  The absolute memory address of a content byte in
       a subsequent Data Record is) obtained by adding the LBA to an offset calculated by  adding
       the  Load  Offset field of the containing Data Record to the index of the byte in the Data
       Record (0, 1, 2, ... n).  This offset addition is  done)  modulo  4G  (i.e.  32‐bits  from
       0xFFFFFFFF  to 0x00000000) results in wrapping around from the end to the beginning of the
       4G linear address defined by the LBA.  The linear address at which a  particular  byte  is
       loaded is calculated as:
              (LBA + DRLO + DRI) MOD 4G
       where:

              DRLO is the Load Offset field of a Data Record.

              DRI  is the data byte index within the Data Record.
       When  an  Extended  Linear Address Record defines the value of LBA, it may appear anywhere
       within a 32‐bit hexadecimal object file.  This  value  remains  in  effect  until  another
       Extended Linear Address Record is encountered.  The LBA defaults to zero until an Extended
       Linear Address Record is encountered.  The contents of the individual  fields  within  the
       record are:

       Record Mark
               This  field  contains  0x3A,  the  hexadecimal  encoding  of the ASCII colon (“:”)
               character.

       Record Length
               The field contains 0x3032, the hexadecimal encoding of the ASCII characters  “02”,
               which is the length, in bytes, of the ULBA data information within this record.

       Load Offset
               This  field  contains 0x30303030, the hexadecimal encoding of the ASCII characters
               “0000”, since this field is not used for this record.

       Record Type
               This field contains 0x3034, the hexadecimal encoding of the ASCII character  “04”,
               which specifies the record type to be an Extended Linear Address Record.

       ULBA    This  field  contains  four ASCII hexadecimal digits that specify the 16‐bit Upper
               Linear Base Address value.  The value  is  encoded  big‐endian  (most  significant
               digit first).

       Checksum
               This  field contains the check sum on the Record Length, Load Offset, Record Type,
               and ULBA fields.

   Extended Segment Address Record
       (16‐ or 32‐bit formats)

       ┌────────┬─────────┬─────────┬─────────┬─────────┬─────────┐
       │Record  │ Record  │ Load    │ Record  │ USBA (2 │  Check  │
       │Mark    │ Length  │ Offset  │ Type    │ bytes)  │  sum    │
       │(“:”)   │ (2)     │ (0)     │ (2)     │         │         │
       └────────┴─────────┴─────────┴─────────┴─────────┴─────────┘
       The 16‐bit Extended Segment Address Record is used to specify bits  4‐19  of  the  Segment
       Base Address (SBA), where bits 0‐3 of the SBA are zero.  Bits 4‐19 of the SBA are referred
       to as the Upper Segment Base Address (USBA).  The absolute memory  address  of  a  content
       byte in a subsequent Data Record is) obtained by adding the SBA to an offset calculated by
       adding the Load Offset field of the containing Data Record to the index of the byte in the
       Data  Record (0, 1, 2, ... n).  This offset addition is done modulo 64K (i.e. 16‐bits from
       0xFFFF to 0x0000 results in wrapping around from the end  to  the  beginning  of  the  64K
       segment  defined  by  the  SBA.   The  address  at  which  a  particular byte is loaded is
       calculated as:
              SBA + ((DRLO + DRI) MOD 64K)
       where:

              DRLO is the LOAD OFFSET field of a Data Record.

              DRI  is the data byte index within the Data Record.

       When an Extended Segment Address Record defines the value of SBA, it may  appear  anywhere
       within  a  16‐bit  hexadecimal  object  file.   This value remains in effect until another
       Extended Segment Address Record is  encountered.   The  SBA  defaults  to  zero  until  an
       Extended Segment Address Record is encountered.

       The contents of the individual fields within the record are:

       Record Mark
               This  field  contains  0x3A,  the  hexadecimal  encoding  of the ASCII colon (“:”)
               character.

       Record Length
               The field contains 0x3032, the hexadecimal encoding of the ASCII characters  '02',
               which is the length, in bytes, of the USBA data information within this record.

       Load Offset
               This  field  contains 0x30303030, the hexadecimal encoding of the ASCII characters
               '0000', since this field is not used for this record.

       Record Type
               This field contains 0x3032, the hexadecimal encoding of the ASCII character  “02”,
               which specifies the record type to be an Extended Segment Address Record.

       USBA    This  field  contains  four ASCII hexadecimal digits that specify the 16‐bit Upper
               Segment Base Address value.  The field is  encoded  big‐endian  (most  significant
               digit first).

       Checksum
               This  field contains the check sum on the Record length, Load Offset, Record Type,
               and USBA fields.

   Data Record
       (8‐, 16‐ or 32‐bit formats)

       ┌───────┬────────┬────────┬────────┬────────┬────────┐
       │Record │ Record │ Load   │ Record │  Data  │ Check  │
       │Mark   │ Length │ Offset │ Type   │        │ sum    │
       │(“:”)  │        │        │        │        │        │
       └───────┴────────┴────────┴────────┴────────┴────────┘
       The Data Record provides a set of hexadecimal digits that represent  the  ASCII  code  for
       data  bytes  that  make  up  a  portion of a memory image.  The method for calculating the
       absolute address (linear in the 8‐bit and 32‐bit case and segmented in  the  16‐bit  case)
       for  each  byte  of  data  is  described in the discussions of the Extended Linear Address
       Record and the Extended Segment Address Record.

       The contents of the individual fields within the record are:

       Record Mark
               This field contains 0x3A, the  hexadecimal  encoding  of  the  ASCII  colon  (“:”)
               character.

       Record Length
               The  field  contains  two ASCII hexadecimal digits that specify the number of data
               bytes in the record.  The maximum value is 255 decimal.

       Load Offset
               This field contains four ASCII hexadecimal digits representing the offset from the
               LBA  (see  Extended  Linear  Address  Record  see Extended Segment Address Record)
               defining the address which the first byte of the data is to be placed.

       Record Type
               This field contains 0x3030, the hexadecimal encoding of the ASCII character  “00”,
               which specifies the record type to be a Data Record.

       Data    This  field  contains  pairs  of  ASCII hexadecimal digits, one pair for each data
               byte.

       Checksum
               This field contains the check sum on the Record Length, Load Offset, Record  Type,
               and Data fields.

       Note:  Care  must  be  taken when the addresses with an record span the end of addressing.
       The behaviour is different for linear and segmented addressing modes.

       linear  If a record starts just short of 2**32, and would finish after  2**32,  the  later
               part  of  the  record wraps around to address 0.  TP 8n segment If a record starts
               just for of a 2**16 boundary, and would finish  after  that  2**16  boundary,  the
               later  part  of  the record wraps around to address 0 within the same segment (not
               the next segment).

       The srec_cat(1) program will never output records such as these, it  will  always  produce
       separate records on output.

   Start Linear Address Record
       (32‐bit format only)

       ┌───────┬────────┬────────┬────────┬────────┬────────┐
       │Record │ Record │ Load.  │ Record │ EIP (4 │ Check  │
       │Mark   │ Length │ Offset │ Type   │ bytes) │ sum    │
       │(“:”)  │ (4)    │ (0)    │ (5)    │        │        │
       └───────┴────────┴────────┴────────┴────────┴────────┘
       The  Start  Linear  Address  Record is used to specify the execution start address for the
       object file.  The value given is the 32‐bit linear address for  the  EIP  register.   Note
       that this record only specifies the code address within the 32‐bit linear address space of
       the 80386.  If the code is to start execution in the real mode  of  the  80386,  then  the
       Start  Segment Address Record should be used instead, since that record specifies both the
       CS and IP register contents necessary for real mode.

       The Start Linear Address Record can appear anywhere in a 32‐bit hexadecimal  object  file.
       If such a record is not present in a hexadecimal object file, a loader is free to assign a
       default execution start address.

       The contents of the individual fields within the record are:

       Record mark
               This field contains 0x3A, the  hexadecimal  encoding  of  the  ASCII  colon  (“:”)
               character.

       Record length
               The  field contains 0x3034, the hexadecimal encoding of the ASCII characters “04”,
               which is the length, in bytes, of the EIP register content within this record.

       Load Offset
               This field contains 0x30303030, the hexadecimal encoding of the  ASCII  characters
               “0000”, since this field is not used for this record.

       Record Type
               This  field contains 0x3035, the hexadecimal encoding of the ASCII character “05”,
               which specifies the record type to be a Start Linear Address Record.

       EIP     This field contains eight ASCII hexadecimal digits that  specify  the  32‐bit  EIP
               register  contents.   The  field  is  encoded  big‐endian  (most significant digit
               first).

       Checksum
               This field contains the check sum on the Record length, Load Offset, Record  Type,
               and EIP fields.

   Start Segment Address Record
       (16‐ or 32‐bit formats)

       ┌───────┬────────┬────────┬────────┬────────┬────────┬────────┐
       │Record │ Record │ Load.  │ Record │ CS (2  │ IP (2  │ Check  │
       │Mark   │ Length │ Offset │ Type   │ bytes) │ bytes) │ sum    │
       │(“:”)  │ (4)    │ (0)    │ (3)    │        │        │        │
       └───────┴────────┴────────┴────────┴────────┴────────┴────────┘
       The  Start  Segment  Address Record is used to specify the execution start address for the
       object file.  The value given is the 20‐bit segment address for the CS and  IP  registers.
       Note  that this record only specifies the code address within the 20‐bit segmented address
       space of the 8086/80186.  The Start Segment Address Record can appear anywhere in a 16‐bit
       hexadecimal object file.   If such a record is not present in a hexadecimal object file, a
       loader is free to assign a default start address.

       The contents of the individual fields within the record are:

       Record Mark
               This field contains 0x3A, the  hexadecimal  encoding  of  the  ASCII  colon  (“:”)
               character.

       Record Length
               The  field contains 0x3034, the hexadecimal encoding of the ASCII characters “04”,
               which is the length, in bytes, of the CS and  IP  register  contents  within  this
               record.

       Load Offset
               This  field  contains 0x30303030, the hexadecimal encoding of the ASCII characters
               “0000”, since this field is not used for this record.

       Record Type
               This field contains 0x3033, the hexadecimal encoding of the ASCII character  '03',
               which specifies the record type to be a Start Segment Address Record.

       CS      This  field  contains  four  ASCII  hexadecimal  digits that specify the 16‐bit CS
               register contents.  The  field  is  encoded  big‐endian  (most  significant  digit
               first).

       IP      This  field  contains  four  ASCII  hexadecimal  digits that specify the 16‐bit IP
               register contents.  The  field  is  encoded  big‐endian  (most  significant  digit
               first).

       Checksum
               This  field contains the check sum on the Record length, Load Offset, Record Type,
               CS, and IP fields.

   End of File Record
       (8‐, 16‐, or 32‐bit formats)

       ┌───────┬────────┬────────┬────────┬────────┐
       │Record │ Record │ Load   │ Record │ Check  │
       │Mark   │ Length │ Offset │ Type   │ sum    │
       │(“:”)  │ (0)    │ (0)    │ (1)    │ (0xFF) │
       └───────┴────────┴────────┴────────┴────────┘
       The End of File Record specifies the end of the hexadecimal object file.

       The contents of the individual fields within the record are:

       Record mark
               This field contains 0x3A, the  hexadecimal  encoding  of  the  ASCII  colon  (“:”)
               character.

       Record Length
               The  field contains 0x3030, the hexadecimal encoding of the ASCII characters “00”.
               Since this record does not contain any Data bytes, the length is zero.

       Load Offset
               This field contains 0x30303030, the hexadecimal encoding of the  ASCII  characters
               “0000”,  since  this  field  is not used for this record.  In ancient times, i8hex
               used this for the start address record.

       Record Type
               This field contains 0x3031, the hexadecimal encoding of the ASCII character  “01”,
               which specifies the record type to be an End of File Record.

       Checksum
               This  field  contains  the check sum an the Record Length, Load Offset, and Record
               Type fields.  Since all  the  fields  are  static,  the  check  sum  can  also  be
               calculated  statically,  and  the value is 0x4646, the hexadecimal encoding of the
               ASCII characters “FF”.

   Size Multiplier
       In general, binary data will expand in sized by approximately 2.3 times  when  represented
       with this format.

EXAMPLE

       Here  is  an  example Intel hex file.  It contains the data “Hello, World” to be loaded at
       address 0.
              :0D00000048656C6C6F2C20576F726C640AA1
              :00000001FF

REFERENCE

       This information comes (very indirectly) from Microprocessors and Programmed Logic, Second
       Edition, Kenneth L. Short, 1987, Prentice‐Hall, ISBN 0‐13‐580606‐2.

       http://en.wikipedia.org/wiki/Intel_HEX

COPYRIGHT

       srec_cat version 1.58
       Copyright  (C)  1998,  1999,  2000,  2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
       2010, 2011 Peter Miller

       The srec_cat program comes with ABSOLUTELY NO WARRANTY;  for  details  use  the  'srec_cat
       -VERSion  License'  command.  This is free software and you are welcome to redistribute it
       under certain conditions; for details use the 'srec_cat -VERSion License' command.

AUTHOR

       Peter Miller   E‐Mail:   pmiller@opensource.org.au
       /\/\*             WWW:   http://miller.emu.id.au/pmiller/

   Derivation
       This manual page is derived from a file marked as follows:

       Intel Hexadecimal Object File Format Specification; Revision A, 1/6/88

       Disclaimer: Intel makes no representation or  warranties  with  respect  to  the  contents
       hereof and specifically disclaims any implied warranties of merchantability or fitness for
       any particular purpose.  Further, Intel reserves the right to revise this publication from
       time  to  time  in  the content hereof without obligation of Intel to notify any person of
       such revision or changes.  The publication of this specification should not  be  construed
       as a commitment on Intel's part to implement any product.