第20章
エラーメッセージ
TATARAは、ソースに誤りを見つけると、エラーメッセージ(error message)を1つ表示して止まります。この章では、メッセージの読み方、止まったときにTATARAがディスクに何を残すか、そして誤りがインクルード・ファイル、マクロ、繰り返しブロックの中にあるときにメッセージのあとに続く経路(trail)の行のたどり方を説明します。すべてのメッセージとその原因は、付録Dに示します。
20.1 メッセージの内容
メッセージは、誤りのあるファイルと行を示し、何が誤っているかを述べます。
; LERR.AS - an error half way down a listing. cseg ld a,1 ld b,2 ld (bc),b ld c,3 end
A:\>tatara /l lerr.as lerr.tro lerr.lst Tatara MSX Macro-Assembler v1.2.0 Copyright (C) 2026 Javier Lavandeira https://tatara.tools LERR.AS(5): ERROR: not a form this instruction has.
- ファイルは、その行があるファイルです。コマンド・ラインで指定したソース、インクルード・ファイル、またはマクロを定義したファイルのどれかです。TATARAはファイル名を大文字で表示します。
- 行は、そのファイルの先頭を1として数えます。LERR.ASの先頭のコメントが1行目なので、ld (bc),bは 5行目です。
- ERROR:のあとのテキストは、何が誤っているかを述べます。ここではld (bc),bは正しく書かれていますが、Z80にはそのような命令がありません。
閉じられていないマクロの定義や条件付きアセンブルは、ソースの最後で初めて見つかります。そのメッセージには、ファイルの最後の行ではなく、それを始めた行、つまりMACROやIFの行が示されます。
行を示さないメッセージもあります。コマンド・ラインの誤りは、ファイルを読む前に見つかるので、メッセージはバナーの前に表示されます(5.6節)。
A:\>tatara /z good.as ERROR: unknown option.
開けなかったファイルは、ERROR: cannot open NOTHERE.INCのように、メッセージの中でその名前が示されます(13章)。
/Qはバナーと要約行を省きますが、エラーメッセージは省きません。
A:\>tatara /q lerr.as LERR.AS(5): ERROR: not a form this instruction has.
20.2 TATARAは最初のエラーで止まる
TATARAが一度に表示するメッセージは1つだけです。誤りを見つけるとそこで止まり、ソースの残りは見ません。その行を直してもう一度アセンブルすると、次の誤りがあれば、TATARAはそこへ進みます。
TATARAが書きかけのオブジェクト・ファイルを残すことはありません。何が残るかは、誤りをいつ見つけたかによって決まります。
- 第1パスで見つけた場合(ほとんどの誤りはここで見つかります)、TATARAはまだオブジェクト・ファイルを作っていません。以前の実行で作った同じ名前のオブジェクト・ファイルは、そのまま残ります(5章)。
- 第2パスで見つけた場合、TATARAはすでに新しいオブジェクト・ファイルを作っています。TATARAはそれを削除するので、以前の実行で作ったものも含めて、その名前のオブジェクト・ファイルは残りません。次の例で、GOOD.ASは正しいソースで、PUB.ASにはPUBLICで宣言して定義していない名前があります。この誤りは、オブジェクト・ファイルを仕上げるときに見つかります。
A:\>tatara good.as pub.tro ... ended at GOOD.AS(5) A:\>dir pub.tro ... PUB TRO 46 26-09-30 9:04 46 bytes in 1 file 3800K free A:\>tatara pub.as pub.tro ... PUB.AS(7): ERROR: a PUBLIC name was never defined. A:\>dir pub.tro ... 0 bytes in 0 files 3808K free
第1パスの場合は古いオブジェクト・ファイルが残っていることがあり、TANRENは何も言わずにそれをリンクします。エラーのあとは、TATARAがエラーなしでソースをアセンブルするまで、リンクしないでください。
リスティングは第2パスで書き出されるので(18章)、第1パスで見つかった誤りでは、リスティングの行が1行も書き出される前に TATARAが止まります。20.1節のコマンド・ラインで指定したLERR.LSTは作られず、代わりに/Lと/Pを付けても、LERR.ASではメッセージだけが表示されます。
20.3 経路
誤りのある行が、コマンド・ラインで指定したソースから直接来たものでないときは、メッセージのあとに経路が続きます。経路は、TATARAがその行にたどり着くまでの各段階を1行ずつ、誤りのところから外側へ向かって示します。経路の各行は4文字字下げされ、次のどれかの形をしています。
- included from FILE(line):上の行のファイルは、その行のINCLUDEでインクルードされました(13章)。
- in NAME, called from FILE(line):上の行はマクロNAMEの一部で、その行がマクロを使いました(16章)。
- in a repeat block, called from FILE(line):上の行は、その行のREPT、IRP、IRPCのブロックの一部です(17章)。
- in a redefined macro, called from FILE(line):マクロと同じですが、使われたあとでマクロが新しく定義し直されたので、名前はもうそのマクロのものではありません(16.7節)。
20.3.1 経路の読み方
次の例では、繰り返しブロックの中に誤りがあります。そのブロックはマクロinnerの中にあり、innerはマクロouterが使い、outerはインクルード・ファイルの中で使われています。MACS.INCは2つのマクロを定義しています。
; MACS.INC - two macros, one using the other, with a repeat block. outer macro nop inner endm inner macro rept 1 ld (bc),b endm endm
USE.INCは2行目でouterを使い、TRAIL.ASは両方のファイルをインクルードします。
; TRAIL.AS - an error in a repeat block, in a macro, in a macro, in an ; include file. include macs.inc cseg include use.inc end
MACS.INC(8): ERROR: not a form this instruction has. in a repeat block, called from MACS.INC(7) in inner, called from MACS.INC(4) in outer, called from USE.INC(2) included from TRAIL.AS(5)
図20.1では、メッセージの各行に番号を付け、その行が示すソースの行に同じ番号を付けています。
経路は上から順に読みます。
- 誤りはMACS.INCの8行目、ld (bc),bにあります。
- その行は、7行目から始まる繰り返しブロックの一部です。
- その繰り返しブロックはinnerの一部で、innerはouterの中の4行目で使われています。
- outerはUSE.INCの2行目で使われています。
- USE.INCは、コマンド・ラインで指定したソースTRAIL.ASの5行目でインクルードされています。
最初の行は誤りのある場所を示し、最後の行は必ずコマンド・ラインで指定したソースの中にあります。その間の行は、一方からもう一方への道筋を示します。
経路に表示されないものが2つあります。USE.INCの2行目について独自のincluded fromの行がないのは、called from USE.INC(2)ですでに示されているからです。また、3行目のinclude macs.incはまったく表示されません。経路は、TATARAが誤りのある行にどうたどり着いたかを示すもので、MACS.INCはそれよりずっと前に最後まで読み終わっています。そこから来たのは、マクロの定義だけです。
20.3.2 定義し直されたマクロ
実行中に自分自身を定義し直すマクロ(16.7節)は、経路の中で自分の名前を持たなくなります。
; REDEF.AS - a macro that defines itself again, then fails. once macro once macro endm ld (bc),b endm cseg once end
REDEF.AS(5): ERROR: not a form this instruction has. in a redefined macro, called from REDEF.AS(8)
名前onceは、今では3行目で定義した空のマクロのものなので、経路は実行中のマクロにその名前を使えません。
20.4 第2パスで見つかるエラー
TATARAはソースを2回読みます(15.2節)。いくつかの誤りは、2回目に読んで1回目と比べたときに初めてわかります。
- phase error - this label had a different value on pass 1. ラベルより前の何かが、2つのパスで異なる大きさにアセンブルされました。多くの場合、条件付きアセンブルの答えが違ったためです(15.2節)。
- this label was defined on pass 1 and not on pass 2 - a conditional skipped it. 上と同じですが、ラベルがまったく飛ばされました。いちばん多い原因は、2回インクルードしたファイルです(13.6節)。
- a PUBLIC name was never defined. 第2パスの最後、オブジェクト・ファイルを仕上げるときに見つかります(12章)。
これらのエラーのあとで、TATARAは書き出していたオブジェクト・ファイルを削除します(20.2節)。
20.5 内部エラー
internal - this line emitted more bytes than fit.のようにinternal -で始まるメッセージは、内部エラー(internal error)です。TATARAは、ソースではなく自分自身の不具合を見つけました。次のものを付けて報告してください。
- ソースと、それがインクルードするすべてのファイル
- コマンド・ライン
- TATARAが表示したすべての出力
- 同じコマンドに/Fを付けたときの出力。その行がマクロから来たものなら/Mを付けたときの出力(19.4節)
out of mapper memory.は内部エラーではありません。ソースが、TATARAの表のためにメモリ・マッパーにある以上のメモリを必要としています。