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

●RLC、RRC、RAL、RARの各命令の説明です

RLC、RRC、RAL、RARはAレジスタを1ビット左または右に回転させる命令です。
ここで、TTLロジックでは一般的なシフトという表現ではなくて、回転(Rotate)という表現をしたのは、単純なシフトではなくて、まさに回転するからです。

まずは各命令のマシン語命令コードから説明を始めます。

ニーモニック マシン語コード(2進数) マシン語コード(16進数) Intel社8080マニュアルでの説明(英語)
RLC       00000111        07              Rotate left
RRC       00001111        0F              Rotate right
RAL       00010111        17              Rotate left through carry
RAR       00011111        1F              Rotate right through carry

各命令の動作です。

RLCはAレジスタの値を1ビット左(A7が左側、A0が右側です)にシフトします。A7の値はA0に入ります。このときA7の値がC(キャリー)フラグにも入れられます。


RRCはAレジスタの値を1ビット右にシフトします。A0の値はA7に入ります。このときA0の値がC(キャリー)フラグにも入れられます。


RALはAレジスタとC(キャリー)フラグをつないで、仮に9ビットのレジスタとしたうえで、全体を1ビット左に回転します。A7の値がCフラグに入り、Cフラグの値がA0に入れられます。


RARはAレジスタとC(キャリー)フラグをつないで、仮に9ビットのレジスタとしたうえで、全体を1ビット右に回転します。A0の値がCフラグに入り、Cフラグの値がA7に入れられます。


いずれの命令も、実行の結果、C(キャリー)フラグのみ変化します。
8080のローテイト命令は以上の4命令だけで、Aレジスタに対してのみ働きます(Z80では、B〜Lやメモリに対しても働く拡張命令が追加されています)。

●RLC、RRC、RAL、RARのタイミングチャートです


タイミングチャートは割とシンプルです(回路は、なかなか大変です)。
T4でAレジスタの値を、4ビットのシフトレジスタ74HC194を2個直列につないだ、ローテイト用レジスタにセットします(74HC194はs0、s1がHのときに、CLKを入れることで、値をロードします)。
それと同時に現在のC(キャリー)フラグの状態を一時的に保存します。
こうしておいて、次のT6で74HC194を1ビットシフトします。
T8でシフトレジスタの値をAレジスタに書き込みます。

Cフラグは、ローテイト前のA7またはA0の値によってセット、リセットされますから、T4のタイミングで現在のCフラグの状態を一時保存すると同時に、新しい値に書き換えます。

●RLC、RRC、RAL、RARの回路図です

ご覧いただいての通り、タイミングチャートからは想像がつかないほど、なかなかに複雑な回路です。

回路図を見ると、ちょっと変わった感じのゲートICがあります。
74HC51です。
4000シリーズなどのCMOS ICでは、ごく普通なのですが、74HCではちょっと珍しいタイプです。
2つのANDゲートの出力がICの内部でNORゲートの入力になっていて、ICの入出力端子は、そのANDゲートの入力端子とNORゲートの出力端子になっています。
1つのICには、2組のAND−NORゲートが入っています。
ANDゲートは1組は2入力ですが、もう1組は3入力になっています。

参考までに、74HC51のデータシートをお見せします。
それとシフトレジスタ74HC194のデータシートも見ていただくことにいたします。

●74HC51のデータシート(部分)です

[出典]National Semiconductor社MM74HC51datasheet

●74HC194のデータシート(部分)です

[出典]National Semiconductor社MM74HC51datasheet(赤線は筆者)

割と平易でわかりやすい英文ですから、読んでいただければ、動作は理解できると思います。
あれ。ミスプリントがありますね。
Function Tableです。ModeはS1、S0のはずなのですが、S0の代わりにS2になっています。誤植でしょうね。

本文を要約しますと、
1)パラレルデータをA、B、C、Dに入力して、S1、S0をHにしておいて、Clockにパルスを与えると、↑のタイミングでA〜Dがロードされ、ラッチされてQA〜QDから出力されます。
2)S1がL、S0がHのときに、Clockにパルスを与えると、↑のタイミングで出力が1ビットQA→QDに右シフトして固定します。このときR入力がQAにラッチされて、出力されます。
3)S1がH、S0がLのときに、Clockにパルスを与えると、↑のタイミングで出力が1ビットQD→QAに左シフトして固定します。このときL入力がQAにラッチされて、出力されます。

本文の説明にも、赤のアンダーラインをつけましたが、TTL(74HCも同じ)での、Right、Leftは、8080などのビット表現とは、左右が逆になっています。
74HC194での「右シフト」は、8080のローテイト命令では「左ローテイト」に相当し、74HC194での「左シフト」は、8080のローテイト命令では「右ローテイト」に相当します。
頭がこんがらがってしまいそうですが、そういうことになっていますので、そのあたりに注意して、回路図を見るようにしてください。
次回は、回路図の説明をする予定です。
2009.2.22upload

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