Z80 DMA

Z80 DMAはZ80システムにDMA機能を付与するファミリLSIです。DMA制御は1回路分しか積んでいませんが(他社ファミリでは4回路程度集積してあるのが普通)、メモリ−メモリ間のデータ転送が行えたり、各種タイミングパルス幅調整までプログラマブルになっていたりとか、高機能でした。しかしZ80 SIOと並んで、あるいはそれ以上に高価なLSIで、あまり使われているところを見たことがありません。

Z80 DMA
これはセカンドソースのZ80 DMAで、上はSHARP製のLH0083AでZ80A DMA相当品、下は東芝製のCMOS化されたものでZ80B DMA相当品のTMPZ84C10AP-6でおそらくZ80 DMA互換では最高速のLSI。

Z80 DMAの機能には、次のようなものがあります。

バイト・バースト・連続のデータ転送モードを持つ。
データ転送・データサーチ・転送と同時にサーチの3種類の動作を選択できる。
ソースアドレスとディスティネーションアドレスを転送ごとにインクリメント・デクリメント・変化なしとすることができる。
メモリ−メモリ間、メモリ−I/O間、I/O−I/O間のDMA転送が可能。
データ転送要求(RDY信号)、サーチデータ検出、データ転送完了によって割り込み発生。
データ転送完了後、自動的に転送をくり返し再実行可能。
256 Byte転送ごとにパルス信号出力可能。
機能的には、他の8 bitマイクロプロセッサ用DMAコントローラを凌駕しています。

Z80ファミリLSIとしては珍しく、Z80以外のマイクロプロセッサと組み合わせて使用できるように考慮されています。バスの読み書きのタイミングがプログラマブルですし、Z80系特有の割り込みのリセット方法もRETI命令を読み込む以外にレジスタ書き込みで割り込み要求をリセットできるようになっています。そのため、8080A/8085や8086などと組み合わせることも可能です。もっとも、16 bitマイクロプロセッサの16 bitを越えるアドレス空間を扱うには不便ですが。
ただしDMA回路を1チャネル分しか搭載していない割に高価なため、応用しにくいチップでした。たとえばIntel系の8237は4チャネルを内蔵していたため、フロッピーディスクやハードディスク、通信などのI/O転送を1個だけですべて引き受けることができました。DMA制御回路は、I/OからのDMA転送要求信号を受け取って動作するため、回路上、特定のI/Oに固定的に結び付けられてしまいます。そのため、DMA転送が必要なI/Oが複数存在すると、Z80 DMAも複数用意しなくてはなりません。外部回路でDMA転送要求信号などを切り替えて、複数のI/OについてZ80 DMAひとつだけでDMA転送を行うことも不可能ではありませんが、複数のデバイスドライバの間で資源管理をきっちり行わなくてはなりませんし、せっかくDMA転送を行ってCPUとI/Oの並列実行を行っているのに、DMA I/O間の並列処理を利用できなくなります。しかもDMAを利用するI/Oに比較的低速のシリアル通信のようなものが含まれると、それを使用している間はディスクI/Oを使えないなどということが起こり得ます。DMA転送を利用するのはI/O動作のパフォーマンスをそれなりに改善したいからで、そのようなシステムではDMA転送が必要なのが1チャネルだけということは考えにくく、複数欲しくなります。結果的に、コスト的にもスペース的にも大きな負担になってしまいます。
また、他のZ80周辺LSIと合わせて周辺LSIが5個以上になると割り込みデイジーチェーンにルックアヘッド回路が必要になるのですが、Z80 DMAを利用するような規模の大きなシステムではそのようなことになりがちで、部品数がさらに増えてしまいます。
さらに、DMAを用いるようなシステムは大規模なものになりがちですが、一般的にZ80の周辺LSIはRETI命令を常時監視する都合上、周辺LSIにCPUがデータを書き込むときだけでなくCPUが命令をフェッチする時にも周辺LSIがデータバスから情報を受け取れなくてはなりません。そのため、システムが大規模でバスにバスバッファを付ける必要が生じたとき、データバスバッファの方向や有効制御が非常に複雑になります。DMAを使用しなければ、割り込みのことを考えて少々複雑という程度ですが、DMAを用いて、特に1回のアクセスでメモリからI/Oへデータを転送する方式を利用しようとするとデータバスバッファの方向制御が複雑になります。また、Z80 CPUとZ80 DMAが同じボードに搭載されてバスバッファを共用していれば、そのバッファの制御は容易ですが、CPU基板にはコストの都合などでZ80 DMAを標準搭載せずに、I/O基板にI/Oポートと一緒にZ80 DMAを設置するような場合、I/O基板のバスバッファの制御がたいへんなことになります。おまけにI/O側にZ80 DMAを増設するような方式だと、Z80 DMAを用いたI/O基板を複数使用する際、BUSRQ*信号のバッファリングを行えないため、問題になることもあるでしょう。Z80 DMAのBUSRQ*信号は単なる出力信号ではなく入出力信号で、Z80 CPUにバス要求を出力すると共に他のZ80 DMAの要求状態を監視するための入力信号でもあるためです。結局、Z80 DMAを使用する場合はできるだけ小規模にしてバスバッファなしで動作させた方がスマートになったり、Z80 CPUのすぐそばにZ80 DMAを実装するためのソケットを2個くらいは用意しておいて必要に応じてZ80 DMAを挿入して使用するような形にしないと回路的な負担が大きくなってしまいます。でも、結局は大規模になりがちなシステム要求とかコスト面での要求からは逆行してしまいます。
このようなことを考えると、HD64180でCPU機能とDMA機能2チャネル分を同一のチップ上に集積したのは、応用上とても有利になったように思います。DMA転送は、使えば便利なことは確かなのですから。

Return to IC Collection