C言語関係掲示板

過去ログ

No.238.フロッピードライブの状態を取得する


No.1449

デバイスの状態
投稿者---ZORO(2002/04/23 21:09:30)


はじめまして。
C言語はちょこっとやったことがあるのですが、解決できないことが出てきたのでご助言を頂きたくて投稿しました。
やりたいことはフロッピードライブの状態を取得するということです。
フロッピードライブにディスクが入っていなければプログラムを中断し、入っていれば続行するといった具合です。
VBやVCなどではドライブの状態を取得できる関数やAPIがあるので簡単なのですが、C言語ではどのようにプログラミングすれば可能になるのでしょうか?
自分で調べた限りDOSの割り込みINT24Hが、状態を持っているとの情報までは突き止めましたが、サンプルなどはアセンブラばかりで???状態です。
何かわかる方がいらっしゃいましたら宜しくお願いいたします。


No.1454

Re:デバイスの状態
投稿者---B.Smith(2002/04/24 14:51:00)


こんにちは。

MS-DOSでは、FDドライブに媒体がセットされていない状態でアクセスした場合、INT 24hが実行されます。そのため、INT 24hをフックすることで、「デバイスの準備が出来ていません」というエラーメッセージを出さないようにすることができます。
サンプル(MS-C用)
#include <dos.h>
#include <stdio.h>
#include <conio.h>

typedef void (interrupt far *SAVE_INTVECT )();

SAVE_INTVECT    SaveVect;   /* 旧ベクタ退避用 */
unsigned short  flg;        /* エラー状況 */

void interrupt far  HookFunc();

void main(void )
{
    FILE    *fp;

    /* 24hのベクターを保存 */
    SaveVect = _dos_getvect(0x24);

    /* 24hに新しく関数HookFuncのアドレスを設定 */
    _dos_setvect(0x24,HookFunc);

    /* テスト:FDドライブへのアクセス */
    fp = fopen("A:\\Test.txt","rb");

    if (!fp){                   /* オープンできない */
        if (flg == 0x2)         /* レジスタDIの値が0x2の場合 */
            printf("drive not ready.\n");
    }else
        fclose(fp);

    /* 保存してあったベクタを戻す */
    _dos_setvect(0x24,SaveVect);
}

/* 24hをフックする */
void interrupt far  HookFunc(void )
{
    _asm{
        ;;DIレジスタの下位バイトが0x2の場合drive not ready
        mov     flg,di
        and     flg,0ffh
    }

    /* 0x2以外の場合は、旧ベクタを呼び出す  */
    /* (0x2以外の場合の処理)              */
    if (flg != 0x2)     SaveVect();
}

すでにセットされているハンドラを取得するには関数_dos_getvect、新しく設定するには関数_dos_setvectを使用します。これらの関数は、コンパイラにより違いがありますので、ライブラリリファレンスを確認してください。
DIレジスタの内容を取得しなければならないので、ここではインラインアセンブラを用いています。これも、コンパイラにより違いがありますので注意してください。
24h割り込みがかかった時のDIレジスタの下位バイトを調べて、この値が2であるならば、デバイスが準備されていないエラーです。

>自分で調べた限りDOSの割り込みINT24Hが、状態を持っているとの情報までは突き止めましたが、サンプルなどはアセンブラばかりで???状態です。

ハードウエアに絡む処理やパフォーマンス重視の処理は、どうしてもアセンブラを頼らなければならないことがあります。これを機会にアセンブラにチャレンジするのも良いかもしれません。
アセンブラは、それを取り巻く環境を理解するのが難しいのであって、言語としてはそれほど難しいものではありません。また、Cとの連携、Cが如何にアセンブラと密接に関わっているか、ということも分かってくると思います。


No.1456

Re:デバイスの状態
投稿者---ZORO(2002/04/24 18:25:35)


ご親切にありがとうございます。
サンプルを元にやってみましたが、私のコンパイラでは解釈されませんでした。
ちなみにwatcom C+DOS/4Gの環境です。
ただヒントになりましたので、これをもとにもう少し頑張ってみます。

戻る


「初心者のためのポイント学習C言語」 Last modified:2002.06.22
Copyright(c) 2000-2002 TOMOJI All Rights Reserved