ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.29
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆いよいよND80ZVの製作にとりかかります
特注品Z80ボードND80ZHも完成しいよいよ本番のND80ZVの製作にとりかかります。
もとの連載記事ではND80ZVのUSB/RS232Cインターフェース回路に実装するPICについての説明が入っていますが、その部分はまた別にまとめることとします。
その部分の開発に手間取ったこともあって完成予定が遅れてしまいましたが、それにしても、当初はあと2〜3ヶ月くらいもあればND80ZVを売り出すことができると思っていました。
まさか半年もかかってしまうなど予想もしていませんでした。
それというのもとんでもないことを思いついてしまったためでした。

[第35回]

●7segLEDの表示バッファアドレスもTK80と同じにしたい

Z80版TK80ボード(ND80ZH)のメモリマップについて、そのワークエリアが当初はTK80のそれとは異なっていたのですが、TK80との互換性を考慮して、TK80モニタプログラムと同じワークエリアアドレスとなるように変更をいたしました([第17回]および[第18回])。

しかしDMA(ダイナミックメモリアクセス)で表示を行っている7セグメントLED表示バッファのアドレスはTK80が83F8〜83FFであったのに対して、ND80ZHではFFF8〜FFFFになっていて、ここのところだけはTK80と互換性が無いままになっています。
これはDMAでLED表示回路がRAMの表示バッファのデータを強制的に読み出すときに、アドレスバスをプルアップしておいて、8桁分のデータの格納アドレスをアクセスするのに必要な、アドレスバスの下位3ビット(A0〜A2)だけを制御するという簡単な回路にしているためで、RAMの一番後ろの8バイトが選択されることになるためです。

TK80のRAMは最大実装時でも8000〜83FFの1KBでしたから、その最後の8バイトのアドレス83F8〜83FFが7セグメントLED表示バッファになっていました。
ND80ZHのRAMは8000〜FFFFの32KBですから、7セグメントLED表示バッファアドレスはFFF8〜FFFFになります。

ND80ZHに搭載しているTK80モニタプログラムのワークエリアのアドレスについては、TK80のワークエリアと同じアドレスにしましたから、TK80のために書かれたプログラムで、ワークエリアに対してREAD/WRITEするようなプログラムでも、アドレスを変更することなくそのままND80ZHに書いて実行させることができます。

しかしたとえばゲームのプログラムなどでは、7セグメントLEDの表示バッファに直接アクセスして、0〜F以外の文字や記号などを表示させるものがあって、そういうプログラムをND80ZHで実行させようとすると、83F8〜83FFをアクセスしている部分はFFF8〜FFFFに書き直さなければなりません。

この変更作業はアセンブラならば比較的楽に行うことができます。
しかしTK80もND80ZHも、アセンブラではなくて16進のマシン語コードを入力していくのですから、そのコードの中で、7セグメントLED表示バッファのアドレスのみを変更してから入力する、という作業は、ことにそのプログラムがある程度の長さがあるようなものでは、結構面倒な変更作業になってしまいます。

[第17回]および[第18回]のところでワークエリアのアドレスを変更したときにも、そのことはちょいと気になったのですけれど、7セグメントLED表示バッファのアドレスをTK80と同じにするにはハードウェア回路を変更しなければなりません。
DMAでRAMをアクセスするときに、A0〜A2だけではなくて、アドレスバスの上位のラインもコントロールする回路にしなければなりませんから、いや、それは大変なことだわ、と思って、そのときはそれから先に進んで考えることなく終わってしまいました。

なにしろ納期がせまっていて、もう目が吊り上っていましたから、じっくり考えるゆとりなどなかったのです。
でも、やっと無事納品が済んで、ほっと一息つきましたら、そのところについても、なんとかしたいなあ、と思うようになりました。
いえ、今回のND80ZHはもう納品してしまいましたので、それをさらに改造することはできませんけれど、この次に製作するつもりの、汎用品のZ80版TK80ボードでは、できるならばそのようにしたいものだと思います。

そこで、回路図を眺めていましたら、おお、ちょいと回路を追加すれば、できてしまうではありませんか。

●そのように変更した回路図です



図の右下部分が追加した回路です。
変更前の回路図([第3回])と見比べてみてください。

何を追加したかといいますと、DMAのときにアドレスバスのA0〜A2を出力するだけではなくて、それに追加して、A10〜A14も0を出力するようにしたのです。
この追加変更は、基板内に余っていたゲートを利用しましたので、それでも不足する74HC126を1個追加しただけで済みました。

こういうことなのです。
変更前の回路ではDMAのときに、アドレスバスのA0〜A2以外は、抵抗で+5Vにプルアップされていますから、A3〜A15=1になります。
ですからそのときにアクセスされるアドレスは11111111 11111xxx、つまりFFF8〜FFFFです。
そこのところを、10000011 11111xxxにできれば、83F8〜83FFがアクセスされることになります。
ということは、A14〜A10の5ビットを強制的に0にすればよいので、図のような回路になるのです。

ところで、ND80ZHにはTK80モニタプログラムのほかに、当社オリジナルのND80Zモニタプログラムも搭載されています。
この構成は、これから製作するつもりの汎用品のZ80版TK80ボードでも、同じようにしたいと思っています。
ND80Zモニタプログラムは、32KBあるRAMを有効に利用できるように、ワークエリアは後ろのFFxxに置いてあります。
すると今回の変更作業によって、7セグメントLED表示バッファがFFF8〜FFFFから83F8〜83FFに変更されることは、TK80モニタプログラムについては本来のオリジナルと同じになるわけですからよいのですけれど、その一方でND80Zモニタプログラムについては逆に7セグメントLED表示バッファだけが、ワークエリアから離れて存在することになって、ちょっとそれでは、なんだかなあ、ということになってしまいます。

そこで、TK80モニタプログラムが選択されているときは、DMAで83F8〜83FFがアクセスされて、ND80Zモニタプログラムが選択されているときには、改造前と同じで、FFF8〜FFFFがアクセスされるように考えてあります。
図の追加された74HC126の前にある74HC00(NANDゲート)と74HC04(インバータ)がそのための回路です。
NANDゲートの1番ピンに入力されているLED_TK80はTK80モニタプログラムが選択されているときだけHになる信号です。

そんな信号がどこにあるのか、と言いますと、ここにあります。



TK80モニタプログラムは、ディップスイッチのbPがOFFのときに選択されるようになっていました。
それをそのまま利用することにしたのです。

●追加改造を行ったND80ZHの写真です

ND80ZHの試作基板を利用して、上の回路の追加改造を行いました。
ちょうど予備のために置いてあったICスペースに今回追加した74HC126を置くことができました。

「予備のICスペース」というのは真っ赤なうそでありました。
もともとここには[第28回]で簡単にする前のステップ回路で使っていた74HC32が置いてあったのです。
ステップ回路が簡単になったことで不要になって外してしまった74HC32のあとがたまたま空いていたので、その場所を今回の74HC126の追加で利用したのでした。

基板裏の追加配線です。

MYCPU80の試作の過程で行った地獄のような追加配線に比べれば、おちゃのこさいさい、であります。

さっそく電源を入れてみると、こんな表示になってしまいました。

これは誤配線でもなんでもありません。
これでよいのです。
まだモニタプログラムは変更していませんから、TK80モニタプログラムが選択されると、モニタプログラムによってゼロクリアされる7セグメントLED表示バッファは、改造前と同じFFF8〜FFFFですが、DMAによって表示されるバッファアドレスは83F8〜83FFに変更されていますから、RAMの初期データがそのまま表示されているのです。
右端の2桁のLEDに遮光フィルムが貼ってないのは、この基板を7セグメントLEDの動作テストに使うように、その部分が改造してあるからです([第31回])。

TK80モニタプログラムを変更しないことには、この表示バッファは利用することができません。
しかし今回変更した回路が正しく機能しているかどうかについては、このままの方がはっきりと確認することができます。

その確認を行うために、ディップスイッチのbPをONにしてND80Zモニタプログラムを選択します。

すると改造の影響はなくなりますから、7セグメントLEDは正しく表示されます。
そこで、TK80モニタプログラムの7セグメントLED表示バッファに表示データを書き込んでみます。
83F8に06を書き込みます。「1」の表示データです。

83F9に5Bを書きます。「2」の表示データです。


83FAに4Fを書きます。「3」の表示データです。


83FBに66を書きます。「4」の表示データです。


83FCに6Dを書きます。「5」の表示データです。


83FDに7Dを書きます。「6」の表示データです。


83FEに27を書きます。「7」の表示データです。


83FFに7Fを書きます。「8」の表示データです。


ディップスイッチのbPをOFFにして、TK80モニタプログラムを選択しました。

まだモニタプログラムは変更されていませんから、リセットしても83F8〜83FFはゼロクリアされません。
ですから、先ほど書き込んだままの表示データがそのまま表示されます。

こちらはTK80モニタプログラムを変更したROMを実装したところです。

今度はリセットによって、83F8〜83FFがゼロクリアされて、そのように表示されました。
改造成功です。
かくして、TK80ソフトウェア完全コンパチブルになりました。

あ。実行速度はコンパチではありませんけれど、そこまでこだわるのは、やり過ぎだと思いますし、8080とZ80は実行クロックについては完全互換ではありませんから、CPUクロックを合わせたとしても、完全にTK80互換にすることはできません([第20回][第21回])。
ですから、CPUクロックについては、4MHzで行くことにいたします。
CPUをつくろう!第467回(2010.4.1upload)を再編集

ワンボードマイコンをつくろう![第35回]
2011.6.29upload

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