第13章
ファイルの取り込み
ソースは、INCLUDEを使って、ほかのファイルの行を取り込むことができます。この章では、INCLUDEが何をするか、TATARAがそのファイルをどこで探すか、環境変数TATARAがどう関わるか、そしてファイルがさらにファイルを取り込むとどうなるかを説明します。
13.1 INCLUDE
includeのあとにファイル名を書くと、TATARAはその位置でそのファイルを読みます。INCLUDEの行の代わりに、そのファイルの行がそこに書かれていたかのように扱われます。ファイルが終わると、TATARAはINCLUDEの次の行から続けます。このようにして読むファイルをインクルード・ファイル (include file)と呼びます。
; DEFS.INC - two names for MAIN.AS five equ 5 ten equ 10
include defs.inc ; the names cseg ld a,five ld b,ten ret end
リスティングでは、INCLUDEの行があった位置にDEFS.INCの行が表示されます。ほかのファイルから来た行であることを示す印は付きません。INCLUDEの行そのものは表示されません。
A:\>tatara /l /p main.as Tatara MSX Macro-Assembler v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools Tatara v1.2.0 29-Sep-26 PAGE 1 ; DEFS.INC - two names for MAIN.AS 0005 five equ 5 000A ten equ 10 cseg 0000' 3E 05 ld a,five 0002' 06 0A ld b,ten 0004' C9 ret end ended at MAIN.AS(6)
ファイル名は、拡張子を付け、引用符で囲まずに、そのまま書きます。そのあとにコメントを書いてもかまいません。TATARAは名前に何も付け加えません。include defsはDEFSという名前のファイルを探し、include "defs.inc"は引用符で始まる名前のファイルを探します。どちらもcannot openと表示して止まります。
インクルード・ファイルには、ソースに書けるものなら何でも書けます。名前、コード、データ、マクロ、そしてさらにINCLUDEの行です。よくある使い方は、いくつものプログラムで共有する名前をまとめておくことです。たとえば、MSXDOS.INCにはMSX-DOS2のファンクションの名前が入っています(14章)。
ファイルを取り込むことは、モジュールをリンクすることとは違います(2章)。インクルード・ファイルは、それを取り込んだソースの一部になり、TATARAがそのソースから作る1つのオブジェクト・ファイルの一部になります。その名前は取り込んだソースの名前になるので、PUBLICもEXTRNも必要ありません。
13.2 TATARAが探す場所
DEFS.INCのように、ドライブもディレクトリも付いていないファイル名のファイルは、何か所にもある可能性があります。TATARAは、次の3つの場所をこの順に探し、最初に見つかったものを読みます。
- INCLUDEの行があるファイルのディレクトリ
- カレント・ディレクトリ (current directory)、つまりコマンドを入力したときにいたディレクトリ
- 環境変数TATARAに書いたそれぞれのディレクトリ(左から順に)
図13.1に、1つのコマンドについて3つの場所を示します。3つの場所のどれにもDEFS.INCがありますが、TATARAが読むのは、MAIN.ASと同じSRCにあるものです。
取り込む側のファイルのディレクトリが最初に来るのは、プロジェクト自身のインクルード・ファイルが、カレント・ディレクトリやTATARAのディレクトリにある同じ名前のファイルに必ず勝つようにするためです。図13.1では、カレント・ディレクトリにA:\PROJECT\DEFS.INCがありますが、TATARAはそこまで行きません。SRCにあるものが先に見つかるからです。
それでも、カレント・ディレクトリは2番目に探されます。もしSRCにDEFS.INCがなければ、TATARAはコマンドを入力したディレクトリ、A:\PROJECTにあるものを読みます。
注. コマンド・ラインで指定したファイルは探されません。TATARAは、入力されたとおりに、ほかのディレクトリを書かなければカレント・ディレクトリから開きます(5章)。3つの場所はINCLUDEにだけ使われます。
13.3 環境変数TATARA
3章では、Tataraに付いているインクルード・ファイルのディレクトリをTATARAに設定しました。TATARAには、セミコロンで区切って複数のディレクトリを書くことができ、TATARAはそれらを左から順に探します。AUTOEXEC.BATなどのバッチ・ファイルでは、次のように書きます。
set tatara=a:\tatara\include;a:\project\inc
プロンプトで入力するときは、3章と同じように、値を引用符で囲みます。
それぞれのディレクトリの最後に\を付ける必要はありませんが、付けてもかまいません。
この環境変数は、3つの場所の最後です。上の行の場合、両方のディレクトリにあるファイルは、最初に書いたA:\TATARA\INCLUDEから読まれます。カレント・ディレクトリや、取り込む側のファイルのディレクトリにもあるファイルはそこから読まれ、環境変数はまったく使われません。
13.4 ファイル名の中のパス
INCLUDEのあとのファイル名には、ディレクトリを含めることもできます。
ドライブで始まる名前や、\で始まる名前は、絶対パス(absolute path)です。
include a:\tatara\include\msxdos.inc include \tatara\include\msxdos.inc
絶対パスは、ファイルがどこにあるかを正確に示します。TATARAは書かれたとおりに開き、ほかの場所は探しません。
それ以外の名前は相対パス(relative path)で、3つの場所で順に探されます。include sub\mid.incは、取り込む側のファイルのディレクトリ、カレント・ディレクトリ、TATARAのそれぞれのディレクトリの下の順に、SUB\MID.INCを探します。
日本のMSXでは、3章と同じように、\は¥と表示されます。同じ文字です。
13.5 ファイルを取り込むファイル
インクルード・ファイルは、さらにほかのファイルを取り込むことができます。TATARAが同時に開けるファイルは4つまで、つまりソースと3段階のインクルード・ファイルです。4段階目でTATARAは止まり、そこまでの経路を、1段階につき1行ずつ、内側から順に表示します。
D2.INC(2): ERROR: too many source files open at once. included from D1.INC(2) included from D0.INC(2) included from DEEPBAD.AS(2)
ここでは、DEEPBAD.ASがD0.INCを取り込み、それがD1.INCを取り込み、それがD2.INCを取り込み、D2.INCの 2行目が5つ目のファイルを求めました。自分自身を取り込むファイルも、同じ制限に当たります。
マクロには別の制限があり、16章で説明します。
13.6 同じファイルを2回取り込む
EQUとマクロだけを書いたファイルは、何回でも取り込めます。2回目にはそれぞれの名前にもう一度同じ値が与えられますが、これは認められています(12章)。マクロも定義し直すことができます(16章)。
ラベルを定義しているファイルは、2回取り込めません。2回目にそのラベルをもう一度定義することになるからです。
CODE.INC(2): ERROR: this name already has a value. included from TWICELAB.AS(2)
ラベルやコードを書いたファイルは、1か所でだけ取り込んでください。
警告. ファイルを2回取り込んでも問題がないようにする方法として、インクルード・ガード(include guard)が使われることがあります。ファイルの中身をIFNDEFで囲み、名前がすでに定義されていれば中身を飛ばすようにして、その内側の最初の行でその名前を定義するものです。TATARAでは、これは使えません。
ifndef gcode_inc gcode_inc equ 1 cseg shared: ret endifTATARAはソースを2回読み(5章)、1回目に定義された名前は2回目にも定義されたままです。そのため、2回目にはgcode_incがすでに定義されていて、ファイルを1回しか取り込んでいなくても、IFNDEFがその中身を飛ばしてしまいます。TATARAは、ラベルsharedが2回目に定義されなかったことに気づいて止まります。
GCODE.INC(4): ERROR: this label was defined on pass 1 and not on pass 2 - a conditional skipped it.TATARAのメッセージでは、それぞれの読み込みをパス(pass)と呼びます。条件付きアセンブルと2つのパスについては、15章で説明します。
13.7 インクルード・ファイルの中のEND
インクルード・ファイルの中のENDは、そのファイルだけでなく、ソース全体を終わらせます(12章)。INCLUDEのあとの行は読まれず、要約行はソースがどこで終わったかを示します。
ended at ENDIT.INC(2)
13.8 メッセージ
ファイルの取り込みについてのメッセージを、それぞれの原因となる行とともに表13.1に示します。
行 |
メッセージ |
名前のないinclude |
INCLUDE without a filename. |
include
nothere.inc |
cannot open NOTHERE.INC |
同時に開く |
too many source files open at once. |
TATARAがインクルード・ファイルを開けないときは、メッセージの前にファイル名と行番号が付きません。その下の行が、そのファイルがどこで求められたかを示します。
ERROR: cannot open NOTHERE.INC included from MIDMISS.INC(2) included from NESTMISS.AS(2)
インクルード・ファイルの中で起きたそれ以外のエラーは、そのファイルの名前と行番号で始まり、そのあとに同じ経路が続きます。
BAD.INC(2): ERROR: not a form this instruction has. included from MIDBAD.INC(2) included from ERRINC.AS(3)
この経路の読み方は、マクロについて加わる行も含めて、20章で説明します。