マシン語命令というのは、基本的には1バイトが1命令に対応している。もちろん、アドレスや数値の指定がある場合は、その分だけ必要バイト数は増加するが、これだけで256種類の命令が備えられることになる。
ところが、やっぱりこれでは足りない……というわけで、Z80においては下記の数値に対しては「次に続く1バイトを新命令とする」という形になっている。
CBh DDh EDh FDh
こういった命令を1つ用意すれば、それだけで新たに256種の命令を追加できる。したがって、上記の場合は単純計算で256×4=1024種の命令が、2バイト命令として加えられることになるわけだ。
実際にはそうした単純なスタイルにはなっていないのだが、今回はこれらの中からCBhにスポットを当ててみたい。
機械語⇔ニーモニック対応表を見ると、ほぼ予想どおりの展開で新たな命令が追加されていることがわかる。つまり、次の1バイト(256種)がビッシリと命令で埋め尽くされているのだ……が、よく見ると30h〜37hが空白になっている。
20h〜27h :B,C,D,E,H,L,(HL),Aに対応したSLA命令
28h〜2Fh :B,C,D,E,H,L,(HL),Aに対応したSRA命令
30h〜37h :空白
38h〜3Fh :B,C,D,E,H,L,(HL),Aに対応したSRL命令
このように、前後にはシフト命令が並んでいる。各ニーモニックの中央にある'L'と'R'によって、左右どちらにシフトするかが決定されるのだが、雰囲気的に30h〜37hにはSLL命令というものが存在してもよさそうに思える。
シフト命令には、論理シフト(Logical)と算術シフト(Arithmetical)があり、SLL命令があるとすれば「論理左シフト命令」ということになる。
算術シフトは、左シフト(SLA)で倍、右シフト(SRA)で半分というシフト演算を行う場合に多用するが、SRA命令はレジスタ値の正負を考慮した右シフトであるため、ビット7の値がそのまま残る。そのため、レジスタ値を正数だけとみなす場合には、命令として不適なケースも出てきてしまう。
それを補うのが論理右シフト(SRL)命令で、こちらのほうはビット7に0が入るようになっている。
となると、先ほど推測したSLL命令というのは、ビット0に0を入れる左シフトということになる……のだが、これではSLA命令と同じ内容になってしまう。正規のニーモニック表に存在しないのは、おそらくこういったツジツマ合わせなのかもしれないが、実際にはどのような実行結果が出るのだろうか?
というわけで、CBhに続けて30h〜37hを入れて実行させてみると、ビット0に1が入る左シフトが行われる。
この実行結果に利用価値があるかどうか、断定はできないがおそらくは「ほとんど実用する機会がない!」といえそうだ。それに、同じ内容は「SCF → RLA」という2つの1バイト命令で実行できてしまう。かといって、SLLにふさわしいような実行内容を与えることもできそうにない。そんなことから、あえて空白としたのではないだろうか。
とりあえず、こういった実行結果が出ることで、このマシン語は一般的に(←裏一般的とでもいうべきか)未定義命令として扱われている。
もちろん、その場合のニーモニック書式は「SLL+レジスタ名」とするのが通例だが、この命名には内容からして違和感があるのは止むを得ないだろう。それよりも、こんな不毛な内容なら「空白のほうがマシ!」としたことに、いみじくも設計者のプライドが見え隠れするようで興味深い。
|