CASL Ⅱ 基本テクニック 25 選

CASL Ⅱ
基本テクニック 25 選
テーマ 01 副プログラムにパラメータを渡す
■ 値渡しと参照渡し
TECH01
PARAM
DATA
;
SUB
START
LAD
CALL
RET
DC
DC
DC
END
START
LD
LD
LD
LD
LD
RET
END
GR1,PARAM
SUB
; パラメータリストのアドレス設定
100
DATA
10,20,30
; 値渡し
; 参照渡し
GR2,0,GR1
GR3,1,GR1
GR4,0,GR3
GR5,1,GR3
GR6,2,GR3
;
;
;
;
;
GR2
GR3
GR4
GR5
GR6
;
;
;
;
FR を設定しない
ZF = 1
ZF = 1
ZF = 1
=
=
=
=
=
100
DATA のアドレス
10
20
30
テーマ 02 レジスタのクリアと負数化
■ 方法は様々
TECH02
START
LAD
LD
SUBA
XOR
GR1,0
GR2,=0
GR3,GR3
GR4,GR4
;
N
SUBA
SUBA
LD
XOR
ADDA
RET
DC
END
GR5,GR5
GR5,N
GR6,N
GR6,=#FFFF
GR6,=1
100
; 0 - N
; 2 の補数化
テーマ 03 配列の順次参照
■ 先頭アドレスをラベルで指定してオフセットを操作する
TECH03
LOOP
SRC
DES
START
LD
LD
ST
LAD
CPA
JMI
RET
DC
DS
RET
END
GR2,=0
GR1,SRC,GR2
GR1,DES,GR2
GR2,1,GR2
GR2,=5
LOOP
10,20,30,40,50
5
テーマ 04 配列の順次参照
■ アドレスを直接操作する
TECH04
START
LAD
GR2,SRC
LAD
GR3,DES
LD
GR4,=0
LOOP
LD
GR1,0,GR2
ST
GR1,0,GR3
ADDL
GR2,=1
ADDL
GR3,=1
LAD
GR4,1,GR4
CPA
GR4,=5
JMI
LOOP
RET
SRC
DC
10,20,30,40,50
DES
DS
5
END
; 次のオフセット
; 10,20,30,40,50 が格納される
; 転送元アドレス設定
; 転送先アドレス設定
; 転送数の初期値
; 次のアドレス
; 次のアドレス
; 転送数のインクリメント
; 10,20,30,40,50 が格納される
テーマ 05 数値から文字へ変換
■ 文字の利用
TECH05
X
PRN
LEN
START
LD
ADDA
ST
OUT
RET
DC
DS
DC
END
GR1,X
GR1,='0'
GR1,PRN
PRN,LEN
7
1
1
; 文字へ変換
テーマ 06 数値から文字へ変換
■ 文字コードの利用 算術演算
TECH06
START
LD
GR1,X
ADDA
GR1,=#0030
ST
GR1,PRN
OUT
PRN,LEN
RET
X
DC
7
PRN
DS
1
LEN
DC
1
END
; 文字へ変換
; 文字の 7 が出力される
テーマ 07 数値から文字へ変換
■ 文字コードの利用 ビット演算
TECH07
X
PRN
LEN
START
LD
OR
ST
OUT
RET
DC
DS
DC
END
GR1,X
GR1,=#0030
GR1,PRN
PRN,LEN
; 文字へ変換
; 文字の 7 が出力される
7
1
1
テーマ 08 数値から文字へ変換
■ 文字列テーブルの利用
TECH08
X
NUM
PRN
LEN
START
LD
LD
ST
OUT
RET
DC
DC
DS
DC
END
GR1,X
GR1,NUM,GR1
GR1,PRN
PRN,LEN
7
'0123456789'
1
1
; テーブルから抽出
; 文字の 7 が出力される
テーマ 09 文字から数値へ変換
■ 文字の利用
TECH09
X
PRN
START
LD
SUBA
ST
RET
DC
DS
END
GR1,X
GR1,='0'
GR1,PRN
'7'
1
; 数値へ変換
; 数値の 7 が格納される
テーマ 10 文字から数値へ変換
■ 文字コードの利用 算術演算
TECH10
X
PRN
START
LD
SUBA
ST
RET
DC
DS
END
GR1,X
GR1,=#0030
GR1,PRN
'7'
1
; 数値へ変換
; 数値の 7 が格納される
テーマ 11 文字から数値へ変換
■ 文字コードの利用 ビット演算
TECH11
X
PRN
START
LD
AND
ST
RET
DC
DS
END
GR1,X
GR1,=#000F
GR1,PRN
'7'
1
; 数値へ変換
; 数値の 7 が格納される
テーマ 12 指定したビット位置の反転
■ シフトによるビットパターンの作成
TECH12
X
N
BIT
START
LD
LD
LD
SLL
XOR
RET
DC
DC
DC
END
GR1,X
GR2,N
GR3,BIT
GR3,-1,GR2
GR1,GR3
#ABCD
6
#0001
; N-1 ビット左シフト
; GR1 = 1010 1011 1110 1101
; 右から 6 ビット目を反転
テーマ 13 上位 8 ビットと下位 8 ビットの入替
■ 定数によるビットの抽出
TECH13
X
START
LD
LD
AND
SLL
AND
SRL
OR
DC
RET
END
GR1,X
GR2,GR1
GR1,=#00FF
GR1,8
GR2,=#FF00
GR2,8
GR1,GR2
#ABCD
;
;
;
;
;
;
データを別のレジスタに保存
下位 8 ビットの抽出
上位 8 ビットに移動
上位 8 ビットの抽出
下位 8 ビットに移動
GR1 = #CDAB
テーマ 14 ビット 1 の数を数える
■ データの右シフト
TECH14
LOOP
SKIP
FIN
X
START
LD
JZE
LD
LD
AND
JZE
ADDA
SRL
JZE
JUMP
RET
DC
END
GR1,X
FIN
GR2,=0
GR3,GR1
GR3,=#0001
SKIP
GR2,=1
GR1,1
FIN
LOOP
#ABCD
; カウンタの 0 クリア
; データを別のレジスタに保存
; ビット判定
; ビットが 1 ならばカウンタのインクリメント
; データの 1 ビット右論理シフト
; ビット 1 が残っていなければ終了
; GR2 = 10
テーマ 15 ビット 1 の数を数える
■ 検査用ビット列の左シフト
TECH15
LOOP
SKIP
FIN
X
BIT
START
LD
JZE
LD
LD
LD
AND
JZE
ADDA
SLL
JZE
JUMP
RET
DC
DC
END
GR1,X
FIN
GR2,=0
GR4,BIT
GR3,GR1
GR3,GR4
SKIP
GR2,=1
GR4,1
FIN
LOOP
#ABCD
#0001
;
;
;
;
カウンタの 0 クリア
検査用ビット列の初期値設定
データを別のレジスタに保存
ビット判定
; ビットが 1 ならばカウンタのインクリメント
; 検査用ビット列の 1 ビット左シフト
; 16 ビット検査したら終了
; GR2 = 10
テーマ 16 ビット 1 の数を数える
■ 検査用ビット列の右シフト
TECH16
LOOP
SKIP
FIN
X
BIT
START
LD
JZE
LD
LD
LD
AND
JZE
ADDA
SRL
JZE
JUMP
RET
DC
DC
END
GR1,X
FIN
GR2,=0
GR4,BIT
GR3,GR1
GR3,GR4
SKIP
GR2,=1
GR4,1
FIN
LOOP
#ABCD
#8000
;
;
;
;
カウンタの 0 クリア
検査用ビット列の初期値設定
データを別のレジスタに保存
ビット判定
; ビットが 1 ならばカウンタのインクリメント
; 検査用ビット列の 1 ビット右論理シフト
; 16 ビット検査したら終了
; GR2 = 10
テーマ 17 ビット 1 の数を数える
■ 符号ビットの利用
TECH17
LOOP
SKIP
FIN
X
START
LD
JZE
LD
LD
JZE
JPL
ADDA
SLL
JUMP
RET
DC
END
GR1,X
FIN
GR2,=0
GR1,GR1
FIN
SKIP
GR2,=1
GR1,1
LOOP
#ABCD
; カウンタの 0 クリア
; GR1 のフラグをセット
; SF = 1 ならばカウンタのインクリメント
; データの 1 ビット左シフト
; GR2 = 10
テーマ 18 ビット 1 の数を数える
■ オーバフローフラグの利用 左シフト
TECH18
LOOP
CNT
FIN
X
START
LD
JZE
LD
SLL
JOV
JUMP
ADDA
LD
JZE
JUMP
RET
DC
END
GR1,X
FIN
GR2,=0
GR1,1
CNT
LOOP
GR2,=1
GR1,GR1
FIN
LOOP
#ABCD
テーマ 19 ビット 1 の数を数える
■ オーバフローフラグの利用 左シフト
TECH19
LOOP
CNT
FIN
X
START
LD
JZE
LD
SLL
JOV
JUMP
LAD
JZE
JUMP
RET
DC
END
GR1,X
FIN
GR2,=0
GR1,1
CNT
LOOP
GR2,1,GR2
FIN
LOOP
#ABCD
インクリメントがフラグに影響する
; カウンタの 0 クリア
; データの 1 ビット左シフト
; OF = 1 ならばカウンタのインクリメント
; GR1 のフラグセット
; GR2 = 10
インクリメントがフラグに影響しない
; カウンタの 0 クリア
; データの 1 ビット左シフト
; フラグに影響を与えない
; GR2 = 10
テーマ 20 ビット 1 の数を数える
■ オーバフローフラグの利用 右シフト
TECH20
LOOP
CNT
FIN
X
START
LD
JZE
LD
SRL
JOV
JUMP
LAD
JZE
JUMP
RET
DC
END
GR1,X
FIN
GR2,=0
GR1,1
CNT
LOOP
GR2,1,GR2
FIN
LOOP
#ABCD
; カウンタの 0 クリア
; データの 1 ビット右論理シフト
; フラグに影響を与えない
; GR2 = 10
テーマ 21 左から指定した数だけビット 1 を入れる
■ 右シフトの利用
TECH21
N
START
LD
LD
SRA
RET
DC
END
GR1,=#8000
GR2,N
GR1,-1,GR2
; N-1 ビット右算術シフト
; GR1 = 1111 1100 0000 0000
6
テーマ 22 右から指定した数だけビット 1 を入れる
■ 右シフトの利用
TECH22
N
START
LD
LD
SRA
LD
SUBA
SRL
RET
DC
END
GR1,=#8000
GR2,N
GR1,-1,GR2
GR2,=16
GR2,N
GR1,0,GR2
6
; N-1 ビット右算術シフト
; GR2 = 16-N
; 16-N ビット右論理シフト
; GR1 = 0000 0000 0011 1111
テーマ 23 左から指定した数だけビット 0、そこから指定した数だけビット 1 を入れる
■ 右シフトの利用
TECH23
N
M
START
LD
LD
SRA
LD
SRL
RET
DC
DC
END
GR1,=#8000
GR2,N
GR1,-1,GR2
GR2,M
GR1,0,GR2
; N-1 ビット右算術シフト
; M ビット右論理シフト
; GR1 = 0001 1111 1000 0000
6
3
テーマ 24 データの右に指定したビット数だけ 0 を入れる
■ 右シフトと左シフトの利用
TECH24
DATA
N
START
LD
LD
SRL
SLL
RET
DC
DC
END
GR1,DATA
GR2,N
GR1,0,GR2
GR1,0,GR2
; N ビット右論理シフト
; N ビット左シフト
; GR1 = 1010 1011 1100 0000
#ABCD
5
テーマ 25 データの左に指定したビット数だけ 0 を入れる
■ 左シフトと右シフトの利用
TECH25
DATA
N
START
LD
LD
SLL
SRL
RET
DC
DC
END
GR1,DATA
GR2,N
GR1,0,GR2
GR1,0,GR2
#ABCD
5
; N ビット左シフト
; N ビット右論理シフト
; GR1 = 0000 0011 1100 1101