標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第107回]

●IN命令とOUT命令の動作テスト

[101回]のはじめのところで、「最近は忙しくてホームページの更新が1日おきになっています」と書きましたが、ここのところ、さらにペースが落ちてしまいました。

いったい何をやっているのでしょう?
実は、ちょいと大変な作業をやっているのです。
その詳細について、近日中にご説明できると思います。
いましばらくお待ちください。

そんなわけで、本日もほんの少しだけになってしまいそうです。

IN命令とOUT命令は今までの命令のように、CPU内部のレジスタや、メモリの内容を書きかえたりするのではなくて、まったく別のI/Oというハードに対して、読み、書き、をします。
ということは、IN命令やOUT命令をテストするためには、メモリのほかにI/O回路が必要なのです。

●I/Oといえば82C55が定番です

82C55(8080発売当時は8255)は8080だけではなくて、その後に発売された8085やZ80のI/O回路を構成する代表的なLSIとしてひろく一般的に使われました。
もともとは8080のファミリーLSIとして開発されたため、Z80との接続にはちょいとしたコツが必要ですが、40pinのLSI1個で、コマンドによって入力にも出力にも設定できる8ビットのI/Oポートを3ポートももっているというのは、なかなかに便利なICです。
ちなみにZ80のファミリーにはZ80PIOというLSIがありますが、こちらは同じ40pinなのに8ビットのポートが2ポートしかありません。この1ポートの差はときとしてかなり利いてくるときがあります。
ということででしょうか、Z80のボードでもZ80PIOよりも82C55を組み込んだボードの方が一般的だったように思います。

それほどにポピュラーだった82C55ですが、Z80に続いて、国内での生産は終了してしまいました。
今はまだ流通在庫があるようですが、やがて国内では入手できなくなる日もそれほど遠くないような気がします。

それはともかく、IN命令とOUT命令のテストです。
また手元にある適当な基板を利用して、「つくるCPU」の基板に82C55回路を接続しました。


フラットケーブルが入り組んでいます。
左下にあるのが、当社のBASIC制御ボードZB25Kです。
これでRAMに命令コードを書き込んで、「つくるCPU」ボードのステップ動作をコントロールしています。

写真中央にあるのが、RAM基板です。
62256相当のRAMがのっています。

その左にあるのが、今回新たに追加した、82C55ボードです。
82C55の出力の確認のために、テスト用のLED表示回路が82C55基板に接続されています。

●82C55の簡単な説明です

82C55には8ビットの入出力ポート、Aポート、Bポート、Cポートの3ポートがあります。
各ポートにアクセスするには、それぞれのポートに割り当てたI/Oアドレスを指定して、IN命令、OUT命令を実行します。
82C55には上記3ポートのほかに、各ポートの入出力方向を設定するための、コントロールワードアドレスがあります。
82C55はコントロールワードアドレスを含めると、合計4つの連続したI/Oアドレスを占有することになります。

今回のテストでは、82C55の外部につけたアドレスデコード回路によって、I/Oアドレスとして80〜83(いずれも16進数)を割り当ててあります。

I/Oアドレス  I/Oポート
80        Aポート
81        Bポート
82        Cポート
83        コントロールワード

●動作テストプログラムです

0000 3E80     MVI A,80
0002 D383     OUT 83
0004 D380     OUT 80
0006 3D       DCR A
0007 D381     OUT 81
0009 3D       DCR A
000A D382     OUT 82
000C DB81     IN 81

0002番地のOUT命令でコントロールワードアドレスに”80”を出力しています。
OUT命令では出力するI/Oアドレスだけを命令の2バイト目で指定します。
Aレジスタのデータが出力されます。
そのためOUT命令に先立って、Aレジスタに出力データをセットしておきます。
それが0000番地のMVI命令です。
OUT命令の実行後もAレジスタの値は変化せずにそのまま残ります。
コントロールワードの詳細については省略しますが、コントロールワードの”80”はA〜Cの全ポートを出力に設定するコマンドです。

0004番地でAポートに同じ”80”を出力しています。
コントロールワードの”80”でも、AポートのI/Oアドレスの”80”でもなくて、ただの出力データとしての”80”です。
ここではAポートのI/Oアドレスが”80”なので、OUT命令の2バイト目が”80”になっていますが、これは「I/Oアドレス」を指定しているので、出力データではありません。
Aポートに出力されるのは0000番地のMVI命令でAレジスタに入れた”80”です。
テストとしてどんなデータを出力してもよいので、たまたまAレジスタに残っている、”80”をそのまま82C55のAポートに出力しているだけです。

I/Oアドレス”83”に対して出力された”80”は、コントロールワードとして82C55のポートの向きを設定させるように働きますが、Aポート〜Cポートに対しては、ただの出力データとしての”80”として働きます。
0004番地のOUT命令の実行によって、Aレジスタの値の”80”がそのままAポートから出力されます。
82C55のAポート〜Cポートから出力されたデータは、ラッチされて、次に別の値を出力するまで、そのまま保持されます。

ポートによって出力データを変えてみる目的で、0006番地のDCR命令を実行します。
Aレジスタに入っていた”80”は−1されて”7F”になります。
次の0007番地のOUT命令で、I/Oアドレス”81”のBポートには、”7F”が出力されます。

もう一度0009番地のDCR Aを実行するので、その次の000A番地のOUT命令で、”82”のCポートには”7E”が出力されます。

最後のIN命令はI/Oアドレス”81”から入力します。Bポートです。
82C55は向きを出力に設定したポートに対してIN命令を実行すると、それ以前に実行されて現在その出力ポートに出力されてラッチされている出力データをそのまま読み込みます。
IN命令は指定するI/Oアドレスから入力したデータをAレジスタに読み込みます。
Bポートには”7F”を出力しましたから、IN 81の実行によってAレジスタには”7F”が読み込まれます。
2008.11.7upload
2008.11.8追記

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