Tatara

第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に置きます。中のディレクトリの構成を変えなければ、ほかの場所でもかまいません。

PIC

図 35.1: ソースのツリーと、そのうちビルドが使うもの。

リポジトリには、ビルドに必要なもの以外のものも入っています。配布物のインクルード・ファイル、このマニュアルの例、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の行には、どれも/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つのプログラムになる流れを示します。

PIC

図 35.2: 27のモジュール、2つのリンク・ファイル、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秒です。

新しいプログラムが動くことは、/Vで確かめられます。

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)。

PIC

図 35.3: ツールを2回ビルドする。2回目は、1回目のビルドで作ったツールを使う。

2回目のビルドのプログラムは、STAGE1にあるものと1バイトも違いません。1回目のビルドで作ったツールが、自分自身をそのまま作り直したわけです。1回目のビルドの前にBUILDにあったプログラム、つまりリリースのプログラムのコピーを取っておけば、それとも同じです。

MSX-DOSには、2つのファイルを比べるコマンドがありません。比べるには、ファイルをほかのコンピューターにコピーして、そこで比べてください。

作業が終わったら、PATHからSTAGE1を外すか、新しいセッションを始めて、インストールされているツールが実行されるようにしてください。