2006.03.26)発展課題のページ(全部読む前にここを読むのは混乱するのでおすすめじゃないです)↑FDC(フロッピーディスクコントローラ)制御の基本ここで説明しているのは内蔵FDDの制御法で、USB接続やPCカード接続のものはこの方法ではたぶん制御できません(ありがたいことにBIOSがエミュレーションしてくれる場合もあります)。USB接続やPCカード接続のFDDを制御したいときは、それぞれ専用の制御方法があります。FDCにはコマンドを送りつけて制御します。ほとんどのコマンドは、コマンドを送ってすぐに実行を完了するのではなくかなり時間がかかります。実行が済むと割り込みで教えてくれますのでそれまではのんびり待つかもしくは他の処理をしましょう(IRQ-06)。ディスクを読み書きするときは、まずヘッドを目的のシリンダへ動かします。その後メモリのどの部分を読み書きするかをDMAC(ダイレクトメモリアクセスコントローラ)という装置に指定してから、FDCに読み書きのコマンドを発行します。DMACの都合により、0x00000000〜0x00ffffffの範囲のメモリにしかアクセスできません。この範囲外のメモリに対してFDの読み書きを実行したければ、DMACの届く範囲へメモリの転送をする必要があります。DMAはマスタのチャンネル2を使います。次に以下を送信したいバイト数だけ繰り返します。データ);FDCからのリザルトステータスの受け取り方:以下を受信しなければいけないバイト数だけ繰り返します。io_in8(0x03f5);とりあえずこれだけ知っていればいいかなという代表的なFDCコマンド::のあとにあるデータは書き込むデータではなくFDCから受け取るデータ(リザルトステータス)です。(Cは割り込み時のシリンダ番号)このコマンドはすぐに実行完了する。[02]CとHが変わらないのなら、連続したセクタを処理することができます(註1)。処理するセクタ数はDMACの設定で指定します。[02]CとHが変わらないのなら、連続したセクタを処理することができます(註1)。処理するセクタ数はDMACの設定で指定します。コマンドはうまく実行できたの?:リザルトステータスの、[ST0]を見ると分かります。PC/AT互換機では発生しない模様(状態遷移割り込み)エラー処理については、まず読み書きでエラーが起きたのなら、シークのやり直しをしないで、3〜5回くらいはコマンドを実行してみるべきです。それでもダメなら、ヘッドの位置がおかしくなったせいかもしれないので、一度シリンダ0へ移動させて、それから目的のシリンダに移動して、また3〜5回くらいは挑戦します。このシリンダ0への戻しのあとの読み書きを数回やってもダメなら、もうダメだと思うのでエラーにしましょう。DMACの設定:(注意)DMAは使わない間や設定中は極力マスクしておくこと。守らないと誤動作の原因です。調べるのではなく、OSが最後にどちらに設定したかを覚えておいてそれを調べる)。実行してさらに最低1秒間待ちます(通電した直後は回転数が安定しないため)。したら2〜3秒くらいは待つほうがいいかもしれません。回しっぱなしでもいいやという考え方もありますが、FDが摩擦で徐々に磨り減るでしょうし、電気代ももったいないので、3〜10秒くらいアクセスのない状態が続いたらモータを止めるようにしておくといいでしょう(OSASKでは3秒にしてあります)。大事な注釈1(2009.03.01追記):実はいつでも簡単に連続したセクタを処理できるわけではありません。今回はtatsuさんがこれで苦労したようです。PCのDMAはアドレスレジスタが16bitしかないチップを後付回路で適当に拡張して、24bitの番地を生成しています。設定するのはまさにその影響です(そしてさらに23-31bitのレジスタに関しては作ることまでサボった)。IBMの技術者は手抜きをしていて、なんとDMAの番地が0-15bitで一杯になって繰り上がっても、16-23bitはそのままになってしまうのです。これはかなりひどいことです。...こんな風にFDCからのデータを0x0012ff00番地へ読み込ませていたら、0x0012ffffの次が0x00130000ではなくて、0x00120000になってしまうのです。これに対処するにはどうしたらいいかですが、一番お手軽な方法は、メモリの16MBの範囲のどこでもいいので、9KB確保します。これはもちろん上記のような64KB境界をまたがない領域です。IDTのそばのメモリがあいていたはずです。FDCからのデータは必ずそこに読み込ませることにします。FDCからの読み込みが完了したら、その9KBのメモリから自分の目的の番地へコピーするようにすればいいでしょう。・・・この方法なら、目的の番地が16MBの範囲外でも問題なくなるので、一石二鳥かもしれません。ここで9KBにしたのは、一度に1トラックを全部読む場合の例です。↑プログラム例FDC制御専用のタスクを作る(そのほうがプログラムが書きやすいので)。このタスクのFIFOに、他のタスクから次のようなコマンドを送る。14:11:03作っていいのですか?いいならやってみますけど・・・。みなさんが理解できるか分かりませんが。Kさんが書いたのになぜ分からないのかがフシギですが。15:15:04こっちは、理解できるのにBIOSを使わずに時計を使うところのサンプルが必要と思うのはすこしおかしいと思いますか?ちなみに、作るのしばらく時間かかりますよ。15:16:20作っていただけるのでしたらとても助かるのでよろしくお願いします。2ヶ月くらいはのんびりお待ちしております。できてもルール上、このページをCloverさんが勝手に書き換えてはいけませんので、適当なところにプログラムをアップロードしてダウンロードURLをご連絡ください。16:06:43分かりました。勉強もあるので暇を見つけて完成させます。16:01:28今、作成中なんですが・・・。15:12:30なんでもいいです。サンプルとして有効かどうかは僕ができたものを見て判断しますので。出来上がるまであれこれ質問はしないでください。00:18:48少々雑ですが、FDCが完成しました。こちらのOSははりぼてOSをベースにしているので少し改良するだけでhrbでも動くはずです。09:42:00適当な場所に今度アップしておきます。変更がないとhrbosでは動かないので最大で2週間待っていてください。出来ましたら個人ページでお知らせします。16:35:16きっと日本語だから分かりにくいのだと思います。・・・キーボードやマウスの割り込み処理を参考に、是非自分で考えてみてください。うまくできた人がたくさんいますよ。17:08:10Kさんやその他だれでも構わないのですがサンプルソースをいただけないでしょうか。tatsuさんのサイトはダウンしており現在tatsuさんのOSのソースコードが入手できない状態です。