ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハックほか雑記を綴っています

MSXマシン語入門(Z80 アセンブラ・機械語)第26回 論理演算の働き マシンコードは? 勉強レポート






f:id:nyaonyaokun:20180903170705j:plain

今回、本で勉強したのは、8ビットでの論理演算です。

僕は少しだけ知っています。国家資格の2種の勉強の時にやりました。

でもほとんど忘れてしまったなぁ~;

でも前回の論理演算の基礎が分かればわかるはず!

MSXマシン語入門(Z80 アセンブラ・機械語) 第25回 論理演算の基本 勉強レポート - ニャオニャオ21世紀

 

それでは始めます。

 

勉強にはこの本を使います。

MSXマシン語入門講座
MSXマシン語入門講座
posted with amazlet at 18.09.03
湯浅 敬
アスキー
売り上げランキング: 1,383,851

 

 

8ビットの論理演算って何?というと、

2進数で1ビットづつ論理演算するということです。(8ビットは、8桁なので8回)

 

例を書きます。

二つの2進数があったとします。

1つは、00101011 (10進数にすると43です。)

もうひとつは、10110010   (10進数にすると178です。)

 

(2進数->10進数とかは、

2進数、8進数、10進数、16進数相互変換ツール

こちらのサイトで簡単にできます^^ )

 

論理積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       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       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       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かぁ〜、

オラ、ワクワクしてきたぞ!

 

 

 

 

 

 


「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください