SREC

Motorola S-record是摩托羅拉公司所創立的檔案格式，可以將二進制的資訊轉換為用ASCII文字表示的十六進位資料，此檔案格式也稱為SRECORD、SREC、S19、S28、S37或MOT。此檔案格式常用在微處理器的快閃記憶體資料寫入，EPROM、EEPROM的資料寫入，或是其他可編程邏輯元件的編程寫入。一般的應用中，會用編譯器或是組譯器將程式的原始碼（可能是C語言或是組合語言）轉換為機器碼，再輸出為S-record或其他格式檔案。燒錄器可以讀取這些檔案，將機器碼寫入非揮發性記憶體中，或是截入到目的系統中，以便執行。

## 簡介

S-record檔案格式是摩托羅拉公司在1970年代中期，為了摩托羅拉6800處理器所創的檔案格式。針對摩托羅拉6800處理器及其他嵌入式系統的軟體開發工具可以將可執行檔及資料轉換為S-record格式。PROM燒錄器可以讀取S-record，燒錄到嵌入式系統的PROM或EPROM中。

### 其他HEX格式

也存在類似用途的其他ASCII檔案格式。BPNF、BHLF及B10F是早期的二進制格式，不過檔案較大，也沒有可變性。十六進制格式用一個字元表示四個位元，相較於二進制格式用一個字元表示一個位元，檔案比較精簡。許多十六進制格式（包括S-record）的可變性較大，其中可以包括位址的資訊，因此其內容可以只對應PROM的一部份。Intel HEX格式常用在Intel的處理器上。Tek Hex是另一種HEX格式，其中包括了除錯用的符號表。

## 格式

### 記錄結構

S｜記錄種類｜位元組數量｜位址｜資料｜檢查碼

SREC格式的檔案包括一組的ASCII字元記錄。記錄從左到右的結構如下：

- 記錄種類，二個字元，第一個字元為大寫的S（0x53），後面是數字字元的0至9，定義記錄的種類。
- 位元組數量，由16進制的二位數組成，表示記錄中剩下的位元組數（16進制二位數表示一個位元組），此欄位的最小值為3，對應16進制的位址欄位加上一個位元組的檢查碼，最大值為255（0xFF）。
- 位址，依記錄種類不同，位址可能是四位／六位／八位的16進制數字，位址會以大端序（高位元組放前面）的格式記錄。
- 資料，由2n個16進制數字組成。若是S1／S2／S3種類的記錄，每筆記錄的資料一般最多是32個位元組，可以在每行80個字的終端機螢幕顯示，不過記錄資料若只有16個位元組，在視覺上比較容易識別
- 檢查碼，由2個16進制數字組成，是位元組數量、位址和資料對應的位元組相加後，取最低位元組，再計算一補數，以下有計算檢查的例子。

### 文字列的結束字元

SREC記錄之間會用一個或是多個ASCII字元的行分隔字元隔開，因此每一個記錄就會佔一行。此作法透過直觀的分隔符記錄來提高易讀性，而且在HEX記錄之間的填充也可以提高語法分析器的效率。

產生HEX的程式一般會依其作業系統的習慣使用對應的行分隔字元。例如，Linux程式會用單一的LF字元（換行符號，16進制`0A`）作為一行的結尾，但Windows程式會用CR字元（回車符，16進制`0D`）之後接著LF字元，作為一行的結尾。

### 記錄種類

以下的表格說明十種可能出現的S-records，其中的S4保留，目前沒有定義，S6一開始也是保留，後來有新的定義。

記錄欄位｜記錄用途｜位址欄位｜資料欄位｜記錄說明

S0｜檔案頭｜16-bit"0000"｜是｜此記錄會包括許多設備商定義的ASCII文字，每個位元組由二個16進制數字表示。此欄位的資料常會以C風格字串的方式表示。其中的文字資料可能會包括：檔案／模組名稱，版本編號，日期／時間，產品名稱。PCB上的記憶體IC名稱、版權說明等。

S1｜資料｜16-bit位址｜是｜此記錄是啟始位址是16位元的資料，一般會用在8-bit的微處理器中，例如AVR、PIC、8051、68xx、6502、80xx、Z80。其資料欄位的位元組數量是「位元組數量」欄位的值減3（2個位元組對應16位元的位址，1個位元組對應檢查碼）。

S2｜Data｜24-bitAddress｜是｜此記錄是啟始位址是24位元的資料。其資料欄位的位元組數量是「位元組數量」欄位的值減4（3個位元組對應24位元的位址，1個位元組對應檢查碼）。

S3｜Data｜32-bitAddress｜是｜此記錄是啟始位址是32位元的資料This record contains data that starts at a 32-bit address.，一般會用在32-bit的微處理器中，例如ARM和680x0其資料欄位的位元組數量是「位元組數量」欄位的值減5（4個位元組對應32位元的位址，1個位元組對應檢查碼）。

S4｜保留｜不適用｜不適用｜此記錄保留

S5｜個數｜16位元計數值｜不適用｜此欄位是可有可無的欄位，其中有S1 / S2 / S3記錄的數量，用16位元來計數。此欄位適用於記錄數量小於等於65,535（0xFFFF）的情形，若是超過，會改用S6欄位。

S6｜個數｜24位元計數值｜不適用｜此欄位是可有可無的欄位，其中有S1 / S2 / S3記錄的數量，用24位元來計數。此欄位可以適用於記錄數量大於等於65,536（0x010000），但小於等於16,777,215（0xFFFFFF）。這個較新的欄位是最新的變更。

S7｜起始位址（檔案終止符）｜32位元位址｜不適用｜此欄位用32位元記錄啟始的位址，用來作為一連串S3記錄的結尾。若SREC檔案只用來燒錄記憶體設備，不需執行位置的資料，此處的位址可以用0代替。

S8｜起始位址（檔案終止符）｜24位元位址｜不適用｜此欄位用24位元記錄啟始的位址，用來作為一連串S2記錄的結尾。若SREC檔案只用來燒錄記憶體設備，不需執行位置的資料，此處的位址可以用0代替。

S9｜起始位址（檔案終止符）｜16位元位址｜不適用｜此欄位用16位元記錄啟始的位址，用來作為一連串S1記錄的結尾。若SREC檔案只用來燒錄記憶體設備，不需執行位置的資料，此處的位址可以用0代替。

### 記錄順序

有些Unix文件中提到「檔案中S-records的順序不重要，不應假設其順序。」，不過大部份產生SREC的軟體都會按照次序排列S-records。一般的檔案順序會由一個（選擇性）的S0檔頭記錄，之後有一筆或是多筆S1／S2／S3資料記錄，可能有一個S5／S6記錄來說明記錄個數，最後由一個適當的S7／S8／S9記錄作結束。

S19-格式，16位元位址的記錄

- S0
- S1（一筆或多筆記錄）
- S5（選擇性的記錄）
- S9

S28-格式，24位元位址的記錄

- S0
- S2（一筆或多筆記錄）
- S5（選擇性的記錄）
- S8

S37-格式，32位元位址的記錄

- S0
- S3（一筆或多筆記錄）
- S5（選擇性的記錄）
- S7

### 限制

記錄長度：Unix手冊中提到：「每個S-record記錄的長度小於等於78個字元」。手冊進一步的限制資料欄位字元限制在64個字元（32個位元組）以內。用8個字元表示位址的資料欄位，若資料為64個字元，總長度為78個字元（2+2+8+64+2，此計算省略了記錄尾端的終止符號或是換行符號)。這個檔案可以用80字元寬的列表機列印。在手冊下面有說明：「此說明只是針對記錄總長度在78個字元的情形，不一定適用於所有情形。」。若省略此限制，S-record的最大長度為514字元：記錄種類2個字元，位元組數量2個位元（其值會是`0xFF=255`），以及位址、資料及檢查碼共2*255個字元。而且需要額外的空間儲存換行符號以及字串結束字元。若記錄長度太長，會有一些問題：「Motorola S-record格式定義允許一行到514個字元，另外加上行終結符號。EPROM燒錄器需要有夠大的行暫存器來處理這麼長的資料，但有這麼大暫存器的EPROM燒錄器不多。」

資料欄位：有些文件建議資料欄位最長到32位元組的資料（64個字元）。S0／S1／S2／S3的最小資料欄位長度為0，最大資料資料欄位長度視位址欄位長度而定。因為位元組數量最大值是255（0xFF），資料欄位的長度為255減1（檢查碼）再減去位址欄位的位元組長度)。S0／S1 records最多可以到252位元組的資料，S2 record最多可以到251位元組的資料，S3 record最多可以到250位元組的資料。

註解：SREC檔案格式不支援註解，有些軟體會省略開頭不是S的資料行，也會省略檢查碼之後的欄位，有時會有這些部份來寫註解（但沒有相容性）。例如CCS PIC編譯器支援在Intel HEX檔案最前面或是最後面的行，前面加上分號當成註解，其手冊提到：「有些燒錄器（尤其是MPLAB）不喜歡在檔案最前面出現註解，因此我們有選項，可以把註解放在檔案後面。

## 例子

不同顏色的含義

### 檢查碼的計算

以下是一個記錄的例子：

```
<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">13</span><span style="background-color: #CCCCFF">7AF0</span><span style="background-color: #CCFFFF">0A0A0D00000000000000000000000000</span><span style="background-color: #CCCCCC">61</span>
```

其檢查碼計算方式如下：

- 加總：將每個位元組相加13 + 7A+F0 + 0A+0A+0D+00+00+00+00+00+00+00+00+00+00+00+00+00 = `19E` （16進制）
- 取最低位元組：總和的最低位元組 = `9E`（16進制）。
- 取補數：計算最低位元組的一補數 = 61（16進制）。

### 16位元的記憶體位址

```
<span style="background-color: #FFCCCC">S0</span><span style="background-color: #CCFFCC">0F</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF">68656C6C6F20202020200000</span><span style="background-color: #CCCCCC">3C</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">1F</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF">7C0802A6900100049421FFF07C6C1B787C8C23783C60000038630000</span><span style="background-color: #CCCCCC">26</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">1F</span><span style="background-color: #CCCCFF">001C</span><span style="background-color: #CCFFFF">4BFFFFE5398000007D83637880010014382100107C0803A64E800020</span><span style="background-color: #CCCCCC">E9</span>

<span style="background-color: #FFCCCC">S1</span><span style="background-color: #CCFFCC">11</span><span style="background-color: #CCCCFF">0038</span><span style="background-color: #CCFFFF">48656C6C6F20776F726C642E0A00</span><span style="background-color: #CCCCCC">42</span>

<span style="background-color: #FFCCCC">S5</span><span style="background-color: #CCFFCC">03</span><span style="background-color: #CCCCFF">0003</span><span style="background-color: #CCFFFF"></span><span style="background-color: #CCCCCC">F9</span>

<span style="background-color: #FFCCCC">S9</span><span style="background-color: #CCFFCC">03</span><span style="background-color: #CCCCFF">0000</span><span style="background-color: #CCFFFF"></span><span style="background-color: #CCCCCC">FC</span>
```

## 相關條目

- 二進制對應文字的編碼，不同編碼演演算法的比較
- Intel HEX，Intel的HEX檔案格式
- Tektronix extended HEX，Tektronix的HEX檔案格式

## 延伸閱讀

- Appendix A, "S Record Information", page A-1, states, "For compatibility with teletypewriters, some programs may limit the number of data bytes to as few as 28 (56 printable characters in the S-record)."

## 外部連結

- RFC 4194 - The S Hexdump Format - IETF

軟體

- SRecord is a collection of tools for manipulating SREC format files.
- BIN2MOT, BINARY to Motorola S-Record file converter utility.
- SRecordizer is a tool for viewing, editing, and error checking S19 format files.
- bincopy is a python package for manipulating SREC format files.

## 基本資料

- 日語原文：S-record
- 域：
- 擴展名：`.s19`, `.s28`, `.s37`, `.s`, `.s1`, `.s2`, `.s3`, `.sx`, `.srec`, `.exo`, `.mot`, `.mxt`
- 開發者：摩托羅拉