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

●IN、OUT、RLC、RRC、RAL、RAR、の回路を実装しました

今回のIN命令、OUT命令の回路までが、この基板の前に作った2枚の試作基板で、一応のテストを済ませた回路です。
RLC、RRC、RAL、RARは、今回が初登場です。
やっと、というか、いよいよ、というか、これからが、残りの、初めてテストする回路の登場ということになります。

写真をクリックすると、拡大画像を見られます。
拡大画像はサイズが大きい(約1MB)ので、インターネットの低速接続環境ではダウンロードに時間がかかります。ご注意ください。



写真の上部に並んだLEDの、左端がINR、DCR用の8ビットのカウンタで、その右はフラグレジスタです。
今回はフラグレジスタの右側に、ローテイト命令用の、8ビットのシフトレジスタ回路を実装しました。

●とりあえず、IN命令とOUT命令を片付けてしまいましょう

IN命令とOUT命令は[第106回]で説明をしました。詳しくはそちらを参照してください。

IN命令、OUT命令は、外部の回路との間で、データのやり取りをするために、無くてはならない大切な命令です。
重要なはずの、その割には、機能としては、このIN命令とOUT命令の、わずか2命令があるだけです。
したがって、何をするにも、外部に専用のI/O回路がいくつも必要になってしまいます。

8080やZ80は、外部回路がなければ何もできない、というある意味、不便な存在なのですが、しかし見方を変えれば、それであるからこそ、I/Oに関係する機能は全て外部回路にまかせてしまって、ひたすらCPUでなければできない、制御の中枢機能に専念することができる、のであるとも言えます。

ともあれ、外部回路のコントロールには、このIN命令とOUT命令が、それこそ八面六臂の大活躍をします。
TK80の回路もIN命令とOUT命令を抜きにしては考えられません。

IN命令とOUT命令は、外部のI/O回路と、Aレジスタとの間で、データのやり取りをします。
Aレジスタ以外のレジスタをIN命令、OUT命令で使うことはできません(Z80には他のレジスタを使ったIN、OUT命令があります)。

外部I/Oもメモリと同じように、アドレスバスとデータバスに接続されますが、メモリとは違って、アドレスバスの下位8ビットしか使用することができません。
A0〜A7の8ビットで決まる、256個のI/Oアドレス(I/O装置)がその全てとなります。

メモリのアクセスとぶつからないように、IN命令のときは、IORD信号が、OUT命令のときはIOWR信号がアクティブになります。
この間は、メモリに対する、MEMRD、MEMWR信号は出力されませんから、メモリからのデータとI/Oからのデータがデータバス上でぶつかったり、またメモリやI/Oに誤ったデータが誤書込(誤出力)されないようになっています。

●IN命令とOUT命令のテストプログラム

IN命令とOUT命令のテストは、[第107回][第108回][第109回]で、I/OポートLSI、82C55を使ったテスト回路を作って、ステップ動作をさせて、動作の確認をしました。
今回は、そのときに使った82C55の回路をつないで、今度はステップ動作ではなくて、通常のCPUクロックでプログラムを実行して、テストをします。

テストプログラムは簡単なものです。

0000 310000   LXI SP,0000
0003 3E80     MVI A,80
0005 D383     OUT 83
0007 3E00     MVI A,00
0009 D380     OUT 80
000B CD3000   CALL 0030
000E DB80     IN 80
0010 3C       INR A
0011 C30900   JMP 0009

0003〜0006は82C55の初期設定です。テスト用の82C55はI/Oアドレス80〜83に割り当てています。
アドレス83にポートの向きを指定するコマンドを与えます。
コマンド80はA〜Cポート全部を出力に指定するコマンドです。
82C55についての簡単な説明は[第107回]にあります。

0007〜000Aでは、初期値00を82C55のAポート(アドレス80)に出力しています。
今回は[第157回]で作った、0.5secタイマールーチンを利用します。
000Bで0.5secタイマールーチンをCALLしています。

000E〜000Fでは、82C55のAポートから、出力値を読み込みます。
IN命令で読み込んだ値はAレジスタに書き込まれます。
82C55の出力ポートに対してIN命令を実行すると、出力中の値がそのまま読み出されます。
0.5secタイマールーチンをCALLする前に、OUT命令でAポートに出力した値がそのまま読み出されます。

0010でAレジスタの値を+1したあとで、0011のJMP命令で、0009に戻って、繰り返します。

このプログラムを実行すると、82C55のAポートの出力が、0.5秒ごとに、00〜FFまで+1ずつ加算されていきます。FFの次はまた00に戻って、ずっと繰り返しを続けます。

●テスト中の写真です



左側にある基板が、[第108回]で、テスト用に作った82C55回路です。
82C55の出力は、その上のLEDにフラットケーブルで接続しています。
3列あるうちの一番上がAポートの出力です。

IN命令、OUT命令は、この先、TK80の回路を動作させるために、たっぷり使うことになりますから、今回はこんな簡単なテストだけですけれど、ひとまずOKということにいたします。
2009.2.19upload

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