MB-6892

レベル3のバス乗っ取り大作戦


FPGAで8ビットパソコンを拡張する

TOP PAGE

レベル3のバス乗っ取り大作戦

 いきなり昭和のマイコン雑誌のようなタイトルで恐縮ですが、今回はFPGAからレベル3のアドレスバスとデータバスを操作してレベル3内のメモリの読み書きを、同時に各信号の遷移を観測して内部の動作を確認していきたいと思います。

バスを乗っ取るって何?

 この頃のパソコンは一般的にバス型トポロジで1本のアドレスバスと1本のデータバスにCPUやメモリがぶらさがっているような形態です。通常バスを占有しているのはCPUで、同時に複数の機器がバスを使用することはできません。他の機器がバスにアクセスするためには、まずCPUを一時的に止めてバスを解放してもらう必要があります。

 CPUのようなバスを占有する機器をバスマスタと言います。CPU以外によく使われるバスマスタと言えばDMAC(ダイレクトメモリアクセスコントローラ)があります。メモリコピーを高速で行いたい場合がありますが、この場合はCPUからDMACにバスの占有権を渡してDMACがメモリの読み書きを行い、終了すればまたCPUに占有権を戻すようなことを行います。

 まあ、バスを乗っ取る、と言うよりバスを共有する、といったほうが正しいかもしれません。


バス型トポロジ

CPUを一時的に止めるには

 レベル3はCPUに6809を採用しています。このCPUには自身を停止させる信号としてDMA信号とHALT信号を持っています。

 DMA信号をONにすると6809は次のサイクルで直ちに停止します。ただし停止後15サイクル(デッドサイクルを含む)毎にバスを要求してきます。2サイクルだけバスを占有した後また停止して15サイクルでまたバス要求、を繰り返します。6809としてはデッドサイクルを含めた16サイクル毎に1サイクルだけ動作する感じになります。

 HALT信号をONにすると6809は現在実行中のコマンドが終了した時点で停止します。HALT中、RESETやNMI割り込みはHALTが解除されるまで保留に、他の割り込みは無効になります。

 6809が停止状態になると6809から出ているBA信号およびBS信号がONになりますので、これを契機にしてバスへのアクセスを行えばいいことになります。

 これらのタイミングチャートがHD6809のデータシートに載っています。これと実際に観測した結果が一致するかどうかを検証します。

設計


レベル3のバス乗っ取り ブロック図

 とりあえずブロック図を起こしたのでこれをもとにいくつか説明します。

●READ/WRITE信号
 拡張I/FにはR/W OUT信号とR/W IN信号がありますが、FPGA側から制御する必要があるためレベル3内部に直接つながっているR/W IN信号を使用します。
●HALT ACK信号
 CPUから出るBA,BS信号のANDがHALT ACK信号として出力されているのでこれをバス制御に使用します。
●VMA OUT信号
 本来VMA信号はCPUが有効なアドレスを出力しているかを判断する信号なのですが、レベル3のVMA OUT信号はアドレスにかかわらず常にONになります。ただし拡張RAMやROM領域にある裏RAMにバンク切り替えをするとOFFになります。VMA OUT信号をOFFにするとFDD I/FにあるEPROMが無効になるのでこれの制御に使っているようです。
 今回、VMA OUT信号は観測用に接続しているだけで使用しません。
●DMA I/O
 DMA信号とHALT信号はNIOS IIマイコンからDMA I/Oを介して制御します。VMA CTRL信号はDMA信号またはHALT信号がONかつHALT ACK信号がONになればONにします。
●BUSDIR
 アドレスバスやR/W信号につながっている双方向バッファの向きを制御します。HALT ACK信号がONになれば、向きをFPGA→レベル3に設定します。
●L3BUS Control
 NIOS IIマイコンからレベル3のメモリ空間にアクセスする際の制御、また、レベル3からFPGAを介してSDRAMにアクセスするためのI/Oポートを提供します。
 NIOS IIマイコンからレベル3にアクセスする際、FPGA内部のクロックは64MHz、一方レベル3内部のメモリは1MHz動作なのでマイコン側のwaitrequest信号を使いアクセスするタイミングを調整します。
 SDRAMにアクセスするためのI/Oポートは、アドレスを設定して読み込み操作を行うとSDRAMからデータを取得できるようにします。漢字ROMのI/Oポートに近い動作になります。
 データバスにつながっている双方向バッファの向きは、FPGAからレベル3への書き込み時はFPGA→レベル3へ、読み込み時はレベル3→FPGAになるように制御します。

 ブロック図をもとに周辺回路も設計します。


レベル3のバス乗っ取り 回路図 (クリックで拡大)

 レベル3とFPGAの間は毎度恒例のバッファを介して接続します。今回はバスやR/W信号を双方向バッファ74LCX245で接続します。DMAやHALTなどレベル3に渡す信号はオープンコレクタ74LS06を、FPGAに入力する信号は74LCX244で接続します。 DMA, HALTの各信号はONになっていることが分かるようにLEDを接続します。 BA,BS,VMA OUTの各信号は観測用で制御には使用しません。

実装

 今回は、使用するICが多いためブレッドボード(大)を2枚つなげて実装しました。


ブレッドボード(大)に実装

 これをレベル3の拡張I/Fに接続して準備完了。


レベル3の拡張I/Fに接続

レベル3マーク5実機でテスト

 それでは電源ON。FPGAからDMA信号をONにします。オレンジ色のLEDが点灯したのでここでレベル3のキーボードを押してみると、通常より低いクリック音とともにキー入力ができます。CPUは先ほど説明したように16サイクル毎に1サイクルだけ動きます。言い換えれば通常の1/16のスピードで動作していることになります。

 以下はFPGA内のロジアナで観測した信号の挙動です。


DMA信号をONにした時の挙動(レベル3)

 次に、HALT信号をONにします。紫色のLEDが点灯したのでレベル3のキーボードを押してみましたが反応がありません。CPUが完全に停止しているようです。


HALT信号をONにした時のタイミングチャート

 いずれも、HD6809のデータシートに載っているタイミングチャートと同じ結果が出ていることが確認できました。

 信号観測だけでは実際に動いているのかいまいちわからないので、レベル3のVRAMに直接書き込んでみることにします。NIOS IIマイコンを使用してVRAMをリード・ライトして1ライン下にスクロールさせ、1ライン分の画像データをSDRAMからVRAMに転送する、を繰り返すプログラムを実行させてみました。


VRAMに直接書き込んでみた(DMA時)

VRAMに直接書き込んでみた(HALT時)

 お、スクロールが始まり画像が出てきました。スクロールスピードはレベル3のソフトウェアで動かした時と比べると明らかに速いですね。 下のHALT信号では正常でしたが、上のDMA信号では途中で色が変わったりしました。これは、おそらくCPUがカラーレジスタを更新するためだと思われます。

 以下はリード・ライト時のタイミングです。


リード・ライト時のタイミング

 アドレスバス、データバスにセットアップするタイミングはE信号の立ち下がりからQ信号の立ち上がりまでのほぼ中間ぐらい(約125ns)にしています。リード時、データはE信号の立ち下がりで取り込みます。

MB-S1でも・・・でもその前に

 さて、レベル3でうまく動いてくれたようなので、今度はMB-S1のL3モード(Bモード)でも動くかどうか検証していきたいと思います。と、その前にレベル3と違う箇所について説明します。

 MB-S1はCPUに68B09Eを採用しています。このCPU、HALT信号は持っていますがDMA信号は持っていません。なのでMB-S1はレベル3と互換を保つため独自でDMA信号を処理するように実装されています。


MB-S1(L3モード)のバス乗っ取り ブロック図

 DMA信号をONにするとカスタムICであるYGM-001が、CPUに供給しているクロックMPUE信号とMPUQ信号を止めることで実質CPUが停止。その後にHALT ACK信号を送るようです。この辺のタイミングチャートが資料にないので実機テストで確認します。

 VMA OUT信号はCPU由来のAVMA信号から生成しています。図にはありませんが、VMA CTRL信号は本体内部のアドレスデコーダの有効無効も制御しているので本体内部にアクセスする場合はONにします。

 HALT信号はレベル3と同じようにCPUが受け取ります。

MB-S1実機でテスト

 それではMB-S1の拡張I/Fに接続してテストといきましょう。


MB-S1の拡張I/Fに接続

 電源ONしてFPGAからDMA信号をONにします。LEDが点灯したのでキー入力するも反応がありません。どうやらレベル3とは異なりCPUは停止したままになるようです。


DMA信号をONにした時の挙動(MB-S1 Bモード)

 ここでDMA信号をOFFにするとMB-S1が勝手に再起動してしまいました。DMA信号のON/OFFを何回か試しましたがいずれも再起動かフリーズします。 68B09EのデータシートによるとクロックE,Q各信号の"H"や"L"の持続時間は最大9.5usとなっています。DMA信号を長時間ONにしてMPUE信号を止めてしまうとCPUが不安定になって再起動しまうのかもしれません。

 ということで、DMA信号はONにした後、7サイクル毎に1サイクルだけOFFにする機能を実装しました。


DMA信号をONにした時の挙動・改(MB-S1 Bモード)

 一方HALT信号ですが、これはレベル3と同じ動作ですね。


HALT信号をONにした時の挙動(MB-S1 Bモード)

 では、画像データを表示させてみます。


VRAMに直接書き込み(DMA時)

VRAMに直接書き込み(HALT時)

 上のDMA信号では色が反映されていません。レベル3と同じくCPUがカラーレジスタを更新するためだと思いますがよくわかりません。HALT信号のほうはうまく表示されました。

 レベル3とMB-S1で動かした様子を動画にまとめましたので興味のある方はどうぞ。

【動画】レベル3のバス乗っ取り大作戦 動作検証 (YouTube)

まとめ

 今回は、大げさなタイトルとは裏腹に思惑通りに動いてくれましたので苦労する箇所はほぼありませんでした。まあ、FPGAを使っているのでタイミング調整しやすいことが大きいかと思います。

 DMA信号の扱いがレベル3とMB-S1ではかなり異なっていますが、これを使用するボードの互換性はどうだったんでしょうか。6800ファミリーのDMACであるMC6844のデータシートにはCPUとDMACを数サイクル毎に交互に動かすような回路が載っていましたのでDMA信号はON/OFFを繰り返すのが前提なのでしょうか。うーむ謎ですねぇ。

 てなわけで次回は、MB-S1のS1モード(Aモード)で1Mバイトのアドレス空間にアクセスできるか検証してみたいと思います。(つづく?)

参考文献

  1. I/O別冊ベーシックマスター活用研究 - 工学社
  2. I/O別冊S1活用研究 - 工学社
  3. HD6809 MPU Datasheet - HITACHI
  4. HD6809E MPU Datasheet - HITACHI
  5. MC6844 DMAC Technical Data - Motorola

 

TOP PAGE