トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第273回]
●MMU回路(1)
とうとう12月になってしまいました。
HCMOS版MYCPU4は組立キットとして秋ごろには販売できるようにしたいと思っていたのですが、あれやこれやで大幅に遅れてしまいました。
やっと試作と動作テストが完了して製品版のプリント基板を手配したところです。
基板は年内には手元に届くと思うのですが、まだこれから組立説明書や操作説明書を作成しなければなりません。
この調子では来年1月からの供給開始ということになってしまいそうです。
当連載記事も遅れ遅れの細切れ状態で来ましたがやっと前回で命令動作の検証が終りました。
回路、動作の説明ももうあと少しで終りそうです。
残っておりますのは今回の見出しに書きましたMMUについての説明です。
「トランジスタ技術」2020年5月号の特集記事に刺激されてMYCPU4の開発を思い立ったのですが、同特集記事で紹介されておりますトランジスタ版4ビットCPUはデータバスは8ビットなのですが、プログラムカウンタは4ビットなのでアドレスバスは4ビットしかありません。
ということはプログラムはアドレス0からアドレスFのわずか16ステップしか組めません。
同特集記事によると16個の8PディップスイッチをROM代わりに使ってそこに最長16ステップのプログラムを組むということのようです。
ま。
学習キットとしてはそんなところなのかもしれませんが。
50年前ならともかく今でしたら大容量のRAMでも安価に入手できるのですから、ここはやっぱり定番通りにプログラムはRAMに組みたいものです。
いや安価に入手できるといいましてもこのところ雲行きが非常に怪しくなってきていましてRAMもROMもそれからなんとDIPタイプのHCMOSロジックICさえも入手困難になってきています。
いずれこういう組立キットは消え去る運命かと思います。
それはさておいて、幸い現時点では32KBのSRAM(おなじみの62256型)ならばまだなんとか入手できています。
しかしそれを使うとなると、32KBのメモリ容量がありながらそのうちわずか16バイトしか使わないなんて、いくらなんでもそれはあんまりでありましょう。
もっとも命令数がわずか20個にも満たない4ビットマシーンですから、その乏しい命令を駆使して数キロバイトのプログラムを(しかもハンドアセンブルで!)書くというのもやっぱり非現実的に過ぎましょう。
まあせめて200バイト程度のプログラムが組めれば上等なのではありませんでしょうか。
そういうことになりますとメモリアドレスとしては8ビットは必要ということになります。
どうすれば4ビットしかないPC(プログラムカウンタ)で8ビットのメモリアドレスにアクセスすることができるのでしょうか。
たとえば256バイトのメモリを16ビット×16個に分割して何らかの方法でその16個の小メモリブロックの間を行き来できるようにできたらどうでしょうか。
CPUのPC(プログラムカウンタ)は8ビットのメモリアドレスのうちの下位4ビット(A3〜A0)にアクセスします。
そして上位4ビット(A7〜A4)はMMU(メモリマネージメントユニット)回路から出力するようにします。
ところがここで悩んだのがそのMMUに4ビットのアドレスデータをどうすれば与えることができるかという問題です。
「トランジスタ技術」2020年5月号の特集記事の4ビットCPUの命令コードは8ビットのデータ幅のうちの上位4ビットは0000〜1111まで定義済みです。
MMUに4ビットのデータを与えるための命令コードが残っていません。
同特集記事の命令コードの一部を変更してWレジスタに対するLD命令のコードを創出したのと同様の方法で、たとえばADD A,BとSUB A,Bをビット0の1、0で使い分けるようにすれば0100か0101のどちらかのコードをMMU用の命令コードとして使うことができます。
うーん。
でもせっかく「トランジスタ技術」誌に敬意を表して互換CPUとして設計したのに、ADDとSUBのところだけ、同じ命令コードに配置するのはいかにも苦しい、というかスマートではありません。
そこでMMUのことはMMU回路に任せることにして、そのための命令は用意しない、という考え方に落ち着きました。
実際の回路は[第257回]でお見せしました。
でももう1ヶ月も前の記事ですからもう一度下に再掲することにします。
図の上側IC4−2(74HC157)、IC7(74HC08)、IC7−2(74HC00)、IC5(74HC175)、IC6(74HC157)がMMU回路です。
IC4−2とIC6の74HC157はプログラム実行中のCPU回路からの出力とRAMにプログラムを書き込むときの82C55からの出力を切り換えるための回路ですから実質的なMMU回路としてはその後ろのIC7(74HC08)、IC7−2(74HC00)、IC5(74HC175)の3個で構成されます。
実はそれともうひとつIC3−2(74HC157)が重要な役を担っています。
考え方はちょっと複雑でひねってあります。
PC(プログラムカウンタ)から出力されるアドレスはIC7(74HC08)につながっています。
そしてRAMからのデータの上位4ビット(D7〜D4)がIC5(74HC175)の入力につながっています。
IC5の出力はRAMアドレスのA7〜A4につながっています。
PCから出力されるアドレスがF(1111)のときにIC5(74HC175)のCK入力がLになります。
74HC175はクロック入力の立ち上がりのときに入力データをラッチします。
それまではRAMのA7〜A4は変化しません。
そこのところがこの回路のポイントです。
PCから出力されるアドレスがF(1111)のときにCPUのデータバスのD7〜D4にはIC3−2(74HC157)から命令コードとして1100が出力されます(このときRAMからのD7〜D4は遮断されています)。
1100はJMP命令のコードです。
そしてそのときのRAMからの出力データD3〜D0がJMP命令のオペランドとしてCPUに与えられます。
すべての動作はJMP命令のCLK4が次の命令のCLK1になる瞬間に行なわれます。
その瞬間にJMP命令が実行されてPCにはJMP命令のオペランドデータがセットされます。
同時にその1CLK前のRAMからの出力データのD7〜D4がIC5(74HC175)にラッチされ、その結果メモリアドレスのA7〜A4が切り換わります。
ちょっと、というか相当にややこしいですね。
本当にそれでメモリバンクが切り換わるのか?
CPUはそれで正しくプログラムを実行できるのか?
次回はそのあたりを実際にテストプログラムを実行して確かめてみることにします。
トランジスタでCPUをつくろう![第273回]
2020.12.4upload
前へ
次へ
ホームページトップへ戻る