今回、本で勉強したのは、8ビットでの論理演算です。
僕は少しだけ知っています。国家資格の2種の勉強の時にやりました。
でもほとんど忘れてしまったなぁ~;
でも前回の論理演算の基礎が分かればわかるはず!
MSXマシン語入門(Z80 アセンブラ・機械語) 第25回 論理演算の基本 勉強レポート - ニャオニャオ21世紀
それでは始めます。
勉強にはこの本を使います。
8ビットの論理演算って何?というと、
2進数で1ビットづつ論理演算するということです。(8ビットは、8桁なので8回)
例を書きます。
二つの2進数があったとします。
1つは、00101011 (10進数にすると43です。)
もうひとつは、10110010 (10進数にすると178です。)
(2進数->10進数とかは、
こちらのサイトで簡単にできます^^ )
論理積ANDをとってみます。
00101011
AND 10110010
------------------------
00100010
各桁のビットごとにANDをとっていきます。
桁は右から数えます。
1桁目は、1と0なのでANDをとると 0
2桁目は、1と1なのでANDをとると 1
3桁目は、0と0なのでANDをとると 0
4桁目は、1と0なのでANDをとると 0
5桁目は、0と1なのでANDをとると 0
6桁目は、1と1なのでANDをとると 1
7桁目は、0と0なのでANDをとると 0
8桁目は、0と1なのでANDをとると 0
よって結果は00100010となります。
ORやXORでも同じようにやります。
まぁ簡単ですね〜。
論理演算をアセンブリで書くと
この論理演算をアセンブリで書きます。
論理演算はAレジスタと他のレジスタ、メモリの内容、定数との間で
行われるそうです。
結果はいつものとおり、Aレジスタに入ります。
(演算結果ってAレジスタに入るものなんですね)
(Aレジスタ) AND (Dレジスタ) ---> Aレジスタ
こういうことです。
論理演算にはかならずAレジスタの値をまず使うのかな?
Dレジスタのところは、8ビットの定数や、(HL)に置き換えることができるそうです。
ちょっと分かりづらいけど、例をみると分かります。
例.
AND B
AND 92H
AND (HL)
(Aレジスタは必ず使うものなので省略されるそうです)
ORとかXORも同じです。
OR B
OR 92H
OR (HL)
とかですね。
演算結果はAレジスタに入ります。
(ちなみに論理演算のNOTという命令はないそうです。
代わりにCPLという命令があり、全く同じことをやっているそうです。)
マスク
論理演算の重要な使い道で、
マスク
というものがあるそうです。
マスクって聞いたことがあるなぁと思ったら、Windowsのお絵かきツール
とかでマスクって言葉がよくでてきましたねぇ。
画像の切り抜きとかの時に聞いたかな。
本文では、
マスクとは、ある数の任意のビットを0にしたり1にしたりするものです。
とあります。
うん?よく分からないなぁ?
こういう時は例をみればわかるので、例を。
10101101 (例えばAレジスタの値)
AND 11110000 (マスクパターン)
--------------------
10100000 (マスクの結果)
上の値がAレジスタの値
下の値がマスクパターンと呼ばれるものだそうです。
マスクパターンを見てみると、
11110000
です。
これでANDをとると、上位4ビットはAレジスタの値がそのまま残り、
下位4ビットはすべて0になるんだそうです。
お!なるほど、ANDは1と1 が1 になるから、すべて1ならそのままになりますね。
例えば、
01001011
AND 11111111
----------------------
01001011
となってANDをとっても全く同じ値になります。
逆にANDは0と1は0、0と0も0なので、
01001011
AND 00000000
-----------------------
00000000
と、すべて0になります。
これらのことから、例のマスクパターン 11110000だと、
上位4ビットは、そのままになり、
下位4ビットは、すべて0になりますね!
これで上位4ビットだけを取り出すことができます。
おー面白い!
もうひとつ例が載っていました。
10101011 (例えばAレジスタの値)
OR 00001111 (マスクパターン)
------------------------
10101111 (マスクの結果)
上位4ビットはそのまま残り、
下位4ビットはすべて1になる
うーん、これは意味はわかるんだけど、何に使うのかは分からないですね?
なんだろう?
使うこともあるかもしれないので、頭の片隅にでもとどめておきます;
マスクって面白いですね!
たまにBASICゲームのサンプルコードでも
なんでこんなANDをとっているんだろう?とか思ったことがありましたが
案外マスクだったりしたのかもしれません^^
論理演算のマシンコード
マシンコードの表を書きます。
AND
(Xに入るレジスタ) A B C D E H L
-------------------------------------------------------------
AND X ... A7 A0 A1 A2 A3 A4 A5
(Xに入るレジスタ・値) (HL) (IX+d) (IY+d) n
---------------------------------------------------------------------------
AND X ... A6 DD A6 d FD A6 d E6 n
例:AND AだとマシンコードではA7
AND B マシンコードではA0
AND 92H だったら、E6 92
XOR
(Xに入るレジスタ) A B C D E H L
-------------------------------------------------------------
XOR X ... AF A8 A9 AA AB AC AD
(Xに入るレジスタ・値) (HL) (IX+d) (IY+d) n
---------------------------------------------------------------------------
XOR X ... AE DD AE d FD AE d EE n
例:XOR AだとマシンコードではAF
XOR B マシンコードではA8
XOR 92H だったら、EE 92
OR
(Xに入るレジスタ) A B C D E H L
-------------------------------------------------------------
OR X ... B7 B0 B1 B2 B3 B4 B5
(Xに入るレジスタ・値) (HL) (IX+d) (IY+d) n
---------------------------------------------------------------------------
OR X ... B6 DD B6 d FD B6 d F6 n
例:OR AだとマシンコードではB7
OR B マシンコードではB0
OR 92H だったら、F6 92
マスクの使用例
マスクの使用例が書いてありました。
・8で割った余りをだす
Aレジスタと7とのANDをとる
・奇数か偶数か知る
1とのANDをとる
(答えが1なら奇数、0なら偶数)
・ビットをすべて反転する
16進数のFF(2進数で11111111)とXORをとる
まとめ
論理演算って面白いですね〜。
ちょっと思ったのが、MSX版ハイドライドで、ジム君が森の中に入った時に、
体の一部が木に隠れていましたが、
あれも論理演算を使ったものなのかな〜って。
森の木とジム君のスプライトで論理演算して、ジム君のスプライトを
定義しなおすというのをやっていたんでしょうか?
なんかできそう^^
MSX2になりますが、
キャラクターにBGを使った場合、
背景との重ね合わせ処理も論理演算を使ってできそうです^^
いろいろ応用ができそうですね、論理演算って。
PS
次世代MSXがでるそうです。
まだ正式発表はありませんけど。
MSX3?次世代MSXとは?西和彦さんの構想について。 - ニャオニャオ21世紀
それに向けてMSXについての勉強をもっとしたいと思います^^
とりあえず、マシン語の基礎をぱぱっと片付けたいと思います。
基礎だけではゲームは作れないので早く応用力をつけたいなぁ〜。
とりあえずはBASICのマシン語を組み込むという方法で力をつけたいと思います。
WebMSXでMSX BASICの自作ゲーム作成!第十弾。 圧倒的速さ!マシン語で画面切り替え!(URLクリックで実行できます) - ニャオニャオ21世紀
次世代MSXかぁ〜、
オラ、ワクワクしてきたぞ!
MSX BASICの情報はこちらへ〜