秋月電子のマイコンボード・AKI-H8/3664Fには、開発セットとして、日立製のCコンパイラ評価版が提供されています。このコンパイラ、小さくても最低限必要な機能などは一通りそろっているため、大変使いやすいのですが、コンパイル結果が一般的なモトローラフォーマットではなく、SYSROFと呼ばれるJapanese Localなフォーマットで出力されます。
デバッガを作る上で、プログラムのダウンロードをするためにはこのSYSROFフォーマットを扱えるか、別の既知のフォーマットに変換出来ればよいのですが、あいにく、SYSROFフォーマットの資料もほとんど無く、コンバータも存在しないため、解析することにしました。目標は、①SYSROFフォーマットから、メモリに配置すべきプログラムコード&データを取り出す、②デバッグの為のシンボル情報を取り出す、の2点です。但し、ここでいうSYSROFフォーマットとは、秋月電子AKI-H8/3664開発セット付属の日立製Cコンパイラが吐き出す、拡張子ABSのファイルをさします。一般に、日立/ルネサスのツール類はSYSROFフォーマットを扱うことが出来ますが、これらのSYSROFフォーマットと互換性があるか否かは検証していません。
参考文献(※1)によると、SYSROFフォーマットがブロック構造になっていること、ブロックの先頭はブロックのタイプを表すコードであることなどがわかりましたので、この情報を基に、適当なSYSROFフォーマットのファイルを数種類生成し、ダンプリストを眺めます。そうすると、規則性が見えてきました。その規則性から導き出した、SYSROFフォーマットの推定論理構造は以下のようなものです。
- SYSROFフォーマットのファイルは1個以上のブロックが順番に書き込まれています。
- ブロックは、バイト単位の可変長データで、『タイプ』、『サイズ』、『データ』、『チェックサム』の4つの部位で構成されています。
- 『タイプ』、『サイズ』、『チェックサム』は各1バイト、データは可変長です。
- 『タイプ』によってそのブロックに何が書かれているかを表します。『タイプ』の最上位ビットは最終ブロックフラグになっています。データが1ブロックに収まらなかった場合、同じタイプのデータを複数のブロックに分割して格納することになりますが、その際、一連のタイプのブロックの最終ブロックは、『タイプ』の最上位ビットに1を立てることによって最後のブロックであることを示します。
- 『サイズ』は、『タイプ』から『チェックサム』までのバイト数です。最も小さいブロックは、データが0バイトであるようなブロックで、3バイト(『タイプ』、『サイズ』、『チェックサム』)です。この時の『サイズ』部には03が入ります。最も大きいブロックは252バイトと思われます。
- 『チェックサム』の計算式は不明です。どうも、『タイプ』から『データ(n)』までの加算結果の下位8ビットの1の補数になっているようです。
- 『データ』部には、『タイプ』毎に異なるフォーマットで情報が格納されています。
- データの格納時のバイトオーダーはビッグエンディアンです。
- シンボル名やファイル名などの可変長データは、『バイト数n』『データ(1)』『データ(2)』・・・『データ(n)』のように格納されています。(以後、この可変長データ格納形式を[name]と呼びます。)
タイプ一覧
タイプ 名前 解説 00 HEADER 不明。ヘッダーと思われるが、ほとんど何も入っていない。 03 BUILD 作成日、ファイル名、CPUタイプなどが含まれている模様。 06 UNITINF ユニット情報。ユニットとは、1つのソースファイル(C/ASM)から生成されたコードやデータのことらしい。下の『UNITINFの構造』で示すレコードが1つ格納されている。 08 SECINF セクション情報。直前に出てきたユニットに含まれるセクションの情報。 0C REFSYM 外部参照シンボル。このユニットが参照する外部のシンボルが必要数分、羅列されている。 14 DEFSYM 外部定義シンボル。このユニットが定義・公開しているシンボルが必要数分、羅列されている。 1A SECHEAD セクションヘッダ。続くオブジェクトデータが所属するユニット番号、セクション番号を表す。 1C OBJECT オブジェクトデータ。 7F TRAILER 終了を示すブロック。以下の固定構造。
FF 03 FD
UNITINFの構造
名前 バイト数 解説 形式 1 不明 セクション 2 このユニットが使用するセクションの数。このブロックの後ろにここで示した数だけセクション情報が連続する。 外部参照シンボル数 2 このユニットが参照する外部シンボルの数。 外部定義シンボル数 2 このユニットが定義するグローバルシンボルの数。 ユニット名 name このユニットの名前。ソースコードの拡張子を省いた名前のようだ。可変長。
SECINFの構造
名前 バイト数 解説 00 1 不明 開始アドレス 4 このユニットのこのセクションが配置される先頭アドレス。 セクションサイズ 4 このセクションのサイズ(バイト) 不明1 4 境界調整数? もしかして、"section"の"ALIGN="の数値か?
ほとんどが2。不明2 3 おそらく、セクション属性。CODE/DATAとか、定数とか、Shareとか。 セクション名 name セクション名そのもの。Cのソースでは、デフォルトで P / C / D / B が生成される。
REFSYMの構造
名前 バイト数 解説 シンボルタイプ 1 不明。ほとんどがC0。 シンボル名 name シンボル名そのもの。
DEFSYMの構造
名前 バイト数 解説 セクション番号 2 おそらく、シンボルの所属セクションを示す。このユニットが持つセクションの、何番目のセクションに属するか。 シンボル種別 1 不明。00か20。多分、00はReadOnly、20はRead/Write オフセット 4 セクションの先頭からのオフセットアドレス。 シンボル名 name シンボル名そのもの。
SECHEADの構造
名前 バイト数 解説 ユニット番号 2 おそらく、このファイルに含まれるユニットの、何番目のユニットのデータかを示す。 セクション番号 2 おそらく、このユニットの何番目のセクションのデータかを示す。
OBJECTの構造
名前 バイト数 解説 不明 1 開始フラグ、圧縮フラグなどらしい。 開始アドレス 4 このオブジェクトデータを配置する先頭アドレス。 データ長 1 データのバイト数。このブロックでのバイト数。 データ 任意 データ
以下は、実際に、秋月電子AKI-H8/3664開発セット付属のCコンパイラでビルドしたABSファイルをダンプした結果です。最初のブロックがタイプ00・HEADER、サイズが33バイト、チェックサムが0x5Eであることがわかります。
SYSROFフォーマットの解析をするプログラムを作成しましたので、公開します。ソースも公開しますので、ご利用下さい。他のプログラムと同様、BSDライセンスとします。一応、お約束の免責事項です。このソフトウェアは無保証です。このソフトウェアを利用したことによって生じたいかなる損害に対しても、私は責任を負いません。
このプログラムは、SYSROFフォーマットのファイルを解析し、結果を表示します。また、モトローラのSフォーマットのHEXファイルへの変換機能もあります。第1引数が解析するSYSROFフォーマットのファイル(拡張子ABS)、第2引数がモトローラSフォーマットに変換した結果を格納するファイル名、第3引数に-aを指定すると、解析を実行します。詳細はソースコードをご覧下さい。
実行ファイル(sysrof2s.exe)、ソースコード(sysrof2s.c)
SYSROFフォーマットについては国内・海外ともほとんど文献が無く、唯一、今回の解析とSフォーマットコンバータの作成に役立ったのが以下の文献でした。
『マイクロプロセッサ向き標準OM/LM形式SYSROFの標準化動向』