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

新製品の紹介(プチ連載です)
MYCPU80用増設I/Oボード組立キット

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
たまにはちょいと息抜きで小品も作ってみたいものです。
簡単にチョイチョイと…。
でも、なかなかそうは簡単にはいかなくて、いつものごとく回を重ねてしまうことになるのかも…。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


[第4回]


●82C55の制御

82C55の操作説明については、どこかに書いたつもりだったのですが、どうも書いていなかったような…。
まあ余りにポピュラーなLSIですからネット上にそれこそゴマンと散らばっているとは思いますけれど。
説明の順序といたしまして、ざっと説明をしておくことにいたします。
といいましても、はなから書くというのも面倒なことでありますから、そこは要領よくND80Z3.5付属説明書からコピーしてしまうことにいたします。

ND80Z3.5組立キット付属「TK−80モニタ操作説明書」より引用

4. 82C55の使い方

4.1 82C55のアドレス

 82C55には入力、出力どちらでも指定できる8ビットのI/Oポートが3組あります。これらはAポート、Bポート、Cポートとよんでおり、それぞれ異なったアドレスによって選択されます。
ND80Z3.5に実装されている82C55には次のアドレスが与えられています。

  80 Aポート
  81 Bポート
  82 Cポート
  83 コントロールワード

コントロールワードは、各ポートの向き(入力か出力か)を設定したり、Cポートに対する特殊なアクセスの場合に使います。

4.2 82C55の各ポートの入出力指定の仕方

82C55のポートはコントロールワードの設定によって入力か出力のいずれかに設定することができますが標準的なモードでは双方向の設定はできません。電源投入後にはまず各ポートの向き(入力か出力か)を設定しなければなりません。向きの設定はコントロールワードアドレスに必要なデータを送ることによって行われます。

 入出力の指定は図5−1のコントロールワードを、OUT命令で82C55のコントロールワードアドレス(83)に送ることで行われます。

たとえばAポートとCポートを出力に、Bポートを入力に設定するには、I/Oアドレス83にコントロールワード82を出力します。

3E82 MVI A,82
D383 OUT 83

〔注意1〕コントロールワード出力によって、出力に設定されたポートはその時点から、全ビットが0になります。
〔注意2〕ここで説明した82C55のコントロールワードは、モード0とよばれる動作についてのものです。82C55にはこのモード0のほかに、モード1、モード2という動作モードがありますが、一般的ではないので説明を省略します。

4.3 各ポートに対するデータ入出力の方法

コントロールワードによって入力、出力の指定が行われたあとは、どのような時点でもその指定にしたがってデータの入出力ができます。(入力ポートならIN命令、出力ポートならOUT命令を使います)

(1)データの出力
AレジスタのデータがOUT命令によって、指定したポートから出力されます。
命令は下のようにコーディングします。

D380 OUT 80 ………Aレジスタの内容をAポートから出力する

〔注記〕出力に設定されたポートから外部に出力されるデータはラッチされています。
したがって新たに別のデータをそのポートから出力するか、または入出力の設定をし直すまではもとのデータの出力が維持されます。

(2)データの入力
IN命令によって、指定したポートからのデータがAレジスタに入ります。
命令は下のようにコーディングします。

  DB81 IN 81  ………Bポートに入力されたデータがAレジスタに入る。

〔注意〕入力データはラッチされません。

4.4 Cポートだけに許される特殊なデータ出力方法

 Cポートも4.3(1)で説明した使い方でデータ出力ができますが、Cポートに限って特殊なデータ出力が可能です。
4.3(1)のOUT命令では、8ビットのデータが出力されますが、作業によっては他の出力は変化させずに特定の1ビットだけ出力を変えたい、という場合があります。
AポートやBポートはソフトウェアで工夫するしかないのですが、Cポートは図5−2のコントロールワードを、コントロールワードアドレス(Cポートアドレスではありません)に出力することで、任意の1ビットだけ出力を変化させることができます。

例えばPC5 から0を出力したければ、00001010つまり0Aを83(82ではありません)に出力します。
 下のようにコーディングします。

3E0A MVI A,0A
D383 OUT 83

〔注意〕この動作は出力に設定されているビットのみに当てはまります。
Cポートは上位4ビットと下位4ビットで入出力を別個に設定できますが、例えば上位が出力で下位が入力に設定されている場合は、上の動作は上位4ビットに対しては有効ですが、下位4ビットに対しては無視されます。

●簡単な動作テストです

82C55の簡単な動作テストをしてみました。
BASICでプログラムを書くと簡単です。
比較のためにまずはND80Z3.5でテストをしてみました。

FOR〜NEXTで時間待ちループを作って、それをはさみながらAポートから00とFFを交互に出力します。

AポートのPA0〜PA7は同じ動きになりますから、そのうちのPA4をオシロスコープで見てみました。

FOR〜NEXTループ1000回で0.7秒ぐらいかかっています。
FOR〜NEXTループ1回あたり0.7msです。
整数値で演算すればもっと高速にできるのですが、ZB3BASICは整数値の演算も内部では実数に換算して浮動小数点演算をしているため、演算速度は遅くなります。

ところでMYCPU80なのですが。
ND80Z3.5はCPUクロック6MHzでCPUはZ80であるのに対してMYCPU80はCPUクロック2MHzで8080相当です。
単純に計算すればMYCPU80はND80Z3.5の3倍時間がかかるということなのですが…。
実際にやってみますと、残念ながらMYCPU80はND80Z3.5に比較して相当に遅いという結果が出てしまいました。

MYCPU80でも最初はFOR〜NEXTループを1000回にしてみましたがそれではとても遅くてオシロで観測できませんでしたので、100回のループに縮めてみましたが、それでもND80Z3.5に比べるとまだ時間がかかっています。

FOR〜NEXTループ100回で1.6秒ぐらいかかっています。
FOR〜NEXTループ1回あたり16msです。
もともとZB3BASICはZ80CPUのために書いたプログラムで8080にはないZ80固有の命令や8080にはないIX、IYレジスタなどを多用しています。
それをMYCPU80用に変更したために、たとえばZ80ならば1命令で済んでしまうところが8080では数十ステップのサブルーチンになってしまうところなどが沢山あって、このような差が出てきてしまいます。

Z80と8080で同じ命令で済ますことができるプログラムならば概ねCPUクロックの差に近くなります。
念のためそこのところも試してみました。
上と同じ動作をマシン語プログラムで書いてそれぞれ実行してみました。

簡単なマシン語命令ならば、このようにCMコマンド(change memory)を使って直接マシン語コードをメモリに書いていくことができます。
書いた結果はDMコマンド(dump memory)を使って確かめることができます。
今度はFOR〜NEXTのような時間待ちループは作らず、00とFFを出力する間にはNOP命令とJP命令のみがはさまれているだけです。

ND80Z3.5での実行結果です。

H、L1回の出力にかかる時間は約8.4μsです。

同じプログラムをMYCPU80でも実行してみました。
時間軸の目盛りが上の画面とは異なります。

H、L1回の出力にかかる時間は約22μsです。
大体CPUクロックと同じ程度の差(6MHz対2MHz)になりました。
もう少し正確に計算しますと、同じ命令のプログラムならば、むしろMYCPU80のほうが健闘しているといえましょう(波形と時間軸から見ると、実行時間は2対6ではなくて2対5)。
自画自賛なのですが、MYCPU80はなかなかに優れものなのです。

MYCPU80用増設I/Oボード組立キット[第4回]
2015.12.6upload

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