FD1791

第2世代のFDCの代表がFD1791シリーズとuPD765です。多種類のディスクサイズやフォーマットに対応でき、マイクロプロセッサとのインターフェースも便利になっています。

FD1791
上はWestern Digital社オリジナルのFD1791-02で1982年製。下のMB8877AはFD1793-02の富士通相当品。なおFD1791はデータバスが負論理でありFD1793はバスが正論理である以外は共通。

FD179xには5つのレジスタがあり、アドレス入力端子と読み書きの条件によって、次のようにアクセスできるレジスタが決まります。
A1
A0
読み出し
書き込み
0
0
ステータスレジスタ
コマンドレジスタ
0
1
トラックレジスタ
トラックレジスタ
1
0
セクタレジスタ
セクタレジスタ
1
1
データレジスタ
データレジスタ
ステータスレジスタはコマンド実行の状態を示すフラグ類が集められていて、各種エラー状態を検出したり、新たなデータを要求するフラグを調べたりすることができます。しかし、各ビットが常に特定のフラグを表すのではなく、コマンドによってビットの意味が変わりますので注意が必要です。ステータスレジスタは読み出し専用です。
コマンドレジスタはFD179xに実行させたい命令を与えるのに使用します。コマンドレジスタは書き込み専用で、Force Interruptコマンド以外のコマンドはBusyステータスビットが立っているときに書き込むことができません。
コマンドの中には特定のセクタを読み出せというようなコマンド(例: Read Sector)も存在しますから、そのセクタを指定するためにトラックレジスタとセクタレジスタを使用します。また、たとえばヘッドが読み出しているトラックは何番目のトラックか調べるコマンドではトラックレジスタに読み出した値が書き込まれます。このようにトラックレジスタやセクタレジスタは書き込みにも読み出しにも使用されます。
最後に残ったレジスタがデータレジスタで、実際にデータとして読み書きされるデータを受け渡すレジスタです。DMA転送時にはデータレジスタの読み書きでDMA要求がリセットされます。

FD1791とFD1793のコマンド表。7 - 0はビット番号で7がMSB。Type Iコマンドというのはヘッド位置を操作するためのコマンドでType IIコマンドがセクタ単位の読み書きです。Type IIIコマンドはトラック単位の操作で、Type IVコマンドは強制割り込みですけど他のコマンドの実行を中断させるためによく使われます。
Type Command 7 6 5 4 3 2 1 0
I Restore 0 0 0 0 h V r1 r0
I Seek 0 0 0 1 h V r1 r0
I Step 0 0 1 T h V r1 r0
I Step-in 0 1 0 T h V r1 r0
I Step-out 0 1 1 T h V r1 r0
II Read Sector 1 0 0 m S E C 0
II Write Sector 1 0 1 m S E C a0
III Read Address 1 1 0 0 0 E 0 0
III Read Track 1 1 1 0 0 E 0 0
III Write Track 1 1 1 1 0 E 0 0
IV Force Interrupt 1 1 0 1 I3 I2 I1 I0

コマンド表の中で使用していたオプションフラグの意味をまとめてみました。
Type bit 記号と意味 解説
I 0, 1 r1, r0: stepping motor rate ステッピングモータの駆動速度を指定する。別表参照
I 2 V: track number verify flag V = 0: トラック番号のベリファイを行なわない
V = 1: IDのトラック番号とトラックレジスタの内容を比較する。
ディスクが6回転するまでに一致するトラック番号が見つからないと
Seek Errorになる。
I 3 h: head load flag h = 0: コマンド開始時にヘッドをアンロードする
h = 1: コマンド開始時にヘッドをロードする
I 4 T: track update flag T = 0: トラックレジスタ変化せず
T = 1: 移動方向に応じてトラックレジスタの内容も更新される
II 0 a0: data address mark a0 = 0: FB (data address mark)
a0 = 1: F8 (deleted data address mark)
II 1 C: side compare flag C = 0: サイド番号の比較を行なわない
C = 1: IDのサイド番号とSの値を比較する。
ディスクが6回転するまでに一致しないとSeek Errorとなる。
II & III 2 E: 15 ms delay E = 0: ヘッドロード後15 msのタイミング遅延を行なわない
E = 1: ヘッドロード後に15 msの遅延を置いてからヘッドロード
タイミング入力を行なう(1 MHzクロック動作の場合には30 ms)
II 3 S: side compare S = 0: サイド0(Cオプションフラグ参照)
S = 1: サイド1
II 4 m: multiple record flag m = 0: シングルセクタリード・ライト
m = 1: マルチセクタリード・ライト
IV 0 - 3 Ix: interrupt condition flags I0 = 1: Not Ready状態からReady状態への遷移で割り込み
I1 = 1: Ready状態からNot Ready状態への遷移で割り込み
I2 = 1: インデックスパルス検出で割り込み
I3 = 1: 無条件で割り込み、実行中のコマンド打ち切り
I3 - I0 = 0: 割り込み発生無し、実行中のコマンド打ち切り

上の表にある別表参照分の表について、ステッピングモータのステップレート表。
r1 r0 CLK = 2 MHz CLK = 1 MHz
0 0 3 ms 6 ms
0 1 6 ms 12 ms
1 0 10 ms 20 ms
1 1 15 ms 30 ms

Restoreコマンドはヘッドをトラック0に移動するコマンドです。このコマンドはハードウェアリセット時にも自動的に実行されます。他のType Iコマンドと共通のオプションフラグを持ちますが、hはコマンド実行開始時にヘッドロードを行なうかどうか、Vはディスクを読み出して確かにトラック0にヘッドが来ているかを確認することを指示します。r1とr0はヘッド移動用のステッピングモータを駆動するパルス間隔を指定するフラグで、フレキシブルディスクドライブによって決まっている値にプログラムしないと正しくヘッドを移動することができなかったり騒音が大きくなったりします。リセットの場合にはh = 0, V = 0, r1:r0 = 11というオプションフラグが選択されます。
具体的な動作としては、まずトラックレジスタに0FFHがロードされ、トラックレジスタをデクリメントしながらヘッドをステップアウトさせます。ドライブから最外周にヘッドが移動したことを示すTR00信号が送られてくるか、トラックレジスタが0になるか(つまり255回ステップアウトが行われたことになる)のどちらかで、コマンド実行が終了します。トラックレジスタとデータレジスタは自動的に0クリアされます。最後にVフラグが1の場合、自動的にベリファイ動作が行われます。最大255回のステップアウトが行われるため、3.5インチフロッピーディスクのように80トラックまで使用するディスクドライブに対しても1回のコマンド実行で正しくリストアが行われます。
Seekコマンドは指定したトラックにヘッドを移動させるコマンドです。まず目的のトラック番号をデータレジスタに書き込み、次にこのコマンドを実行すると、トラックレジスタの内容とデータレジスタの内容が一致するまでヘッドを移動させます。トラックレジスタの内容は自動的に更新されます。Vフラグが1の場合、自動的にベリファイ動作が行われます。
Stepコマンドは1トラック分だけヘッドを移動するコマンドですが、1トラック外側へ移動するか内側へ移動するかは、直前に移動したのと同じ方向になります。新たにTオプションを指定できますが、これはトラックレジスタを更新するかどうかという意味になり、1なら自動的に+1あるいは-1されます。
Step-inコマンドとStep-outコマンドはそれぞれヘッドを内周あるいは外周へ1トラック分だけ移動させるコマンドです。移動方向がコマンドによって決まっている他はStepコマンドと同じです。
Read Sectorコマンドはセクタを読み出すコマンドです。トラックレジスタとセクタレジスタに読み出したいセクタを表す数値をセットして(正しくヘッドをシークしてから)Read Sectorコマンドを発行すると、ヘッドの存在するトラックのIDフィールドを次々と読み出して、トラックレジスタとセクタレジスタの内容と一致するIDフィールドを持つセクタを読み出しはじめます。何バイトの読み出しが発生するかはIDフィールド内に記録されている記録長バイトによって決まります。mフラグが1になっていると、1セクタ分の読み出しが完了するとセクタレジスタの内容をインクリメントし、さらにそのセクタに対しての読み出しを続けます。マルチセクタリードの場合、セクタレジスタの内容が1トラックに含まれるセクタの最大の番号を越えるなどしてエラーが発生するか、Type IVコマンドでアボートさせるかのどちらかの要因でコマンド動作を終了します。自動的にヘッドをステップインさせたりして複数トラックに渡る読み出しなどは行ないません。
Write Sectorコマンドは書き込みを行なう点を除けば、ほぼRead Sectorコマンドと似たような動作を行ないます。
Read Addressコマンドは最初に見つかったIDフィールド6 Byteの内容を読み出すもので、ついでに読み出したトラック番号をトラックレジスタに書き込みます。ヘッドがどのトラックにあるか不明なときに使うとか、フォーマットが不明で1セクタが何バイト長になっているか知りたいときに使うことができますけど……あまり使いませんかね。
Read Trackコマンドはインデックスパルス検出後から次のインデックスパルスが入力されるまでのディスク1回転分の全データを読み出すコマンドです。ギャップとかシンクパターンを含む全データをとにかく読み出します。
Write Trackコマンドはトラックのフォーマットを行なうためのコマンドです。フォーマットのためには、単に通常のデータだけでなく、IDフィールドやギャップに相当するデータや、データとは異なるパターンを持つ特別な同期用信号パターンを書き込まなくてはなりません。そのため、Write Trackコマンドで書き込むデータのうち0F5Hから0FEHの値については特別な意味を持たせ、マーカの書き込みやCRC操作を行ないます。そのデータをコントロールバイトと呼び、意味を末尾に表としてまとめておきました。このFDCでフォーマットを行なうには、1トラック分のフォーマット情報を表すコントロールバイト列を作成しておき、それをWrite Trackコマンドで書き込むことになります。
さて、ギャップの長さや各IDフィールドの意味などは基本的に規格で決まっていますが、フォーマット情報を特別なものにすれば通常とは異なるギャップやら矛盾のあるIDやらを書き込むことができます。そして、必要とあればRead Trackコマンドでそれを検証することができます。ということで、このFD1791系列のFDCを用いた場合、uPD765系列のFDCよりフォーマットの自由度が高く、uPD765では書き込めないトラックパターンを作成することができます。ま、ある種のコンピュータではコピーしにくいであろうコピープロテクトの技法が存在したりして。それでなくても、メディアが1枚1000円くらいしたときには、自作機のフォーマットは1セクタ長を長めにしてギャップを少なくしたケチケチフォーマットを行なって、通常の2割り増しくらいのデータを詰め込むようなこともありました。
Force Interruptコマンドは特定の割り込み条件を待って割り込みを発生させたり、無条件で割り込みを発生させたりすることができるコマンドですが、別のコマンド実行を命じた後に異常にBusy状態が長いような場合に強制的にコマンドを打ち切るためにも使用します。その性格上、Busy状態とは無関係にコマンドレジスタに書き込めます。

コマンド実行にしたがってステータスレジスタの各ビットがどのような意味になるか、次の表にまとめました。
command 7 6 5 4 3 2 1 0
全Type Iコマンド Not Ready Write Protect Head Loaded Seek Error CRC Error Track 0 Index Pulse Busy
Read Address Not Ready 0 0 Record Not Found CRC Error Lost Data DRQ Busy
Read Sector Not Ready 0 Record Type Record Not Found CRC Error Lost Data DRQ Busy
Read Track Not Ready 0 0 0 0 Lost Data DRQ Busy
Write Sector Not Ready Write Protect Write Fault Record Not Found CRC Error Lost Data DRQ Busy
Write Track Not Ready Write Protect Write Fault 0 0 Lost Data DRQ Busy

Write Trackコマンドの単密度用コントロールバイト。
バイト 意味 データパターン クロックパターン
00 - F4 データとしてそのまま書き込む 00 -  F4 FF
F5 - F6 禁止
F7 計算したCRC 2Byteを書き込む CRC 2 Byte FF
F8 - FB アドレスマークとしてそのまま書き込む
CRCをプリセットする
F8 - FB C7
FC インデックスマーク(FC)を書き込む FC D7
FD データとしてそのまま書き込む FD FF
FE IDアドレスマークとしてそのまま書き込む
CRCをプリセットする
FE C7
FF データとしてそのまま書き込む FF FF

Write Trackコマンドの倍密度用コントロールバイト。
バイト 意味 データパターン ミッシングクロック
00 - F4 データとしてそのまま書き込む 00 -  F4
F5 マーカA1を書き込む
CRCをプリセットする
A1 あり
F6 マーカC2を書き込む C2 あり
F7 計算したCRC 2Byteを書き込む CRC 2 Byte
F8 - FB アドレスマークとしてそのまま書き込む
CRCをプリセットする
F8 - FB
FC インデックスマーク(FC)を書き込む FC
FD データとしてそのまま書き込む FD
FE IDアドレスマークとしてそのまま書き込む
CRCをプリセットする
FE
FF データとしてそのまま書き込む FF

Return to IC Collection