ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
[第133回]
●ND80ZVをBSに接続する(3)
明けましておめでとうございます。
本年もよろしくお願いいたします。
昨年12月30日以来の更新です。
実は。
私には暮れも正月もありませんでした。
ええ。
何をしていたかといいますと…。
今はまだちょっと言えません。
近日中に、多分発表することになると思っておりますが、今はちょっと、本当にやれるかどうか、予備調査の段階ですので、言えません。
私にとって、今年はちょっと大変な年になってしまいそうです。
そんなわけで(これじゃ何もわかりませんですねえ)、大晦日も、正月三が日もどこにも行かず、ひたすら部屋に篭って、パソコンやドキュメントと格闘しておりました。
あ。
本日もそうでした。
ですので、BS+ND80ZVの続きを書かなければならないのですけれど、本日も途中で終わってしまうかもしれません。
なにとぞご了承をお願いいたします。
さて。
前回の続きです。
ちょっと時間がありませんので、前回までのいきさつは省略しまして、いきなり解決編です。
ND80ZVとBSとの接続についてM様にお尋ねしたところ、
「BSとTK−80とを接続するときにつながっていたコネクタの信号のうち、下記の信号はよくわからないので、接続していません」
というメールをいただきました。
1)HLDA+RESET
2)EXTINT(INT7)
3)RESET
実は1)が必要な信号だったのです。
この信号はTK−80から出力されている信号で、LED表示のためのDMAサイクル中にCPUがホルトしていることを示す信号です。
前回もお見せしましたが、同様の回路はND80ZVにもあります。
前回書いたことをもう一度書きます。
回路図の左上に書いてありますDMAenblという信号が、TK−80のHLDAに相当すると思います。
この回路図ではA0〜A2だけではなくて、A10〜A14もDMAenblで制御する回路になっています。
TK−80はA0〜A2だけです。
1秒間に数百回、CPUにHOLD信号(Z80の場合はBUSRQ信号)を送ってほんのわずかな時間だけCPUを停止させておいて、その間にRAMのLED表示バッファの内容を読み出してLED表示回路に送るための回路です。
CPUはホルト期間中は全ての信号出力をハイインピーダンスにします。
アドレス線を抵抗でプルアップしておけばアドレス出力はFFFFになります。
そのときA0〜A2だけを強制的に変化させればFFF8〜FFFFの内容を読み出すことができます。
TK−80はアドレスをフルデコードしていませんから、A10〜A14がHであっても83F8〜83FFのRAMの内容が読み出されます。
しかしND80ZVには32KBのRAMが実装されていて8000〜FFFFのすべてのアドレスにRAMが割り当てられていますから、TK−80と同じようにはできません。
そこでDMAの期間にA0〜A2だけをコントロールするのではなくて、同時にA10〜A14を強制的にLにすることで、RAMの83F8〜83FFの内容を読み出せるようにしているのです。
以上の説明の中に答えがありました。
DMAの期間中はアドレスはFFFFになってしまいます。
TK−80単体ではそれでも構わなかったのですが、BSと接続するときはBS上のメモリも有効にするために、TK−80のROM、RAMもフルデコードする必要があります。
そのための信号はBS側に用意されていて、それをTK−80のメモリセレクト回路に接続することで、TK−80のROM、RAMは本来のメモリアドレスに限ってアクセスできるようになります。
すると、BSと接続してアドレスがフルデコードされてしまったために、DMAの期間中にTK−80のRAMがセレクトされなくなってしまい、そのままではLEDのダイナミック点灯ができなくなってしまいます。
そこで、もう一度上の回路を見てください。
ND80ZVでは、DMAの期間中にフルデコードされたRAMの83F8〜83FF番地をアクセスできるように、A10〜A14をその期間中だけ強制的にLにしています。
これと同じ回路がBSと接続するTK−80にも必要になってしまうのです。
その回路はBSに用意されていて、それをアクティブにする信号が1)のHLDA+RESETだったのです。
TK−80からのHLDA信号によって、BSはその期間中A10〜A14を強制的にLにします。
そのHLDA信号がHアクティブ(正論理)出力だったことが、今回の問題の原因となりました。
その信号がBSに接続されていなかったために、BS回路では、HLDAが常時入力されている状態になって、したがってA10〜A14が常時Lになってしまったのです。
ND80ZVのキーボードからBSのメモリアドレスを指定して読み出しても、A10〜A14が強制的にLにされているために、BSのメモリが読み出せなかったのです。
以下の部分は言葉足らずのところがありましたので、一部を書き改め、追記しました(12.1.5)。
最初は74HC367をバッファとしてA10〜A14に入れていたために、(ラインが出力ショートしていますから)ND80ZV側がH出力のとき、BS側出力のLとがぶつかって、中間的な値になってしまっていたようです。
M様がこのラインを観測して「波形がくずれている」ように見えたのは、そういうことだったのです。
その後74HC367を外してA10〜A14がZ80から直接出力されるようになると、おそらくはZ80の出力が74HC367よりも弱かったために、BSからの出力に負けてA10〜A14が完全にLになってしまったのだと思われます。
その状態で、BSのメモリアドレスを指定して読み出しても、A10〜A14は常時Lになってしまっていますから、ND80ZVのRAMの内容が読み出されてしまったのです。
もうおわかりいただけたと思います。
今回の問題の解決策は、上の回路図の「DMAenblをBSのHLDA+RESETに接続する」でした。
ワンボードマイコンをつくろう![第133回]
2012.1.4upload
2012.1.5一部更新
前へ
次へ
目次へ戻る
ホームページトップへ戻る