Sレコード生成プログラム [ColdFire V2]
どんなに時間が経過しても、モトローラの標準バイナリ・フォーマットは、「Sレコード」です。 ダンプを作成するなら、Sレコード生成プログラムは欠かせません。
Sレコードって、何だ
バイナリの情報をテキスト・ファイルに変換するためには、色々な方法があります。 最近では、BASE64というエンコード方法がメール添付ファイルなどで使われています。
マイコンのプログラムの場合、データももちろん重要なのですが、そのデータを配置するアドレスも情報として持っていなくてはなりません。 そのために、インテルが提唱したフォーマットを「HEX」と言い、モトローラが提唱したフォーマットを「Sレコード」と呼んでいます。
Sレコードのフォーマットをちょっとだけ
「Sレコード」は、一行完結のフォーマットで、各行の先頭が"S"という文字で始まっている事から、この名前で呼ばれています。 "S"の次には、"0"から"9"の文字が続き、その行が何をあらわしているのかを示します。
文字 "S" | レコードの種別を示す文字 | データ長を示す2文字の16進数 | 2文字の16進数単位で構成されるデータ本体 | チェックサム | 行末文字 |
多くの8ビットマイコンの場合、アドレス部分は16ビットです。 この場合、種別"1"を使います。 データ本体の最初の2バイトがアドレスを示します。
一方、ColdFireのように32ビットのアドレスを使用する場合には、種別"3"が使用されます。 この場合、データ本体の最初の4バイトがアドレスを示します。 今回のプログラムの場合には、種別"3"のレコードのみを生成します。
データ長は、データ長部分とデータ本体をあわせた長さをバイト単位で表したものです。
データ本体は、配置すべきアドレスに続いて配置するデータを並べます。
チェックサムは、データ長部分とデータ本体の和の1の補数になっています。 そのため、受信したデータを検証する場合には、データ長からチェックサムまでの和が$FFになることを確認します。
Sレコード生成プログラム
フォーマットを確認したところで、サクッとプログラムを書いてしまいます。
sd(long s, long len){ long i,n,nBytes=28; char cs,d; while(len>0){ n=(len>nBytes)?(nBytes):(len); PrStr("S3");PrHexByte(n+5);PrHex(s); cs=(n+5)+(s>>24)+(s>>16)+(s>>8)+s; for(i=0;i<n;i++){d=*(s+i);PrHexByte(d);cs+=d;} PrHexByte(~cs);PrStr("\r\n"); s+=n;len-=n; } }
この関数は、以前作成したダンプ・リスト生成関数と同じ"m"ファイルに入れておきます。 使用の際には、開始アドレスと長さを指定します。
m::sd(0x400,100) S32100000400ffffffffffffffff000000000000000000000000ffffffff46fc27007d S3210000041c2e7c20008000243c4000000006820000000123c24000000041f940109c S32100000438003f1410028200000001660000084ef9000200002c002e01203c20002c S3150000045400000680000002214e7b0c05203c0000b3
現状のプログラムでは、一行に表示するバイト数を28バイトにしてあります。 お好みの長さをnBytesに設定してご使用ください。
今日の問題
ところで、「Sレコード」を出して、何に使うのでしょうか?
参考文献
Interface (インターフェース) 2008年 09月号 [雑誌]
- 作者:
- 出版社/メーカー: CQ出版
- 発売日: 2008/07/25
- メディア: 雑誌
> ところで、「Sレコード」を出して、何に使うのでしょうか?
業を煮やして逆アセンブルとか、クローンとか、、、クローンの必要は無いな。
by hamayan (2008-09-20 23:15)