標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第384回]

●ローテイト命令の回路

今回の8ビットCPUのローテイト回路です。


え?
たった、これだけ?

そうです。たったこれだけです。
これだけで、ローテイト命令、正確に言えば、右ローテイト命令の回路になります。

という動作です。

今回の8ビットCPU(4ビットCPUも同じ)ではCF(キャリーフラグ)を含めて9ビット(4ビットCPUでは5ビット)を右にローテイトする命令をRRというニーモニックで定義します。
8080のRARに相当します。
8080のRRC(レジスタの8ビットのみを右にローテイトする)に相当する命令はありません。
RRに比べて使用頻度が少ない、と判断したからです。

さて、さきほどの回路図をよく見てください。
CFのセット、リセットを除くと、ただの74HC244があるだけのように見えます。
シフトレジスタを使わないで、どうしてローテイトできるのか?
回路図をよーく見ると、74HC244の左側(入力)と右側(出力)が1ビットずれているのがわかりますでしょうか?

このように配線するだけで、ただのバッファがシフトレジスタの役目をしてくれるのです。
いや「レジスタ」ではありませんが、ここではレジスタである必要がないので74HC244を使います。
もし「レジスタ」が必要なら、74HC373を使えば、それこそ立派な「シフトレジスタ」になってしまいます。
しかもIC1個で8ビットなのですから、そりゃあもう立派すぎます。

MYCPU80のローテイト回路([第169回])と比べてみてください。
どうです?
そりゃあ今回の回路はMYCPU80回路の1/4の機能しかありませんが、それにしてもこれだけすっきりしてしまえば「お見事!」と言っていただけるのではありませんでしょうか?

●左ローテイト回路がありません

右ローテイト回路はわかったけれど、左ローテイト回路はどうするの?

左ローテイトは、こういう動作です。

左ローテイトは[第381回]にも少し書きましたが、ADC命令で代用できます。

わかりやすいように、8080の命令で説明してみましょう。
Aレジスタに、データ5Aがあって、C(キャリー)がセットされているものとします。
ADC A を実行すると結果がどうなるかを考えてみます。

Aレジスタが5Aで、そこに同じAレジスタをキャリー付で加算しますから、

   01011010
   01011010
 (キャリー)  1(
 0 10110101
 ↑キャリーはクリアされる

という計算をすることになります。
計算前と計算後のAレジスタの値とキャリーの状態をそれぞれ比較してみると、みごとに「左ローテイト」しています。

なぜ?
って、それは簡単な理屈なのです。
キャリーがあると、ちょっと考えがややこしくなりますから、キャリーを考えないで、ただ左に1ビットシフトすることだけを考えてみましょう。
2進数で左に1ビットシフトする、とはどういうことでしょうか?

ああ、その前に10進数で考えてみましょうか。
たとえば、12345を左に1桁シフトする、とどうなるでしょうか?
123450になります。
ということは、10倍です。
数字の並びを変えないで、そのまま桁位置を左に一桁移動するわけですから、当然10倍になります。

2進数も全く同じなのです。
たとえば、
00100001 (21、十進数の33) を左に1ビットシフトすると、01000010 (42、十進数の66)になりますが、確かに2倍になっています。10進数の各桁は10のn乗ですが、2進数は2のn乗なので、そうなる(2倍になる)のです。

え、じゃ、じゃあ、ひょっとして、右シフトは1/2?
その通りです。
しかし、上で計算したように、2倍は、同じ値を加算することで簡単に結果が得られますが、1/2を減算で求められるか、というとそうはいきません。
逆は必ずしも真ならず、です。
ですから、右ローテイト(右シフト)は、ソフト的に求めることができないので、ハードで、つまりロジック回路で求めるのです。

今回の8ビットCPU回路では、左ローテイトとADCの結果が同じになることに着目して、左ローテイトをADCで代用することを考えましたが、それとは逆に、2進数の乗除算ではローテイト(シフト)を利用して計算回数を少なくする工夫をするのが一般的な方法とされています。
2009.11.20upload

前へ
次へ
ホームページトップへ戻る