Tatara

第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にないオプションになります。

オプション

働き

章

/B

出力ファイルにBLOADのヘッダーを書き、標準の拡張子を.binにする

26

/D:addr

データ・セグメントをaddrから始める

24

/M

セグメントとグループの表、そしてシンボルを表示する

25

/O:file

出力ファイルの名前を指定する

この章

/P:addr

コード・セグメントをaddrから始める

24

/Q

バナーと要約行を省く

この章

/R

オブジェクト・ファイルのすべてのレコードを表示する(診断用)

付録F

/V

バナーを表示して終わる

この章

/?

使い方の画面を表示して終わる

この章

表 21.1: 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.
 

書き出すバイトを持つモジュールが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.

TANRENにないオプションか、コロンのない/D、/O、/Pです。

ERROR: cannot open NAME.TRO

その名前のオブジェクト・ファイルが見つかりません(TANRENが探す場所は23章で説明します)。

ERROR: the output file NAME is also an input file.

出力ファイルがオブジェクト・ファイルを上書きしてしまいます。

表 21.2: リンクを始める前のメッセージ

どのモジュールも定義していない名前のように、リンクの途中で見つかる誤りについては、27章で説明します。