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

●JMP命令の説明です

いままで説明してきた回路は全てレジスタを操作するだけの命令でした。
確かに命令を解読して、その通りに実行してはいるのですが、とにかくレジスタ間か、レジスタ・メモリ間のデータ転送ばかりでしたから、CPUの回路というよりは、なんだかメモリ電卓の回路のような気がしないでもありません。

しかし、いよいよ、最もCPUらしい回路の説明にとりかかっていくことになります。
その代表とも言えるのが、JMP命令です。

命令コードは
11000011 (16進数ではC3)
です。
アセンブラ表記は
JMP 1234
です。
マシン語命令コードC3に続く2バイトの値が示すメモリアドレスに無条件でジャンプします。

たとえば、メモリアドレス0010から続く3バイトが次の値だったとき、

0010 C3
0011 56
0012 78

CPUは0012番地まで読み取ったあと、7856番地にジャンプします(5678番地ではありません)。
8080は16ビット、2バイトの値をメモリに置くときには、若いアドレスに下位バイトが来るように配置します。
ですからCPUは上の例では、まず命令コードのC3を読み、次に続くジャンプ先を指定するアドレスの下位アドレスを先に読み、続いて上位アドレスを読むことになります。

この命令の動作はどのような回路にするとよいのでしょうか?
ポイントはプログラムカウンタです。

CPUはプログラムカウンタが示すメモリアドレスの通りに、メモリから命令を読み取って解読しながら、それを実行していきます。
普通は、メモリから1バイト読むごとにプログラムカウンタは+1だけ進んでいきます。
JMP命令を読み込んだあとで、プログラムカウンタにJMP先のアドレスを書き込めば、次にCPUは新たに書き込まれたプログラムカウンタの値が示すメモリアドレスから命令コードを読み込んでくれるはずです。

●話の順番として、JMP命令をデコードする回路です

じつは、JMP命令だけではなくて、2枚目の基板にある命令の半数ぐらいが同じデコード回路から出ているのです。
とりあえずはJMP命令の部分だけ取り出してお見せすればよいようなものですが、いずれは全部説明していくことになりますから、この際、全部まとめてお見せしてしまいます。

●2枚目の基板にある全命令のデコード回路です



JMP命令は図の中ほどにあります。
JMP命令の命令コードは、11000011 ですから、op7=1、op6=1のときの、op2〜op0が”011”(=3)のセレクトラインと、op5〜op3が”000”(=0)のセレクトラインのANDによって選択されます。

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



命令コード”C3”に続く2バイトをそのままプログラムカウンタに入れたいところですが、残念ながら、それはできません。
順序として、まず”C3”の次のメモリアドレスの値を読んで、プログラムカウンタの下位レジスタ(PCL)に書き込みます。
そして次の値を読み込んで…。この時点でプログラムカウンタの下位8ビットが書き変えられてしまっていますから、次の値を読むことができなくなってしまいます。

そこで、M2、M3の期間に、”C3”コードに続く2バイトの値をメモリから読んで、ワークレジスタ、WKL、WKHに書き込みます。
そして、次のM4、M5で、WKLの値をPCLに、WKHの値をPCHに書き込むようにしています。
WKL、WKHは、d3〜d0またはs3〜s0が、”0111”、”0110”で、regWR、regRDをアクティブにすることで書き込み、読み出しができ、PCL、PCHはd3〜d0またはs3〜s0が、”0011”、”0010”で、regWR、regRDをアクティブにすることで書き込み、読み出しができます。
d3〜d0、s3〜s0とレジスタの関係については、[第27回]で説明しました。こちらの表を参照してください。
d3〜d0、s3〜s0とregRD、regWR信号とによってレジスタをアクセスする仕組みについては、[第27回]の「レジスタコード表」の下に回路図がありますが、その回路はその後に改良によって変更していますので、[第45回]で説明した、こちらの回路図を参照してください。

今日はもう時間が無くなってしまいました。
この続きは次回に致します。
2008.9.8upload

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