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
© Copyright 2024 Paperzz