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 格式，其中包括了除錯用的符號表。

## 格式

### 記錄結構

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

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

### 文字列的結束字元

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

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

### 記錄種類

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

### 記錄順序

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

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

1. S0
2. S1（一筆或多筆記錄）
3. S5（選擇性的記錄）
4. S9

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

1. S0
2. S2（一筆或多筆記錄）
3. S5（選擇性的記錄）
4. S8

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

1. S0
2. S3（一筆或多筆記錄）
3. S5（選擇性的記錄）
4. 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）不喜歡在檔案最前面出現註解，因此我們有選項，可以把註解放在檔案後面。

## 例子

**不同顏色的含義**

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

### 檢查碼的計算

以下是一個記錄的例子：

```
S1137AF00A0A0D0000000000000000000000000061
```

其檢查碼計算方式如下：

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

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

```
S00F000068656C6C6F202020202000003C
S11F00007C0802A6900100049421FFF07C6C1B787C8C23783C6000003863000026
S11F001C4BFFFFE5398000007D83637880010014382100107C0803A64E800020E9
S111003848656C6C6F20776F726C642E0A0042
S5030003F9
S9030000FC
```

## 相關條目

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

## 參考資料

## 延伸閱讀

* M68HC05EVM Evaluation Module User's Manual 4th, Motorola (Freescale), 1990  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)."
* M146805EVM Evaluation Module Users Manual 1st, Motorola (Freescale), 1983
* MCM6830L7 MIKBUG / MINIBUG ROM, Engineering Note 100, Motorola (Freescale), 1975

## 外部連結

* 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.