Thanks for the great info dog I owe you bigitgy. このページは[[OS-Wikiのページ:http://community.osdev.info/index.php?%28FDC%29765A]]のコピーです。 * FDCの765Aの仕様 [#t35e13ad] -AT互換機やPC-9801シリーズで使われている。 -MB8877Aとの違いは、FDCが最大4ドライブをサポートしていること。MB8877Aと比べるとFDCとしてかなりインテリジェントでもある。フォーマット・リードトラックのコマンドが弱いのが難点。しかし4ドライブで状態遷移割り込みが使えるのはすばらしいし、セクタの読み書きの際に、CHRNを全て指定できるのもすばらしい。 -データ転送はDMAのTC(ターミナルカウント)に依存しており、この仕様のために、カウント値は実際の転送量-1をセットする。 * I/Oアドレスなど [#tba78a85] -AT互換機の場合: --ステータスレジスタはI/Oポートの0x03f4を8bitリードすることで読み出せる。 --データレジスタはI/Oポートの0x03f5を8bitリード・ライトすることでアクセスできる。 --0x0374、0x0375でもできるようなことを書いてある資料もあるが、試したことはないので不明。 --I/Oポートの0x03f2に8bitアクセスで0x00をライトすると、FDCリセット? さらにその後に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。よくわからなければ、とりあえず1にしておけば問題はない。 ---bit5:リザーブ(0にするのが望ましい)。 ---bit6:1にすると、強制READYが有効になる。この信号線とドライブからのREADY信号とのORがFDCに接続されている。ドライブ存在チェックのためのRECALIBRATEのときにのみ1にするのが望ましい。ここをずっと1のままにしてしまうと、Not Readyを検出できなくなるので注意。 ---bit7:FDCのリセットピンの制御。 * 基礎知識 [#a27a880a] -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ではシーク系のコマンドはバックグラウンドで処理するように設計されている。ということでこれらのコマンド動作は、他のコマンド類と異なる。 --SEEK系のコマンドを無事に受け付けると、765Aはシーク動作の完了を待たずに、ステータスのbit4(FDC Busy)を0にしてしまう。これは他のドライブに対するコマンドは受け付けられるからである。しかしバックグラウンドで実行しているドライブは当然Busyであり、それはステータスのbit0-3に反映される。 --SEEK系のコマンドの実行が完了すると、割り込みでCPUに知らせてくる。CPUはExecution-Phaseでないときに割り込みを受け取ったら、速やかにSENSE INT STATUSで応じなければならない。これでST0をチェックして、状態遷移割り込みなのか、それともSEEK系の終了割り込みなのかを判断する。 --結局、SEEK系のコマンドは、SEEK終了を知らせる割り込みにCPUがSENSE INT STATUSで応じてST0とPCNをリードしおわった時点で、コマンドの実行が完了する(=やっとこのドライブ対して次のコマンドが発行可能になる)。 * レジスタ [#m7c9a842] -ステータスレジスタ(8bit,リードのみ) (参考:AT互換機ではI/Oポートの0x03f4) --bit0 (FD0 Busy): 1のとき、ドライブ#0がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#0に対するコマンドは当然受け付けられない。 --bit1 (FD1 Busy): 1のとき、ドライブ#1がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#1に対するコマンドは当然受け付けられない。 --bit2 (FD2 Busy): 1のとき、ドライブ#2がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#2に対するコマンドは当然受け付けられない。 --bit3 (FD3 Busy): 1のとき、ドライブ#3がSEEK系コマンドによるシーク動作を実行中であるか、もしくはシーク動作終了の割り込み要求を保留中。この時ドライブ#3に対するコマンドは当然受け付けられない。 --bit4 (FDC Busy):1のとき、FDCがCommand-Phase, Execution-Phase, Result-Phaseのいずれかであることを意味する。このとき、全てのドライブに対してコマンドを受け付けることはできない。 --bit5 (Non DMA Mode):1のとき、FDCが非DMAモードでデータ転送中であり、メインシステムに対してサービスを要求していることを示す。 --bit6 (Data Input/Output):このビットはbit7(Request for Master)が1のときのみ有効。bit7が1のとき、このビットが0ならFDCはCPUによってデータレジスタに書き込まれるのを待っている、このビットが1ならFDCはCPUによってデータレジスタを読み取ってもらうのを待っている。 --bit7 (Request for Master):1のとき、FDCはCPUがデータレジスタにアクセスするのを待っている。データレジスタの準備ができているともいえる。 -データレジスタ(8bit,リードとライト) (参考:AT互換機ではI/Oポートの0x03f5) --bit0-7:コマンドやコマンドパラメータを書き、リザルトステータスを読み取ったりするポート。非DMAモード時のデータのやり取りにも使う(AT互換機もPC-9801も非DMAモードをサポートしない)。 * リザルトステータス [#s0c80bb6] -頻繁に出てくるのでここでまとめて紹介 -ST0 --bit0-1 (Unit Select):割り込み要因がどのドライブに対するものかを示す。 --bit2 (Head Address):割り込み要求時のヘッドの位置を示す。SENSE INT STATUSコマンド実行時は常に0になる。 --bit3 (Not Ready):1のとき、指定されたドライブがREADYではないことを意味する。 --bit4 (Equipment Check):1のとき、ドライブからFault信号を受け取ったか、もしくはRECALIBRATEコマンドを実行してもTRACK0信号を検出することができなかったことを意味する。 --bit5 (Seek End):1のとき、SEEKまたたRECALIBRATEコマンドによるシーク動作が、正常終了もしくは異常終了したことを意味する。 --bit6-7 (Interrupt Code):割込み要求のタイプを説明。 ---0:コマンドの正常終了 (NT) ---1:コマンドの異常終了 (AT) ---2:コマンドがInvalidだったのでコマンドを実行せずにエラー終了 (IC) ---3:ドライブの状態遷移検出割り込み (AI) -ST1 --bit0 (Missing Address Mark):1のとき、Address Markが検出されなかったことを意味する。 ---READ ID等で、Index Markを2回検出するまでに、Address Markが一度も検出されなかった ---READ DATA等で、Data Address MarkもしくはDeleted Data Address Markが検出されなかった(このとき、ST2のbit0も1になる) --bit1 (Not Writable):1のとき、WRITE DATA、WRITE DELETED DATA、WRITE IDコマンドの実行時に書き込み不可を検出したことを意味する。 --bit2 (No Data):1のとき、CHRNで指定されたセクタを見つけられなかったことを意味する。 ---READ IDでエラーのないIDフィールドを見つけられなかった場合にもセットさせる。 --bit3 (Reserve):常に0 --bit4 (Over Run):1のとき、処理中のセクタのデータ処理において、CPUからの転送(もしくはDMAからの転送)が規定時間内に行われなかったことを意味する。 --bit5 (Data Error):1のとき、IDフィールド、もしくはデータフィールドを読み取った際にCRCエラーが生じたことを意味する。どちらが原因なのかはST2のbit5で区別できる。 --bit6 (Reserve):常に0 --bit7 (End of Cylinder):1のとき、指定された最終セクタを越えてアクセスを継続させようとしたことを意味する。 -ST2 --bit0 (Missing Address Mark in Data Field):1のとき、データを読み取るときにData Address MarkもDeleted Data Address Markのどちらも検出できなかったことを意味する。 --bit1 (Bad Cylinder):ST1のbit2に関連したステータスで、CHRNのCのバイトが一致しなくて、かつその値が0xffであったことを意味する。 --bit2 (Scan Not Satisfied):1のとき、SCAN系コマンドで最終セクタまでスキャンしても条件に合うデータが検出されなかったことを意味する。 --bit3 (Scan Equal Hit):1のとき、SCAN系コマンドでEqual条件が満足されたことを意味する。 --bit4 (No Cylinder):ST1のbit2に関連したステータスで、1のとき、CHRNのCのバイトが一致しなかったことを意味する。 --bit5 (Data Error in Data Field):1のとき、ディスクのデータを読み取るときにCRCエラーを検出したことを意味する。 --bit6 (Control Mark):1のとき、READ DATAもしくはSCAN系コマンド実行時にDeleted Data Address Markのついたセクタのデータを処理したことを意味する。 --bit7:資料不足により不明(すみません) -ST3 --bit0-1 (Unit Select):ドライブへのUnit Select信号の状態。 --bit2 (Head Address):ドライブへのSide Select信号の状態。 --bit3 (Two Side):ドライブからのTwo Side信号の状態。 --bit4 (Track 0):ドライブからのTrack0の状態。 --bit5 (Ready):ドライブからのReady信号の状態。 --bit6 (Write Protect):ドライブからのWrite Protect信号の状態。 --bit7 (Fault):ドライブからのFault信号の状態。 * コマンド一覧 [#kca9f303] -''K'' :すみません、実はこの項目のために苦労して集めた資料の一部を紛失しています。ということで情報もれを見つけたら、こめんと欄で教えてください。 -記号の説明: --コマンドオプションビット群 ---コマンドはbit0-4がコマンド番号。bit5-7はオプションフラグである。 ---SK:スキップフラグ。1でDeleted Data Address Markをスキップする。コマンドバイトのbit5によく置かれる。 ---MF:倍密度フラグ。0で単密度(FM)、1で倍密度(MFM)。コマンドバイトのbit6によく置かれる。 ---MT:マルチトラックフラグ。詳細不明(すみません)。コマンドバイトのbit7によく置かれる。 --HD-US:bit0-1にドライブ番号、bit2にヘッド番号、bit3-7を0にした8bitのパラメータ。 --C:アドレスマーク上のシリンダ番号(8bit) ---R-PhaseでCHRNが帰ってくる場合、それは最後に処理したセクタの情報を返している。 --H:アドレスマーク上のヘッド番号(8bit) --R:アドレスマーク上のセクタ番号(8bit) --N:アドレスマーク上のセクタ長パラメータ(8bit) ---0:128バイト(倍密度では指定できない) ---1:256バイト ---2:512バイト ---3:1024バイト ---4:2048バイト ---5:4096バイト(単密度では指定できない) -READ DIAGNOSTIC (02) --C-Phase:[? MF ? 02] [HD-US] [C] [H] [R] [N] [EOT] [GPL] [DTL] --E-Phase:(データ転送) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --いわゆるリードトラックコマンド。セクタの末尾に到達してもそのままデータ転送を続ける。CHRNで指定したデータフィールドから転送が始まる。DMAが尽きなければ、2周目にGAP0やインデックスマーク、GAP1、そして最初のセクタのアドレスマークやデータが見える。またこのコマンドは最初のセクタのところ以外は各アドレスマークやSYNCで自動調節しないので、しょっちゅうビットずれを起こす。かなり不便な仕様である。 ---MB8877Aは、インデックスホール直後から読み出して再びインデックスホールを見つけるまで読む、ちゃんとシンクロするのでビットずれはない。 --資料をかなりなくしてしまったので自信なし。 --Bochsはこのコマンドをサポートしていない。 -SPECIFY (03) --C-Phase:[0 0 0 03] [SRT-HUT] [HLT-ND] -SENSE DEVICE STATUS (04) --C-Phase:[0 0 0 04] [HD-US] --R-Phase:[ST3] -WRITE DATA (05) --C-Phase:[MT MF ? 05] [HD-US] [C] [H] [R] [N] [EOT] [GPL] [DTL] --E-Phase:(データ転送) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --?の部分は何だったか分からなくなりました。すみません。 --Bochsは、MT = MF = 1, ? = 0でないとエミュレーションできない。 -READ DATA (06) --C-Phase:[MT MF SK 06] [HD-US] [C] [H] [R] [N] [EOT] [GPL] [DTL] --E-Phase:(データ転送) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --Bochsは、MT = MF = SK = 1でないとエミュレーションできない。 -RECALIBRATE (07) --C-Phase:[0 0 0 07] [HD-US] ---註:HD-USのヘッド番号は0にすること。 --E-Phase:(バックグラウンド) --INT: -SENSE INT STATUS (08) --C-Phase:[0 0 0 08] --R-Phase:[ST0] [PCN] --[PCN]はコマンド終了時のシリンダ番号(Present Cylinger Number) -READ ID (0a) --C-Phase:[MT MF SK 0a] [HD-US] --E-Phase:(データ転送はなし) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --CHRNはこのコマンドが実行された時点から最初に発見されたAddress MarkのCHRN値。 --Bochsは、MF = 1, MT = SK = 0でないとエミュレーションできない。 -READ DELETED DATA (0c) --C-Phase:[MT MF SK 0c] [HD-US] [C] [H] [R] [N] [EOT] [GPL] [DTL] --E-Phase:(データ転送) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --Bochsはこのコマンドをサポートしていない。 -WRITE ID (0d) --C-Phase:[0 MF 0 0d] [HD-US] [N] [SC] [GPL] [D] --E-Phase:(データ転送) --INT: --R-Phase:[ST0] [ST1] [ST2] [C] [H] [R] [N] --Command-Phaseの[N]はセクタ長、[SC]はセクタ数、[GPL]はGap3の長さ(0を指定すると256と見なされる)、[D]はセクタのデータフィールドの初期値(これで埋め尽くされる) --Execution-Phaseでは、[SC]個の、[C][H][R][N]の組をFDCに転送する --Result-Phaseの[C][H][R]はダミー --Bochsはこのコマンドをサポートしていない。 -SEEK (0f) --C-Phase:[0 0 0 0f] [HD-US] [NCN] --E-Phase:(バックグラウンド) --INT: --[NCN]は目的のシリンダ番号(New Cylinder Number) -内容不明(10) --(情報募集:Bochsのソースを見たら分かるかな) -内容不明(13) --(情報募集:Bochsのソースを見たら分かるかな) -内容不明(18) --(情報募集:Bochsのソースを見たら分かるかな) -SCAN LOW OR EQUAL (19) --(まだ書いてない) --Bochsはこのコマンドをサポートしていない。 -SCAN HIGH OR EQUAL (1d) --(まだ書いてない) --Bochsはこのコマンドをサポートしていない。 -Invalid --C-Phase:[??] ---上記以外の何らかの8bitデータ --R-Phase:[ST0] ---このときST0 == 0x80 * こめんと欄 [#x53a5af3] -PCだと0x3f7のbit 7でメディア変更が検出できるらしいです。(98は不明) -- ''名無しさん'' SIZE(10){2005-03-12 (土) 12:50:11} -一応 765 の残りコマンド。0x11: SCAN EQUAL これは READ DATA とコマンド書式は同じ。0x09: WRITE DELETED DATA これは WRITE DATA の DELETED 版。元の 765 (7265) には10,13,18 というコマンドはない。Bochs 拡張かな。 -- ''alp'' SIZE(10){2006-02-20 (月) 23:43:01} -実機上XPでコマンド13が使われているようなのでBochs拡張ではないと思われ。 -- ''vakabong'' SIZE(10){2006-03-09 (木) 14:25:46} -0x13はconfigure -- ''名無しさん'' SIZE(10){2006-03-11 (土) 21:57:03} -0x3F2のbit1-0: ATではCフェーズのUSを殺しちゃってるらしいので、ここでドライブ番号を指定するのだそうです。 -- ''nika'' SIZE(10){2006-08-18 (金) 23:55:52} -WRITE DATA コマンドのMFのあとの?のところは0をことになっているようです。 -- '' '' SIZE(10){2006-08-25 (金) 09:54:29} //#comment