Tatara

第18章
リスティング

リスティングには、TATARAがソースから何を作ったかが表示されます。それぞれの行が書いたとおりに、アセンブルされたアドレスと、作られたバイトとともに表示されます。プログラムがソースのとおりに動かないときや、ある行が思ったより多くの場所を取るときには、リスティングを見ます。

リスティングの出し方は、5章で説明しました。リスティングは、コマンド・ラインの3つ目に書いたファイルに書き出され、それがなければ、/Pを付けたときに画面に表示されます。/Lを付けると、それぞれの行の前にアドレスとバイトが付きます。付けなければ、リスティングにはソースだけが表示されます。この章では、/Lを付けたリスティングについて説明します。ファイルではなく画面で見るには、両方のオプションを付けます。

tatara /l /p modes.as
 

この章の残りでは、リスティングの1行に何が表示されるか、リスティングがどのようにページに分かれるか、そしてリスティングに何を表示するかをソースから決める疑似命令について説明します。

18.1 リスティングの1行

リスティングの1行の欄を図18.1に示します。最初にアドレス、次にバイト、そのあとにソース行がそのまま表示されます。

PIC

図 18.1: リスティングの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
 

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つの疑似命令で制御します。

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桁左にずれているのは、それぞれがフォーム・フィードで始まり、フォーム・フィードはページ上で場所を取らないためです。このリスティングから、次のことがわかります。

主番号は、ソースの中のフォーム・フィードで増えます。フォーム・フィード(文字コード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つのうちのほかの疑似命令が来るまで有効です。

次のマクロには、アセンブルされることのない行があります。ソースは、それぞれの設定でこのマクロを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つの疑似命令で決まります。

次のソースには、偽になる条件付きアセンブルが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.
 

ほかのリスティングの疑似命令は、オペランドを取らないか、どんなテキストでも取るので、独自のメッセージはありません。