全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2111
推到 Plurk!
推到 Facebook!

parallel port I/O demo,使用lcsboy大大的WDM Driver

 
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-05 21:25:48 IP:61.70.xxx.xxx 未訂閱
 
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#define Support9x       0
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
        OSVERSIONINFO osv;
        osv.dwOSVersionInfoSize = sizeof(osv);
        GetVersionEx(&osv);
        // 判斷目前使用的OS, 是否為WinNT 系列
        if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
        {
          // 如果是WinNT系列, 動態啟動WDM Driver
          if (!OpenDriver())
          {
            ShowMessage("Driver not ready!!!");
            CloseDriver();
            Application->Terminate();
          }
          WinNT=true;
        }    #if Support9x
#else
        else
        {
          ShowMessage("Support WinNT base only!");
          Application->Terminate();
        }
#endif
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
        // 如果是WinNT系列, 動態關閉WDM Driver
        if (WinNT)
        {
          if (!CloseDriver())
            ShowMessage("Close Driver Fail!");
        }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormShow(TObject *Sender)
{
        char HDD_Serial[21]=""; // HDD序號一共有10個Word            if (WinNT)
          IdentifyIDE_NT();
#if Support9x
        else
          IdentifyIDE_9x();
#endif            BYTE *pt;
        pt=(BYTE *)IDEData 10*2;
        memcpy(HDD_Serial, pt, 20);
        Edit1->Text=HDD_Serial;    // 如果想要看看IDE 傳回256個word的值
// 1. 請自行貼上一個TMemo元件
// 2. 拿掉下面的#ifdef
#ifdef Debug
        String Str, ShowStr;
        pt=(BYTE *)IDEData;
        for (i=0; i<32; i  )
        {
          ShowStr="";
          for (j=0; j<16; j  )
          {
            Str.sprintf("%.2X", *pt);
            ShowStr =(Str " ");
            pt  ;
          }
          Memo1->Lines->Append(ShowStr);
        }
#endif
}
//---------------------------------------------------------------------------    void __fastcall TForm1::IdentifyIDE_NT()
{
        // Prepare for HDD ready
        WaitIDE_NT();            // 設定Device為Master HDD
        r.type=IOACCESS_WRITE_BYTE;
        r.m_dx=0x1F6;
        r.m_al=0xA0;
        WinIO();
        IDEStatus=WaitIDE_NT();
        if ((IDEStatus & 0x50) != 0x50)
        {
          ShowMessage("Set Device Fail!");
          Close();
        }            // 下ATA Command:0xEC
        r.type=IOACCESS_WRITE_BYTE;
        r.m_dx=0x1F7;
        r.m_al=0xEC;
        WinIO();
        IDEStatus=WaitIDE_NT();
        if ((IDEStatus & 0x58) != 0x58)
        {
          ShowMessage("Set Identify Command Fail!");
          Close();
        }            // 讀回HDD傳回來的256個Word
        r.type=IOACCESS_READ_WORD;
        r.m_dx=0x1F0;
        j=0;
        for (i=0; i<256; i  )
        {
          WinIO();
          IDEData[j  ]=r.m_ah;
          IDEData[j  ]=r.m_al;
        }    }
//---------------------------------------------------------------------------    BYTE __fastcall TForm1::WaitIDE_NT()
{
        r.type=IOACCESS_READ_BYTE;
        r.m_dx=0x1F7;
        do{
          WinIO();
        }while(r.m_al>=0x80);
        return r.m_al;
}
//---------------------------------------------------------------------------    #if Support9x
void __fastcall TForm1::IdentifyIDE_9x()
{
        BYTE AL, AH;            // Prepare for HDD ready
        WaitIDE_9x();            // 設定Device為Master HDD
        asm{
          mov   dx, 0x1F6
          mov   al, 0xA0
          out   dx, al}
        IDEStatus=WaitIDE_9x();
        if ((IDEStatus & 0x50) != 0x50)
        {
          ShowMessage("Set Device Fail!");
          Close();
        }            // 下ATA Command:0xEC
        asm{
          mov   dx, 0x1F7
          mov   al, 0xEC
          out   dx, al}
        IDEStatus=WaitIDE_9x();
        if ((IDEStatus & 0x58) != 0x58)
        {
          ShowMessage("Set Identify Command Fail!");
          Close();
        }            // 讀回HDD傳回來的256個Word
        j=0;
        for (i=0; i<256; i  )
        {
          asm {
            mov dx, 0x1F0
            in  ax, dx
            mov AH, ah
            mov AL, al}
          IDEData[j  ]=AH;
          IDEData[j  ]=AL;
        }    }
//---------------------------------------------------------------------------    BYTE __fastcall TForm1::WaitIDE_9x()
{
        BYTE AL;
        do{
          asm{
            mov dx, 0x1F7
            in  al, dx
            mov AL, al}
        }while(AL>=0x80);
        return AL;
}
//---------------------------------------------------------------------------
#endif    void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Close();
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button2Click(TObject *Sender)
{
//讀出378 port程式段
        r.type=IOACCESS_READ_BYTE;
        r.m_dx=0x378;
        WinIO();
        Edit2->Text=r.m_al;
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button3Click(TObject *Sender)
{
//寫入378 port程式段       if(!Edit3->Text.IsEmpty()&&-1Text)&&StrToInt(Edit3->Text)<256)
       {
        r.type=IOACCESS_WRITE_BYTE;
        r.m_dx=0x378;
        r.m_al=StrToInt(Edit3->Text);
        WinIO();
       }else ShowMessage("Input 0-255");    }
//---------------------------------------------------------------------------
我以上是使用lcsboy大大提供的WinIO Driver 以及修改他先前所發表之hdd範例 加入Parallel port 對0x378的簡單I/O 不太了解的可以參考看看 我是在WIN2K下使用BCB6 Coding的因為.EXE檔有點"肥"所以把主程式放上來^^
系統時間:2024-05-15 16:38:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!