ニャオニャオ21世紀

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

MSXマシン語入門(Z80 アセンブラ・機械語) 第29回ビット操作について<シフトなど> 勉強レポート 

今回は、ビット操作です。

今までは基本的には1バイト単位での操作でしたが、

これからやることは1ビット単位です。

 

これぞマシン語、ですね^^

2進数のところが身についていないと少しやりずらいかも。

 

では、本を読んで勉強したいと思います。

 

まずビット操作命令で、BIT、 SET、 RESというのがあるそうです。

それから、ローテイト /  シフト命令。

シフト命令っていのは、昔、資格勉強しているときにやったなぁ〜。

 

まず、ビット操作命令です。

 

 

ビット操作命令

 SET  

8ビットレジスタや、HLレジスタなどで指定されるアドレスの

メモリの内容の、指定したビット(桁)を1にするもの

(例)

SET 0 , B

◯◯◯◯◯◯◯1   (Bレジスタの8ビットのデータ)

0ビットを1にします。

 

これはわかります^^

 

RES

8ビットレジスタや、HLレジスタなどで指定されるアドレスの

メモリの内容の、指定したビット(桁)を0にするもの

(例)

RES 4 , (HL)

◯◯◯0◯◯◯◯   (HLレジスタで示されるメモリの内容、8ビットのデータ)

4ビット目を0にします。

(HL)ってなんだっけ?と思ったら、HLレジスタにアドレスをいれて、

そのアドレスに入っている値のことでした^^

あのややこしいヤツですね、思い出しましたw

 

BIT

指定したビットが0か1か調べます。

BIT 1 , L

◯◯◯◯◯◯◉◯  Lレジスタの8ビットのデータ

1ビット目が0か1か?

0なら、Zフラグが1になり、

1なら、Zフラグが0になります。

 

ちょっとZフラグ関係がややこしいけど、意味はわかります^^

 

SET命令とRES命令は、フラグに影響を与えません。

 

 

ローテイト / シフト命令

 これは、8ビットのデータを右や左に回したり、ずらしたりする命令だそうです。

 

ローテイト命令

 

ローテイト命令には、”ローテイトサーキュラ"と"ローテイト"という

2種類があります。

 

 

ローテイトサーキュラ命令

 

RLC(ローテイト・レフト・サーキュラ)命令

           10010100                          (実行前)

                 ←

    00101001    CYフラグ: (実行後)   

 または、

    00010100                          (実行前)

                 ←

    00101000    CYフラグ: 0  (実行後)

 

左にずらします。

 ( ビット0をビット1に、ビット1をビット2に...)

 ( ビット7をビット0とCYフラグに入れる命令 )

 

 

RRC(ローテイト・ライト・サーキュラ)命令

           10010101       (実行前) 

               →

   11001010    CYフラグ: 1  (実行後) 

 または、

    00010100                         (実行前)

                 →

    00001010    CYフラグ: (実行後)

右にずらします。

 ( ビット0をビット7とCYフラグに入れます)

 ( ビット7をビット6、ビット6をビット5に... )

 

 

ローテイト命令

 RL(ローテイト命令 レフト) 

          10010100      CYフラグ: 0    (実行前)

                ←

   00101000     CYフラグ: 1    (実行後)

 

左にずらします。

  (CYフラグをビット0へ、ビット7をCYフラグに入れます)

  (ビット0をビット1へ、ビット1をビット2へ....)

 

 

RR(ローテイト命令 ライト) 

CYフラグ: 0      10010101   (実行前) 

                   →

 CYフラグ: 1     01001010   (実行後)

 

右にずらします。    

  (CYフラグをビット7へ、ビット0をCYフラグに入れます)

  (ビット7をビット6へ、ビット6をビット5へ....)

 

OPコードは、

RLC   B

RRC  H

RL     (HL)

RR    A

このような感じになります。

他にもRLCA、RRAなどといった命令もあるそうです。

 

 

シフト命令

 

シフト命令は、ビットを左右にずらすという点ではローテイト命令と変わらないそうです。

シフト命令も2種類あります。

・SL(シフトロジカル)

・SA(シフトアリスメティック)  -> L (左)とR(右)があります。

 

ここで注意が!

SLは右にシフトする命令しかないそうです。

つまりSRL命令のみ。

(シフトロジカルには、左にシフトはないそうです^^)

 

SL(シフトロジカル)

SRL(シフトライトロジカル)

(実行前)   10101000     CYフラグ: X

                      →

(実行後)   01010100     CYフラグ: X <変わらず> 

右にずらします。

(ビット7には必ず0が入ります。)

 

 

SA(シフトアリスメティック)

SLA (シフトレフトアリメティック)

(実行前)  CYフラグ: X           10101010

                                                   ←

(実行後) CYフラグ: 1            01010100    

左にずらします。

(ビット0には0が入ります。ビット7にあったものはCYフラグへ)

 

 

SRA(シフトライトアリメティック)

(実行前)     10101010    CYフラグ: X 

                        →

(実行後)      11010101   CYフラグ: 0 

右にずらします。

(ビット7には実行前のビット7の値が入ります。ビット0はCYフラグに

入ります)

このビット7に入る値のところが他にはないですね^^

 

OPコードは、

SRL   (HL)

SLA   A

SRA   C

このようになります。

 

 

シフト命令の応用

 

左シフトは、2倍にするという意味がある。

 

MSXのCPUであるZ80には、掛け算がありません。

左シフトの、SLA(シフトレフト アリメティック)を使えば、

2の乗数倍は簡単にできます。

 

SLA 1回で2倍

SLA 2回で4倍

SLA 3回で8倍

というようになります。

これは便利!

掛け算は、ジャンプを使って、ループで足し算を何回かする方法以外にも

あるのです!

 

右シフトを使えば、値を半分にできます。

SRLを使うと、普通に半分になります。

 

マイナスの値の場合は、

SRAを使います。-2を-1にするとか。

(CYフラグがそのままになっているところがミソとか^^)

 

掛け算のアルゴリズムは他にもあるそうです。

またの機会に取り上げることが出来たら、と思います。

 

 まとめ

 今日やった命令は、

SET

RES

BIT

 

RLC

RRC

RL

RR

 

SRL

SLA

SRA

です。

 8bit 算術演算命令のマシンコード
x (レジスタ、値) A B C D E H L
RLC x CB07 CB00 CB01 CB02 CB03 CB04 CB05
RRC x CB0F CB08 CB09 CB0A CB0B CB0C CB0D
RL x CB17 CB10 CB11 CB12 CB13 CB14 CB15
RR x CB1F CB18 CB19 CB1A CB1B CB1C CB1D
SLA x CB27 CB20 CB21 CB22 CB23 CB24 CB25
SRA x CB2F CB28 CB29 CB2A CB2B CB2C CB2D
SRL x CB3F CB38 CB39 CB3A CB3B CB3C CB3D

 

x (レジスタ、値) (HL) (IX+d) (IY+d)
RLC x CB06 DD CB d 06 FD CB d 06
RRC x CB0E DD CB d 0E FD CB d 0E
RL x CB16 DD CB d 16 FD CB d 16
RR x CB1E DD CB d 1E

FD CB d 1E

SLA x CB26 DD CB d 26 FD CB d 26
SRA x CB2E DD CB d 2E FD CB d 2E
SRL x CB3E DD CB d 3E FD CB d 3E

 

とても覚えられない(涙)

プログラミングをしていく中で覚えていくことにします^^

こんな機能の命令があったなぁということだけ

知っていればOKかな?

 

必要なものは自然と覚えるので^^

 

あとは、I/Oポートとマシン語の応用(乱数とかPSG、ジョイスティック)

うーん、面白そう^^

 

ゲームに直結する部分ばかりですね〜。

早くやりたいです^^

 

MSX関係のお買い物はこちらでどうぞ^^

msx | 通販ショップの駿河屋

 

では〜。 

 

次のページ

www.nyaonyao21.com

 


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

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