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

●PCもSPも8ビット内部データバスにつながっています

前回、8080の場合、スタックポインタとプログラムカウンタが8ビットの内部データバスにつながっているのか、独立しているのかはわからない、と書きました。
一晩寝て、今朝になってから読み返していて気がつきました。
なんだ。両方とも8ビットデータバスにつながっているに、決まってるじゃないか。

やっぱり一晩寝ると、多少は脳細胞も復活してくれるようです。
こんな当たり前のことに気が付かなかったなんて、お恥ずかしい限りです。

どうしてスタックポインタもプログラムカウンタも8ビットの内部データバスにつながっている、と断言できるのでしょうか?

●その理由です

まずは、プログラムカウンタからです。
前回は、プログラムカウンタを扱う命令としてはPCHLがある、ということにほんの少しだけふれました。
PCHL命令はHLレジスタの値をプログラムカウンタに転送する命令です。
その結果、HLの値が示すアドレスにジャンプすることになります(間接ジャンプ命令です)。

プログラムカウンタに値をセットする命令はこのPCHLだけですから(と思い込んでしまったのが、おばかでした)、HL→PCへのデータ転送を8ビットの内部データバスを介して行うのか、それともそれ専用に16ビットを一度に送るのかは、8080の設計図を見たわけではないので、わかりません。
と、まあ、みごとに、おばかなことを書いてしまいました。

たしかにちょっと考えると、プログラムカウンタに値をセットする命令はPCHLだけのように、思えます。
でも、でも、ほら、他にもあるじゃありませんか。

たとえば、JMP命令(JZ、JCなどの条件JMP命令も)、CALL命令もそうでした。
JMP命令やCALL命令は、メモリに書かれているOPコードの次の2バイトの値を、次の命令実行アドレスとしてプログラムカウンタに書き込みます。

メモリからは、当然1度に1バイトずつしか読めません。
メモリから読み出した値は、必ず、8ビットの内部データバスを通ります。
その値をプログラムカウンタに書き込むためには、プログラムカウンタが8ビットずつ上位、下位に分かれて、それぞれが内部データバスにつながっていなければならない、という当然の理屈です。

それに加えて、CALL命令の場合は、さらに、今あるプログラムカウンタの値を、先にメモリスタックに退避させる、という働きもします。
メモリスタックは当然8ビットですから、プログラムカウンタの値は、やはり上位、下位の8ビットの値に分けられて、内部データバスに読み出されたあと、メモリに書き込まれることになります。

これと逆の動作をするのがRET命令です。
RET命令は、メモリスタックから読み出した戻り先アドレスをプログラムカウンタに格納する、という動作をしますが、これも上でCALLについて説明しましたように、メモリからは1度に8ビットの値しか読み出せませんから、やはり、8ビットの内部データバスを経由して、プログラムカウンタに、8ビット、2回に分けて書き込まれることになります。

どう考えてもプログラムカウンタは8ビットの内部データバスにつながっていなくてはならないわけです。

さて、次にスタックポインタについても考えてみます。

前回、スタックポインタを扱う命令として、SPHLとLXI SPがある、ということをほんの少しだけ書きました。

なかでもLXI SPは、JMPやCALLと全く同じで、メモリにあるOPコードの次に書かれている8ビット2バイトの値を、メモリから読み出して、それをスタックポインタに書き込む命令ですから、その値は当然8ビットの内部データバス経由で、8ビットずつ2度に分けて書き込むしか仕方がないはずです。
スタックポインタも8ビットの内部データバスにつながっているに決まっている、のです。

これは、昨日、LXI SP命令を持ち出した時点で、すぐに気がつかなくてはならなかった、ことなのです。
やっぱり、あれです。夜遅くまでパソコンなどをさわっていると、脳が酸素欠乏症になってしまうのですよね。

スタックポインタを扱う命令は他にもありました(これも、今朝になってから、思い出しました。やっぱり、低酸素症だわ)。

DAD SPです。
HLレジスタとスタックポインタの値を加算して、結果をHLレジスタに入れる、という命令です。
16ビットの加算命令ですけれど、これは間違い無く、8ビットに分けて、下位、上位の順に、2回加算しています。
なぜ?ですか。

だって、8080は8ビットのALUしか無いからなのですよ。
前回の8080の内部ブロック図をもう一度見てみましょう。
真中あたりに、ARITHMETIC LOGIC UNIT(ALU)と書いてあって、その右下にちょっと小さいですけれど(8)と書いてありますでしょう。
8ビットのCPUですから、8ビットのALUなのです。
これはもう、どう考えても、スタックポインタも8ビット内部データバスにつながっていなくてはならない、わけです。
2009.5.28upload

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