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

●さて、残りの回路はどうなるのでしょう?

とりあえず、CPUの中心となる部分は、どうやら出来たようです。あとは、ガーバーデータを基板メーカーに送れば、しばらく待つうちにホンモノのプリント基板になって、送られてきます。

しかし、これだけでは、まだCPUらしいことは何もできません。MOV命令が実行できるだけです。

実はMOV命令だけだといっても、命令コードのうちのかなりの部分を片付けたことになります。
8080の命令コードは8ビットです。ということは、命令として使うことの出来るコードは00000000〜11111111の256個ということになります。8080はこの全てを使っているのではなくて、いくつか未定義のコードがあります。Z80はその未定義のコードに独自の命令を割り当てているのです。しかし、そのことは、ここでは余談です。

命令コードの各ビットにはおおまかな分類のための役割が割り当ててられています。
MOV命令には、命令コードの上位2ビット、bit7とbit6が01のコード、01000000〜01111111が全て割り当てられているのです。
なんと割り当て可能な全コードのうちの25%をMOV命令ただ1つが占有しているのです。

いや1つだけ例外があります。01110110です。これはMOV命令のコードの約束に従えば、MOV M,Mになるはずですが、8080にそのような命令はありません。8080ではこのコードはHLT命令(ただちに実行を停止する)に割り当てられています。
またこのHLT以外にも、MOV命令として実行はされるけれど、実際には意味のない命令コードも含まれています。
たとえば01000000は、アセンブラニーモニックで表記すれば、MOV B,Bになりますが(Bレジスタの内容をBレジスタにコピーする)、PICなどとは違い、8080のMOVはフラグに影響を与えませんから、これは、実質的にはNOP(no operation、何もしない)と同じです。

今回のメイン基板には、MOV、HLTのほかに、ついでにMVI命令も搭載しました。
MVI(move immediate)とは、8ビットレジスタまたはメモリに、命令コードに続く8ビットのデータを転送する命令です。
コードは00000110〜00111110の8個です。これにはMOVの場合とは異なり、メモリに対する命令コード00110110も含まれます。

このメイン基板だけで、全命令コードの4分の1以上の働きをすると言ったところで、もちろん、MOVとHLTとMVIだけしかできないのでは、とてもCPUとは言えません。
はたしてその他の命令はちゃんとつくることができるのでしょうか?

●残りの回路の基板

さきにも書きましたように、回路図としてはすでに8080の全機能、命令についての設計は一通りは完了しています。
しかし、それを全部実際にプリント基板に実装できるように、具体的な配線作業までおこなうとすれば、はたして最後まで無事やりとげることができるでしょうか?

実際にメイン基板の作業をしてみて、想像以上に大変だったことから、今後の作業に私自身がいささか不安になってきてしまいました。
そこで、第2の基板の作成作業にとりかかったのですが…。

命令のうちMOVがコードのかなりの部分を占めることはすでに説明しました。またレジスタ群の回路も相当のものになることについても、すでに説明しました。これらは最初に作成するメイン基板に載せます。
しかし実はというか、やはりというか、レジスタやMOVに負けず劣らない回路は、ADD、SUBなどの演算回路です。これはそれこそハンパではない。それも当然で、これこそが、まさにCPUの中核とも言える部分だからです。ここは多分大仕事になります。
そこで、基板としては、この部分はあと回しにしてしまいます。

第2の基板では、JMP、CALL、RETのグループとINR、DCR、それにIN、OUTを中心に考えることにしました。CALL、RETのためにSP(スタックポインタ)の回路も登場します。
またJMP、CALL、RETにはそれぞれフラグの状態によって動作が異なる、条件付命令が含まれています。ということで第2の基板にはフラグレジスタも載せなければなりません。
第2の基板の設計作業を進めていくうちに、あれぇ、これは、まずいなぁ、ということに気がついてしまいました。

実は基板を複数に分割するように考える過程で、当初はできるだけ、レジスタも機能もしぼって利用できるものは極力兼用できるような回路にするように計画していました。そこでは、外部メモリのためのアドレッシングを行う場合の、PC(プログラムカウンタ)やSP(スタックポインタ)、またはHLレジスタやBC、DEレジスタの値をアドレスバスに出力するために、一度8ビットの内部バスを経由させて、外部アドレスバス専用の出力レジスタに送り込むように考えていました。
この考え方だと、各レジスタは8ビットの内部バスにつないでおくだけでよいので、回路が簡単になると考えたからです。しかし、この考えも、甘かった!

実際に回路設計をすすめていくと、これでは命令によってはクロックがやたら多くなってしまって、何をやっているのやらわからない、状態になってしまうことがわかってきました。まあ、それも、回路のトレーニングの材料になるかも、とも思ったのですが、クロック数が増えるということは、そのクロックを維持、コントロールする回路も増大しますし、タイミングの誤差も無視できなくなります(このタイミングの誤差については、いずれ説明する機会があるかもしれません)。
ということで、最初から設計をやり直して、外部アドレスバスには、PC、SP、HLレジスタは直接16ビット幅で接続するように設計を変更しました。すでにメイン基板はおおよそできあがっていましたから、この変更はなかなかに大変でした。慣れた方がこのメイン基板をご覧になると、ICのレイアウトがかなり乱れていることに気づかれるかもしれません。すでに配置し終わったICをむりやり移動して、新しい目的のための配線や回路を追加しなければならなかったためです。

第2の基板を作る過程で、あれぇ、まずいなぁ、ということになったわけも、このことに関係しています。
第2の基板にSPを配置することはかなり前の段階で決めていました。しかし、その時点ではすでに説明したように、SPから外部アドレスバスへは、8ビットの内部バスを経由して行う、つもりでした。
これはその後に変更して、PC、SP、HLレジスタからは直接外部アドレスバスに出力するように考えをあらためたのでしたが(このこともすでに説明しました)、それをすっかり忘れてメイン基板の中だけ対策して、終わった、終わった、と思っていたのです。

第2の基板上にあるSP(スタックポインタ)からメイン基板上の外部アドレスバスとの接点までの接続ラインが無い(!)ことに気がつきました。なんと、A0〜A15の16本ものラインです。
これに気がつかないで、メイン基板を先に発注していたら、なかなかにつらいことになっていました。

やっぱり、先にメイン基板だけ発注しておいて、その間にゆっくり残りの基板を設計しよう、などという考えは甘かった!のです。

覚悟をきめて、残りの基板の設計もすすめることにしました。
すると、やっぱり、当初机上で思っていたよりも、基板のサイズが超デカく!なってしまうことが、だんだんと見えてきました。
とりあえずの作業の途中でも、第3の基板、つまりADDなどの演算を中心とする回路基板は、かなり大きくなってしまうことが予想できました。これは230mm角でもとてもムリで230mm×310mmということになってしまいました!(普通プリント基板は1m角の定尺のボードから切り出すので、作業ロスを見込むと230mmの上は310mmになってしまうのです)
どうやらそれでもパンクしそうだ、という事態になって、当初の予定をまたまた変更し、できるだけ多くの命令回路を第2の基板に移動することにしました。この段階では第2の基板も230mm角でほぼ作図が完了していたのですが…。いくらなんでもこんな大きな基板を4枚もつなぐなどとても考えられない。なんとか3枚におさめたい…。ということで、またもや泣く泣く第2の基板を変更して、最終的には第2、第3の基板とも、なんと230mm×310mmという巨大な基板になってしまいました!

いくらなんでもこんな基板、このまま組立キットにするのは、とてもムリですよね!
それについては、またあらためて、考えてみます。もう少し小さい基板に分割して、機能も整理して、とりあえずもう少し小さくても基本的な動作ができるようなキットにできれば、など、工夫の仕方もあるかもしれません。
せっかくここまで作業してきたのですから、とりあえず、作るだけはつくることにしたいと思います。

かくして、当初、とりあえずメイン基板だけまず先につくって…、というつもりだったのが、そうもいかないぞ、ということになって、結局のところ、第2、第3の基板についても、一応の基板設計まで、完了させてしまったのです。

が…。しかし。
とんでもないことに、今、気がついてしまいました…。

これが第2の基板。まだ配線の最終確認作業はしていない。

そして、これ(↓)が第3の基板。こちらも最終確認作業はまだやっていない。


ここで、気がついてしまった、大変なこと、とは!?
2008.7.15upload

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