Tatara

付録A
疑似命令リファレンス

この付録では、TATARAが受け付けるすべての疑似命令を示します。A.1節では用途ごとにまとめ、A.2節ではそれぞれの書き方と短い説明をアルファベット順に示します。A.3節では疑似命令の行に書いたラベルがどうなるかを、A.4節では一部の疑似命令が持つ別名を示します。それぞれの項目には、その疑似命令を例とともにくわしく説明している節を示してあります。

書き方の中の斜体の語は、実際に書くものを表し、角かっこの中は省略できます。疑似命令は大文字でも小文字でも書けます。

A.1 用途ごとの疑似命令

A.1.1 データ

疑似命令

働き

節
DB

バイトと文字列を置く

11.1
DW

ワードを下位バイトから置く

11.3
DC

最後の文字のビット7を立てた文字列を置く

11.4
DS

何も置かずに場所を確保する

10.4

A.1.2 名前

疑似命令

働き

節
EQU

名前に値を一度だけ与える

12.3
DEFL

あとで変えられる値を名前に与える

12.4
PUBLIC

名前をほかのモジュールに提供する

12.5
EXTRN

ほかのモジュールが定義する名前を使う

12.5

A.1.3 セグメントとロケーション・カウンター

疑似命令

働き

節
CSEG

コード・セグメント、または名前付きのものを選ぶ

10.2, 10.5
DSEG

データ・セグメント、または名前付きのものを選ぶ

10.2, 10.5
ASEG

アブソリュート・セグメントを選ぶ

10.2
GROUP

トランジェント・データ・セグメントのグループを始める

10.6
ORG

ロケーション・カウンターを設定する

10.3

A.1.4 ファイルとソースの終わり

疑似命令

働き

節
INCLUDE

ほかのファイルをその場所で読む

13.1
END

ソースを終わらせ、開始アドレスを示すこともできる

12.6

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 マクロと繰り返しブロック

疑似命令

働き

節
MACRO

マクロの定義を始める

16.1
ENDM

マクロまたは繰り返しブロックを終わらせる

16.1
LOCAL

展開のたびに名前を新しい名前に置き換える

16.5
EXITM

展開を途中で終わらせる

16.6
REPT

ブロックを指定した回数だけ繰り返す

17.1
IRP

リストの項目ごとにブロックを繰り返す

17.2
IRPC

テキストの文字ごとにブロックを繰り返す

17.3

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

IFと同じです。

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

DBと同じです。

DEFL


name defl expression
名前に値を与えます。その値は、同じ名前のあとのDEFLで変えられます。名前はコロンを付けずに書き、ラベルやEQUの名前と同じにはできません。TATARAにはSETがありません。Z80のコードでは、setは命令だからです。12.4節。

DEFM

DBと同じです。

DEFS

DSと同じです。

DEFW

DWと同じです。

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

PUBLICと同じです。

EQU


name equ expression
名前に値を与えます。その値は変えられません。名前はコロンを付けずに書きます。コロンを付けると、TATARAはそれをラベルと見なして止まります。12.3節。

EXITM


exitm
マクロの展開、または繰り返しブロックの繰り返しを、すぐに終わらせます。条件付きアセンブルの中で使い、そこで開いたままの条件付きアセンブルも閉じます。16.6節、17.4節。

EXT

EXTRNと同じです。

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

IFEと同じです。

IFIDN


ifidn <text>,<text>
2つのテキストが、大文字と小文字も含めて同じなら、その行をアセンブルします。15.5節。

IFNB


ifnb <text>
テキストが空でなければ、その行をアセンブルします。15.5節。

IFNDEF


ifndef name
名前が定義されていなければ、その行をアセンブルします。そのほかはIFDEFと同じです。15.3節。

IFT

IFと同じです。

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のラベルは、そのファイルのバイトの前のアドレスを持ちます。

いくつかの疑似命令は違います。

ラベルをいちばん安全に置けるのは、ラベルだけの行か、バイトを作る行です。

A.4 別名

一部の疑似命令には別名があります。TATARAは、M80向けに書かれたソースがそのままアセンブルできるように、これらを受け付けます(*EJECTと$EJECTは1桁目に書いた場合だけ)。

別名 同じもの
COND, IFT IF
DEFB, DEFM DB
DEFS DS
DEFW DW
ENTRY PUBLIC
EXT EXTRN
IFF IFE
*EJECT, $EJECT PAGE

TATARAが受け付けないM80の疑似命令は、付録Jに示してあります。