ワンボードマイコンをつくろう!(パソコンの原点はここから始まった)
TK80ソフトコンパチブル!8080、Z80マシン語からBASICまでこれ1台でこなせます
当記事は2009年11月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.6.28
前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆特注品Z80ボードND80ZHの機能説明
TK80コンパチブルで、その上中日電工オリジナルのND80Zとしても動作するというZ80CPUのワンボードマイコンを企画し、その開発準備をしていたところに、ND80Zの特注品の開発依頼をいただきました。製品名はND80ZHです。
新企画のZ80ボード(ND80ZV)はこのあとで製作することになりますが、基本的な機能はND80ZHと共通していますから、まずはND80ZHの機能を説明します。

[第11回]

●スピーカ出力回路

Z80版TK80ボード(ND80ZH)の機能説明の続きです。

マイコンのプログラムで、とりあえずやってみたいと思うのは、「音」の出力です。
1と0だけの単純な方形波を出力するだけなのに、それが音として聞こえ、それを連続的に変化させるとメロディになってしまうというのは、なんとも不思議な感じがするものです。

確か小学校のときだったか、「音色」というものがあって、さまざまな楽器の音色は、実は波形の違いによって生み出されるものだと習ったように記憶しています。
ただの方形波には音色が無いように思われるのですけれど。
うう。そうか。方形波、という音色なのか。

今回のZ80版TK80ボードにもスピーカ出力回路(といってもトランジスタ2石の簡単なアンプ回路だけですけれど)がついています(MYCPU80にも同じ回路がついています)。
小型のスピーカを接続している写真です。


●キー入力について

今回の試作基板の写真をご覧になって、「キーがTK80と違う」ことにお気づきになられた方もみえるかと思います。
キーの部分を拡大した写真です。


本当は各キーにはアクリルの透明キャップがついています。
透明キャップ付ですから、あとから任意のキーシールを入れることができます。
今回は試作評価用ですからつけてありません。

一番上に並んでいるキーの名前がTK80のそれではありません。
じつはこのキーは、当社のND80シリーズのものなのです。
TK80の機能キーは、エンピツで書き加えてあります。

CONT(RET)とMON(RESET)は、単に呼称が違うだけで、機能としては同じです。
STOREキーとLOADキーについては、TK80とは全く役割が異なっています。
確かTK85がこんな感じのレイアウトだったような…。

その昔、TK80コンパチの、いわばコバンザメ商法で売り出したのでありましたが、NECがTK80の後継としてTK85を低価格で売り出したのを見て衝撃を受け、さっそく機能強化して以来、ずっとこのスタイルで来ています。
今回は基本的にはTK80互換のモニタプログラムを搭載しているのですけれど、せっかくのZ80CPUでありますし、まあどうせND80Zモニタプログラムという開発済みのものを持っているわけでありますから、その両方のモニタプログラムをROMに書き込んでしまって、DIPSWで選択できるようにしたい、と考えました。

もっともさすがに時代に合わない機能もありまして、たとえばW16、W32、W64とありますのがそれです。
ご想像の通り、当時別売しておりました、2716、2732、2764用ROM WRITER用の機能です。
そのWRITERはもうありません。
ですけれど、そのためにキーシールを印刷しなおすとなると、コストがばかになりませんから、ずっとこのままのスタイルできています。

SO、SIは、これもオプションのRS232Cインターフェースボードのためのものですが、今回はオンボートになって、しかもカセットテープインターフェースの代わりにSTORE、LOAD機能として利用するつもりですから、このキー機能も使いません。
STORE、LOAD用には、SV、LDを使います。
VF(ベリファイ)はカセットテープの場合には必須でしたが、RS232Cでは使わないでしょうね。

OUT、INは、I/Oデバイス(82C55など)に対して、OUT、INを実行します。
これらのキー機能は[*(I/O)]とともに使います。

●I/Oモード

TK80モニタでは、メモリに対するREAD/WRITEはキー操作で行えます。
[8][0][0][0][ADRSSET][3][E][WRITEINC]というように、です。
しかし、I/Oデバイスに対しては、そのアドレスにデータをIN、OUTするプログラムを書いて、それを実行することでしか、アクセスできませんでした。

簡単なI/O動作の確認をその場で行いたいときには、ちょいと面倒です。
そのようなときに、このキー機能は重宝します。
たとえば、ボード上の82C55のAポート(アドレス80)にデータ5Aを出力したいときは、以下のキー操作をするだけで、ただちに82C55へのアクセスが行われます。

[8][0][ADRSSET][5][A][*(I/O)][OUT]

I/Oアドレスもメモリアドレスと同じように、[READINC][READDEC]キーを使うことができます。

操作しているところを写真に撮りました。

ボード上の82C55(I/Oアドレス80〜83)にデータを出力してみます。
最初はアドレス83にコントロールワード80を出力します。
コントロールワードアドレス83に80を出力するとA、B、Cの全ポートが出力に設定されます。
[8][3][ADRSSET][8][0]
まで入力したところです。
ここではアドレス表示が0083になっていますが、I/Oアドレスは下位8ビットのみが有効ですから、4桁のアドレス表示のうち上位2桁にはなにが表示されていても無視されます。


[*(I/O)][OUT]と操作しました。
7セグメントLEDの表示は変化しませんが、I/Oアドレス83に80が書き込まれたため、82C55のAポート〜Cポートが出力に設定されました。
82C55の入出力用コネクタに接続したLEDボードが全点灯しました。
このLEDは、82C55の出力がLの時に点灯します。
82C55はポートを出力に設定すると、最初は出力が全ビットLになります。


[READDEC]を押しました。
アドレスが−1されて82になりました。
Cポートのアドレスです。


[5][A][*I/O][OUT]と操作しました。
LEDボードは上からAポート、Bポート、Cポートの順に並んでいます。
左がビット7、右がビット0です。
Cポートから5Aが出力されたことがわかります。

外につけたLEDボードおよびその他について[追記]しました(2010.2.26)。


[READDEC][3][4][*I/O][OUT]と操作しました。
I/Oアドレスは81になりました。
Bポートのアドレスです。
Bポートのアドレスに34を書き込みました。
Bポートから’34’が出力されたことがわかります。


[READINC]を押しました。
I/Oアドレスが82に戻りました。
Cポートのアドレスです。


今度は、[*I/O][IN]と操作してみました。
データ表示部の下位2桁に、I/Oアドレス82(Cポート)からの入力データ5Aが表示されました。
82C55は、出力に設定されたポートに対して入力命令(IN)を実行すると、出力にラッチされている値がそのまま読み出されます。

[追記]
1)5Aは’01011010’ですが、82C55の入出力コネクタに接続したLEDボードは、0で点灯、1で消灯しますから、視覚的には逆の表示になります(でもテスト用ですからそれでも構いません)。
ですから、○●○●●○●○というように表示されています。

2)[ADRSSET][READINC][READDEC]はメモリからのREAD動作を伴いますから、それらのキーを押した直後には、7セグメントLEDのアドレス表示部(左4桁)に表示された「メモリアドレス」から読み出されたデータが、7セグメントLEDのデータ表示部の下位2桁(右端の2桁)に表示されます。
[0][0][8][3][ADRSSET]や[READDEC][READINC]と操作したときに7セグメントLEDのデータ表示部の右端2桁に表示される値はI/Oデバイスのデータではなくて、そのとき7セグメントLEDのアドレス表示部(左4桁)に表示されている「メモリ」アドレス(上の操作例写真では0083、0082など)のデータです。この時点では82C55からのデータではありません。
このあと[*I/O][IN]と操作したとき、はじめてI/Oデバイスからのデータが7セグメントLEDのデータ表示部の右2桁に表示されます。

なおこの[追記]では説明の都合で[0][0][8][3][ADRSSET]と書きましたが、すでに上の本文で説明をしましたようにI/Oアドレスは下位2桁(8ビット)のみが有効ですから、[*I/O][IN]、[*I/O][OUT]の操作に対しては、7セグメントLEDのアドレス表示部の上位2桁(左端2桁)は意味をもちません(無視されます)。
ですから[8][3][ADRSSET]で構いませんし、[1][2][8][3][ADRSSET]と操作しても[*I/O][IN]、[*I/O][OUT]に対しては全く同じ結果が得られます。

もちろん[ADRSSET][READDEC][READINC]を押した直後には、メモリに対しては7セグメントLEDのアドレス表示部(左4桁)全てが意味をもちますから、[0][0][8][3][ADRSSET]と[1][2][8][3][ADRSSET]では、そのときに7セグメントLEDのデータ表示部の右2桁に表示されるメモリからのデータは異なってきますが、その表示されている値のままで[*I/O][OUT]と操作しない限り、I/Oデバイスに対して影響を与えません。

[WRINC]はメモリに対しての書き込み動作ですから、I/Oデバイスに対しては影響を与えません。
7セグメントLEDのアドレスの表示にだけ注目すれば[READINC]と同じになります
しかし当然のことながら、メモリに対してデータを書き込んでしまいますから、[*I/O][IN]、[*I/O][OUT]の操作をすることを目的として、[READINC]の代わりに[WRINC]を使ってはいけません。
CPUをつくろう!第442回(2010.2.25upload)を再編集

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

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