MSX用の仮想FDDを作る

 先日、久しぶりにMSXを起動してみると、あれ、MSXのロゴが出た直後で画面がフリーズ。FDDユニットをはずすと正常に起動するので、どうやらFDDユニットが故障してしまったようです。以前の記事で作成した仮想FDDの確認をしたかったのに…。うむむむ、それならカートリッジ部分も含めて作ってやろうじゃないの(久しぶりにやる気が出ている)。てなわけで、MSX用の仮想FDDを作っていきます。


ソニーHB-F1II+HBD-F1

FDDユニットを調査

 まずFDDユニットの構造がどうなっているのかHBD-F1の内部を開けて調査していきたいと思います。

 カートリッジのカバーを開けると基板が1枚。印刷面には大きなICが2個、画面右にもICが2個見えます。一方IC1と印刷された部分、ここは裏側のハンダ面にCXD1032なるICがついていました。ここで、それぞれのICについて情報をネットで調べてみます。


HBD-F1 カートリッジ内の基板

HBD-F1内にあるCXD1032
●WD2793A
 これはハードディスクメーカとしておなじみのウェスタンデジタル社のFloppy Disk Controller、略してFDCですね。データシートによると富士通のMB8877などWD1691の発展型でコマンド体系もほぼ同じです。このICはデータセパレータと書き込み補償機能も内蔵していてディスクドライブと直結できるようです。
●MB83128
 これはごく一般的な16KBのマスクROMです。
●74LS06,74LS38
 出力がオープンコレクタなロジックICです。入力側がFDC、出力側がディスクドライブにつながっていると推測できます。
●CXD1032
 問題はこのICです。カスタムICのようで詳細なデータシートが見つかりませんでしたが、ピンアサインの情報がありました。これを見るとこのICには、アドレスデコードの機能、モータ制御&ドライブセレクトのレジスタの機能、1MHzのクロック生成機能を兼ね備えていることが分かりました。

 今度はエッジ端子部分を見てみます。端子があるのはバスと/SLTSLや/RD、/WRでした。/IORQや/INTには端子がないのでI/OポートやZ-80の割り込みは使用していなさそうです。

 一方、ドライブ側ですが、こちらは電源回路とドライブユニットだけで、カートリッジ側からきたケーブルがそのままドライブユニットにつながっていました。

 以上の調査結果から、だいたい以下のように推測しました。


MSX+HBD-F1 FDD ブロック図

 ハードウェアの構成はだいたいわかりましたが、CXD1032のレジスタがどのような構造なのかがわからない。そこで次は、ソフトウェアを解析してレジスタの構造を特定していきたいと思います。

DISK BIOS ROMを解析

 基板からROMをひっぺはがしてデータを取り出します。MSX2テクニカルハンドブックによれば命令やデバイスの拡張をする場合、プログラムは4000h~7FFFhに置かれるとのことなので、これを考慮して逆アセンブル。

 その結果、FDCやCXD1032のレジスタはメモリマップドI/Oになっていて7FF8h~7FFBhがFDC、7FFCh~7FFFhがCXD1032のレジスタに割り当てられていることがわかりました。Z-80の割り込みは使用していないはずなのでDMAのようなものは使わず、すべてレジスタをポーリングしてソフトウェアで処理しているようです。

 上記BIOSからの情報、さらにネットやMAMEのソースコードあたりも調査して、CXD1032のレジスタは以下のようになっていると推測しました。


CXD1032 DISK I/O レジスタ

設計

 HBD-F1の構造がだいたいわかりましたので、これを参考にFPGAの内部構成をブロック図にしてみました。


MSX用 仮想FDD FPGA内 ブロック図

 FPGA内部のクロックはPLLで逓倍して64MHzで動かします。各モジュールについて簡単に説明すると、

●FDC
 これは以前に作ったMB8876もどきモジュールを流用しますが、今回はディスクフォーマットもできるようにするため、CRCの計算機能とWRITE TRACKコマンドを新たに実装します。今回はDISK DRIVEモジュールもFPGA内にあるのでデータの受け渡しは8ビットパラレルで行います。MSXは2DDなので約32マイクロ秒ごとに受け渡しします。
●UNIT SEL
 CXD1032のレジスタ機能をここに実装します。モータOn/Off信号はOffにセットされても8秒ほどOnを持続するようにします。
●ROM
 DISK BIOSの容量が16KBなので、FPGA内部のフラッシュメモリに入れます。フラッシュメモリはリード要求してからデータが出るまで5サイクルほどかかりますが、64MHzで動かしていれば問題ないでしょう。また、MAX10-FB基板にあるLEDを緑色に点灯させてアクセスしていることを確認できるようにします。
●DISK DRIVE
 これも以前に作ったモジュールを流用します。ディスクイメージをSDRAMに置きSDRAM R/Wモジュールを介してFDCに送ります。MSXは2DDなので、ドライブの回転速度は300rpm、記録方式はMFM、トラック数は80で固定します。ドライブは1ドライブ構成にします。
●NIOS II マイコンシステム
 PCとSDRAMにあるディスクイメージの送受信を行うためにここはソフトウェアで実装します。以前に作ったモジュールをそのまま流用します。

 ディスクイメージは実際のFDに近づけるため、IBMフォーマットに沿った(GAP,SYNC,ID MARK,DATA MARKなどが入っている)ものにします。32マイクロ秒の間隔でデータを読み出し、0.2秒で最初のデータ位置に戻るようにします。

 周辺回路も設計します。MSX側は+5V、一方FPGAは+3.3Vで動作するので、MSX側のスロットとFPGAは直接つながずロジックICを挟みます。ロジックICは+3.3V動作ながら+5Vも扱える74LCXシリーズを使います。ロジックICの電源はMAX10-FB基板からとりMSX側の+5Vは使いません。

 そのほか、状態表示用LCD、ヘッドを移動させたときに音を出すための圧電スピーカ、ディスクアクセス用LED、リードやライト処理を強制終了させるためのボタンを接続します。


MSX用 仮想FDD 回路図 (クリックで拡大)

 詳細を知りたい方は過去の記事(レベル3/S1用の仮想FDDを作る Part2FPGAでFDDコントローラを作る)を参照ください。

実装

 新たに実装するCRCについて簡単に説明すると、FDで採用しているのはCRC-CCITTと呼ばれている16ビットCRCで、多項式がX16+X12+X5+1なやつです。初期値は0xffffで、計算対象はID MARK、DATA MARKから(0xa1から)になります。詳しくはネットで検索してください。

 そのほかのモジュールはほぼ流用です。とはいえ、シミュレーションはきちんとして、想定通り動いていることを確かめます。シミュレーションで想定通り動いていないと実機ではさらに予想外の動きになり不具合の特定が困難になりますので。

 回路は毎度恒例のブレッドボード上に実装し、コネクタをMSXのスロットに接続して準備完了。


ブレッドボード上に実装

MSXのスロットにエッジコネクタを接続する

実機でテスト

 いざ電源ON。…うーん、MSXのロゴが出た後にFPGAにアクセスしている様子がうかがえるもののダンマリしてしまいました。シミュレーションで想定通りでも実機では動かないんだなぁ、これが…。FPGAにロジックアナライザを組み込んで各信号を観測して問題点を探します。

 結果、あーMSXからの信号にノイズが乗っているようですね。ノイズ対策するのを忘れていました。これを修正して、再度電源ON。お、今度は無事に起動して、HitBitノートが立ち上がりました。ちなみに、HitBitノートというのはHB-F1 IIに初めから入っているソフトでして、ゲームソフトをカートリッジに挿していてもこのソフトが先に立ち上がることもある厄介者(ォィ。


HitBitノートが立ち上がった

HitBitノート 左はFDなし、右はFDアイコンが追加されている

 ここでBASICを選択。アクセスランプLEDが点灯して無事DISK BASICが起動しました。MAX10-FB基板上のLEDをよく見るとうっすら点灯しています。どうやらアイドリング中でもBIOSにアクセスしているようです。


BIOSアクセス中は緑色LED(画面上)が点灯。ディスクアクセス中は黄色LED(画面下)が点灯。

 ではBASICのコマンドを実行してみます。LOADコマンドを実行すると……!?正常に処理する時と、Disk I/O ErrorやDisk Offlineになったりする時があります。うーむ、一難去ってまた一難…。


DISK BASICからコマンドを実行

 結果、DISK DRIVEモジュールのカウンタが正しくカウントアップされない場合があるのと、MSX側のリセット信号にもノイズが乗っていてFPGA内部がリセットされることがある、という問題が見つかりました。これらを修正して何回か起動を繰り返しテストを行い、安定して動作することが確認できました。

 最後に、MSX-DOSが正常に起動することも確認できました。これでSEEK処理やREAD SECTOR処理については問題なく動作するようになりました。


MSX-DOSも無事に起動した

フォーマットできるか

 次は、フォーマットができるかテストします。フォーマットはWRITE TRACK処理とWRITE SECTOR処理が正しく動くことが必要です。それでは早速テストしてみます。

 結果、フォーマットが途中で止まってしまいました。問題点を探っていると、なんとレジスタのモータOn/Offが逆になっていました。いままでのリード処理ではモータOn/Offを頻繁に繰り返すので問題が表面化しなかったんですね。これを修正すると、お、無事にフォーマットが完了しました。


フォーマットが問題なく実行できた

まとめ

 勢いで作り始めましたが何とか完成しました。Z-80はハードもソフトも久しぶりでしたし…。今回作ったROM BIOSのモジュールはROMカートリッジとしても使えそうです。ただし、フラッシュメモリの容量には限界があるので大容量のカートリッジを作成する場合は別途記憶先を考えなければいけませんが。

 それにしても、FPGAの設計もかなりこなれてきたかな、と思っていましたがまだまだです。実機テストでは不具合の特定に数日かかってますので…。外部からの信号にはノイズ対策が必須であること、セットアップとホールド時間はしっかり把握しておかないとトラブルのもとになりますね。以後気をつけたいと思います。(おわり)

参考文献

  1. MSX2テクニカルハンドブック - アスキー出版局
  2. WD279X-02 Floppy Disk Formatter/Controller Datasheet - Western Digital
  3. 図解 マイクロコンピュータZ-80の使い方 - オーム社
  4. CXD1032 - まとめるところ@ウィキ (https://www34.atwiki.jp/matomerutokoro/pages/57.html)
  5. Resources - MSX Assembly Page (http://map.grauw.nl/resources/#diskcontrollers)
  6. OTN-2:CRC code for MFM FD (http://www7b.biglobe.ne.jp/~izushi/OTN/tn2/index.html)
  7. MAMEのソースコード

◆関連ページ◆

FPGAでMSX-MUSICもどきを作る

 

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

 

TOP PAGE