6: 2008-11-14 (金) 20:11:39 |
7: 2008-11-19 (水) 19:51:54 |
| -(by [[K]], 2008.11.13) | | -(by [[K]], 2008.11.13) |
| *** 註 | | *** 註 |
- | -所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.13時点で最新のabcdw003での仕様を書きました。 | + | //-所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.13時点で最新のabcdw003での仕様を書きました。 -- commented_out by K, 2008.11.19 |
| + | -所詮はOSASK-HB向けなのでまあ暫定的なものです。とりあえず2008.11.19時点で近日リリース予定のabcdw004での仕様を書きました。 |
| *** 基本構造 | | *** 基本構造 |
| -最初の2バイトがシグネチャで、0x47 0x01。 | | -最初の2バイトがシグネチャで、0x47 0x01。 |
| -それ以降はすべてタグ。 | | -それ以降はすべてタグ。 |
- | -数値はたいてい[[GUIGUI01/memo01]]の(6)の方法でエンコードされている。以下これをeh4エンコードと呼ぶ。 | + | //-数値はたいてい[[GUIGUI01/memo01]]の(6)の方法でエンコードされている。以下これをeh4エンコードと呼ぶ。 -- commented_out by K, 2008.11.19 |
| + | -数値はたいてい[[GUIGUI01/man0004]]の(1)の方法でエンコードされている。以下これをgh4エンコードと呼ぶ。 |
| ---- | | ---- |
- | -(例)hellok0.g01 (いわゆる27バイトの"hello, world\n") | + | //-(例)hellok0.g01 (いわゆる27バイトの"hello, world\n") |
- | 47 01 8D 19 4A 2A FF D5 35 01 24 8D 68 65 6C 6C | + | // 47 01 8D 19 4A 2A FF D5 35 01 24 8D 68 65 6C 6C |
| + | // 6F 2C 20 77 6F 72 6C 64 0A 44 03 |
| + | // |
| + | // 47 01 -- シグネチャ。 |
| + | // 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。 |
| + | // _9 4_A 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 |
| + | // FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 |
| + | // -- commented_out by K, 2008.11.19 |
| + | -(例)hellok1.g01 (いわゆる27バイトの"hello, world\n") |
| + | 47 01 8D 19 4C 2A FF D5 35 01 24 8D 68 65 6C 6C |
| 6F 2C 20 77 6F 72 6C 64 0A 44 03 | | 6F 2C 20 77 6F 72 6C 64 0A 44 03 |
| | | |
| 47 01 -- シグネチャ。 | | 47 01 -- シグネチャ。 |
| 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。 | | 8D 1_ -- [0D] セクション開始タグ, ネスト内タグ数1。 |
- | _9 4_A 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 | + | _9 4_C 2A -- [14] イメージ展開タグ, イメージ長 0x2a = 42。つまり21バイト。 |
| FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 | | FF D5 35 01 24 ... 0A 44 03 -- コードセクションの中身。 |
| + | |
| | | |
| *** タグのフォーマット | | *** タグのフォーマット |
- | -タグ番号はすべてeh4でエンコード。このルールはネスト内のタグでも有効。 | + | -タグ番号はすべてgh4でエンコード。このルールはネスト内のタグでも有効。 |
| -[00] : | | -[00] : |
| --後続パラメータなし。 | | --後続パラメータなし。 |
| -[01]~[0B] : | | -[01]~[0B] : |
- | --何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。 | + | //--何らかの数値を指定。後続パラメータは1つで、eh4でエンコード。 -- commented_out by K, 2008.11.19 |
| + | --何らかの数値を指定。後続パラメータは1つで、gh4でエンコード。 |
| -[0C]~[0F] : | | -[0C]~[0F] : |
| --ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。 | | --ネスト構造型タグ。タグの中にタグが複数含まれるタグ(0や1つの場合もあるが)。まず一つのパラメータがeh4で記述され、それがネスト内に含まれるタグの数を表す。 |
| --ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 | | --ネストの中にネストのタグが含まれることも当然ありうるが、その場合はネスト全体でタグ数1と数える。上記の例を参照のこと。 |
| -[10]~[17] : | | -[10]~[17] : |
- | --4bit数値による一次元配列記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 | + | //--4bit数値による一次元配列記述用タグ。eh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 -- commented_out by K, 2008.11.19 |
| + | --4bit数値による一次元配列記述用タグ。gh4ではないエンコードのビット列などを格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるバイナリの長さを表す。ただしこの長さはバイト単位でもビット単位でもなく、4bit単位である。 |
| -[18]~[1F] : | | -[18]~[1F] : |
- | --eh4による一次元配列記述用タグ。eh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるeh4数値の個数を表す。 | + | //--eh4による一次元配列記述用タグ。eh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがeh4で記述され、それがこのタグ内に含まれるeh4数値の個数を表す。 -- commented_out by K, 2008.11.19 |
| + | --gh4による一次元配列記述用タグ。gh4でエンコードされた数値列を格納するために使われている。まず一つのパラメータがgh4で記述され、それがこのタグ内に含まれるgh4数値の個数を表す。 |
| -[20]~[27] : | | -[20]~[27] : |
| --[10]~[17]の形式の配列記述用タグ。たとえば可変長文字列の配列などを記述するために使う。 | | --[10]~[17]の形式の配列記述用タグ。たとえば可変長文字列の配列などを記述するために使う。 |
- | --最初にeh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するeh4と文字列そのものに相当する4bit配列」を繰り返す。 | + | //--最初にeh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するeh4と文字列そのものに相当する4bit配列」を繰り返す。 -- commented_out by K, 2008.11.19 |
| + | --最初にgh4があって、これが文字列の個数に相当。そしてその個数の回数だけ「各文字列長に相当するgh4と文字列そのものに相当する4bit配列」を繰り返す。 |
| -[28]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 | | -[28]以降のタグ番号については、どんなフォーマットを取るかの規定はまだない。 |
| *** タグのコード(ルート内) | | *** タグのコード(ルート内) |
| -[19] コンパクト型リロケーション情報。これを配置するときは必ず[14]の後になる(直後である必要はない)。 | | -[19] コンパクト型リロケーション情報。これを配置するときは必ず[14]の後になる(直後である必要はない)。 |
| --このリロケーションアルゴリズムは、バイナリの指定したオフセットからの4バイトに対して、指定したセクションの開始アドレスの値をリトルエンディアンで加えるというただそれだけのことをする。 | | --このリロケーションアルゴリズムは、バイナリの指定したオフセットからの4バイトに対して、指定したセクションの開始アドレスの値をリトルエンディアンで加えるというただそれだけのことをする。 |
- | --[19]ではeh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値からの増分値のみをeh4にして並べる。 | + | //--[19]ではeh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値からの増分値のみをeh4にして並べる。 -- commented_out by K, 2008.11.19 |
| + | --[19]ではgh4の配列になっているわけだが、最初の要素は「*どの*セクションの開始アドレスを加算するか」である。残りの要素が、補正の必要なオフセットの羅列になっているのだが、これはコンパクト化のための細工がある。まず補正が必要なオフセットをすべて並べて、これをソートして昇順にする。そしてデータセクションへのリンク情報の場合、オフセットを全部4で割る(つまりデータセクション内のアドレス情報はすべてアラインされていると仮定している・・・これに適合しない場合は[1A]のリロケーション情報を使う)。さらにオフセット列の最初の要素以外は前の値+4からの増分値のみをgh4にして並べる(データセクションの場合は前の値+1からの増分値)。 |
| --一つのセクションに対して、コードセクションとデータセクションの両方の補正が必要になることももちろんありうる。その場合は、[19]のタグが2回現れることとなる。bssセクションのアドレスも参照する場合は3回現れることもありえるだろう。 | | --一つのセクションに対して、コードセクションとデータセクションの両方の補正が必要になることももちろんありうる。その場合は、[19]のタグが2回現れることとなる。bssセクションのアドレスも参照する場合は3回現れることもありえるだろう。 |
| -[1A] コンパクトではないリロケーション情報。フォーマットの詳細はまだ決めていない。 | | -[1A] コンパクトではないリロケーション情報。フォーマットの詳細はまだ決めていない。 |
| ---- | | ---- |
| -上記以外はすべてリザーブ。 | | -上記以外はすべてリザーブ。 |