標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第459回]
●ND80ZHのステップ回路(その2)
Z80版TK80ボード(ND80ZH)のステップ回路は[第457回]にお見せしました。
その回路図をよく見ますと、ROMselect信号だけではなくて、RFSHなどというわけのわからない信号が抱き合わせになってしまっています。
それはまた一体どういうわけなのか、というところで前回は終ってしまいました。
普通に考えると、下のような回路でいいはずなのです。
すっきりしていて前回考えた通りのわかりやすい回路です。
ところがこの回路にすると、まともにステップ動作をしてくれません。
なぜかといいますと、Z80のリフレッシュが邪魔をしてくれるからなのです。
●Z80のリフレッシュ機能
Z80は、ダイナミックRAMのデータ維持に必要なリフレッシュの機能をもっています。
Z80のメモリ空間はたかだか64KBですから、今ならそれくらいのメモリはSRAM(スタティックRAM)の1〜2個で簡単に実現できてしまいます。
しかしZ80が登場した当時は、まだメモリの集積度が低くて、スタティックRAMはとても高価だったのです。
ちなみにTK80は標準ではわずかに512バイトのRAMしか搭載していませんでした。TK80の基板上には1KBのRAMエリアしかありませんでしたから、RAMをフル実装してもやっと1KBだったのです。
そんな昔でもダイナミックRAMはありました。
いまでは普通にRAMといえばパソコンのDRAMのことをさすようになってしまいましたが、そのDRAMというのはダイナミックRAMのことなのです。
もちろん集積度は今とは比べ物になりませんでしたが、当時でもスタティックRAMよりはダイナミックRAMの方が集積度が高かったので、数十KBのメモリシステムということになれば、ダイナミックRAMを使うことになります。
ところがスタテイックRAMと違ってダイナミックRAMは通電状態でも、そのままではデータを維持しておくことができません。非常に微細な構造でデータを維持しているために、ほっておくと、すぐにデータが消滅してしまいます。
そこでデータが消えてしまわないように、数ミリだか数十ミリ秒だかの間隔で、メモリを常時アクセスして「再書込み」してやらなければなりません。それがリフレッシュです。
一般的なダイナミックメモリシステムでは、そのためにリフレッシュ回路を組んで、CPUのメモリアクセスとは別にリフレッシュを行うようにしなければなりませんでしたが、Z80では、そのようなリフレッシュ回路を用意しなくてもよいように、自前でその仕組みをもっていたのです。
下はZilog社「Z80 User’s Manual」からの引用です。
Z80では、CPUがOPコードをフェッチしたあとの、内部処理の期間中に空きになる、T3、T4のクロックのときに、外部アドレスバスにダイナミックRAMのための「リフレッシュアドレス」信号が出力されます。
ところで…?
なんのお話でしたっけ?
そうでした。
Z80ではINTE信号がありませんから、TK80と同じようにステップ動作をさせるために、INTEの代わりに、ROMselect信号を使おうとしたところ、うまく動いてくれません。
理屈の上では、ROMのモニタプログラムからRAMのユーザープログラムにジャンプして、そこで1命令を実行したところでINT信号が出るはずなのですが、実際にはINT信号が出てくれないのです。
ROMselect信号は、MREQとA15=0とのANDから作っています。
ですから、RAMをアクセスしているときは、D−FFのクリア端子はHになって、フリップフロップが働くはずなのですが、どうもRAMをアクセスしているはずなのに、D−FFがクリアされてしまうようなのです。
そこで、リフレッシュに注目、です。
上のタイミングチャートを見ると、RefreshのときもMREQがアクティブになっています。
もしもRAMをアクセスしているときに、A15=0になるようなアドレスが出力されたとするならば、おお、D−FFはクリアされてしまいます。
それではということで、[第457回]にお見せした回路図のように、このリフレッシュ期間中はD−FFをクリアしないようにすると、TK80と同じように正しくステップ動作をしてくれるようになります。
実は、この[第457回]にお見せしたZ80CPUでのステップ回路は、もうかれこれ30年近くも前に作ったND80Zの回路でした。当時はどのような過程でこのリフレッシュ問題にたどりついたのかは全く記憶にありませんし、記録も残っていません。
ただ回路図として残っていることからすると、ともかくZ80CPUを使ってTK80のステップ動作と同じことをさせるためにはこうしなければならない、ということを探り当てたことには違いありません。
ところで、さきほどのタイミングチャートを見ている限りでは、ここまでのお話はしごくもっともな展開で、疑問をさしはさむ余地はないのでありますが…。
さきほどのZ80 User’s Manualからの引用文をよくよく読み直してみますと。
おい、ちょっと、待て。おかしいではないか。
ということになります。
だって、しょっぱなから「the lower seven bits of the address bus contain a memory refresh address …」と書いてあります。
そう。確かにアドレスバスの下位7ビットには、リフレッシュアドレスが出力されるのです。
でも、ではこのときアドレスバスの上位ビットには何が出力されるのでしょうか?
Z80 User’s Manualのリフレッシュ信号の説明や、アドレスバス出力、OPコードフェッチサイクル(M1サイクル)の説明など、あちこち捜してみたのですけれど、そのどこにも、このときアドレスバスの上位ビットがどういう状態になるのかについては、何も書かれていませんでした。
うう。
さて、しかし、どこかで、何かを、読んだような…。
本日は時間がなくなってしまいました。この続きはまた次回にすることにいたします。
[追記]
昨日は眠かったので気がつかなかったのですけれど、今朝(3/20)になってから読み直していましたら、今回お見せした「Z80 User’s Manual」からの引用文にはミスプリントがあることに気がつきました(お気づきになりましたでしょうか?)。
本日も朝から多忙ですので、それについても次回に書くことにいたします。
2010.3.19upload
2010.3.20追記
前へ
次へ
ホームページトップへ戻る