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

●HLT命令の説明です

HLT命令は、Halt(停止する)の言葉通り、停止命令です。
しかし停止しているように見えるだけで、本当は同じ命令(HLT命令)を繰り返し実行しています。

HLT命令のマシン語命令コードは、01110110(”76”)です。
命令コードのbit7とbit6が01の命令はMOV命令でした。

MOV命令のマシン語コードのルールでは、01110110は、ddd=110、sss=110なので、MOV M,Mになります。
ddd=sssである、MOV M,M以外の命令、たとえばMOV A,A(01111111)とかMOV H,H(01100100)はその通りに実行されます。
しかし、01110110はMOV M,Mにはならないで、HLT命令になってしまいます。

なぜ?と聞かれても答えられません。
それは、8080の設計者がそのように命令コードを組んだからで、HLTがMOV M,Mの意味のマシン語コードでなければならない、というものでは決してありません。

HLT命令は、MOV命令と同じコードになるため、MOV命令の回路図に含めて作図しました。
その回路図は[第40回]にお見せしたMOV命令と一緒になった回路図です。
[第40回]の回路図はMOVもMVIもHLTも全部一緒になっているため、とてもわかりづらい回路図になってしまいました。
そこで、HLT命令の部分だけ抜き取って、お見せすることにしました。

●HLT命令の回路図です



なんだかL字型の変な回路図になってしまいました。
これはもとの「MOV命令と一緒の回路図」から、HLT命令の部分だけを抜き出して、そのままに近いレイアウトでまとめたからです。
そうすることに、特に深い意味はありません。
ただ単にズボラだっただけです。

図の左側部分は”01110110”をデコードして、HLT命令を検出するためのAND回路です。
図の右側部分の回路については、タイミングチャートを見ながら、説明をしていきます。

●HLT命令のタイミングチャートです



HLT命令には、いままで説明した、MOV命令やMVI命令などと根本的に異なっているところがあります。
どこでしょうか?

それは、他のほとんどの命令が、レジスタかメモリのデータの変更、移動を伴うために、T0〜T3のOPコードフェッチサイクルに続く、T4以後のマシンサイクルを必要としているのに対して、HLT命令はOPコードフェッチサイクル(T0〜T3)だけで終わってしまっているというところです。

本当は、HLT命令の動作だけを考えると、T0〜T3の4クロック全部は必要ありません。
T0、T1の2クロックだけで済ますこともできます。
その方が少しだけですが回路も簡単になります。
ここは迷ったところで、困ったところも出てきたために、そのように直してみたりもしたのですが、他の命令が少なくとも4クロック以上であるのに、HLT命令だけが2クロックというのもなんとなくしっくりこなくて、結局ここは当初の設計のまま、T0〜T3の4クロックとすることにしました。

しかし今でも、HLT命令は2クロックあればいいはず、という考えは残っていますので、いずれ改良版などを作るときがあれば、ひょっとすると、そのようにするかも知れません。

HLT命令の回路図の中にRSフリップフロップがあります。
RSフリップフロップについては、前に説明をしました([第45回]●RSフリップフロップ)。
ここではHLT状態を継続するためと、外部にHLTA信号を出力し続けるために、RSフリップフロップを使っています。

●HLTはPCのカウントアップを禁止することで、HLTとなる

PC(プログラムカウンタ)はT3が終わるタイミングで+1されます。
プログラムカウンタが進んでしまうと、HLTではなくなってしまいます(次のT0になると、次の命令が読み込まれてしまいます)。
そこで、HLT命令が認識されると、命令解読直後のタイミング(T2の開始と同時)に、RSフリップフロップがsetされます。
なおRSフリップフロップのset、resetはその回路の目的によって、そう呼ぶだけで、どちらがsetでどちらがresetかという固定した決まりはありません。

RSフリップフロップがsetされると、プログラムカウンタをカウントアップするためのパルス入力(PCclkまたはPCinc)を禁止するための信号として、PCclkDE2がアクティブになります。
PCclkDE2がPCclkを禁止している(ゲートしている)回路部分は、[第39回]●プログラムカウンタの回路図です を見ていただくとわかります。
あ。ですけれど、その部分だけ、抜き出して、ここでお見せした方がいいですよね。多分。

●プログラムカウンタの回路図(カウントアップを禁止している部分の回路)


PC(プログラムカウンタ)の最下位4ビット(A0〜A3)をカウントするバイナリカウンタ74HC193のクロック入力回路です。
74HC193はpin5(UPクロック入力)にL→Hのパルスを入れると、カウントアップします。

pin5の入力回路は負論理のORになっていて、命令回路から出力されるPCclkと、T3(OPコードフェッチサイクルの終わり)のときに自動的にカウントアップするための回路からの信号が入力されています。
PCclkDE2はT3からの信号をゲートする74HC126のコントロール入力(pin13)につながっています。

PCclkDE2がLになると、T3になっても74HC193のpin5には、パルスが入力されなくなりますから、PC(プログラムカウンタ)はカウントアップされません。
したがって外部アドレスバス(A0〜A15)からは、現在のアドレスが出力されたままになりますから、永久にHLT命令を読んで実行することを繰り返すことになります。

ここで74HC126を使っているのは、たまたまこの近くに空いているオープンコレクタゲートが他にはなかったからです。
しかし、それがあとでトラブルの原因になってしまいました(そのお話はまた、別の回にすることにいたします)。

HLT命令がHLTであり続けるための回路についての説明は以上です。

HLT命令については、もう少し説明しておきたいことがあるのですが、ちょっと長くなってしまいそうですので、本日はここまでにしておきたいと思います。
2008.8.31upload

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