第21章
TANRENの実行
TANRENは、TATARAが作ったオブジェクト・ファイルを1つのプログラムにまとめます。この章では、TANRENの実行のしかた、つまりコマンド・ライン、出力ファイルの名前の付き方、オプション、TANRENが表示するもの、そしてリンクを始める前のメッセージについて説明します。そのほかのことは、あとの章で詳しく説明します。リンク・ファイル(22章)、TANRENがオブジェクト・ファイルを探す場所(23章)、プログラムのメモリへの配置(24章)、モジュールの間での名前の対応(25章)、出力ファイルの種類(26章)、エラーメッセージ(27章)です。
TATARAと同じように、TANRENにはMSX-DOS2またはNextorと、メモリ・マッパーが必要です。
21.1 コマンド・ライン
コマンド・ラインは、tanrenのあとにオブジェクト・ファイルの名前とオプションを書いたものです。
tanren [options] object [object...]
拡張子なしで指定したオブジェクト・ファイルには.troが付くので、tanren main subはMAIN.TROとSUB.TROをリンクします。名前でもオプションでも、文字は大文字でも小文字でもかまいません。
次の2つのモジュールで、小さなプログラムができます。MAIN.ASは、SUB.ASにあるgreetを呼び出します。どちらも、MSX-DOSのファンクションの名前とsystemマクロのためにMSXDOS.INCをインクルードし、SUB.ASはさらに、表示する行を終わらせるキャリッジ・リターンとライン・フィード、CHR_CRとCHR_LFのためにASCII.INCをインクルードします(14章)。
; MAIN.AS - calls greet, in another module, and ends the program. include msxdos.inc extrn greet cseg start: call greet system _TERM0 end start
; SUB.AS - greet prints a line. include msxdos.inc include ascii.inc public greet cseg greet: ld de,msg system _STROUT ret dseg msg: db 'Hello from TANREN.',CHR_CR,CHR_LF,'$' end
それぞれをアセンブルしてオブジェクト・ファイルにし、TANRENが2つをリンクしてMAIN.COMにします。
A:\>tatara /q main.as main.tro A:\>tatara /q sub.as sub.tro A:\>tanren main sub Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools 2 modules, 16 records, ends at EOF. Wrote MAIN.COM, 0100-0125 (38 bytes), entry 0100. A:\>main Hello from TANREN.
21.1.1 オブジェクト・ファイルの順序
TANRENは、モジュールを指定した順にメモリに置きます。最初のモジュールのコードをメモリ・アドレス0100hに、次のモジュールのコードをそのすぐあとに、というように続けます(データの置き場所は24章で説明します)。MSX-DOSは.COMのプログラムを必ずメモリ・アドレス 0100hから始めるので、最初に実行するコードのあるモジュールを、最初に指定しなければなりません。
同じ2つのモジュールを逆の順に指定すると、greetのコードから始まるプログラムになります。
A:\>tanren sub main ... WARNING: SUB.COM is entered at 0100, not at 0109. 2 modules, 16 records, ends at EOF. Wrote SUB.COM, 0100-0125 (38 bytes), entry 0109.
要約行には、MAIN.ASのENDの行にあるアドレスstartが0109hになったと表示されますが、.COMのプログラムはそこからは始まりません。MSX-DOSは0100hにあるものを実行します。TANRENは要約の前に、/Qを付けていてもこのことを警告し、ファイルはそのまま書き出します。この警告は、/Bなしで書き出すファイルのエントリー・アドレスが、ファイルの最初のアドレスと違うときに必ず表示されます。/Bを付けると、エントリー・アドレスはBLOADのヘッダーに入り、警告は出ません(26章)。
21.1.2 名前の間の空白
名前とオプションは、空白またはタブで区切ります。それ以外の文字は、コンマも含めて名前の一部になります。
A:\>tanren main,sub ... ERROR: cannot open MAIN,SUB.TRO
オプションは、名前の前、あと、名前の間のどこに書いてもかまいません。
21.2 出力ファイル
TANRENは出力ファイルに、最初のオブジェクト・ファイルの名前に拡張子.comを付けた名前を付け、そのオブジェクト・ファイルと同じディレクトリに書き出します。BLOAD用のファイルを書き出す/Bを付けると、拡張子は.binになります。
A:\>tanren /b main sub ... Wrote MAIN.BIN, 0100-0125 (38 bytes), BLOAD header, entry 0100.
/O:は出力ファイルの名前を指定します。名前はコロンのすぐあとに書きます。
A:\>tanren main sub /o:prog.com ... Wrote PROG.COM, 0100-0125 (38 bytes), entry 0100.
名前は書いたとおりに使われます。TANRENは拡張子を付けないので、/o:progでは拡張子のないPROGというファイルが書き出され、MSX-DOSはこれをコマンドとして実行しません。
コマンド・ラインの誤りで入力のファイルを上書きしないように、出力ファイルはオブジェクト・ファイルのどれとも同じであってはなりません。
A:\>tanren /o:sub.tro main sub ... ERROR: the output file SUB.TRO is also an input file.
TANRENは名前を書いたとおりに比べるので、2つの異なるパスで指定した同じファイルには気が付きません。
21.3 オプション
TANRENのオプションを表21.1に示します。アドレスは1桁から4桁の16進数で、/p:4000のようにhを付けずに書きます。/D:、/O:、/P:にはコロンが必要で、/pだけではTANRENにないオプションになります。
/P:はコードの始まる場所を変え、要約行にそれが表示されます。
A:\>tanren /p:4000 /o:high.bin main sub ... Wrote HIGH.BIN, 4000-4025 (38 bytes), entry 4000.
21.4 TANRENが表示するもの
TANRENは、TATARAと同じようにバナーを表示して始まり、2行の要約で終わります。
2 modules, 16 records, ends at EOF. Wrote MAIN.COM, 0100-0125 (38 bytes), entry 0100.
- modulesは、TANRENが読んだオブジェクト・ファイルの数です。recordsは、その中にある情報のまとまりの数で、各セグメントのバイト、名前、TANRENがアドレスを書き込む場所などです(付録F)。
- ends at EOFは、各オブジェクト・ファイルが、最後のレコードが示すところで終わっていたことを示します。そのあとに何かあるときは、代わりにAND BYTES AFTER THEM.と表示され、その前の行にそのファイルの名前が表示されます。TATARAはそのようなファイルを作らないので、そのモジュールをもう一度アセンブルしてください(27.3節)。
- Wroteは、出力ファイルの名前、最初と最後のバイトのアドレス、そのバイト数を示します。/Bを付けると、ディスク上のファイルはBLOADのヘッダーの分だけ7バイト長くなり、この行にもそう表示されます。
- entryは、ENDの行で指定したアドレスです。/Bのときにヘッダーに書き込まれます。/Bなしでは、ファイルの最初のアドレスでなければならず、違うとTANRENは警告します。
書き出すバイトを持つモジュールが1つもないときは、2行目はNothing to write: no module has any content.になります。
/Qはバナーと要約を省きます。エラーは/Qがあってもなくても表示されるので、/Qを付けて何も表示されなかったリンクは成功しています。/Vはバナーを表示して終わり、/?、またはオブジェクト・ファイルを1つも指定しないtanrenは、バナーと使い方の画面を表示します。
A:\>tanren Tatara MSX Linker v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools Usage: TANREN [options] <object|@list> [more...] Options: /B Write a BLOAD header on the output file /D:<addr> Start the data segments at <addr> /M Print the segment and group tables /O:<file> Write the image to <file> /P:<addr> Start the code segments at <addr> /Q Omit the banner above and the summary line /R Print every record in the object files /V Print the program version /? Print this screen <object> : A .tro file; .tro is assumed when you leave it off. @<list> : A file of the same words; ; is a comment, .lnk is assumed. <addr> : One to four hex digits, as in /P:4000. <file> : The output. Default: the first object with .com (.bin with /B). It may not be an input file.
21.5 127文字のコマンド・ライン
MSX-DOSがコマンドに与えるのは、プログラムの名前と空白を含めて127文字です。プロンプトでは、COMMAND2はそれ以上を受け付けず、127文字を超えてキーを押してもビープ音が鳴るだけです。バッチ・ファイルでは、それより長い行はまったく実行されず、COMMAND2は*** Command too longと表示します。
モジュールの多いプログラムでは、それでは足りないことがあります。リンク・ファイル(link file)には、同じ言葉を必要なだけファイルに書いておけるので、コマンド・ラインにはtanren @progのようにそのファイルだけを書きます(22章)。
ほかのプログラムがもっと長い行でTANRENを実行すると、MSX-DOSはそれを何も言わずに127文字で切ります。TANRENのコマンド・ラインがちょうど 127文字のときは、何かが切られたかどうかがわからないので、TANRENは/Qがあっても警告を表示します。
WARNING: the command line is 127 characters, which is all MSX-DOS gives - anything past it was dropped in silence. Use @<file> if a module is missing.
21.6 TANRENが始まらないとき
TANRENが何かをリンクする前に表示するメッセージを、表21.2に示します。最初の3つはバナーの前に表示されます。
メッセージ |
意味 |
ERROR: Tanren needs MSX-DOS2 or Nextor. |
MSXがMSX-DOS1で動いています。 |
ERROR: Tanren needs a memory mapper. |
MSXにメモリ・マッパーがありません。 |
ERROR: unknown option. |
|
ERROR: cannot open NAME.TRO |
その名前のオブジェクト・ファイルが見つかりません(TANRENが探す場所は23章で説明します)。 |
ERROR: the output file NAME is also an input file. |
出力ファイルがオブジェクト・ファイルを上書きしてしまいます。 |
どのモジュールも定義していない名前のように、リンクの途中で見つかる誤りについては、27章で説明します。