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

●いよいよ2枚目の基板の説明にかかります

前回まででやっと1枚目の基板の説明がほぼ終わりました。
実はまだ説明していない回路も残っているのですが、それは2枚目、3枚目の基板の回路に深くかかわっている部分ですので、関連している回路の説明をする時まで、おあずけ、ということに致します。

●最初はINR、DCR回路の説明です

2枚目の試作基板が、もうぼちぼち出来あがってくるころだと思います。
基板が出来てきたら、また写真に撮ってお見せすることにいたします。
それまでは、回路図とタイミングチャートを使って説明をしていくことにいたします。

最初はまず、INR、DCR命令の回路の説明からスタートです。
アセンブラのニーモニックは、
INR r または INR M
DCR r または DCR M
です。
レジスタA〜L、またはHLレジスタで示されるメモリアドレスのデータを+1(increment)、−1(decrement)します。
マシン語コードは
INR が 00ddd100
DCR が 00ddd101
です。
bit7、bit6が0でbit2=1、bit1=0でINR、DCR命令になります。bit0=0がINRでbit0=1がDCRです。

●INR、DCR命令のデコード回路です

1枚目の基板はMOV、MVIとHLT回路のみでしたので、OPコード(命令コード)の各ビットをゲートに入力して、それぞれの命令回路を選択する信号を得ていました。
しかし2枚目の基板は、命令の数が多いので、もっと効率良くデコードすることが必要になります。
そこで、上図のように、74HC238を使って、INR、DCR回路(およびその他の回路)をセレクトできるようにしました。

2枚目の基板に含まれている命令回路はこれだけではありません。
上の回路は、ですから命令デコード回路の一部です。
残りのデコード回路も、それぞれの命令の説明にしたがって、順次紹介していきます。

●INR(DCR)レジスタの回路です



INR命令、DCR命令の回路の説明に入る前に、INR(DCR)レジスタについて説明をしておきます。

命令はINR、DCRに分かれていますが、実際に命令を実行するのは共通の回路で、その中心は、4bitのup/downカウンタ(74HC191)2個です。
PC(プログラムカウンタ)はRESET信号によってクリアしなければならないため、クリア端子のある74HC193を使いましたが、INR/DCRレジスタはクリアする必要が無く、upカウントとdownカウントの切換えをpin5にHかLを与えることで行える便利さから、74HC191を使うことにしました。

設計の初期には、各レジスタA〜Lを74HC191で構成することも考えたのですが、そのようにしても、M(メモリ)に対するINR、DCR命令のためには、どの道up/downカウンタが必要になってしまいます。

それに、A〜Lレジスタはデータをラッチすることのみの機能に限定し、INR、DCRやローテイト命令の機能については、それぞれその機能のためのカウンタ回路、シフトレジスタ回路を用意することに決めてしまえば、A〜Lには8ビットレジスタの74HC373が使えることになります。

カウンタやシフトレジスタは4ビットなので、CPUの8ビットレジスタを構成するには、各2個を実装しなければならず、実装面積が増えてしまいますから、できれば避けたいところです。

以上のような理由から、A〜Lレジスタに対するINR、DCR命令も、一旦up/downカウンタ74HC191にロードして、up/downしたあと、またもとのレジスタに戻すように考えました。
面倒なようですが、メモリに対するINR、DCR命令と同じ回路で済みますから、かえって簡単になってしまいます。

up/downカウンタそのものの回路はきわめてシンプルです。
下位4ビットを受け持つ74HC191(L)からのキャリーが上位4ビット用の74HC191(H)のpin14(clk入力)に入っています。こうすることによって、8ビットのup/downカウンタとして動作させることができます。

pin5(d/u入力)にLを入力するとupカウンタ、Hを入力するとdownカウンタとして動作します。
下位4ビット用の74HC191のpin14(clk入力)にL→Hのパルスを入力するごとに、+1または−1カウントします。
pin11はLD(ロード)端子です。pin11をLにすると、内部データバスib0〜ib7のデータがカウンタにロードされ、pin11がHになるとデータはカウンタにラッチされます。
カウンタからのデータは74HC244を介して、INRregRDがLのときに、内部データバスに出力されます。

●SフラグとZフラグ

いままでに説明したMOV、MVI、HLT命令は、実行してもフラグに影響を与えません。
しかし、これから説明を進めていく命令は、実行することで、フラグに影響を与えるものが少なくありません。
INR、DCR命令も、実行の結果によって、S(サイン)フラグ、Z(ゼロ)フラグ、H(ハーフキャリー)フラグをセット、リセットします。

うっかりしていると、つい間違ってしまいそうなのですが、C(キャリー)フラグは変化しません。

P(パリティフラグ)もセット、リセットされるようですけれど、INR、DCR命令でパリティフラグをセット、リセットしてみても余り意味はなさそうですし、当初はZ80と混同してP/V(パリティ・オーバーフロー)フラグとして考えていたものを、あとで削除してしまいました([第19回])。
いまさらパリティフラグをセット、リセットするように考えるのも面倒なので、独断と偏見によって、INR、DCR命令ではP(パリティ)フラグは変化しないことに決定しました。

さてそこで、S(サイン)フラグとZ(ゼロ)フラグの回路の説明です。
この2つのフラグについては、INR、DCR命令の実行結果だけではなくて、その他の命令の実行の結果であっても、命令の実行によって得られた結果の値によって、セット、リセットされます。

ですから、本当はINR、DCR命令の回路にくっついているのはおかしいようなものですが、フラグ変化を伴う命令の回路としては、INR、DCR回路が一番最初に考えた回路でしたので、ついでにくっつけてしまいました。

SフラグとZフラグは、計算の結果が出力される、内部データバス(ib0〜ib7)の値によって、セット、リセットされます。
8ビットの数を符号付の数として考えたときに、その値がマイナスということは、bit7=1の値のことでした([第14回]参照)から、ib7=1のときにSフラグがセットされ、ib7=0のときにリセットされます(Sフラグは値がマイナスであるときにセットされます)。
Zフラグはその名の通り、値が0のときにセットされ、0ではないときにリセットされます。

●H(ハーフキャリー)フラグ

INR(DCR)レジスタの回路図の上の方にH(ハーフキャリー)フラグのセット、リセット回路があります。
ハーフキャリーフラグは、計算の結果、bit3からのキャリー(減算、DCRの場合にはボロー)がある場合にセットされ、そうではないときにリセットされます。

bit3からのキャリー(下位4ビット用の74HC191のpin13)をそのまま、Hフラグのセット、リセットに使わず、RSフリップフロップで受けているのは無駄なように思えます。

このRSフリップフロップは、確かにINR、DCRに対しては必要の無い回路なのですが、実は16ビットレジスタに対するINX、DCX命令もこの回路を利用していて、RSフリップフロップは、そのために必要な回路なのです。
この部分については、またINX、DCXのところで説明をいたします。

●あれ?C(キャリー)フラグがある?

Hフラグの回路の下を見ると、なんと上位4ビット用の74HC191のpin13からのキャリー出力を受けている、別のRSフリップフロップがあります。
上位4ビット用のカウンタからのキャリー出力ということは?

これってC(キャリー)フラグなんじゃないの?
でも確か上の説明のところで、INR、DCR命令では、C(キャリー)フラグは変化しなかった、と書いていませんでした?

その通りです。
実はこのRSフリップフロップ回路は、C(キャリー)フラグをセット、リセットするための回路ではなくて、その上のH(ハーフキャリー)フラグ回路と同じで、INX、DCX命令の回路のために必要なのです。
この回路についても、INX、DCX回路のところで説明することにします。

この2つのRSフリップフロップは、INR、DCR(およびINX、DCX)命令のときだけに使われる回路なので、OPコードフェッチサイクルの最初のT0のタイミングでリセットするようにしてあります(フラグのリセットではありません。RSフリップフロップのリセットです)。

ここで説明した各フラグのセット、リセット回路は、フラグそのものではなくて、フラグのセット、リセットをする回路です。
それじゃあ、いったいフラグそのものは、どこにあるの?

当然の疑問なのですが、今回は、もう時間が無くなってしまいましたので、フラグ本体についての説明、およびINR、DCR命令そのものの回路(up/downカウンタだけでは、INR、DCR命令は実行できません!)については、次回に説明することにいたします。
2008.9.5upload

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