こんにちは、
前回は「FDDエミュレーターについて(その1)」としてFDDエミュレータ REX-FDCF の開発に至るまでの経緯についてお話しましたが、今回は、その続編として「FDDエミュレーターのデータの読み書きについて」お話します。
リード・ライト動作のタイミングや、各種FDD信号出力タイミングなどは、各メーカー様のFDD製品のマニュアル等を参考に開発しました。
■読み出し動作
FDコントローラがFDインターフェイス上のモータオンとドライブセレクトをアサートすると(①②)、FDDエミュレーターはFDインターフェイス上のインデックスパルスとトラック00を出力し(③④)、リードデータをFDコントローラーへ送り始めます。
FDコントローラーはインデックスパルスとトラック00を検出してから任意のセクターに移動して、必要な情報を読み取ります。(⑤⑥⑦⑧)
■書き込み動作
書き込み動作も、任意のセクターに移動するまでは、読み出し動作と同じです。(①②③④⑤)
その後、FDコントローラは、まずライトゲートをアサートします。(⑥)
この後、データを書き出すために、ライトデータパルスを出力します。(⑦)
FDDエミュレーター内部では、ライトゲートの検出をきっかけにライトデータパルスのMFMデコードを開始し、8ビットのデジタルデータに変換します。(⑧)
そして、変換されたバイナリデータをCFカードに保存します。(⑨)
■トラックデータの展開
書き込み動作が終了すると、即座に書き込みを行ったトラックのデータ読み出し、つまりFDコントローラーに対してのリードデータの送信(⑩)が必要になります。この間CFにアクセスしていては間に合いませんので、FDDエミュレーター内部ではRAM上にフロッピーディスクの1トラック分のデータを展開し、動的にデータの書き換えを行うことでリードとライトの切り替えをスムーズに行えるような作りにしています。
[トラックイメージ]
■書き込み位置の補正
MFMデコードが完了し変換データを受け取った時点では、どうしても本来のライトデータを受け取った位置からはズレが生じていますので、このまま受信したデータを保存してしまうと正しいセクター位置にデータが保存されません。
このズレを修正するためにFDDエミュレーター内部では、IDフィールドやDATAフィールドの管理を行い、受信したデータを正しいセクター位置のDATAフィールドへ書き込むという処理を入れています。
この動的な書き換えのタイミングが難しく、システムによっては、書き込みを行うデータ位置が1バイトズレたり、セクター位置が1つズレたり、トラック位置が1つズレたりと、ズレを補正する処理の作成に苦労しました。
今回は、FDDエミュレーター REX-FDCF のデータの読み書きについて説明しました。
次回は、フォーマットについて説明します。
「FDDエミュレーターについて(その3)」へ続く。
関連記事
FDDエミュレーターについて(その1)
FDDエミュレーターについて(その3)
FDDエミュレーターについて(その4)
FDDエミュレーターについて(その5)