MSX用の仮想FDDを作る
先日、久しぶりにMSXを起動してみると、あれ、MSXのロゴが出た直後で画面がフリーズ。FDDユニットをはずすと正常に起動するので、どうやらFDDユニットが故障してしまったようです。以前の記事で作成した仮想FDDの確認をしたかったのに…。うむむむ、それならカートリッジ部分も含めて作ってやろうじゃないの(久しぶりにやる気が出ている)。てなわけで、MSX用の仮想FDDを作っていきます。
FDDユニットを調査
まずFDDユニットの構造がどうなっているのかHBD-F1の内部を開けて調査していきたいと思います。
カートリッジのカバーを開けると基板が1枚。印刷面には大きなICが2個、画面右にもICが2個見えます。一方IC1と印刷された部分、ここは裏側のハンダ面にCXD1032なるICがついていました。ここで、それぞれのICについて情報をネットで調べてみます。
今度はエッジ端子部分を見てみます。端子があるのはバスと/SLTSLや/RD、/WRでした。/IORQや/INTには端子がないのでI/OポートやZ-80の割り込みは使用していなさそうです。
一方、ドライブ側ですが、こちらは電源回路とドライブユニットだけで、カートリッジ側からきたケーブルがそのままドライブユニットにつながっていました。
以上の調査結果から、だいたい以下のように推測しました。
ハードウェアの構成はだいたいわかりましたが、CXD1032のレジスタがどのような構造なのかがわからない。そこで次は、ソフトウェアを解析してレジスタの構造を特定していきたいと思います。
DISK BIOS ROMを解析
基板からROMをひっぺはがしてデータを取り出します。MSX2テクニカルハンドブックによれば命令やデバイスの拡張をする場合、プログラムは4000h~7FFFhに置かれるとのことなので、これを考慮して逆アセンブル。
その結果、FDCやCXD1032のレジスタはメモリマップドI/Oになっていて7FF8h~7FFBhがFDC、7FFCh~7FFFhがCXD1032のレジスタに割り当てられていることがわかりました。Z-80の割り込みは使用していないはずなのでDMAのようなものは使わず、すべてレジスタをポーリングしてソフトウェアで処理しているようです。
上記BIOSからの情報、さらにネットやMAMEのソースコードあたりも調査して、CXD1032のレジスタは以下のようになっていると推測しました。
設計
HBD-F1の構造がだいたいわかりましたので、これを参考にFPGAの内部構成をブロック図にしてみました。
FPGA内部のクロックはPLLで逓倍して64MHzで動かします。各モジュールについて簡単に説明すると、
ディスクイメージは実際の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、リードやライト処理を強制終了させるためのボタンを接続します。
詳細を知りたい方は過去の記事(レベル3/S1用の仮想FDDを作る Part2、FPGAでFDDコントローラを作る)を参照ください。
実装
新たに実装するCRCについて簡単に説明すると、FDで採用しているのはCRC-CCITTと呼ばれている16ビットCRCで、多項式がX16+X12+X5+1なやつです。初期値は0xffffで、計算対象はID MARK、DATA MARKから(0xa1から)になります。詳しくはネットで検索してください。
そのほかのモジュールはほぼ流用です。とはいえ、シミュレーションはきちんとして、想定通り動いていることを確かめます。シミュレーションで想定通り動いていないと実機ではさらに予想外の動きになり不具合の特定が困難になりますので。
回路は毎度恒例のブレッドボード上に実装し、コネクタをMSXのスロットに接続して準備完了。
実機でテスト
いざ電源ON。…うーん、MSXのロゴが出た後にFPGAにアクセスしている様子がうかがえるもののダンマリしてしまいました。シミュレーションで想定通りでも実機では動かないんだなぁ、これが…。FPGAにロジックアナライザを組み込んで各信号を観測して問題点を探します。
結果、あーMSXからの信号にノイズが乗っているようですね。ノイズ対策するのを忘れていました。これを修正して、再度電源ON。お、今度は無事に起動して、HitBitノートが立ち上がりました。ちなみに、HitBitノートというのはHB-F1 IIに初めから入っているソフトでして、ゲームソフトをカートリッジに挿していてもこのソフトが先に立ち上がることもある厄介者(ォィ。
ここでBASICを選択。アクセスランプLEDが点灯して無事DISK BASICが起動しました。MAX10-FB基板上のLEDをよく見るとうっすら点灯しています。どうやらアイドリング中でもBIOSにアクセスしているようです。
ではBASICのコマンドを実行してみます。LOADコマンドを実行すると……!?正常に処理する時と、Disk I/O ErrorやDisk Offlineになったりする時があります。うーむ、一難去ってまた一難…。
結果、DISK DRIVEモジュールのカウンタが正しくカウントアップされない場合があるのと、MSX側のリセット信号にもノイズが乗っていてFPGA内部がリセットされることがある、という問題が見つかりました。これらを修正して何回か起動を繰り返しテストを行い、安定して動作することが確認できました。
最後に、MSX-DOSが正常に起動することも確認できました。これでSEEK処理やREAD SECTOR処理については問題なく動作するようになりました。
フォーマットできるか
次は、フォーマットができるかテストします。フォーマットはWRITE TRACK処理とWRITE SECTOR処理が正しく動くことが必要です。それでは早速テストしてみます。
結果、フォーマットが途中で止まってしまいました。問題点を探っていると、なんとレジスタのモータOn/Offが逆になっていました。いままでのリード処理ではモータOn/Offを頻繁に繰り返すので問題が表面化しなかったんですね。これを修正すると、お、無事にフォーマットが完了しました。
まとめ
勢いで作り始めましたが何とか完成しました。Z-80はハードもソフトも久しぶりでしたし…。今回作ったROM BIOSのモジュールはROMカートリッジとしても使えそうです。ただし、フラッシュメモリの容量には限界があるので大容量のカートリッジを作成する場合は別途記憶先を考えなければいけませんが。
それにしても、FPGAの設計もかなりこなれてきたかな、と思っていましたがまだまだです。実機テストでは不具合の特定に数日かかってますので…。外部からの信号にはノイズ対策が必須であること、セットアップとホールド時間はしっかり把握しておかないとトラブルのもとになりますね。以後気をつけたいと思います。(おわり)
参考文献
- MSX2テクニカルハンドブック - アスキー出版局
- WD279X-02 Floppy Disk Formatter/Controller Datasheet - Western Digital
- 図解 マイクロコンピュータZ-80の使い方 - オーム社
- CXD1032 - まとめるところ@ウィキ (https://www34.atwiki.jp/matomerutokoro/pages/57.html)
- Resources - MSX Assembly Page (http://map.grauw.nl/resources/#diskcontrollers)
- OTN-2:CRC code for MFM FD (http://www7b.biglobe.ne.jp/~izushi/OTN/tn2/index.html)
- MAMEのソースコード
◆関連ページ◆