# S-record

Il formato S-record Motorola è una codifica di dati da binario a esadecimale ("hex") in testo ASCII . È noto anche come SREC o S19. Ogni record contiene un checksum per rilevare errori durante la trasmissione. Il primo record (S0) può includere commenti arbitrari come il nome del programma o il numero di versione. L'ultimo (terminazione) record (S7, S8, o S9) può comprendere un indirizzo di partenza.
Il formato S-record è stato creato nel 1970 per il processore Motorola 6800 quale tool di sviluppo software per questo e altri processori embedded, per convertire codice eseguibile e dati in formato S-record. I programmatori di PROM sono in grado leggere il formato S-record e "bruciare" i dati nelle PROM o EPROM utilizzate nei sistemi embedded.
Esistono altre codifiche ASCII con uno scopo simile. BPNF, BHLF e B10F sono vecchie codifiche di formati binari, ma non sono né compatti né flessibili. I formati esadecimali sono più compatti perché rappresentano 4 bit per carattere, anziché uno solo. Altri, al pari di S-record, sono più flessibili, poiché includono informazioni di indirizzo, in modo da poter specificare solo una parte di una PROM. Il formato HEX di Intel è stato spesso utilizzato con processori Intel. Hex Tek è un altro formato esadecimale che può includere una tabella dei simboli per il debug.

## Formato

Un file in formato SREC consiste in una serie di record ASCII. Tutti i numeri esadecimali (hex) sono espressi in Big Endian. I record hanno la seguente struttura:
* Codice d'inizio, un carattere, una S.
* Tipo Record, una cifra, da 0 a 9, definisce il tipo del campo dati.
* Contatore byte, due cifre esadecimali, indica il numero di byte (coppie di cifre esadecimali) che seguono nel resto del record (indirizzo, dati e campi di checksum).
* Indirizzo, quattro, sei, o otto cifre esadecimali, determinati dal tipo di record per la locazione di memoria del primo byte di dati. I byte degli indirizzi sono espressi nel formato big endian.
* Dati, sequenza di coppie di n cifre esadecimali, per n byte di dati.
* Checksum, due cifre esadecimali: il byte meno significativo del complemento a uno della somma dei valori rappresentati dalle due coppie di cifre esadecimali per il numero di byte, l'indirizzo e campi dati. Ad esempio:
S1137AF0 0A0A0D0000000000000000000000000061
13+7A+F0 +0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = 19E, poi prendere il byte meno significativo e quindi prendere il complemento a uno di tale byte (9E) che è uguale a 0x61
Ci sono otto tipi di record, elencati di seguito:
| Record | Descrizione | Bytes di indirizzo | Sequenza dati |
| S0 | Blocco di intestazione | 2 | Si |
| S1 | Sequenza dati | 2 | Si |
| S2 | Sequenza dati | 3 | Si |
| S3 | Sequenza dati | 4 | Si |
| S5 | Contatore record | 2 | No |
| S7 | Fine blocco | 4 | No |
| S8 | Fine blocco | 3 | No |
| S9 | Fine blocco | 2 | No |

### S0

La sequenza dati del record S0 contiene i dati specifici del fornitore piuttosto che i dati di programma. Una stringa con il nome del file ed eventualmente informazioni sulla versione.

### S1, S2, S3

Sequenza dati, dipendente dalla dimensione dell'indirizzo. Un sistema a 16-bit/64K utilizza S1, a 24-bit di indirizzo utilizza S2 e a 32-bit utilizza S3.

### S5

Conteggio dei record S1, S2 e S3 che in precedenza compaiono nel file o nella trasmissione. Il conteggio dei record è memorizzato nel campo a 2 byte di indirizzo. Non ci sono dati associati a questo tipo di record.

### S7, S8, S9

Il campo indirizzo del record S7, S8, oppure S9 può contenere un indirizzo di partenza per il programma.

## Esempio

Codice d'inizio
Tipo Record
Contatore byte
Indirizzo
Dati
Checksum