MB-6892
MB-S1

レベル3/S1用の仮想FDDを作る

 1980年代前半、8ビットパソコンの記憶装置と言えばカセットテープかフロッピーディスクでした。 ただフロッピーディスクは非常に高価でドライブ+インターフェースカード+DISK BASICなどのOS、これら一式の値段が本体の2倍近くになることもありました。 それでも、広く普及したこともあって後年は価格もかなり下がりました。 今回は、そんなフロッピーディスクドライブ(FDD)機能をFPGAに実装して仮想FDDとしてアクセスできるようにしたいと思います。


S1基本システム FDDが本体より高い。でもプリンタの方がってマウスたかっ!

フロッピーディスケット 5インチ2Dと3インチ

 まずは、フロッピーディスクまわりがどうなっているかをおさらいします。 以下にレベル3用5インチ両面倍密度(2D)フロッピーディスクのブロック図を示しました。
 データの読み書き、ドライブヘッドの移動はフロッピーディスクコントローラ(FDC)に指示を出して行い、ドライブのモータON/OFFやドライブの選択はUNIT SELに書き込んで制御します。 ちなみに5インチ版のFDCは富士通のMB8866やMB8876を、3インチ版はモトローラのMC6843を採用していました。


L3 2D FDのブロック図

 これをもとにFPGAに実装する機能を考えていきます。今回は、FDCとディスクドライブ(FDD)の機能をすべてFPGA側に実装するので、

上記FDDの機能以外に、ディスクイメージの状態表示用にI2Cで動かせるLCDと、FPGAに指示をするためのボタンを接続します。以上の機能をブロック図にすると以下のようになります。


FPGAのブロック図

 さらに、各モジュールについて細かい機能を設計していきます。

と挙げ出したらきりがないのでこれぐらいにして、あとはFPGA周りの回路も設計します。今回は、ボタンやらLCDやらで使用するIOピンも多くなっています。ROMKIL信号を作るためにNANDゲートである74HC00が増えてロジックICが5つになりました。NMIとROMKIL信号はあいかわらずトランジスタで実装していますがスイッチングが速くなるようにコンデンサを入れています。


回路図(クリックで拡大)

 一通り設計が完了したら実装していきます。FDCは5インチ用と3インチ用のものをVerilog HDLで実装していきます。 一方、PCとの送受信する部分はソフトウェアなのでC言語で記述します。 さらに、PC側のソフトウェアをVC++で作っていきます。今回は、作らなければならないものが多いし、FDCや各モジュールの状態遷移がややこしい!

 それぞれの機能ごとに実装が終わったら単体テストを行っていきます。FDCなどのハードウェア部分はシミュレーションで想定通り動いているかをテストします。また、ディスクイメージの送受信はFPGAだけで実際に動かせるようにしデバッグ&テストを行いました。


FPGA単体でテスト

 デバッグ&テストでいろいろ試行錯誤した結果なんとか動く形になったのでいよいよ実機と接続します。 今回は、ロジックICが5つもあるのでブレッドボード1枚では足らず小さいブレッドボードを追加しました。配線が終わったらマーク5の拡張端子に接続します。 まずはFPGA側を通電し、5インチ2DのディスクイメージをFPGAに送り込みます。これは単体テストをしたこともあって問題なく動きました。


ブレッドボード上に配線

マーク5に接続

状態表示用LCDでファイルが送られたことを確認

 ではマーク5の電源を入れてみます。はたしてDISK BASICは起動するでしょうか…やっぱりNG。 ROM BASICさえ起動しない状態に。 今回もFPGA内のロジックアナライザで信号を観測します。その結果いろいろ不具合箇所が見えてきました。

と、他にもいろいろと不具合が見つかり、これらを修正した結果、やーっとDISK BASICが起動しました!


5インチ2D版のDISK BASICを起動

NEWONコマンドでの再起動、プログラムのLOADやSAVEも問題ないようです。 いや、SAVEはちょっと遅いのでもしかしたら問題あるのかも。 確認のためPCにディスクイメージを送って中身を見てみるとSAVEは正しく行われているようなので問題なしかな?


プログラムをLOAD

5インチ2D版が成功したので、次は3インチ版のDISK BASICも試してみます。 前述の不具合を修正した後に3インチ版のディスクイメージを送り電源ON。おっ!こちらは、すんなりと起動した模様です。


3インチ版のDISK BASICを起動

 次は、S1に接続して動作確認してみます。まずは、Aモードで5インチ2D版のS1 DISK BASICの起動させます。 実機はS1/40で2HDのFDがついているため、IOアドレスがFPGA側と重複しないようにします。 ABモード切替スイッチにつながっている白いコネクタをはずし、このコネクタのピンをショートさせて、2HD FDのIOアドレスを切り替えます。


S1に接続

まずは、Aモードで5インチ2D版のS1 DISK BASICをFPGAに送り、S1の電源を入れます。おおっ!こちらも、あっさりと起動してしまいました。


5インチ2D版のS1 DISK BASICを起動

 次はBモードでLEVEL-3 DISK BASICを試してみます。マーク5と同様に5インチ版と3インチ版で動作確認を行います。結果は、あれ起動しない。 どうやら、BモードではCPUがアドレスを変更してからアドレスバスに出力されるまでにタイムラグがあるため、ラッチするタイミングを遅くしなければいけないようです。 これを変更したところ、無事起動するようになりました。


BモードでDISK BASICを起動

まとめ

 今回は全体のシステムの規模がいままでのより大きくなり、準備段階からここまで到達するのに約3カ月かかりました。 いまだ実機の信号遷移を理解していないということで、この状態でシミュレーションやらでテストOKとなっても実機では動かないわけでして。 これは今回かなり理解が進んだので、今後は実機での検証もスムーズにいくのではないかと(期待を込めて)思います。(おわり)

次→ レベル3/S1用の仮想FDDを作る Part2

 

TOP PAGE