第35章
TATARAとTANRENを
自身のソースからビルドする
TATARAとTANRENは、TATARAがアセンブルするソース言語で書かれていて、MSXの上で、TATARAとTANRENによってビルドされます。それぞれのリリースは、その前のリリースが作ったものです。この章では、ソースのある場所とその構成を示し、2つのツールをビルドするバッチ・ファイルを順に見て、それを実行します。そのあとで、最初のビルドで作ったツールを使って、ツールをもう一度ビルドします。
ツールの内部のしくみはここでは扱いません。それぞれのモジュールは、ソースのコメントで説明されています。
35.1 ソース
3章でインストールするアーカイブには、2つのプログラム、インクルード・ファイル、README.TXT、LICENSEしか入っていません。ソースは公開リポジトリ https://github.com/javilm/tataraにあり、ZIPファイルとしてダウンロードしてMSXにコピーできます。
図35.1に、ツリーのうちビルドが使う部分を示します。この章では、ツリーをA:\SRC\TATARAに置きます。中のディレクトリの構成を変えなければ、ほかの場所でもかまいません。
リポジトリには、ビルドに必要なもの以外のものも入っています。配布物のインクルード・ファイル、このマニュアルの例、2つのツールのテスト一式です。BUILD\には現在のリリースのプログラムが入っていて、ビルドはその上に自分の作ったものを書き込みます。
注. ソースは約700 KBあり、ビルドにはそのほかにオブジェクト・ファイルと 2つのプログラムを置く場所が必要です。これは720 KBのフロッピー・ディスクに入る量を超えるので、ツールはハード・ディスクか、CFカードや SDカードの上でビルドしてください。
ビルドはすでにインストールされているツールで行うので、A:\TATARA\BIN、またはTATARA.COMとTANREN.COMのあるディレクトリがPATHに入っていなければなりません(3.4節)。
35.2 BUILD.BAT
BUILD.BATは27のモジュールをアセンブルし、2つのツールをリンクします。
rem BUILD.BAT - assemble and link both tools, with Tatara. rem SILENCE IS SUCCESS. /Q prints nothing for a module that works and rem errors print anyway, so anything on the screen between the === rem lines is a problem. set TATARA=shared\ echo === Assembling TATARA modules... tatara /q tatara\tatara.as tatara.tro tatara /q tatara\cmdline.as cmdline.tro tatara /q tatara\srcline.as srcline.tro tatara /q tatara\fields.as fields.tro tatara /q tatara\dirtab.as dirtab.tro tatara /q tatara\macros.as macros.tro tatara /q tatara\errs.as errs.tro tatara /q tatara\expand.as expand.tro tatara /q tatara\cond.as cond.tro tatara /q tatara\expr.as expr.tro tatara /q tatara\symtab.as symtab.tro tatara /q tatara\optab.as optab.tro tatara /q tatara\insn.as insn.tro tatara /q tatara\emit.as emit.tro tatara /q tatara\objout.as objout.tro echo === Assembling TANREN modules... tatara /q tanren\tanren.as tanren.tro tatara /q tanren\lcmd.as lcmd.tro tatara /q tanren\lobj.as lobj.tro tatara /q tanren\lseg.as lseg.tro tatara /q tanren\lsym.as lsym.tro tatara /q tanren\lerrs.as lerrs.tro tatara /q tanren\limg.as limg.tro tatara /q tanren\arglist.as arglist.tro echo === Assembling shared modules... tatara /q shared\msxdos.as msxdos.tro tatara /q shared\strutil.as strutil.tro tatara /q shared\alloc.as alloc.tro tatara /q shared\hash.as hash.tro echo === Linking TATARA and TANREN binaries tanren /o:build\tatara.com @tatara.lnk tanren /o:build\tanren.com @tanren.lnk echo === Cleaning up del *.tro
これはツリーのルートから実行し、次の4つのことを行います。
- TATARAをshared\にします。 モジュールはそれぞれの.INCファイルを取り込みます。それらはモジュールの隣にあり、インクルードの探し方の規則1で見つかります。モジュールはMSXDOS.INCなどSHAREDにあるファイルも取り込み、それらは規則3によってTATARAを通して見つかります(13.2節)。このディレクトリは相対パスなのでカレント・ディレクトリから見た位置になり、ビルドはツリーのルートから実行したときにしかうまくいきません(34章)。
- 27のモジュールをアセンブルします。1つのモジュールに tataraの行が1つずつあり、アセンブラーの15のモジュール、リンカーの8つ、両方が使う4つの、3つのグループに分かれています。オブジェクト・ファイルは、どれもツリーのルートに書き出されます。
- 2つのツールをリンクします。それぞれをリンク・ファイルから(22章)、/O:でプログラムをBUILDに書き出すようにしてリンクします。
- オブジェクト・ファイルを削除します。
tataraの行には、どれも/Qが付いています。エラーなしでアセンブルできたモジュールは何も表示せず、エラーは/Qの有無にかかわらず表示されます。そのため先頭のコメントにあるように、===の行の間に何かが表示されたら、それは問題があるということです。2つのリンクには/Qがなく、TANRENの要約が表示されます。
TATARA.LNKはアセンブラーの19のオブジェクト・ファイルを指定するもので、22.2節に示してあります。TANREN.LNKはリンカーの12のオブジェクト・ファイルを指定します。
; the linker's own modules. tanren.tro ; the driver lcmd.tro arglist.tro ; the command line lobj.tro ; the object reader lseg.tro lsym.tro limg.tro ; tables and the image lerrs.tro msxdos.tro strutil.tro alloc.tro hash.tro ; shared
どちらのファイルも同じ行で終わっています。共有の4つのモジュールは一度だけアセンブルし、両方のツールにリンクします。どちらのファイルもツールのドライバーを最初に指定しているので、そのコードは0100hに置かれます。MSX-DOSは.COMプログラムを0100hから実行するからです(21.1節)。図35.2に、27のモジュールが2つのプログラムになる流れを示します。
注. BUILD.BATは終わるときにTATARAを元に戻さないので、ビルドのあとはshared\が入ったままです。ほかのものをアセンブルする前に、インクルード用のディレクトリを設定し直してください(3.4節)。
35.3 実行する
BUILD.BATは、ツリーのルートから実行します。
A:\SRC\TATARA>build === Assembling TATARA modules... === Assembling TANREN modules... === Assembling shared modules... === Linking TATARA and TANREN binaries Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools 19 modules, 1898 records, ends at EOF. Wrote BUILD\TATARA.COM, 0100-7990 (30865 bytes). Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools 12 modules, 766 records, ends at EOF. Wrote BUILD\TANREN.COM, 0100-3501 (13314 bytes). === Cleaning up
アセンブルの===の行の間には何も表示されていないので、27のモジュールはどれもエラーなしでアセンブルできています。Wroteの行にentryの部分がないのは、どちらのツールのモジュールもENDの行にアドレスを書いていないからです。どちらのプログラムも、最初のモジュールのコードから、0100hで始まります(21.4節)。
ビルドにかかる時間は、マシンと、ファイルを置いたインターフェースやカードによって変わります。目安として、IDEインターフェースのCFカードや SDカードからビルドすると、MSX turbo R(パナソニックFS-A1GT)で約4分、MSX2+(ソニーHB-F1XV)で約23分かかります。turbo Rが速いのは、R800 プロセッサーのためです。
openMSXなどのエミュレーターは、エミュレートしたMSXを、本物のMSXの速さではなく、動いているコンピューターで可能なかぎりの速さで動かすこともできます。そうするとビルドの時間は大きく短くなり、最近のMacでは約14秒です。
A:\SRC\TATARA>build\tatara /v Tatara MSX Macro-Assembler v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools A:\SRC\TATARA>build\tanren /v Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools A:\SRC\TATARA>
35.4 ツール自身でツールをビルドする
最初のビルドは、インストールされているツールで行いました。それで作ったツールでもう一度ビルドすると、ツールが自分自身をビルドできることがわかります。新しいツールのコピーを専用のディレクトリSTAGE1に置き、そのディレクトリをPATHの先頭に入れます。こうすると、MSX-DOSはインストールされているものより先に、新しいTATARA.COMとTANREN.COMを見つけます。
A:\SRC\TATARA>md stage1 A:\SRC\TATARA>copy build\tatara.com stage1 A:\SRC\TATARA>copy build\tanren.com stage1 A:\SRC\TATARA>set path=a:\src\tatara\stage1;%path%
PATHには、どのディレクトリからでもツールが見つかるように、ディレクトリを完全なパスで書いています。%path%は、PATHにすでに入っていたディレクトリを、新しいディレクトリのあとに残します。
そしてBUILD.BATをもう一度実行します。1回目と同じ行が表示され、2つのプログラムが、1回目のものの上に、もう一度BUILDに書き出されます(図35.3)。
2回目のビルドのプログラムは、STAGE1にあるものと1バイトも違いません。1回目のビルドで作ったツールが、自分自身をそのまま作り直したわけです。1回目のビルドの前にBUILDにあったプログラム、つまりリリースのプログラムのコピーを取っておけば、それとも同じです。
MSX-DOSには、2つのファイルを比べるコマンドがありません。比べるには、ファイルをほかのコンピューターにコピーして、そこで比べてください。
作業が終わったら、PATHからSTAGE1を外すか、新しいセッションを始めて、インストールされているツールが実行されるようにしてください。