nika管理人nikaへのメッセージなどは上記Twitter等へどうぞ。GTFとCVT(3549)(AT)RTC(2368)BIOS(1675)PlayStation2/VP2(1089)RecentDeleted(818)PV3アーカイブこのページはOS-Wikiのページのコピーです。†AT互換機やPC-9801シリーズで使われている。MB8877Aとの違いは、FDCが最大4ドライブをサポートしていること。MB8877Aと比べるとFDCとしてかなりインテリジェントでもある。フォーマット・リードトラックのコマンドが弱いのが難点。4ドライブで状態遷移割り込みが使えるのはすばらしいし、セクタの読み書きの際に、CHRNを全て指定できるのもすばらしい。データ転送はDMAのTC(ターミナルカウント)に依存しており、この仕様のために、カウント値は実際の転送量-1をセットする。†AT互換機の場合:ステータスレジスタはI/Oポートの0x03f4を8bitリードすることで読み出せる。データレジスタはI/Oポートの0x03f5を8bitリード・ライトすることでアクセスできる。0x0374、0x0375でもできるようなことを書いてある資料もあるが、試したことはないので不明。その後に0x03f7に8bitアクセスで0x00をライトとする必要もあり?(OSASKでは今のところリセットも0x03f7へ0x00を書き込むこともやってはいません)。0x03f2について:bit0-1:ドライブ番号(これが何に使われるのかは不明)。bit2:FDCへのリセット信号(0でアクティブ)。bit3:FDCのDMAイネーブル(1で許可)。bit4:ドライブ0のモータON(1でON)。bit5:ドライブ1のモータON(1でON)。bit6:ドライブ2のモータON(1でON)。bit7:ドライブ3のモータON(1でON)。PC-9801の場合:ステータスレジスタはI/Oポートの0x0090を8bitリードすることで読み出せる。データレジスタはI/Oポートの0x0092を8bitリード・ライトすることでアクセスできる。I/Oポート0x0094の8bitライトは次の意味を持つ:bit0-3:リザーブ(0にするのが望ましい)。bit4:プリンタポートのPSTB信号イネーブルビット。わからなければ、とりあえず1にしておけば問題はない。bit5:リザーブ(0にするのが望ましい)。bit6:1にすると、強制READYが有効になる。この信号線とドライブからのREADY信号とのORがFDCに接続されている。ドライブ存在チェックのためのRECALIBRATEのときにのみ1にするのが望ましい。Readyを検出できなくなるので注意。bit7:FDCのリセットピンの制御。†4つのフェーズIdle-Phase:何もしてない状態。ステータスのbit4は0。この時FDCはデータレジスタへの書き込みを待っている。書き込んだ瞬間にそれはコマンドと解釈され、直ちにCommand-Phaseになる(パラメータが不要なコマンドでは、Command-Phaseを一瞬で通り過ぎて次のフェーズに移る)。Command-Phase:コマンドやそれに後続するパラメータを書き込んでいる状態。ステータスのbit4は1。この時もFDCはデータレジスタへの書き込みを待っている。Execution-Phase:コマンドを実行している状態。ステータスのbit4は1。FDへのデータ(FDCへのコマンドやパラメータやST0~ST3ではない)のやり取りも、このフェーズで行われる。Result-Phase:コマンドを実行しおわって、各種ステータスをCPUに通知するフェーズ。ステータスのbit4は1。FDCはデータレジスタのリードを待っている。通知される最後のデータを受け取った直後にIdle-Phaseになる。シーク系のコマンド(RECABRATEとSEEK)シーク系のコマンドは非常に時間がかかる。これはFDCにとってもCPUにとっても退屈である。いうことで、765Aではシーク系のコマンドはバックグラウンドで処理するように設計されている。いうことでこれらのコマンド動作は、他のコマンド類と異なる。Busy)を0にしてしまう。これは他のドライブに対するコマンドは受け付けられるからである。バックグラウンドで実行しているドライブは当然Busyであり、それはステータスのbit0-3に反映される。SEEK系のコマンドの実行が完了すると、割り込みでCPUに知らせてくる。STATUSで応じなければならない。これでST0をチェックして、状態遷移割り込みなのか、それともSEEK系の終了割り込みなのかを判断する。STATUSで応じてST0とPCNをリードしおわった時点で、コマンドの実行が完了する(=やっとこのドライブ対して次のコマンドが発行可能になる)。1のとき、ドライブ#0がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#0に対するコマンドは当然受け付けられない。1のとき、ドライブ#1がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#1に対するコマンドは当然受け付けられない。1のとき、ドライブ#2がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#2に対するコマンドは当然受け付けられない。1のとき、ドライブ#3がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#3に対するコマンドは当然受け付けられない。Result-Phaseのいずれかであることを意味する。このとき、全てのドライブに対してコマンドを受け付けることはできない。Mode):1のとき、FDCが非DMAモードでデータ転送中であり、メインシステムに対してサービスを要求していることを示す。Master)が1のときのみ有効。bit7が1のとき、このビットが0ならFDCはCPUによってデータレジスタに書き込まれるのを待っている、このビットが1ならFDCはCPUによってデータレジスタを読み取ってもらうのを待っている。Master):1のとき、FDCはCPUがデータレジスタにアクセスするのを待っている。データレジスタの準備ができているともいえる。(参考:AT互換機ではI/Oポートの0x03f5)bit0-7:コマンドやコマンドパラメータを書き、リザルトステータスを読み取ったりするポート。非DMAモード時のデータのやり取りにも使う(AT互換機もPC-9801も非DMAモードをサポートしない)。Select):割り込み要因がどのドライブに対するものかを示す。Address):割り込み要求時のヘッドの位置を示す。STATUSコマンド実行時は常に0になる。Ready):1のとき、指定されたドライブがREADYではないことを意味する。Check):1のとき、ドライブからFault信号を受け取ったか、もしくはRECALIBRATEコマンドを実行してもTRACK0信号を検出することができなかったことを意味する。End):1のとき、SEEKまたたRECALIBRATEコマンドによるシーク動作が、正常終了もしくは異常終了したことを意味する。Code):割込み要求のタイプを説明。Markが検出されなかったことを意味する。IDコマンドの実行時に書き込み不可を検出したことを意味する。Data):1のとき、CHRNで指定されたセクタを見つけられなかったことを意味する。IDでエラーのないIDフィールドを見つけられなかった場合にもセットさせる。Run):1のとき、処理中のセクタのデータ処理において、CPUからの転送(もしくはDMAからの転送)が規定時間内に行われなかったことを意味する。Error):1のとき、IDフィールド、もしくはデータフィールドを読み取った際にCRCエラーが生じたことを意味する。どちらが原因なのかはST2のbit5で区別できる。Cylinder):1のとき、指定された最終セクタを越えてアクセスを継続させようとしたことを意味する。Markのどちらも検出できなかったことを意味する。Cylinder):ST1のbit2に関連したステータスで、CHRNのCのバイトが一致しなくて、かつその値が0xffであったことを意味する。Satisfied):1のとき、SCAN系コマンドで最終セクタまでスキャンしても条件に合うデータが検出されなかったことを意味する。Hit):1のとき、SCAN系コマンドでEqual条件が満足されたことを意味する。Cylinder):ST1のbit2に関連したステータスで、1のとき、CHRNのCのバイトが一致しなかったことを意味する。Field):1のとき、ディスクのデータを読み取るときにCRCエラーを検出したことを意味する。Markのついたセクタのデータを処理したことを意味する。Select信号の状態。Select信号の状態。0):ドライブからのTrack0の状態。(Ready):ドライブからのReady信号の状態。Protect信号の状態。(Fault):ドライブからのFault信号の状態。:すみません、実はこの項目のために苦労して集めた資料の一部を紛失しています。いうことで情報もれを見つけたら、こめんと欄で教えてください。記号の説明:コマンドオプションビット群コマンドはbit0-4がコマンド番号。bit5-7はオプションフラグである。SK:スキップフラグ。Markをスキップする。コマンドバイトのbit5によく置かれる。0で単密度(FM)、1で倍密度(MFM)。コマンドバイトのbit6によく置かれる。MT:マルチトラックフラグ。詳細不明(すみません)。コマンドバイトのbit7によく置かれる。HD-US:bit0-1にドライブ番号、bit2にヘッド番号、bit3-7を0にした8bitのパラメータ。C:アドレスマーク上のシリンダ番号(8bit)R-PhaseでCHRNが帰ってくる場合、それは最後に処理したセクタの情報を返している。[N]いわゆるリードトラックコマンド。セクタの末尾に到達してもそのままデータ転送を続ける。CHRNで指定したデータフィールドから転送が始まる。DMAが尽きなければ、2周目にGAP0やインデックスマーク、GAP1、そして最初のセクタのアドレスマークやデータが見える。このコマンドは最初のセクタのところ以外は各アドレスマークやSYNCで自動調節しないので、しょっちゅうビットずれを起こす。MB8877Aは、インデックスホール直後から読み出して再びインデックスホールを見つけるまで読む、ちゃんとシンクロするのでビットずれはない。資料をかなりなくしてしまったので自信なし。Bochsはこのコマンドをサポートしていない。[N]?の部分は何だったか分からなくなりました。0でないとエミュレーションできない。1でないとエミュレーションできない。[HD-US]註:HD-USのヘッド番号は0にすること。MarkのCHRN値。0でないとエミュレーションできない。[N]Bochsはこのコマンドをサポートしていない。[N]Command-Phaseの[N]はセクタ長、[SC]はセクタ数、[GPL]はGap3の長さ(0を指定すると256と見なされる)、[D]はセクタのデータフィールドの初期値(これで埋め尽くされる)Execution-Phaseでは、[SC]個の、[C][H][R][N]の組をFDCに転送するResult-Phaseの[C][H][R]はダミーBochsはこのコマンドをサポートしていない。(19)(まだ書いてない)Bochsはこのコマンドをサポートしていない。(1d)(まだ書いてない)Bochsはこのコマンドをサポートしていない。7でメディア変更が検出できるらしいです。