カピバラ父さんのプログラミング処方箋~コンバータ

Human68kの実行ファイルの拡張子には、.Xの他に、.R、.Zがあります。

一般的なアプリケーションプログラムで、拡張子.X以外を使う理由は見当たらないので、 本項目は、ちょっと特殊な癖があるプログラマ向けと思って、読み飛ばしても大丈夫です。

コンバータCV.Xの使い方

拡張子Xの実行ファイルから、拡張子Rの実行ファイルに変換する場合、
A> cv program.x
と書きます。

変換可能な条件が整っている.Xファイルであれば、正常な.Rファイルが生成されます。

ただし、.Rに変換後も、同じ挙動をするとは限らないのでテストが必要になりますが、 テスト実行の際、拡張子を省略して実行すると、同じフォルダにある.Xが実行されてしまう ことがあるため、ちゃんと、
A> program.R
とコマンドを打ち込む必要があります。意外とやりがちなミスです。

なお、拡張子.Zのファイルを自作する必要が生じる機会は、私は思いつきません。

実は、HUMAN.SYSが.Z形式という噂を聞いたことがありますが、 一般ユーザはOSを自作しませんから、あまり参考になる事例とは思えません。

フルリロケータブルなプログラム

拡張子.Rのファイルに変換するには、いくつか条件があります。

  1. ファイルの先頭から実行すること
  2. 再配置情報を持たないこと
  3. BSS、STACKセクション末尾を、A1レジスタに依存していないこと
経験上、こんなところかと思います。

ファイルの先頭から実行するようにプログラムを書くのは簡単です。 リンクの際には、そのオブジェクトを先頭に置くことを忘れないようにしましょう。

再配置情報というのは、.Xファイルをロードしたときに、プログラム中で参照しているアドレスを、 読み込んだメモリアドレスと足し合わせて書き換えるべき場所の一覧表です。

プログラム内のラベルを「絶対アドレッシング」という方法でアクセスする箇所が1つでもあると、 .Rファイルには変換できなくなります。

3つ目のA1レジスタについては、プログラム実行直後に、 Human68kから引き渡されるアドレスレジスタの値が、.Xと.Rで違いが出るケースで問題を起こす例です。

.Xファイルの場合、A1レジスタにはBSSとSTACKを含むプロセス用メモリ末尾のアドレスが入っており、 プログラム冒頭でmove a1,sp としていると、自前のスタック領域を使うことができます。

このようなプログラムをうっかり.R形式にコンバートすると、A1レジスタの値は、 プログラムコード(TEXT,DATAセクション)の末尾になるため、スタックを使用する処理を行うと プログラムやデータ部分を侵食してしまいます。

この問題を回避するには、sp初期値を与えるときは、ちゃんとアドレス計算して渡すことです。

フルリロケータブルのメリットは?

そんなこんなで、いろいろ面倒くさい、フルリロケータブルなプログラミングです。
初学者におすすめするものではありません。

しかしながら私は、苦労に見合うだけのメリットもあると思っています。 例えば、ラベルへの絶対アドレッシングを徹底的に避けるプログラミングスタイルでは、 PC相対アドレッシングを使いますが、こうすることで、プログラムサイズが1箇所につき 1ワード減り、メモリアクセスも同様に節約できます。

絶対アドレッシングを避けるのは.Rファイルにするためではなく、 より効率的なアドレッシングがあるから使いたい、というのが優先的なモチベーションです。

そのほかのメリットとしては、実行中に読み込むデータファイル内に 68000のプログラムコードを含ませて処理させたいときの埋め込みデータ作成ができます。

例えば、キャラクタ固有の思考ルーチンや表示処理などを実装するとき、プログラム中にそのコードを置くのではなく、 キャラクタデータファイルの一部に埋め込むことができます。

キャラクタデータを追加でプラグインできるようなシステムを作りたいときには必要になる技術です。

これから68000のアセンブラを覚えるのでしたら、最初からフルリロケータブル化できる コーディング方法に慣れておくのも、悪くないと私は思います。


プログラミング処方箋へ

Copyright©2026 カピバラ父さん