いまAKI-H8をつかってSmartMediaをつなげようとしてます。このメーリングリストが 有るのを知って早速登録しました。 必要に迫られたので、バイナリエディタをつかって解析してみました。 以下の解析結果は秋月が配布している古いバージョンのH8/300H用アセンブラ、Cコ ンパイラの出力するOBJファイルで有効。とりあえず、AKI-H8のアドバンスドモード で使用するためのアドレッシングモードの分しか調べていない。また、間違いや例外 があるかもしれないので、信用しきらないでほしい。 この解析結果の応用としては、AKI-H8用のDOSみたいなものぐらいかな。自由な位置 にプログラムを配置するためには、AKI-H8上にリンカを作る必要がある。この用途に は、以下の解析結果で十分だと思う。 OBJファイルの構造 block1 block2 block3 ... blockn 0xFF03FD ここでブロックの構造は次のようになっている byte blockID byte sizeofblock byte data[sizeofblock-3] byte checksum sizeofblockがbyteなので、256バイト以上のブロックは分割さる。分割される場 合、最後のブロックをのぞいてblockIDは0x80引いた値になる。 チェックサムを含めてブロック内のすべてのbyteを足したときの最下位byteが0xFFに なっている。 blockIDは次のようになっている。順番はOBJファイル内のものになっている。分割し て場合も1つと数えている。 blockID 種類 数 0x80 file header 1 0x84 program info 1 0x86 object info 1 0x88 section info sectionの数 0x8C(0x0C) import table 0or1 0x94(0x14) export table 0or1 0x9A section header 0x9C(0x1C) section data section header1つにつき1つ 0xA0(0x20) cross refernce table section header1つにつき0または1つ それぞれのブロックのデータ部分の構造は次のようになっている。 section no./import no.は0から数える。ソースファイルでの順番とは異なる。 yymmddhhmmssとあるのは、日時のこと。たとえば、991023082542というようになって いる。2000年以降はどうするんでしょうね。 file header(0x80) 不明 program info(0x84) byte 不明 char[] yymmddhhmmss byte length of program name char[] program name PROGRAM=で指定したもの byte length of target cpu char[] target cpu '300H' obj info(0x86) byte length of obj name char[] obj name byte length of compiler name char[] compiler name 'A_H8S'または'C_H8S' char[] yymmddhhmmss byte 0x00 section info(0x88) byte 0x00:絶対アドレス(locate=で明示された場合) 0x40:相対アドレス dword 開始アドレス、相対アドレスの場合0にされる dword セクションのサイズ dword 境界調整数(align) byte セクションの種類 0x00:code 0x10:data 0x11:common 0x20:stack word 0xFFC0 byte length of name char[] name セクション名 import table(0x0C,0x8C) 次の構造のものが並んでいる byte 0xC0 byte length of name char[] name 外部参照名 export table(0x14,0x94) 次の構造のものが並んでいる word section no. byte 0x00:Cの関数 0x20:Cの変数、アセンブラのアドレスシンボル 0x40:定数シンボル dword location/value byte length of name char[] name 外部定義名 section header(0x9A) word 0x0000 word section no. このあとに、section data、cross refernce table(codeセクションの場合)がつづ く。 1つのセクションに複数個有る場合がある。 section data(0x1C,0x9C) byte 0x80 dword location byte size of data byte data[size of data] cross refernce list(0x20,0xA0) 相対アドレスセクションを参照している場合、または外部参照している場合にコード 内の未決定アドレスをリンカで設定するためのもの。 次の構造のものが並んでいる。 byte アドレッシングモード 0x04 プログラムカウンタ相対 0x05 イミディエト,ディスプレースメント付きレジスタ間接 0x07 絶対アドレス dword コード内の置き換える場所 byte 0x00 byte 置き換えるサイズ(bit) 0x08 8bit 0x10 16bit 0x18 24bit 0x20 32bit byte この位置から0xFFまでのバイト数 (アドレスの計算式) byte 0xFF アドレスの計算式は次の値と演算子の組み合わせによる。逆ポーランド記法。符号 付き32bitで計算。 ・値 byte 種類 0x00 セクションの先頭アドレス 0x02 外部参照シンボルのアドレス 0x03 定数 0x04 セクション集合のサイズ 0x05 セクション集合の先頭アドレス 前のbyteが0x03の場合 byte 0x04 signed int32 定数 それ以外 word section no.またはimport no. ・演算子 byte 0x20 + 加算 0x21 - 減算 例:02 00 12 00 00 03 03 04 00 00 00 90 20 21 00 00 00 04 21 (import18 - (section3 + 144)) - 4 LIBファイルの構造 0 file header block 0x100 obj table block 0x200 export table block 0x?00 obj1 0x?00 obj2 ... 0x?00 objn 0x?00 0xFE03FD ブロックの構造は0BJファイルと同じだが、上の項目の境界は256バイトに整理されて いる。OBJの内容はOBJファイルそのまま。 それぞれのデータ部分の構造 file header(0xE0) 0x00 char[] yymmddhhmmss char[] yymmddhhmmss 後は不明 obj table(0x62,0xE2) 次の構造が並んでいる char[] yymmddhhmmss word objimage address ファイル内でのポインター÷256 word size OBJのサイズ÷256 byte length of name char[] name export table(0x64,0xE4) 次の構造が並んでいる word obj no. byte length of name char[] name