第18章
リスティング
リスティングには、TATARAがソースから何を作ったかが表示されます。それぞれの行が書いたとおりに、アセンブルされたアドレスと、作られたバイトとともに表示されます。プログラムがソースのとおりに動かないときや、ある行が思ったより多くの場所を取るときには、リスティングを見ます。
リスティングの出し方は、5章で説明しました。リスティングは、コマンド・ラインの3つ目に書いたファイルに書き出され、それがなければ、/Pを付けたときに画面に表示されます。/Lを付けると、それぞれの行の前にアドレスとバイトが付きます。付けなければ、リスティングにはソースだけが表示されます。この章では、/Lを付けたリスティングについて説明します。ファイルではなく画面で見るには、両方のオプションを付けます。
tatara /l /p modes.as
この章の残りでは、リスティングの1行に何が表示されるか、リスティングがどのようにページに分かれるか、そしてリスティングに何を表示するかをソースから決める疑似命令について説明します。
18.1 リスティングの1行
リスティングの1行の欄を図18.1に示します。最初にアドレス、次にバイト、そのあとにソース行がそのまま表示されます。
次のソースには、それぞれの種類の行が1つずつあります。
extrn far five equ 5 aseg org 4000h abs: nop cseg code: ld hl,data call far db 1,2,3,4,5,6,7,8,9 only: dseg data: ds 2 end
extrn far 0005 five equ 5 aseg org 4000h 4000 00 abs: nop cseg 0000' 21 00 00 code: ld hl,data 0003' CD 00 00 call far 0006' 01 02 03 04 db 1,2,3,4,5,6,7,8,9 000A' 05 06 07 08 000E' 09 000F' only: dseg 0000' data: ds 2 end
- アドレスは、その行がアセンブルされたアドレスで、16進数で表示されます。only:やdata: ds 2のように、バイトを作らずにラベルを定義する行には、そのラベルのアドレスが表示されます。EQUの行では、アドレスの欄に名前の値が表示されます。
- リロケーション・マークのアポストロフィーは、リロケータブルなアドレス、つまりTANRENが仕上げるコード・セグメントまたはデータ・セグメントの中のオフセットのあとに付きます(10章)。4000hのようなアブソリュート・セグメントのアドレスには付きません。コードとデータで同じマークです。
- バイトは、その行が作ったバイトで、メモリに並ぶ順に、1行に4つまで表示されます。それより多く作る行は、アドレスとバイトだけの行に続きます。9バイトのDBは3行になります。
- そのあとに、ソース行が書いたとおりに表示されます。
EXTRN、ASEG、ORGのように、何も作らず、何も定義しない行では、アドレスとバイトの欄は空になります。
オペランドがリロケータブルまたは外部のときは、TANRENが仕上げる前の、オブジェクト・ファイルにあるとおりのバイトが表示されます。dataではセグメントの中のオフセットの0000h、外部の名前farでは0です。これらのバイトにはマークが付きません。M80のリスティングでは、このようなオペランドは16ビットの値1つにマークを付けて、0000"や0000*のように表示されますが、TATARAはメモリに並ぶ順にバイトを1つずつ表示し、マークは付けません。
マクロの展開または繰り返しブロックから作られた行には、ソース行の前の欄に+が付きます(16章)。
18.2 ページ
リスティングはページに分かれます。各ページはページ見出し(page heading)で始まります。ページ見出しは、タイトル、TATARAの名前とバージョン、日付、ページ番号の行と、サブタイトルの行、空の行からなります。プリンターが新しい紙に印刷を始めるように、2ページ目からは各ページがフォーム・フィードで始まります。1ページには、標準でソースの56行が入ります。
ページは、次の3つの疑似命令で制御します。
- TITLE textはタイトルを設定します。タイトルはページ見出しの左に表示されます。
- SUBTTL textはサブタイトルを設定します。サブタイトルはページ見出しの下の行に表示されます。
- PAGEは、その行のあとで新しいページを始めます。PAGEnは1ページの長さをn行にし、同じように新しいページを始めます。この行数はページ全体の行数で、そのうち4行はページ見出しに使われるので、page 12ではソースに8行が残ります。nは10から255まででなければなりません。1桁目に書いたM80の*EJECTと$EJECTは、数のないPAGEの別名です。
TATARAは、タイトルとサブタイトルの最初の28文字を残し、それよりあとは捨てます。
次のソースは、タイトルとサブタイトルを設定し、ページを短くして、後半を新しいページから始めます。
title Page test subttl First part page 12 cseg db 1 db 2 ... db 10 subttl Second part page db 11 end
Page test Tatara v1.2.0 30-Sep-26 PAGE 1 title Page test subttl First part page 12 Page test Tatara v1.2.0 30-Sep-26 PAGE 1-1 First part cseg 0000' 01 db 1 0001' 02 db 2 0002' 03 db 3 0003' 04 db 4 0004' 05 db 5 0005' 06 db 6 0006' 07 db 7 Page test Tatara v1.2.0 30-Sep-26 PAGE 1-2 First part 0007' 08 db 8 0008' 09 db 9 0009' 0A db 10 subttl Second part page Page test Tatara v1.2.0 30-Sep-26 PAGE 1-3 Second part 000A' 0B db 11 end
2ページ目からの見出しが2桁左にずれているのは、それぞれがフォーム・フィードで始まり、フォーム・フィードはページ上で場所を取らないためです。このリスティングから、次のことがわかります。
- TITLEの行は見出しのあとにありますが、最初のページにはすでにタイトルがあります。TATARAはタイトルを第1パスから引き継ぐので(15章)、最初のページにはソースの最後のタイトルが表示されます。それからは、各ページには、そのページが始まったときのタイトルが表示されます。ソースの最初にTITLEを1つだけ書けば、すべてのページにそれが表示されます。
- サブタイトルは第1パスから引き継がれず、SUBTTLの行の次のページから表示されます。ソースの新しい部分を、それ自身のサブタイトルを付けて新しいページから始めるには、上の例のようにSUBTTLのあとにPAGEを書きます。
- ページ番号は1、1-1、1-2、1-3と進みます。PAGEで、または前のページがいっぱいになって始まったページは、同じページの一部として番号が付きます。主番号はそのままで、ダッシュのあとの番号が増えます。
主番号は、ソースの中のフォーム・フィードで増えます。フォーム・フィード(文字コード0Ch)だけの行は新しいページを始め、そのページの番号は2、3と進み、そのあとのページは2-1、2-2となります。これはM80と同じページ番号の付け方で、フォーム・フィードで区切ったソースを、部分ごとに1つの主番号で印刷できます。
18.2.1 最後のページ
ファイルに書き出したリスティングは、番号がSのページで終わります。このページには、ソースが定義したマクロの名前と、シンボルとその値が表示されます。
Tatara v1.2.0 30-Sep-26 PAGE S Macros: Symbols: 000F' only 0000* far 0000' data 4000 abs 0000' code 0005 five
これは18.1節のソースのリスティングで、このソースはマクロを定義していません。リロケータブルな値には、リスティングの行と同じアポストロフィーが付きます。外部の名前はこのモジュールでは値を持たないので、0000*と表示されます。シンボル表については、19章で説明します。/Pで画面に表示したリスティングには、このページはありません。
18.3 リスティングを止める、再開する
.XLISTはリスティングを止め、.LISTは再開します。その間の行は普通にアセンブルされますが、リスティングには表示されません。.XLISTの行自体も表示されませんが、.LISTの行は表示されます。
cseg db 1 .xlist db 2 db 3 .list db 4 end
cseg 0000' 01 db 1 .list 0003' 04 db 4 end
アドレスは0000hから0003hに進んでいます。表示されない2行も、それぞれ 1バイトずつ作っているためです。
いちばんよく使うのは、インクルード・ファイルの前後です。そうしないと、インクルード・ファイルの行はすべてリスティングに表示されます(5章)。
.xlist include msxdos.inc .list
18.4 マクロの展開
マクロの展開や繰り返しブロックをリスティングにどれだけ表示するかは、次の3つの疑似命令で決まります。それぞれ、その行から、3つのうちのほかの疑似命令が来るまで有効です。
- .XALLは標準の設定で、展開の行のうち、バイトを作る行を表示します。
- .LALLは、アセンブルされない条件付きアセンブルの行も含めて、展開のすべての行を表示します。
- .SALLは、展開の行を1つも表示しません。マクロを使った行が、展開の代わりであることを示す+を付けて表示されます。
次のマクロには、アセンブルされることのない行があります。ソースは、それぞれの設定でこのマクロを1回ずつ使います。
two macro db 1 if 0 db 2 endif ld a,3 endm cseg two .lall two .sall two .xall two end
two 0000' 01 + db 1 0001' 3E 03 + ld a,3 .lall two 0003' 01 + db 1 + if 0 + db 2 + endif 0004' 3E 03 + ld a,3 .sall + two .xall two 0009' 01 + db 1 000A' 3E 03 + ld a,3
.LALLでは、アセンブルされなかった行にはアドレスがありません。.SALLでは、展開があったことを示すのは、マクロを使った行の+とアドレスだけです。アドレスは0004hから 0009hに進んでいて、展開の3バイトは0006hから0008hにあります。
18.5 アセンブルされない行
条件付きアセンブル(15章)が飛ばした行をリスティングに表示するかどうかは、さらに3つの疑似命令で決まります。
- .LFCONDは標準の設定で、それらの行をアドレスなしで表示します。
- .SFCONDは、それらの行を表示しません。IF、ELSE、ENDIFの行は表示されます。
- .TFCONDは、この2つを切り替えます。.LFCONDのあとでは.SFCONDとして、.SFCONDのあとでは.LFCONDとして働きます。
次のソースには、偽になる条件付きアセンブルが5つあり、それぞれの疑似命令の前に1つずつ、最後の疑似命令のあとに1つあります。
cseg if 0 db 1 endif .sfcond if 0 db 2 endif .lfcond if 0 db 3 endif .tfcond if 0 db 4 endif .tfcond if 0 db 5 endif end
cseg if 0 db 1 endif .sfcond if 0 endif .lfcond if 0 db 3 endif .tfcond if 0 endif .tfcond if 0 db 5 endif end
2つ目と4つ目の条件付きアセンブルの行は表示されていません。M80も、このソースを同じように表示します。
18.6 メッセージ
PAGEの長さが10から255の範囲にないと、TATARAは次のメッセージを表示して止まります。
PAGEBAD.AS(1): ERROR: a PAGE length must be 10 to 255.
ほかのリスティングの疑似命令は、オペランドを取らないか、どんなテキストでも取るので、独自のメッセージはありません。