Statusレジスタを空読みする。ラベル5:Statusレジスタを読む。(セクタのライト:PIO-Write)この2つのコマンドのパラメータやStatusのbit割り振りは同じなので、まとめて説明。どちらのコマンドもStatusのDRDYが1になってないと実行できない。Featuresレジスタは利用しない。Countレジスタに連続処理するセクタ数(1つなら1)。HighレジスタにLBAのbit0-23、もしくはCHSのSとC。Device/HeadレジスタにCHSのHかもしくはLBAの最上位、そしてデバイス番号とLBAフラグをセット。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。イジェクトボタンを押されて、デバイス取り出し要求があるなどの状態のエラー。STATUSを実行していないので、ソフトウェアが交換を検出していないかもしれない。それを通知するためのエラー。リードの場合、アンコレクタブルエラー(1で発生。(CHS変換のためのパラメータ設定:No-Data)CHS変換をサポートしているデバイスで使用可能。StatusのDRDYが1になっていなくても実行可能。Countレジスタに最大セクタ番号。Device/Headレジスタのbit0-3に最大ヘッド番号、bit4にはデバイス番号をセット。Highレジスタは参照しないので、どんな値でも構わない。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。featureセットをサポートしているデバイスで使用可能。StatusのDRDYが1になっているときにのみ実行可能。Device/Headレジスタのbit4にはデバイス番号をセット。bit0-3は参照しないのでなんでもよし。Highレジスタは参照しないので、どんな値でも構わない。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。イジェクトボタンを押されて、デバイス取り出し要求があるなどの状態のエラー。STATUSが実行されたので、次からはこのエラーは出ない。STATUSを実行していないので、ソフトウェアが交換を検出していないかもしれない。それを通知するためのエラー。STATUSを実行されたので。次からはこのエラーは出ない。モードが色々あってややこしいので下記参照のこと。StatusのDRDYが1になっているときにのみ実行可能。Device/Headレジスタのbit4にはデバイス番号をセット。bit0-3は参照しないのでなんでもよし。Highレジスタは参照しないので、どんな値でも構わない。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。モードが色々あってややこしいので下記参照のこと。StatusのDRDYが1になっているときにのみ実行可能。Device/Headレジスタのbit4にはデバイス番号をセット。bit0-3は参照しないのでなんでもよし。Countレジスタには、スタンバイタイマー値をセット。この時間だけ待ってみて、その間にアクセスがなければ自動的にIDLEになります。Highレジスタは参照しないので、どんな値でも構わない。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。(デバイス情報取得:PIO-Read)StatusのDRDYが1になっているときにのみ実行可能。Device/Headレジスタのbit4にはデバイス番号をセット。bit0-3は参照しないのでなんでもよし。Highレジスタは参照しないので、どんな値でも構わない。得られる512バイトの情報については、下記参照。(正常終了時は0)そのほかのレジスタは、Device/HeadのDEVビットが保存されることを除いては、すべて未定義。(コマンド異常終了時)Statusのbit0のERRビットが必ず1になる。†4つのモードがあるACTIVE:すぐにコマンドが受け付けられる状態で一番電気を食う。IDLE:全てのコマンドを受け付けられるが、ACTIVEよりは反応が悪い可能性がある。STANDBYほどはひどくないし、電気消費もちょっと押さえてくれる。ACTIVEのままにするのはよくないと、たいていの資料には書いてある。コマンドを実行するたびにIDLEコマンドを実行するといいだろう(一般のコマンドを実行するとモードがACTIVEに変わってしまうため)。STANDBY:全てのコマンドを受け付けられるが、コマンドを実行するまでに最大30秒の遅延がありうる。その代わり結構節約してくれると思う。SLEEP:一番電気を食わない。RESETコマンド以外を受け付けない。RESETを実行するまでに最大30秒の遅延がありうる。普通のデバイスはコマンド実行後にずっとACTIVEのままでいるが、一部のデバイスは自主的にIDLEやSTANDBYになるものもあるらしい。ATA規格ではそういう自主的なモード遷移も一応認めているようだ。当てにはできないので、ソフトウェアでちゃんと制御するのが望ましい。†ここではアドレスをバイト単位で書いていますが、データは16ビット単位でやり取りされているため、文字列などはIA-32からするとやや変則的です。複数のワードにまたがるデータは一度適当な機種で実験してみて、観察するといいでしょう。LBAモードでアクセス可能な全セクタ数(以下まだ書き途中)(補足)0x078-0x07bの「LBAモードでアクセス可能な全セクタ数」というのは、アクセス可能なLBAの最大値を意味するのではなく、本当の意味での全セクタ数である。LBAは0から指定できるので、ここの値から1を減じた値が、指定できるLBAの最大値となる。他の「セクタ数」についても同様であろう。PARAMETERSで設定しないとだめらしい。変なの~)でもまあ僕たちの場合はBIOSがそういうことをやってくれた後だと想定してもいいと思うので、この辺を気にする必要はないかもしれません。Lowなどが分かるのならこの説明で十分だと思うのですが・・・。16:16:51僕の知る範囲では、ATAではそういうことになっているようです。ATAPIだと他のセクタサイズもあります。MULTIPLEの違いを教えてください。13:15:02kikeoさんへ:説明したいのですが、忙しくてしばらくは無理です。GYZさんへ:僕にも違いが良く分かりません。コマンド20/30についてはだいたい分かっているのですが、他のコマンドはコマンド名がなんとか分かった程度でしかないのです。13:34:38非MULTIPLEでは、指定した全セクタの処理が終わるまで、割り込みが発生しませんが、MULTIPLEでは1セクタごとに(もしくは2セクタごと、4セクタごとなど、設定で変更できますが)、割り込みが来るようです。いう中間報告の有無が違いなのかもしれません。ただの想像ですので、間違っている可能性大ですが。16:15:03上記のコマンド表を見れば分かりますが、DMA系命令はプロトコルもPIO系命令とは違いますよ。16:58:46すみません、もう少し勉強してみます。ありがとうございました。17:42:12割り込みの有無等、細かい点で差異があるのですね。Web上に情報が少なくて困っていたところなんで、非常に参考になります。ありがとうございました。MODEコマンドで指定したセクタ数(2~128の間で2^nの値で指定)だけまとめて読み書きします。指定セクタ分読み書きした後に割り込みが発生する以外に違いは無いようですよ。20:09:32読み込む単位が違うんですね。ソースと照らし合わせて、ようやく納得出来ました。