前回は8085のREADY信号を操作して「ワン・ウエイト」挿入してみました。今回はHOLD信号を操作してバスを乗っ取ります。後で「ソフトウエア制御のDMAコントローラ」をバスに接続してこの後接続予定のSRAMに勝手アクセスする準備であります。モダンなマイコンにもDMAあり、でも自分でリクエスト信号つくったりしないな。
DMA(Direct Memory Access)
今も昔もDMAという技法あり。この老人が業界に入ったころには既にDMAコントローラがブイブイ言わせておりましたぞ。CPUのお手を煩わせることなく、IOからメモリへあるいはメモリからIO、はたまたメモリ間でデータを転送してくれるもの。IOが遅くてタラタラ転送するのがCPUには無駄だからか、IOの速度にCPUのソフトが追従できなかったからかは時代によって変わると。
勿論、モダンなマイクロコントローラ(MCU、「マーベルの」ではありませんぞ)の多くにもDMAコントローラ搭載されております。ただ、オンチップに何もかも集積されているので、自前のハードウエアでDMAのリクエスト信号を発生してバスの使用権をかすめ取って転送する、などということはまず行わないのではないかと思います。ソフトでDMACのレジスタをこちょこちょするだけでDMAの設定完了っと。
今回は、このところターゲットにしている古代の8ビットCPU、インテル8085のバスを乗っ取る練習をしてみます。HOLDかけるだけだけれども。
接続予定のSRAMに外部から命令コードを書き込むための準備ですが、考えてみるとこの方法、太古のコンピュータ開闢のころより伝わる「コンソールからのブートローダー手動書き込み」に一脈通じるものかと。「制御卓(コンソールとフリガナを振りたいです)」上でランプの点灯を見つめながらアドレス、データをパチパチやってエイっとやるやつ。この年寄もそこまで古くないっすけど。
HOLD、BUSRQ
インテルは8085に限らず、バスの使用権をリクエストするための入力端子(CPUからみて)はHOLDと呼んでます。Zilog Z80ではBUSRQです。おんなじ意味なんだけれども。よってバスの使用を許可する、CPUはバスから手を引いたよ、という意味の信号は8085ではHLDA(ホールド・アクノリッジ)、Z80ではBUSAK(バス・アクノリッジ)です。今回、エクササイズするのは8085機なので、以下の赤丸のところの端子です。
過去回では、HOLDが「悪さ」をしないようにロウ固定入力にしておきました。今回は外部から「テキトーなタイミング」で信号を入れていきます。8085のHOLD入力は特にタイミングをとる必要もなく適当にアサートすれば、CPUが受付可能(バスサイクルが途中でちょん切れたりしないように良きに計らってくれる)になったらHLDA信号がアクティブになります。HLDAがアクティブになった次のステートからCPUバス(アドレス、データ、バス制御信号共)は皆HiZ(ハイ・インピーダンス)になるので、外部のデバイスが勝手な信号をバス上に載せられるという塩梅です。実際に観察したバスの波形が以下に。
実際にはHOLD信号は適当なタイミングで印加しているので、ロジアナ画面上では左右にズレます。しかしHLDAのエッジでトリガかけると他の信号はピタリと止まります。上記の赤い線の間がバスがHiZになっているところです。いくらでも伸ばせるので好き勝手に使えと。ソフトウエアDMAC側からすると、HOLDかけ、HLDAを確認してからバスを好き勝手に使って仕事をし、バスを手放してからHOLDをインアクティブにすれば多分OK。
※上記で末尾の信号HOLDAと書いてしまいましたが、HLDAが正しい綴りです。