# S-Record

Das Motorola-S-Record-Format ist ein ASCII-basiertes Datenformat zur Kodierung von Binärdateien. Es ist auch als SREC- oder S19-Format bekannt. Hauptsächlich wird es zum Abspeichern des Programmcodes von Mikrocontrollern in eingebetteten Systemen verwendet. Es wurde in den 1970er Jahren vom Hersteller Motorola für dessen 6800-Mikroprozessor entwickelt.
Ein ähnliches, wenn auch leicht unterschiedliches Format ist das Intel-HEX-Format, welches u. a. für Intel-Prozessoren verwendet wird.
Die ASCII-Kodierung erlaubt die Bearbeitung bzw. das Öffnen der Datei mit einem Texteditor. Da es Prüfsummen enthält, können bei einer Übertragung beschädigte Datensätze erkannt werden.

## Format

Eine S-Record-Datei besteht aus einer Reihe von ASCII-Datensätzen (engl. Records). Alle Hexadezimalzahlen sind Big endian, d. h. das höchstwertige Byte wird als erstes, also auf der kleineren Adresse gespeichert. Die Datensätze haben folgende Struktur:
* Start code, ein Zeichen: S
* Record type (Datensatztyp), eine Ziffer, 0 bis 9, definiert den Typ des Datensatzes
* Byte count (die Anzahl der Bytes), zwei hexadezimale Ziffern, 0 bis F, beinhaltet die Anzahl der Bytes (also jeweils zwei hexadezimale Ziffern) die im restlichen Datensatz (Adresse, Daten und Prüfsumme) folgen.
* Adresse, vier, sechs oder acht hexadezimale Ziffern (abhängig vom Datensatztyp), die die Speicheradresse der darauf folgenden Daten festlegen.
* Datenfeld, eine Folge von 2n hexadezimalen Ziffern, also n Datenbytes
* Checksum (Prüfsumme), zwei hexadezimale Ziffern – das Einerkomplement des niederwertigen Bytes der Summe von byte count, Adresse (byteweise) und der Daten (ebenfalls byteweise)
Es gab einige Programme, die die Anzahl der Zeichen in einem S-Record aus Gründen der Kompatibilität mit Fernschreibern auf 56 druckbare Zeichen begrenzten. Eine UNIX-Manpage schreibt von einer Begrenzung auf 78 druckbare Zeichen. Da von Motorola kein Limit definiert wurde, sollte ein Programm auch mit einem Byte count von 255, also mit 514 druckbaren zuzüglich terminierender Zeichen, umgehen können.
Es existieren die acht unten aufgeführten Datensatztypen:
| Record | Beschreibung | Adressbytes | Datenfeld |
| S0 | Block header (Block Vorspann) | 2 | Ja |
| S1 | Datenreihe | 2 | Ja |
| S2 | Datenreihe | 3 | Ja |
| S3 | Datenreihe | 4 | Ja |
| S5 | Record count (Datensatzanzahl) | 2 | Nein |
| S6 | Record count (Datensatzanzahl) | 3 | Nein |
| S7 | End of block (Blockende) | 4 | Nein |
| S8 | End of block (Blockende) | 3 | Nein |
| S9 | End of block (Blockende) | 2 | Nein |
* Der S0-Vorspann enthält keine Programmdaten, sondern herstellerspezifische Daten. Das Datenfeld ist folgendermaßen aufgebaut:
** Modulname (20 Zeichen)
** Version (2 Zeichen)
** Revision (2 Zeichen)
** Beschreibung (0–36 Zeichen)
* Im S5-Datensatz ist die Anzahl der vorstehenden S1-, S2- und S3-Datensätze in dem zwei Byte großen Adressfeld gespeichert. Dieser Datensatz enthält kein Datenfeld. Der S6-Datensatz hat die gleiche Funktion wie der S5-Datensatz und hat auch, bis auf das drei Byte große Adressfeld, den gleichen Aufbau.
* Die Adressfelder von S7, S8, oder S9 können die Startadresse des Programmes enthalten.

## Beispiel
### Beispiel mit 16-bit Adressen

Die Prüfsumme für den ersten Beispiel-Datensatz berechnet sich wie folgt: ${0F+00+00+68+65+6C+6C+6F+21+20+20+20+20+00+00}\ {=}\ 2C4\rightarrow C4\rightarrow \neg C4\ {=}\ 3B$.

### Beispiel mit 24-bit Adresse
## Verwandte Dateiformate

Sehr ähnlich ist das Intel HEX-Format (auch kurz Intel HEX). Weitere Formate für diesen Anwendungsbereich sind z. B. der einfache Binärcode oder das Jedec-Format.

## Quellen

* ↑ srec - Linux man page
* 1 2 MC68000 Family Programmer’s Reference Manual (PDF; 2,4 MB) Appendix C
* ↑ Archivierte Kopie (Memento des Originals vom 19. Juni 2015 im Internet Archive) Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.ee.nmt.edu
* ↑ http://www.macgui.com/usenet/?author=Ron+Widell&id=1600&group=45