Tatara

第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.
 

閉じられていないマクロの定義や条件付きアセンブルは、ソースの最後で初めて見つかります。そのメッセージには、ファイルの最後の行ではなく、それを始めた行、つまり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が書きかけのオブジェクト・ファイルを残すことはありません。何が残るかは、誤りをいつ見つけたかによって決まります。

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文字字下げされ、次のどれかの形をしています。

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では、メッセージの各行に番号を付け、その行が示すソースの行に同じ番号を付けています。

PIC

図 20.1: メッセージと経路の各行と、それが示すソースの行

経路は上から順に読みます。

  1. 誤りはMACS.INCの8行目、ld (bc),bにあります。
  2. その行は、7行目から始まる繰り返しブロックの一部です。
  3. その繰り返しブロックはinnerの一部で、innerはouterの中の4行目で使われています。
  4. outerはUSE.INCの2行目で使われています。
  5. 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回目と比べたときに初めてわかります。

これらのエラーのあとで、TATARAは書き出していたオブジェクト・ファイルを削除します(20.2節)。

20.5 内部エラー

internal - this line emitted more bytes than fit.のようにinternal -で始まるメッセージは、内部エラー(internal error)です。TATARAは、ソースではなく自分自身の不具合を見つけました。次のものを付けて報告してください。

out of mapper memory.は内部エラーではありません。ソースが、TATARAの表のためにメモリ・マッパーにある以上のメモリを必要としています。