2014年10月22日水曜日

SDカードを使ったFDDエミュレーターを試作

フロッピーディスクドライブの信号を見てみて、フロッピーディスクドライブの互換品を自分で作れそうな気がしたので、MMC / SDカードを使ったフロッピーディスクドライブのエミュレーターを作ってみました。

回路図 H8S FDD EMULATOR20141022.pdf
ソースコード 2144_FD_EMULATOR20141020.zip

マイコンは H8S/2144 で、開発環境はルネサスのHEW無償版です。回路図、ソースコードはどのような用途にでも自由にお使いください。

作成途中ですが、MFMエンコードや CRCの計算は正しく動いていて、X1 turbo の OS LSX-Dodgers 上で 2D と 2HD 形式のファイルの読み取りが正常に動作しました。シークが遅いせいか IPLからの起動はまだできません。書き込みもできません。
フロッピーディスクのCRC計算や、MFMエンコードの資料はなかなか見つからないので、そのサンプル程度には役に立つんじゃないでしょうか。

今のところ、古いパソコンのエミュレータでよく使われている、D88形式のイメージファイルを使っていて、STEP信号が来るたびに D88ファイルからトラックのデータを読んで、CRCを計算して、MFMでエンコードしてバッファに書き込むという動作をしているのでシークに時間がかかっています。
クロックビットの分イメージファイルのサイズが 2倍になってしまいますが、CRCの計算とMFMのエンコードをあらかじめ済ませておいた、独自形式のイメージファイルを使って速くしたらいいんじゃないかなと考え中です。

はじめ、READ DATA 信号の生成は、タイマーで 1ビット期間 (クロックビットを入れると 2HD では 1Mbps) づつ割り込みをかけて、IOポートをソフトウェアで操作して行ってみたのですが、H8Sではまったく間に合わなかったので、SCI のクロック同期モードを使うようにしました。
クロックビットを含めると 1トラック分のバッファに 25Kバイトも必要になるので、外付けRAMのあるジャンクのマイコン基板を使ったのですが、秋月で 1個 360円の PIC32MX が SRAM を 32Kバイト内蔵しているので、これを使えば外付け部品無しで作れるかも。
まともに動くものが作れそうなら、PIC32MX で実用品を何個か作って、古いシンセや古いパソコンで使いたいと思っています。



READ DATA 信号は、FDDエミュレーターを作り始めてすぐに、オシロで見て正常っぽい波形が出るようになったのですが、FDDエミュレーターをPCにつないで動かしてみてもさっぱり読み込んでくれませんでした。
そのため FDC を直接操作して、FDC がどんなデータを読んでいるのか、トラックフォーマットは合っているのか、CRC の計算は正しいのか、そもそも上位ビットから先に送信しているけれどこれで合っているのか、データビットの前にクロックビットを送信しているけれどこれで合っているのかというようなことを調べなければならなくなったのですが、PC-9801 や X68000 や IBM-PC で使われていた uPD765 系の FDC では CRC の値を読み取ることができない(エラーの有無しかわからない)ので、リードアドレス命令で CRC の値を読むことができる MB8877 / FD1791 系の FDC を使っている X1 でテストプログラムを作らなければならなくなりました。
でも Z80 のアセンブラでテストプログラムを書くのは嫌だなあと、自由に使える Z80 用の Cコンパイラは無いものかと探したら BDS C があったので、FDDエミュレーターは放っぽり出して 1ヶ月以上も BDS C を使ってみたり MB8877 の使い方を調べるために、古本の「試験に出るX1」を定価の2倍くらいで買ってみたりして、なんとかテストプログラムを作って、FDDエミュレーターの動作テストが出来るようになりました。