付録A
疑似命令リファレンス
この付録では、TATARAが受け付けるすべての疑似命令を示します。A.1節では用途ごとにまとめ、A.2節ではそれぞれの書き方と短い説明をアルファベット順に示します。A.3節では疑似命令の行に書いたラベルがどうなるかを、A.4節では一部の疑似命令が持つ別名を示します。それぞれの項目には、その疑似命令を例とともにくわしく説明している節を示してあります。
書き方の中の斜体の語は、実際に書くものを表し、角かっこの中は省略できます。疑似命令は大文字でも小文字でも書けます。
A.1 用途ごとの疑似命令
A.1.1 データ
A.1.2 名前
A.1.3 セグメントとロケーション・カウンター
A.1.4 ファイルとソースの終わり
A.1.5 条件付きアセンブル
| 疑似命令 | 働き |
節 |
| IF | 値が0でなければ、その行をアセンブルする |
15.1 |
| IFE | 値が0なら、その行をアセンブルする |
15.1 |
| IFDEF | 名前が定義されていれば、その行をアセンブルする |
15.3 |
| IFNDEF | 名前が定義されていなければ、その行をアセンブルする |
15.3 |
| IF1 | 第1パスでだけ、その行をアセンブルする |
15.4 |
| IF2 | 第2パスでだけ、その行をアセンブルする | 15.4 |
| IFB | テキストが空なら、その行をアセンブルする | 15.5 |
| IFNB | テキストが空でなければ、その行をアセンブルする |
15.5 |
| IFIDN | 2つのテキストが同じなら、その行をアセンブルする |
15.5 |
| IFDIF | 2つのテキストが違えば、その行をアセンブルする |
15.5 |
| ELSE | 条件が偽のときにアセンブルする行を始める |
15.1 |
| ENDIF | 条件付きアセンブルを終わらせる |
15.1 |
A.1.6 マクロと繰り返しブロック
A.1.7 リスティング
| 疑似命令 | 働き |
節 |
| TITLE | ページ見出しのタイトルを設定する |
18.2 |
| SUBTTL | ページ見出しのサブタイトルを設定する |
18.2 |
| PAGE | 新しいページを始め、ページの長さも設定できる |
18.2 |
| .XLIST | リスティングを止める |
18.3 |
| .LIST | リスティングを再開する | 18.3 |
| .XALL | 展開のうちバイトを作る行を表示する | 18.4 |
| .LALL | 展開のすべての行を表示する | 18.4 |
| .SALL | 展開の行を表示しない |
18.4 |
| .LFCOND | 条件付きアセンブルで省かれた行を表示する |
18.5 |
| .SFCOND | それらの行をリスティングから省く |
18.5 |
| .TFCOND | その2つを切り替える |
18.5 |
A.2 アルファベット順の疑似命令
名前がドットで始まる疑似命令は、どれもリスティングを制御するもので、ほかの疑似命令のあとに別のグループとしてまとめてあります(A.2.1節)。疑似命令の別名もアルファベット順の位置に置き、どの疑似命令と同じかを示しています。
- ASEG
-
aseg
アブソリュート・セグメントを選びます。このセグメントのアドレスは書いたとおりのもので、TANRENはそれを動かしません。セグメントはそれぞれ自分のロケーション・カウンターを持つので、あとのASEGは前回止まったところから続きます。10.2節。 - COND
- CSEG
-
cseg [name]
コード・セグメントを選びます。名前を書くと、その名前の名前付きコード・セグメントを選びます。ソースはコード・セグメントで始まります。同じ名前のCSEGはどれも同じセグメントに追加され、TANRENはすべてのモジュールの同じ名前のセグメントをつなげます。10.2節、10.5節。 - DB
-
db item[,item…]
それぞれの項目を置きます。式は1バイト(その下位バイト)として置き、値はアブソリュートでなければなりません。文字列は1文字を1バイトとして置きます。1文字か2文字の文字列のあとに演算子が続くと、文字列ではなく式の中の文字定数になります。11.1節、11.2節。 - DC
-
dc string
1つの文字列をDBと同じように置き、最後の文字のビット7を立てます。文字列は空であってはなりません。11.4節。 - DEFB
- DEFL
-
name defl expression
名前に値を与えます。その値は、同じ名前のあとのDEFLで変えられます。名前はコロンを付けずに書き、ラベルやEQUの名前と同じにはできません。TATARAにはSETがありません。Z80のコードでは、setは命令だからです。12.4節。 - DEFM
- DEFS
- DEFW
- DS
-
ds count
ロケーション・カウンターをcountバイト進めて場所を確保し、何も置きません。個数はアブソリュートで、第1パスでわかっていなければなりません。2つ目のオペランドはありません。10.4節。 - DSEG
-
dseg [name[,transient]]
データ・セグメントを選びます。名前を書くと、その名前の名前付きデータ・セグメントを選びます。名前のあとにtransientを書くと、そのセグメントはトランジェント・データ・セグメントになり、変数はGROUPでグループに分けます。10.2節、10.5節、10.6節。 - DW
-
dw expression[,expression…]
それぞれの式をワードとして、下位バイトから置きます。値は、ラベルや外部の名前のような、TANRENが仕上げるアドレスでもかまいません。1文字か2文字の文字列は文字定数になり、それより長い文字列はエラーです。11.3節。 - ELSE
-
else
条件付きアセンブルのうち、条件が偽のときにアセンブルする行を始めます。まだ閉じていないいちばん内側の条件付きアセンブルに属し、省略できます。15.1節。 - END
-
end [address]
ソースを終わらせます。TATARAはそのあとを何も読みません。このファイルを取り込んだファイルの残りも読みません。アドレスがあれば、それはプログラムの開始アドレスで、TANRENはentryとして表示します。ENDのないソースは、ファイルの終わりで終わります。12.6節、13.7節。 - ENDIF
-
endif
まだ閉じていないいちばん内側の条件付きアセンブルを終わらせます。15.1節。 - ENDM
-
endm
マクロの本体、またはREPT、IRP、IRPCのブロックを終わらせます。それぞれのENDMは、開いているいちばん内側のものに属します。16.1節、17.1節。 - ENTRY
- EQU
-
name equ expression
名前に値を与えます。その値は変えられません。名前はコロンを付けずに書きます。コロンを付けると、TATARAはそれをラベルと見なして止まります。12.3節。 - EXITM
-
exitm
マクロの展開、または繰り返しブロックの繰り返しを、すぐに終わらせます。条件付きアセンブルの中で使い、そこで開いたままの条件付きアセンブルも閉じます。16.6節、17.4節。 - EXT
- EXTRN
-
extrn name[,name…]
ほかのモジュールが定義する名前を宣言します。それを使う値はどれも TANRENが仕上げるので、2バイトで値を持つ場所にしか書けません。EXTRNで宣言した名前は、同じモジュールでは定義できません。12.5節。 - GROUP
-
group name
トランジェント・データ・セグメントのグループを始めます。セグメントのグループはどれもセグメントの先頭から始まり、セグメントの大きさはいちばん大きいグループの大きさになります。GROUPはトランジェント・データ・セグメントの中でしか使えず、ラベルは付けられません。グループの名前はモジュールの間で共有されます。10.6節。 - IF
-
if expression
値が0でなければ、ELSEまたはENDIFまでの行をアセンブルします。式には、すでに定義されている名前しか使えません。条件付きアセンブルは16段まで入れ子にできます。15.1節、15.2節、15.6節。 - IF1
-
if1
第1パスでだけ、その行をアセンブルします。中でラベルを定義したりバイトを作ったりすると、2つのパスが食い違い、エラーになります。15.4節。 - IF2
-
if2
第2パスでだけ、その行をアセンブルします。制限はIF1と同じです。15.4節。 - IFB
-
ifb <text>
山かっこの中のテキストが空なら、その行をアセンブルします。15.5節。 - IFDEF
-
ifdef name
名前が定義されていれば、その行をアセンブルします。EXTRNで宣言した名前は、定義されているものと見なします。名前はこの行より前で定義してください。そうでないと、2つのパスで答えが変わります。15.3節。 - IFDIF
-
ifdif <text>,<text>
2つのテキストが違えば、その行をアセンブルします。比較は正確で、大文字と小文字も区別します。15.5節。 - IFE
-
ife expression
値が0なら、その行をアセンブルします。そのほかはIFと同じです。15.1節。 - IFF
- IFIDN
-
ifidn <text>,<text>
2つのテキストが、大文字と小文字も含めて同じなら、その行をアセンブルします。15.5節。 - IFNB
-
ifnb <text>
テキストが空でなければ、その行をアセンブルします。15.5節。 - IFNDEF
-
ifndef name
名前が定義されていなければ、その行をアセンブルします。そのほかはIFDEFと同じです。15.3節。 - IFT
- INCLUDE
-
include filename
そのファイルを、その行が書かれた場所で読みます。行がそこに書かれていたのと同じことになります。名前は書いたとおりに、引用符なしで使われ、何も付け加えられません。TATARAはファイルを、それを取り込むファイルの隣、カレント・ディレクトリ、環境変数TATARAのそれぞれのディレクトリの順に探します。インクルード・ファイルとマクロの展開は 16段まで入れ子にできます。13.1節、13.2節。 - IRP
-
irp parameter,<item[,item…]>
ENDMまでのブロックを、項目ごとに1回ずつ、パラメーターをその項目に置き換えてアセンブルします。項目はマクロの引数の規則に従い、山かっこは省略できます。17.2節。 - IRPC
-
irpc parameter,text
ENDMまでのブロックを、テキストの文字ごとに1回ずつアセンブルします。山かっこが必要なのは、テキストに空白を含めるときだけです。17.3節。 - LOCAL
-
local name[,name…]
マクロまたは繰り返しブロックの中で、それぞれの名前を、展開のたびに新しい名前(??0000、??0001など)に置き換えます。LOCALの行は、本体の最初に書かなければなりません。16.5節、17.4節。 - MACRO
-
name macro [parameter[,parameter…]]
マクロの定義を始めます。本体は、対応するENDMまでです。名前はコロンを付けずに書きます。マクロは使う前に定義しなければならず、定義し直すこともできます。16.1節〜16.7節。 - ORG
-
org expression
いまのセグメントのロケーション・カウンターを設定します。アブソリュート・セグメントではアドレス、ほかのセグメントでは先頭からのオフセットです。値は第1パスでわかっていなければならず、アブソリュートか、いまのセグメントのアドレスでなければなりません。10.3節。 - PAGE
-
page [n]
自分の行のあとで、リスティングの新しいページを始めます。10から255 までのnを書くと、ページの長さ(ページ見出しを含む)も設定します。18.2節。 - PUBLIC
-
public name[,name…]
名前をほかのモジュールに提供します。この行は定義の前にも後にも書けますが、名前はどれもモジュールのどこかで定義しなければなりません。ラベル、EQUの名前、DEFLの名前を公開できます。コロンを2つ付けて書いたラベルも公開されます。12.5節。 - REPT
-
rept count
ENDMまでのブロックをcount回アセンブルします。回数はアブソリュートで、すでにわかっていなければなりません。回数が0 なら、何もアセンブルしません。17.1節。 - SUBTTL
-
subttl text
サブタイトルを設定します。サブタイトルは、次のページからページ見出しの下に表示されます。TATARAは最初の28文字を残します。18.2節。 - TITLE
-
title text
タイトルを設定します。タイトルはページ見出しの左に表示されます。TATARAは最初の28文字を残します。18.2節。
A.2.1 ドットで始まる疑似命令
- .LALL
-
.lall
ここから、マクロの展開や繰り返しブロックのすべての行を、条件付きアセンブルで省かれた行も含めて表示します。18.4節。 - .LFCOND
-
.lfcond
条件付きアセンブルで省かれた行を、アドレスなしで表示します。これがデフォルトです。18.5節。 - .LIST
-
.list
.XLISTのあとで、リスティングを再開します。18.3節。 - .SALL
-
.sall
ここから、展開の行を表示しません。マクロを使う行には+が付きます。18.4節。 - .SFCOND
-
.sfcond
条件付きアセンブルで省かれた行を、リスティングから省きます。IF、ELSE、ENDIFの行は表示されます。18.5節。 - .TFCOND
-
.tfcond
.LFCONDから.SFCONDへ、またはその逆に切り替えます。18.5節。 - .XALL
-
.xall
展開のうち、バイトを作る行を表示します。これがデフォルトです。18.4節。 - .XLIST
-
.xlist
リスティングを止めます。そのあとの行はふつうにアセンブルされますが、表示されません。18.3節。
A.3 疑似命令の行のラベル
ラベルは、ほかの行と同じように、たいていの疑似命令の行に書けます(6.3節)。ラベルは、TATARAがその行に来たときのロケーション・カウンターの値を、行が何かをする前のセグメントで持ちます。そのため、ORGのラベルは新しい値ではなく、ロケーション・カウンターの前の値を持ちます。セグメントを選ぶ疑似命令のラベルは、その行まで使っていたセグメントのアドレスを持ちます。INCLUDEのラベルは、そのファイルのバイトの前のアドレスを持ちます。
いくつかの疑似命令は違います。
- EQU、DEFL、MACROは、ラベルではなく名前を取ります。名前のあとにコロンを付けると、TATARAはEQU, DEFL and MACRO take a name, not a label.で止まります。
- GROUPにはラベルを付けられません。ラベルを付けると、TATARAはGROUP needs a name, no label, and a transient DSEG.で止まります。
- IF、ELSE、ENDIFのラベルは、TATARAがその行に来たときにアセンブルしている場合にだけ定義されます(15.6節)。
- REPT、IRP、IRPCのラベルは、最初の繰り返しの始まりのアドレスを持ちます。
- EXITMのラベルは、展開がそこまで進んだアドレスを持ちます。
- マクロの中のLOCALとENDMのラベルは、メッセージなしで無視されます。TATARAはこの2つの行をマクロの本体を保存するときに読み、アセンブルすることはないので、ラベルが持つロケーション・カウンターがないからです。M80も同じです。
ラベルをいちばん安全に置けるのは、ラベルだけの行か、バイトを作る行です。
A.4 別名
一部の疑似命令には別名があります。TATARAは、M80向けに書かれたソースがそのままアセンブルできるように、これらを受け付けます(*EJECTと$EJECTは1桁目に書いた場合だけ)。
TATARAが受け付けないM80の疑似命令は、付録Jに示してあります。