PAGETweetレベル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のデータシートに載っています。これと実際に観測した結果が一致するかどうかを検証します。ブロック図とりあえずブロック図を起こしたのでこれをもとにいくつか説明します。IN信号を使用します。ACK信号として出力されているのでこれをバス制御に使用します。OUT信号はアドレスにかかわらず常にONになります。拡張RAMやROM領域にある裏RAMにバンク切り替えをするとOFFになります。I/FにあるEPROMが無効になるのでこれの制御に使っているようです。OUT信号は観測用に接続しているだけで使用しません。I/Oを介して制御します。ACK信号がONになればONにします。●BUSDIRアドレスバスやR/W信号につながっている双方向バッファの向きを制御します。ACK信号がONになれば、向きをFPGA→レベル3に設定します。IIマイコンからレベル3のメモリ空間にアクセスする際の制御、また、レベル3からFPGAを介してSDRAMにアクセスするためのI/Oポートを提供します。IIマイコンからレベル3にアクセスする際、FPGA内部のクロックは64MHz、一方レベル3内部のメモリは1MHz動作なのでマイコン側のwaitrequest信号を使いアクセスするタイミングを調整します。SDRAMにアクセスするためのI/Oポートは、アドレスを設定して読み込み操作を行うとSDRAMからデータを取得できるようにします。漢字ROMのI/Oポートに近い動作になります。データバスにつながっている双方向バッファの向きは、FPGAからレベル3への書き込み時はFPGA→レベル3へ、読み込み時はレベル3→FPGAになるように制御します。ブロック図をもとに周辺回路も設計します。(クリックで拡大)レベル3とFPGAの間は毎度恒例のバッファを介して接続します。今回はバスやR/W信号を双方向バッファ74LCX245で接続します。DMAやHALTなどレベル3に渡す信号はオープンコレクタ74LS06を、FPGAに入力する信号は74LCX244で接続します。HALTの各信号はONになっていることが分かるようにLEDを接続します。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に直接書き込んでみることにします。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信号を処理するように実装されています。ブロック図DMA信号をONにするとカスタムICであるYGM-001が、CPUに供給しているクロックMPUE信号とMPUQ信号を止めることで実質CPUが停止。ACK信号を送るようです。この辺のタイミングチャートが資料にないので実機テストで確認します。OUT信号はCPU由来のAVMA信号から生成しています。CTRL信号は本体内部のアドレスデコーダの有効無効も制御しているので本体内部にアクセスする場合はONにします。HALT信号はレベル3と同じようにCPUが受け取ります。MB-S1実機でテストそれではMB-S1の拡張I/Fに接続してテストといきましょう。電源ONしてFPGAからDMA信号をONにします。LEDが点灯したのでキー入力するも反応がありません。レベル3とは異なりCPUは停止したままになるようです。Bモード)ここでDMA信号をOFFにするとMB-S1が勝手に再起動してしまいました。DMA信号のON/OFFを何回か試しましたがいずれも再起動かフリーズします。68B09EのデータシートによるとクロックE,Q各信号の"H"や"L"の持続時間は最大9.5usとなっています。DMA信号を長時間ONにしてMPUE信号を止めてしまうとCPUが不安定になって再起動しまうのかもしれません。いうことで、DMA信号はONにした後、7サイクル毎に1サイクルだけOFFにする機能を実装しました。Bモード)一方HALT信号ですが、これはレベル3と同じ動作ですね。Bモード)では、画像データを表示させてみます。VRAMに直接書き込み(DMA時)VRAMに直接書き込み(HALT時)上のDMA信号では色が反映されていません。レベル3と同じくCPUがカラーレジスタを更新するためだと思いますがよくわかりません。HALT信号のほうはうまく表示されました。レベル3とMB-S1で動かした様子を動画にまとめましたので興味のある方はどうぞ。(YouTube)まとめ今回は、大げさなタイトルとは裏腹に思惑通りに動いてくれましたので苦労する箇所はほぼありませんでした。FPGAを使っているのでタイミング調整しやすいことが大きいかと思います。DMA信号の扱いがレベル3とMB-S1ではかなり異なっていますが、これを使用するボードの互換性はどうだったんでしょうか。6800ファミリーのDMACであるMC6844のデータシートにはCPUとDMACを数サイクル毎に交互に動かすような回路が載っていましたのでDMA信号はON/OFFを繰り返すのが前提なのでしょうか。わけで次回は、MB-S1のS1モード(Aモード)で1Mバイトのアドレス空間にアクセスできるか検証してみたいと思います。2019-07-16。