Z80 コンピュータを作ろう!(その2)
前回は,メモリや I/O デバイスへの読み書きに関する信号について書きました。
今回は,残りの制御信号について書いてみたいと思います。
割り込み信号
大抵の CPU には,割り込みという概念があります。
Z80 には,マスカブル割り込みと,ノンマスカブル割り込みがあり,それぞれ,外部からの割り込み要求を受け付けるピンがあります。
マスカブル割り込み要求信号は,/INT というピンで受け付けます。
なぜマスカブルと言うと,ソフトウェアで割り込み要求をマスク,すなわち受け付けないようにできるからです。
この割り込みは通常,複数の割り込み要求を受け付けるので,ワイヤードオアで使用されることが多いです。(割り込みモード 2 を使うと,割り込みベクタで複数割り込みを制御することもできます)
ノンマスカブル割り込み要求信号は,/NMI というピンで受け付けます。
この割り込み要求はマスカブル割り込みよりも優先度が高く,マスクすることができません。
緊急事態用といった感じですが,ゲーム機やパソコンでは,比較的使われることは少ないような気がします。
それぞれの信号が入力されると,プログラムカウンタの内容をスタックにセーブし…云々と言うのは,よくマシン語の本に書かれていますね。ですので省略します(笑)
リセット信号
いわゆるリセットがかかると入力される信号です。
よく,リセットボタンと呼ばれるスイッチがあると思いますが,それです。
リセットをすると,プログラムカウンタが 0000H にセットされ…云々…と言うのもいろんな本に書いているので省略します。
重要なのは,電源オン時にもリセット信号を入力する必要があるということです(パワーオンリセットと言います)。
電源を入れただけでは,Z80 は自分で勝手にリセットするわけではありません。外部から信号を入力する必要があるのです。
ウェイト信号
Z80 は,クロックサイクルに従って規則正しく動作します。
周辺デバイスもそれに従って動作しなくてはいけません。
でも,それに追いつけないデバイスもあります。
追いつけないのに,Z80 がそのまま突っ走ってしまったら,データを取りこぼしたりしますよね。
そういう時に,デバイスは「ちょっと待ってくれ」という信号を Z80 に対して送ります。
/WAIT ピンをアクティブにすると,その間だけ,Z80 は データの読み書きを保留します。
デバイスがデータの準備をしたら,/WAIT を解除して,Z80 は動作を続行します。
バスリクエスト信号
バスに接続されたデバイスは,通常,Z80 からの指示を受けて動作しているので,バスは Z80 がほとんど支配しています。
でも,一時的に外部からメモリをアクセスしたい時はどうすればよいのでしょう?
Z80 は,クロックパルスに従って逐次メモリから命令を拾って実行していますので,外部からメモリをアクセスするとバスの競合が起こります。
Z80 にお伺いを立てないとといけません。
そんな時に,/BUSRQ 信号をアクティブにして,「ちょっとバスを使いたいのですが…」とお伺いを立てると,Z80 は,「今の仕事終わらせるからちょっと待ってね」と言って,準備オーケーになると /BUSAK 信号をアクティブにして,「使っていいよ」と言います。
この「使っていいよ」状態になると,Z80 は,アドレスバス,データバス,/MREQ,/IORQ,/WR,/RD をハイインピーダンスにして,電気的に切り離された状態になります。これで,外部からバスを使える状態になるわけです。
/BUSRQ を解除すると,Z80 は,バスを取り返して実行を再開します。
リフレッシュ信号
ダイナミックメモリ (DRAM) のリフレッシュ用の信号で,Z80 が,リフレッシュアドレスをアドレスバスに出力している時に,/RFSH ピンがアクティブになります。
DRAM を使用しない場合は,あまり重要な信号ではないのですが,これと同時に /MREQ がアクティブになってしまうので,通常のメモリアクセス時は,/RFSH がアクティブでないことを確認する必要があります。
マシンサイクル1信号
メモリから命令を取り出すタイミングで,/M1 というピンがアクティブになります。
また,マスカブル割り込みを受け付けた時も,/IORQ とともにアクティブになります。
ホールト信号
Z80 が,HALT 命令を実行して,ホールト状態になるとアクティブになります。
ざっとこんな感じです
これから作ろうとしている Z80 コンピュータは,これらの全てのピンを使う予定なので,一通り説明をしてみました。
それぞれの信号の実際の使いみちなどは,制作過程で詳しく説明していきたいと思います。