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

●前回の続き(追記)です

前回、XCHG命令の回路の説明のところで、次のように書きました。

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


なにしろ限られた時間の中で一気に書いてしまおうとすると、舌足らずな表現になってしまったり、不正確なことを書いてしまったりします。
8080の設計がどうなっているのか、見たことはありませんから、あくまで想像するしかありません。
そんないい加減なことなら、はじめから書かなければよいのですけれどね。
余計なことを書くものだから、こうやって後からフォローしなければならないハメになります。

おそらく、8080では、外部アドレスバスの出力部にも、ラッチがあって、そこには「内部データバス」がつながっているのだ、と思います。

あるいは、そうかもしれませんけれど、これは、どうかなぁ、と思います(はて、どうしてこういういいかげんなことを書いてしまったのでしょう)。

図で説明することにします。

●私が勝手に考えた8080のレジスタブロック図


これは私が想像する8080の内部(レジスタ部分)です。
多分こんな感じではないかな、と思います。
内部データバスは8ビットです(だから、8ビットCPUです)。
ここは、間違いありません。

前回は、この内部データバスと右端のアドレスラッチがつながっているのではないか、と書きました。
しかし、もしそうだったとすると、内部データバスは8ビットですから、HLレジスタからアドレスラッチにデータを送るのに、8ビットずつ2回に分けて送らなければなりません。
HLレジスタはそれでも仕方がないとしても、スタックポインタやプログラムカウンタまで2回に分けて送る、というのはいかにも非能率ですし、無理にそんなことをしなくても、アドレス送出に関係するレジスタだけ16ビットのバスを用意したほうが理にかなっています。

あ。ただ、ここで問題になるのが、XCHG命令でトグルするHLレジスタとDEレジスタです。
DEレジスタをBCレジスタと同じ側に配置したのでは、XCHG命令によって、DEレジスタがHLレジスタとして動作しなくてはならないときに、データをアドレスラッチに置くことができません。
ということから考えると、DEレジスタもHLレジスタと同じ配置にしてあるのでは、と思います。

しかし、それならDEレジスタもHLレジスタと同じように、メモリの間接アドレッシング用の機能をもたせることができたはず、とも考えたのですが、多分、命令コードの制約から、その機能が利用できなかったのではないか、と想像をたくましくしています。
つまり、こういうことです。
HLレジスタを使ってメモリアドレスを指定する(間接アドレッシング)とき、そのメモリはMという記号で表されます。
そしてこのMはMOV命令やその他の演算命令などで、BレジスタやCレジスタなどの汎用レジスタと同じように扱うことができます。
それを可能にしているのが、各レジスタに与えられた3ビットのコードです(このレジスタに与えられたコードについては、[第27回]で説明しています)。
下のようになっています。

Bレジスタ  000
Cレジスタ  001
Dレジスタ  010
Eレジスタ  011
Hレジスタ  100
Lレジスタ  101
M       110 ←HLレジスタで示すメモリアドレス
Aレジスタ  111

これで全部使い切ってしまっていますから、DEレジスタで示すメモリアドレスに、コードを割り当てることができません。
ですから、回路としては、DEレジスタを間接アドレッシングに利用することもできるのだけれど、命令コードに空きがないので、それが利用できないのではなかろうか、と…。
ま、これは、すべて私の勝手な想像に過ぎないのですけれど、ね。

上の図で、スタックポインタとプログラムカウンタのところに ? がつけてあるのは、この2組のレジスタが8ビットの内部バスから独立しているのか、つながっているのかがわからないからです。

でも、多分、これらのレジスタも内部データバスにつながっている、と思います。
HLからプログラムにデータを転送するPCHL、同じくHLからスタックポインタに転送するSPHLや、スタックポインタに定数を設定するLXI SP命令の実行には、スタックポインタやプログラムカウンタも内部データバスにつながっていたほうが、余計なロジックを使わずに済みます。
「つくるCPU」の回路もそうしています。

[5月28日追記]
まあ、私はなんという、おばか、なのでしょう。
スタックポインタとプログラムカウンタも8ビットの内部データバスにつながっているに決まってるじゃありませんか!
こんなわかりきったことに、どうして気がつかなかったのでしょう。
このことについては、次回書くことにいたします(年甲斐もなく赤面、なので字までトマトになってしまいました)。


おお。そうでした。
ここまで、書いてきて、思いつきました。
8080User’s Manualです([第77回])。
何か参考になりそうなことが書いてあるかもしれません。

●8080 User’s Manualから

こんな図がありました。

出典:Intel社「8080 Microcomputer Systems User’s Manual September 1975」

ちょっと見にくいですけれど、ほうら、やっぱり、内部データバス(internal data bus)とは別に、register arrayからaddress bufferに16bitの出力ラインが出ていました。

●「つくるCPU」のレジスタブロック図

ここまでいろいろ書いてきましたので、この「つくるCPU」のレジスタはどうなっているか、それも図で示すことにいたします(回路図ももちろん大変ですけれど、こういう図を描くのも、けっこう手間がかかります)。



スタックポインタもプログラムカウンタも内部データバスにつながっています。
外部アドレスバスには出力ラッチを使わず、各レジスタの出力用ゲート(74HC244)から直接外部アドレスバスに出力しています。
この図では省略しましたが、このほかにも、INR、DCR命令用の8ビットUP/DOWNカウンタやローテイト命令のためのシフトレジスタ、ALUのレジスタ”A”、レジスタ”B”も内部データバスにつながっています。
2009.5.27upload
2009.5.28追記(赤字の部分

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