またまた問題になってきました。
今回は本格的にビット操作命令を解説します。
ビットは0,1をリセット、セットする命令、
何ビット目を読むかという命令です。
実はパソコンはビット演算から生まれて計算ができました。
でも、チートなビット演算はどのように使うのかがわかりません。
今回はビットを見てみましょう。
□□□■■■■■
これは1Fhです。
4ビットを境にして上位下位ビットという所に注目します。
上位は□□□■で1hです。下位は■■■■です。Fhです。
これに7ビットをセットします。
SET 7,A
そうすると■□□■で1hが9hになりましたね。
では確認してみましょう。
BIT 7,A
これを実行するとZフラグが変化します。
RES 7,A
これで元に戻ります。
さて、今回はこの命令を活用してみます。
CレジスタFh、Bレジスタの3Ehを
FEHに変える場合はAレジスタは0、
3Fhに変える場合はAレジスタは1になります。
前回からつなげるとプログラムは3番目になります。
ビット演算とは一言で言えば…
「そんなのズルいぞ!ちゃんと計算しろ!」と、
言いたくなりそうな感じがします。
2番目はBASICにしたものを書いてからマシン語にします。
;A: 0-HI 1-LOW
LD A,0
LD B,3Eh
LD C,Fh
CP 1
JP Z,BIT1
LD A,C
BIT0 :CALL BIT00
CALL BIT01
CALL BIT02
CALL BIT03
RET
BIT1 :LD A,C
CALL BIT10
CALL BIT11
CALL BIT12
CALL BIT13
RET
;4BIT_MOVE_HI
BIT00: BIT 0,A
JR Z,ZERO00
SET 4,B
RET
ZERO00:RES 4,B
RET
BIT01: BIT 1,A
JR Z,ZERO01
SET 5,B
RET
ZERO01:RES 5,B
RET
BIT02: BIT 2,A
JR Z,ZERO02
SET 6,B
RET
ZERO02:RES 6,B
RET
BIT03: BIT 3,A
JR Z,ZERO03
SET 7,B
RET
ZERO03:RES 7,B
RET
;4BIT_MOVE_LOW
BIT10: BIT 0,A
JR Z,ZERO10
SET 0,B
RET
ZERO10: RES 0,B
RET
BIT11: BIT 1,A
JR Z,ZERO11
SET 1,B
RET
ZERO11: RES 1,B
RET
BIT12: BIT 2,A
JR Z,ZERO12
SET 2,B
RET
ZERO12: RES 2,B
RET
BIT013: BIT 3,A
JR Z,ZERO13
SET 3,B
RET
ZERO13:RES 3,B
RET
かなり適当ですがフラグを調べるとzフラグが変化するだけなので、
サブルーチンでやってみました。
最初にAレジスタに0か1かを入れて分岐させるようにしました。
プログラムをする時はzフラグにしますがプログラムの途中ですから
Aレジスタに代入することにしています。
4ビットを1ビットごとに調べてコピーしています。
さて、プログラム2に戻ります。
まぁ、プログラムは今までと同じ命令の繰り返しです。
100 X=1:Y=100
110 A=x:B=0:H=0
120 REM
130 'MOD1
140 IF A=1 GOTO 240
150 'z \ & div/0
160 IF A=0 GOTO 240
170 A=A-2
180 B=B+1
190 'C MOD
200 IF A<2 GOTO 230
210 '
220 GOTO 160
230 PRINT B,A
という感じです。
140行は座標が1で割れない場合の分岐です。
160行は数が割り切れて0、または数値が0の分岐です。
200行は割り切れない場合の分岐です。
と、このようなプログラムをマシン語化して次回はやります、
MSXBASICはマシン語作成の補助として使うことができますね。
※コメント投稿者のブログIDはブログ作成者のみに通知されます