GR(16ビット),SP(16ビット),PR(16ビット),FR(3ビット)の4種類がある。
GR(汎用レジスタ,General Register)は,GR0~GR7の8個があり,
算術,論理,比較,シフトなどの演算に用いる。
このうち,GR1~GR7のレジスタは,指標レジスタ(index register)
としてアドレスの修飾にも用いる。
SP(スタックポインタ,Stack Pointer)は,
スタックの最上段のアドレスを保持している。
PR(プログラムレジスタ,Program Register)は,
次に実行すべき命令語の先頭アドレスを保持している。
FR(フラグレジスタ,Flag Register)は,
OF(Overflow Flag),SF(Sign Flag),ZF(Zero Flag)と呼ぶ
3個のビットからなり,演算命令などの実行によって次の値が設定される。
これらの値は,条件付き分岐命令で参照される。
OF算術演算命令の場合は,演算結果が-32768~32767に収まらなくなったとき1になり, それ以外のとき0になる。 論理演算命令の場合は,演算結果が0~65535に収まらなくなったとき1になり, それ以外のとき0になる。
SF演算結果の符号が負(ビット番号15が1)のとき1,それ以外のとき0になる。
ZF演算結果が零(全部のビットが0)のとき1,それ以外のとき0になる。
命令の形式及びその機能を示す。 ここで,一つの命令コードに対し2種類のオペランドがある場合, 上段はレジスタ間の命令,下段はレジスタと主記憶間の命令を表す。
r, r1, r2いずれも GRを示す。指定できるGRはGR0~GR7
adrアドレスを示す。指定できる値の範囲は0~65535
x指標レジスタとして用いるGRを示す。指定できるGRはGR1~GR7
[ ][ ]内の指定は省略できることを示す。
( )( )内のレジスタ又はアドレスに格納されている内容を示す。
実効アドレスadrとxの内容との論理加算値又はその値が示す番地
←演算結果を,左辺のレジスタ又はアドレスに格納することを示す。
+L, -L論理加算,論理減算を示す。
FRの設定○ : 設定されることを示す。
○*1: 設定されることを示す。ただし、OFには0が設定される。
○*2: 設定されることを示す。ただし、OFにはレジスタから最後に送り出されたビットの値が設定される。
— : 実行前の値が保持されることを示す。
1文字は8ビットからなり,上位4ビットを列で,下位4ビットを行で示す。 例えば,間隔,4,H,\のビット構成は,16進表示で,それぞれ20,34,48,5Cである。ビット構成が21~7E(及び表では省略しているA1~DF)に対応する文字を図形文字という。 図形文字は,表示(印刷)装置で,文字として表示(印字)できる。
[ ]内の指定が省略できることを示す。
{ }内の指定が必須であることを示す。
その命令の(先頭の語の)アドレスを他の命令やプログラムから参照するための名前である。 長さは1~8文字で,先頭の文字は英大文字でなければならない。 以降の文字は,英大文字又は数字のいずれでもよい。 なお,予約語であるGR0~GR7は,使用できない。
1文字以上の間隔文字の列である。
命令ごとに記述の形式が定義されている。
命令ごとに記述の形式が定義されている。
覚え書きなどの任意の情報であり,処理系で許す任意の文字を書くことができる。
命令は,4種類のアセンブラ命令(START,END,DS,DC), 4種類のマクロ命令(IN,OUT)および機械語命令(COMET IIの命令)からなる。 その仕様を次に示す。
アセンブラ命令は,アセンブラの制御などを行う。
START命令は,プログラムの先頭を定義する。
実行開始番地は,そのプログラム内で定義されたラベルで指定する。指定がある場合はその番地から,省略した場合はSTART命令の次の命令から,実行を開始する。
また,この命令につけられたラベルは,他のプログラムから入口名として参照できる。
END命令は,プログラムの終わりを定義する。
DS命令は,指定した語数の領域を確保する。
語数は,10進定数(≥ 0)で指定する。語数を0とした場合,領域は確保しないが,ラベルは有効である。
DC命令は,定数で指定したデータを(連続する)語に格納する。
定数には,10進定数,16進定数,文字定数,アドレス定数の4種類がある。 マクロ命令は,あらかじめ定義された命令群とオペランドの情報によって, 目的の機能を果たす命令群を生成する(語数は不定)。
IN命令は,あらかじめ割り当てた入力装置から,1レコードの文字データを読み込む。
入力領域は,256語長の作業域のラベルであり,この領域の先頭から,1文字を1語に対応させて順次入力される。レコードの区切り符号(キーボ-ド入力の復帰符号など)は,格納しない。格納の形式は,DC命令の文字定数と同じである。入力データが256文字に満たない場合, 入力領域の残りの部分は実行前のデータを保持する。入力データが256文字を超える場合, 以降の文字は無視される。
入力文字長領域は,1語長の領域のラベルであり,入力された文字の長さ(≥ 0)が2進数で格納される。ファイルの終わり(end of file)を検出した場合は,-1が格納される。
IN命令を実行すると,GRの内容は保存されるが,FRの内容は不定となる。
OUT命令は,あらかじめ割り当てた出力装置に,文字データを,1レコードとして書き出す。
出力領域は,出力しようとするデータが1文字1語で格納されている領域のラベルである。 格納の形式は,DC命令の文字定数と同じであるが, 上位8ビットは,OSが無視するので0でなくてもよい。
出力文字長領域は,1語長の領域のラベルであり, 出力しようとする文字の長さ(≥ 0)を2進数で格納しておく。
OUT命令を実行すると,GRの内容は保存されるが,FRの内容は不定となる。
RPUSH命令は,GRの内容を,GR1,GR2,…,GR7の順でスタックに格納する。
RPOP命令は,スタックの内容を順次取り出し,GR7,GR6,…,GR1の順でGRに格納する。
機械語命令のオペランドは,次の形式で記述する。
r, r1 , rGRは,記号GR0~GR7で指定する。
x指標レジスタとして用いるGRは,記号GR1~GR7で指定する。
adrアドレスは,10進定数,16進定数,アドレス定数又はリテラルで指定する。
リテラルは,ひとつの10進定数,16進定数又は文字定数の前に等号(=)を付けて 記述する。CASL IIは,等号の後の定数をオペランドとするDC命令を生成し, そのアドレスをadrの値とする。
DC命令は,END命令の直前にまとめて配置される。
プログラムの実行に関して,次の取決めがある。
START命令のラベル)と解釈する。この場合,アセンブラはアドレスの決定を保留し,その決定をOSに任せる。OSは,実行に先立って他のプログラムの入口名との連係処理を行いアドレスを決定する(プログラムの連係)。
SPに設定する。
CALL命令でプログラムに制御を渡す。プログラムを終了し OSに制御を戻すときは,RET命令を使用する。
IN命令に対応する入力装置,OUT命令に対応する出力装置の割当ては,プログラムの実行に先立って利用者が行う。
IN,OUT命令では,入出力装置の違いを意識する必要はない。
プログラムの実行等に関し,この仕様で定義しない事項は,処理系によるものとする。
参考資料は,COMET IIの理解を助けるため又は COMET IIの処理系作成者に対する便宜のための資料である。したがって,COMET II,CASL IIの仕様に影響を与えるものではない。
命令語の構成は定義しないが,次のような構成を想定する。ここで,OPの数値は16進表示で示す。
マクロ命令が生成する命令群は定義しない(語数不定)が,次の例のような命令群を生成することを想定する。
〔例〕IN命令
LABEL IN IBUF,LEN
マクロ生成
LABEL PUSH 0,GR1
PUSH 0,GR2
LAD GR1,IBUF
LAD GR2,LEN
SVC 1
POP GR2
POP GR1
シフト演算命令において,例えば,1ビットのシフトをしたときの動き及びOFの変化は,次のとおりである。
COUNT1 START ;
; 入力 ; GR1:検索する語
; 処理 ; GR1 中の'1'のビットの個数を求める
; 出力 ; GR0:GR1 中の'1'のビットの個数
PUSH 0,GR1 ;
PUSH 0,GR2 ;
SUBA GR2,GR2 ; Count = 0
AND GR1,GR1 ; 全部のビットが'0'?
JZE RETURN ; 全部のビットが'0'なら終了
MORE LAD GR2,1,GR2 ; Count = Count + 1
LAD GR0,-1,GR1 ; 最下位の'1'のビット 1 個を
AND GR1,GR0 ; '0'に変える
JNZ MORE ; '1'のビットが残っていれば繰返し
RETURN LD GR0,GR2 ; GR0 = Count
POP GR2 ;
POP GR1 ;
RET ; 呼出しプログラムへ戻る
END ;