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

●8080のXCHG命令回路

前回、この連載記事を読まれた方からメールをいただいて、雑誌「インターフェース」(CQ出版社)に嶋 正利氏が書かれたDAA回路についての説明図のコピーを添付していただきました、ということを書きました。
DAA回路だけではなくて、XCHG命令についても、その解説図を添付していただきましたので、今回はXCHG命令について、お話をしたいと思います。

XCHG命令の回路については、[第91回]で説明をしました。
その中で、下のように書きました。

8080もZ80も実行クロック数は4クロックで、これはNOPなどと同じで、最低のクロック数で実行します。
レジスタのセレクト回路に何か工夫があって、セレクトするチャンネルを簡単に交換するような仕組みになっているのかもしれません。
「つくるCPU」の回路ではごくオーソドックスにWKレジスタを使います。
ですからクロック数が多くなって、なかなか大変な処理になります。

8080のIC設計回路を見たわけではありませんから、そのように書いたのですが、多分そういうことだろうなぁ、とは思っていました。
そこで、この文を読まれた、前回にも書きました、岐阜県のK様が、「インターフェース」に載っていた、嶋 正利氏が書かれた、XCHG命令の解説図をコピーしてメールで送ってくださったのです。

●嶋 正利氏の説明によるXCHG回路

前回と同様、今回も、メールに添付していただいた嶋 正利氏のXCHG回路図をもとに、私が作図しました(簡単な回路ですから、ほとんど、そのまんま、ですけれど…)。


右のRegister Unitは、いただいた回路図では、Memory Unitになっていましたが、ここは「つくるCPU」の説明の流儀でそのように書き換えました。
また信号名もこの連載での説明に合わせた名前に書き換えました。

考え方はとてもシンプルです。
JKフリップフロップにXCHGコマンド信号が入るたびに、出力Qが反転(もとの図ではトグルと書いてあります)し、HLselect信号とDEselect信号が、レジスタユニットに入っていくラインが交互に入れ替わります。
ちょうど電車の線路がポイント切換えで切り換わるように、HLselect、DEselectの各信号で選択されるレジスタが入れ替わってしまうのです。
ロジック回路でセレクト線を切り換えるだけですから、これは速いわけです。

この考え方はなかなかに有用で、たとえば限られたアドレス線しかないI/O回路やメモリ回路で、同じアドレスに複数の回路(I/O、メモリ)を置くことが可能になります。
バンク切換えのメモリなども、同じ考え方でできます。

多分、この方式の延長として、Z80では、EX AF,AF’やEXXという機能を実現しています(と思います)。
Z80では、Aレジスタ、フラグレジスタとB、C、D、E、H、Lの各レジスタがそれぞれ2組あって、そのうちの1組だけがアクセスできる(「表」に出ている)のですが、EX AF,AF’命令、EXX命令によって、「表」に出ている組と「裏」に隠れている組を入れかえることができるのです。

じつは、今回のこの企画を思いついて、各命令回路を考えていく過程で、当初は、私もHLとDEのセレクトラインを切り換える、という方式を考えていました。
しかし、検討を進めるうちに、「いや、これは、そんなに簡単にはいかないわ」と、早々に、この案はあきらめてしまいました。
一見シンプルに見える、セレクトラインの切換え方式ですが、8080の回路でも、多分、上の図の回路だけではだめで、他にも工夫が必要だったはずだと思います。

●「つくるCPU」では、そのようにしなかった、その理由

上の回路のほかに、何が必要なのでしょうか?
考慮しなければならないことは、下の2つです。

その1です。
HLレジスタ、DEレジスタは16ビットレジスタであると同時に、8ビットのレジスタ、H、L、D、Eとしてもアクセスできなければならない、ということです。

XCHG命令をセレクトラインで切り換える回路にしたときは、HLとDEののセレクトラインを切り換えて、同じレジスタを見かけ上、HLとしてアクセスしたり、DEとしてアクセスしたりしますが、そうすると、HL、DEのセレクトラインを切り換えると同時に8ビットのレジスタHとD、LとEのアクセスラインもトグルしなければなりません。
まあ、しかし、これは、8ビットのセレクトラインも切り換えるようにすれば、なんとかなります。

その2です。
HLレジスタにはメモリアドレス(M)を間接的に示す機能があります。
したがってHLのデータを外部アドレスバス(A15〜A0)に出力する回路が必要になります。
しかし、この機能はDEレジスタにはありません。
おそらく、8080では、外部アドレスバスの出力部にも、ラッチがあって、そこには「内部データバス」がつながっているのだ、と思います。
しかし、「つくるCPU」のレジスタ回路では、そのようにはしていません。

レジスタの回路図は[第23回]にあります。
回路図を見ていただくとわかりますように、レジスタを構成している8ビットのラッチ74HC373のOEは全てGNDにつないであります。
常時アクティブです。
このOE端子はバスラインに複数個接続可能にするための機能で、まさにCPUの内部バスに直接接続するのに、ちょうど都合のよい機能なのですが、その機能をわざと殺してしまっています。
そして、そのために、わざわざ内部バスとの間に、74HC244を付け加えているのです。
なんと無駄なことを…。というところでしょうが、もちろん理由があります。
レジスタ内容を表示するためのLEDの存在です。
これがあるために、74HC244で仕切らなければならないのですけれど、しかし、このLEDは、「ぜひとも欲しい」ものなので、これはもうどうしようもないことなのです。

で、8ビットのレジスタ当たり1個の74HC373だけで済むところが、ご覧の通り複雑な回路になってしまっています。
ま、それはちょっと本題からはずれた余計なお話でした。
それはともかく、どのみち74HC244でセパレートしなければならないわけですから、それならHLの場合だけ、もう1組74HC244を追加して、それを外部アドレスバスに出したら、それでHLレジスタの機能が出来あがります。
ここをXCHG命令だけのために、内部バスを経由させる、というのは、トータルとして考えて得策ではない、という結論になったため、セレクトラインを切り換える方式はとらないことにしたのです。

それに、もうひとつ、これもレジスタのLED表示に関係することなのですが、セレクトラインを切り換える方式にした場合、XCHGを実行するたびに、基板上のHLレジスタとDEレジスタの位置が入れ替わってしまいます。
それは、ちょっと、まずいのではありませんか、ねぇ。
2009.5.26upload

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