上はWestern Digital社オリジナルのFD1791-02で1982年製。下のMB8877AはFD1793-02の富士通相当品。なおFD1791はデータバスが負論理でありFD1793はバスが正論理である以外は共通。
FD179xには5つのレジスタがあり、アドレス入力端子と読み書きの条件によって、次のようにアクセスできるレジスタが決まります。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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