[S-Record Format]


	SREC(4)                UNIX 5.0 (03/21/84)                SREC(4)


	An S-record file consists of a sequence of specially formatted
	ASCII character strings.  An S-record will be less than or equal to
	78 bytes in length.

	The order of S-records within a file is of no significance and no 
	particular order may be assumed.

	The general format of an S-record follow:

	+------------------//-------------------//-----------------------+
	| type | count | address  |            data           | checksum |
	+------------------//-------------------//-----------------------+

	  type      A char[2] field.  These characters describe the
		    type of record (S0, S1, S2, S3, S5, S7, S8, or
		    S9).

	  count     A char[2] field.  These characters when paired and
		    interpreted as a hexadecimal value, display the
		    count of remaining character pairs in the record.

	  address   A char[4,6, or 8] field.  These characters grouped
		    and interpreted as a hexadecimal value, display
		    the address at which the data field is to be
		    loaded into memory.  The length of the field
		    depends on the number of bytes necessary to hold
		    the address.  A 2-byte address uses 4 characters,
		    a 3-byte address uses 6 characters, and a 4-byte
		    address uses 8 characters.

	  data      A char [0-64] field.  These characters when paired
		    and interpreted as hexadecimal values represent
		    the memory loadable data or descriptive
		    information.

	  checksum  A char[2] field.  These characters when paired and
		    interpreted as a hexadecimal value display the
		    least significant byte of the ones complement of
		    the sum of the byte values represented by the
		    pairs of characters making up the count, the
		    address, and the data fields.

	  Each record is terminated with a line feed.  If any
	  additional or different record terminator(s) or delay
	  characters are needed during transmission to the target
	  system it is the responsibility of the transmitting program
	  to provide them.

	  S0 Record  The type of record is 'S0' (0x5330). The address 
		     field is unused and will be filled with zeros
		     (0x0000).  The header information within the data
		     field is divided into the following subfields.

				  mname      is char[20] and is the
					     module name.

				  ver        is char[2] and is the
					     version number.

				  rev        is char[2] and is the
					     revision number.

				  description is char[0-36] and is a
					     text comment.

		     Each of the subfields is composed of ASCII bytes
		     whose associated characters, when paired,
		     represent one byte hexadecimal values in the case
		     of the version and revision numbers, or represent
		     the hexadecimal values of the ASCII characters
		     comprising the module name and description.

	  S1 Record  The type of record field is 'S1' (0x5331).  The
		     address field is interpreted as a 2-byte address.
		     The data field is composed of memory loadable
		     data.

	  S2 Record  The type of record field is 'S2' (0x5332).  The
		     address field is interpreted as a 3-byte address.
		     The data field is composed of memory loadable
		     data.

	  S3 Record  The type of record field is 'S3' (0x5333).  The
		     address field is interpreted as a 4-byte address.
		     The data field is composed of memory loadable
		     data.

	  S5 Record  The type of record field is 'S5' (0x5335).  The
		     address field is interpreted as a 2-byte value
		     and contains the count of S1, S2, and S3 records
		     previously transmitted.  There is no data field.

	  S7 Record  The type of record field is 'S7' (0x5337).  The
		     address field contains the starting execution
		     address and is interpreted as  4-byte address.
		     There is no data field.

	  S8 Record  The type of record field is 'S8' (0x5338).  The
		     address field contains the starting execution
		     address and is interpreted as  3-byte address.
		     There is no data field.

	  S9 Record  The type of record field is 'S9' (0x5339).  The
		     address field contains the starting execution
		     address and is interpreted as  2-byte address.
		     There is no data field.

     EXAMPLE

	  Shown below is a typical S-record format file.

		 S00600004844521B
		 S1130000285F245F2212226A000424290008237C2A
		 S11300100002000800082629001853812341001813
		 S113002041E900084E42234300182342000824A952
		 S107003000144ED492
		 S5030004F8
		 S9030000FC

	  The file consists of one S0 record, four S1 records, one S5
	  record and an S9 record.

	  The S0 record is comprised as follows:

	     S0     S-record type S0, indicating it is a header
		    record.

	     06     Hexadecimal 06 (decimal 6), indicating that six
		    character pairs (or ASCII bytes) follow.

	     00 00  Four character 2-byte address field, zeroes in
		    this example.

	     48     ASCII H, D, and R - "HDR".

	     1B     The checksum.

	  The first S1 record is comprised as follows:

	     S1     S-record type S1, indicating it is a data record
		    to be loaded at a 2-byte address.

	     13     Hexadecimal 13 (decimal 19), indicating that
		    nineteen character pairs, representing a 2 byte
		    address, 16 bytes of binary data, and a 1 byte
		    checksum, follow.

	     00 00  Four character 2-byte address field; hexidecimal
		    address 0x0000, where the data which follows is to
		    be loaded.

	     28 5F 24 5F 22 12 22 6A 00 04 24 29 00 08 23 7C Sixteen
		    character pairs representing the actual binary
		    data.

	     2A     The checksum.

	  The second and third S1 records each contain 0x13 (19)
	  character pairs and are ended with checksums of 13 and 52,
	  respectively.  The fourth S1 record contains 07 character
	  pairs and has a checksum of 92.

	  The S5 record is comprised as follows:

	     S5     S-record type S5, indicating it is a count record
		    indicating the number of S1 records.



	     03     Hexadecimal 03 (decimal 3), indicating that three
		    character pairs follow.

	     00 04  Hexadecimal 0004 (decimal 4), indicating that
		    there are four data records previous to this
		    record.
	     F8     The checksum.

	  The S9 record is comprised as follows:

	     S9     S-record type S9, indicating it is a termination
		    record.
	     03     Hexadecimal 03 (decimal 3), indicating that three
		    character pairs follow.

	     00 00  The address field, hexadecimal 0 (decimal 0)
		    indicating the starting execution address.
	     FC     The checksum.


    [Intel Hex ASCII Format]

	Intel HEX-ASCII format takes the form:

	    +----------------------------------- Start Character
	    |
	    |  +-------------------------------- Byte Count 
	    |  |                                     (# of data bytes)
	    |  | 
	    |  |     +-------------------------- Address of first data.
	    |  |     |     
	    |  |     |     +-------------------- Record Type (00 data,
	    |  |     |     |                         01 end of record)
	    |  |     |     |
	    |  |     |     |       +------------ Data Bytes
	    |  |     |     |       |        
	    |  |     |     |       |       +---- Checksum
	    |  |     |     |       |       |
	    | / \ /     \ / \ /         \ / \
	    : B C A A A A T T H H ... H H C C

	An examples:

	    :10000000DB00E60F5F1600211100197ED300C3004C
	    :1000100000000101030307070F0F1F1F3F3F7F7FF2
	    :01002000FFE0
	    :00000001FF

	This information comes from _Microprocessors and Programmed
	Logic_, Second Edition, Kenneth L. Short, 1987, Prentice-Hall, 
	ISBN 0-13-580606-2. 

	Provisions have been made for data spaces larger than 64 kBytes.
	The above reference does not discuss them.  I suspect there is
	a start of segment type record, but I do not know how it is
	implemented.


Here also a description from the Buffalo monitor manual:

Date:    19970915
From:    Glen Wiley <gwiley@wiley.jax.fl.us>
To:      Mot-68HC11-Apps@freeware.mcu.motsps.com
Subject: Re: S19 format

 Message sent by Glen Wiley <gwiley@wiley.jax.fl.us>
 to the mot-68hc11-apps Mailing List.

The following is taken from the buffalo monitor manual:


                            APPENDIX A

                       S-RECORD INFORMATION

INTRODUCTION

The Motorola S-record format was devised for the purpose of encoding
programs or data files in a printable format for transportation between
computer systems.  This transportation process can therefore be
monitored and the S-records can be easily edited.

S-RECORD CONTENT

When observed, S-records are essentially character strings made of
several fields which identify the record type, record length, memory
address, code/data, and checksum.  Each byte of binary data is encoded
as a 2-character hexadecimal number: the first character representing
the high-order 4 bits, and the second the low-order 4 bits of the byte.

Five fields which compromise an S-record are shown below:

TYPE      RECORD LENGTH       ADDRESS   CODE/DATA      CHECKSUM
where the fields are composed as follows:

               PRINTABLE
FIELD          CHARACTERS                    CONTENTS

Type           	 2       	S-record type - S0, S1, etc.

Record 		 2              Character pair count in the record,
length                           	excluding the type and record length.

Address        	4,6,           	2-, 3-, or 4-byte address at which 
                or 8           		the data field is to be loaded into                    
                                   	memory.

Code/data     	0-2n          	 From 0 to n bytes of executable code,
                                   	memory loadable data, or descriptive
                                   	information.  For compatibility with
                               		teletypewriters, some programs may
                                   	limit the number of bytes to as few as
                                   	28 (56 printable characters in the S-
                                   	record.

Checksum            2        	Least significant byte of the one's
                                   	complement of the sum of the values
                                   	represented by the pairs of
                                   	characters making up the record
                                  	length, address, and the code/data
                                   	fields.

Each record may be terminated with a CR/LF/NULL.  Additionally, an S-
record may have an initial field to accommodate other data such as line
numbers generated by some time-sharing systems.

Accuracy of transmission is ensured by the record length (byte count)
and checksum fields.


S-RECORD TYPES

Eight types of S-records have been defined to accommodate the several
needs of the encoding, transportation, and decoding functions.  The
various Motorola upload, download, and other record transportation
control programs, as well as cross assemblers, linkers, and other file-
creating or debugging programs, utilize only those S-records which serve
the purpose of the program.  for specific information on which S-records
are supported by a particular program, the user manual for that program
must be consulted.

      NOTE

The EVB monitor supports only the S1 and S9 records.  All data before
the first S1 record is ignored.  Thereafter, all records must be S1 type
until the S9 record terminates data transfer.

An S-record format may contain the following record types:

     S0    	Header record for each block of S-records.  The code/data
               	field may contain any descriptive information identifying
               	the following block of S-records.  The address field is
               	normally zeroes.

     S1        	Code/data record and the 2-byte address at which the
               	code/data is to reside.

     S2-S8     	Termination record for a block of S1 records.  Address
               	fields may optionally contain the 2-byte address of the
               	instruction to which control is to be passed.  If not
               	specified, the first entry point specification
               	encountered in the input will be used.  There is no
               	code/data field.

Only one termination record is used for each block of S-records. 
Normally, only one header record is used, although it is possible for
multiple header records to occur.


S-RECORD CREATION

S-record format programs ma be produce by several dump utilities,
debuggers, or several cross assemblers or cross linkers.  Several
programs are available for downloading a file in S-record format from a
host system to an 8-bit or 16-bit microprocessor-based system.


S-RECORD EXAMPLE

Shown below is a typical S-record format, as printed or displayed:

          S00600004844521B
          S1130000285F245F2212226A000424290008237C2A
          S11300100002000800082629001853812341001813
          S113002041E900084E42234300182342000824A952
          S107003000144ED492
          S9030000FC

The above format consists of an S0 header record, four S1 code/data
records, and an S9 termination record.

The S0 header record is comprised of the following character pairs:

     S0   S-record type S0, indicating a header record.

     06   Hexadecimal 06 (decimal 06), indicating six character pairs
          (or ASCII bytes) follow.

     00   Four-character 2-byte address field, zeroes.
     00

     48
     44   ASCII H, D, and R - "HDR".    
     52

     1B   Checksum of SO record.

The first S1 code/data record is explained as follows:

     S1   S-record type S1, indicating a code/data record to be
          	loaded/verified at a 2-byte address.

     13   Hexadecimal 13 (decimal 19), indicating 19 character pairs,
         	 representing 19 bytes of binary data, follow.

     00   Four-character 2-byte address field; hexadecimal address 0000,
     00		 indicates location where the following data is to be loaded. 

The next 16 character pairs are the ASCII bytes of the actual program
code/data.  In this assembly language example, the hexadecimal opcodes
of the program are written in sequence in the code/data fields of the S1
records;

     OPCODE              INSTRUCTION

28 5F             		BHCC  $0161
24 5F                    	BCC   $0163
22 12                    	BHI   $0118
22 6A                    	BHI   $0172
00 04 24                 	BRSET 0,$04,$012F
29 00                    	BHCS  $010D
08 23 7C                 	BRSET 4,$23,$018C

.    (Balance of this code is continued in the code/data fields 
.    of the remaining S1 records, and stored in memory location 
.    0010, etc..)

2A   Checksum of the first S1 record.

The second and third S1 code/data records each also contain $13 (19)
character pairs and are ended with checksums 13 and 51, respectively. 
The fourth S1 code/data record contains 07 character paris and has a
checksum of 92.

The S9 termination record is explained as follows:

     S9   	S-record type S9, indicating a termination record.

     03   	Hexadecimal 03, indicating three character pairs (3 bytes)
          		follow.

     00   	Four-character 2-byte address field, zeroes.
     00

     FC   	Checksum of S9 record.

Each printable character in an S-record is encoded in hexadecimal (ASCII
in this example) representation of the binary bits which are actually
transmitted.  For example, the first S1 record above is sent as shown
below.


type      length         address        code/data      checksum

S   1     1   3       0   0   0   0    2   8   5   F     2   A

53  31    31  33     30  30  30  30    32  38  35  46    32  41


-- 
Glen Wiley                               gwiley@wiley.jax.fl.us
Senior Developer, CSSD - AT&T UCS

finger gwiley@falkirk.wiley.jax.fl.us PGP public key

"Real men run Linux."                    Micro$oft - Just say no!

 To unsubscribe, send mail to Majordomo@www.mcu.motsps.com.
 In the message body, put    unsubscribe mot-68hc11-apps
 http://www.mcu.motsps.com/lit/faq/major.html#zubscribe

