今回は、ビット操作です。
今までは基本的には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フラグ: 1 (実行後)
または、
00010100 (実行前)
←
00101000 CYフラグ: 0 (実行後)
左にずらします。
( ビット0をビット1に、ビット1をビット2に...)
( ビット7をビット0とCYフラグに入れる命令 )
RRC(ローテイト・ライト・サーキュラ)命令
10010101 (実行前)
→
11001010 CYフラグ: 1 (実行後)
または、
00010100 (実行前)
→
00001010 CYフラグ: 0 (実行後)
右にずらします。
( ビット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
です。
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 BASICでゲームを作りたい方はこちらへ〜