www.pudn.com > read_harddisk_refrence.rar > IDE_DISK.CPP


/*-------------------------------------------------------------------------*\ 
|                                                                           | 
|                           IDE Ó²Å̲ÎÊý¶ÁÈ¡³ÌÐò                            | 
|                           ~~~~~~~~~~~~~~~~~~~~                            | 
|                    Copyright (C) 1997-2003, Victor Chen                   | 
|                         Email: victor@cppfans.com                         | 
|                      Homepage: http://www.cppfans.com                     | 
|                                                                           | 
\*-------------------------------------------------------------------------*/ 
#include "ide_disk.h" 
#pragma link "WinIo_bc.lib" 
//--------------------------------------------------------------------------- 
unsigned char inportb(unsigned short p) 
{ 
  unsigned long v = 0; 
  GetPortVal(p, &v, 1); 
  return v; 
} 
//--------------------------------------------------------------------------- 
unsigned short inportw(unsigned short p) 
{ 
  unsigned long v = 0; 
  GetPortVal(p, &v, 2); 
  return v; 
} 
//--------------------------------------------------------------------------- 
unsigned long inportd(unsigned short p) 
{ 
  unsigned long v = 0; 
  GetPortVal(p, &v, 4); 
  return v; 
} 
//--------------------------------------------------------------------------- 
void outportb(unsigned short p, unsigned char v) 
{ 
  SetPortVal(p,v,1); 
} 
//--------------------------------------------------------------------------- 
void outportw(unsigned short p, unsigned short v) 
{ 
  SetPortVal(p,v,2); 
} 
//--------------------------------------------------------------------------- 
void outportd(unsigned short p, unsigned long v) 
{ 
  SetPortVal(p,v,4); 
} 
//=========================================================================== 
char DetectHDD(unsigned long BasePort) //bit 0: HDD-0, Bit 1: HDD-1 
{ 
  int HD_No, HD_Detected=0, i, f; 
  unsigned char HD_Selection[2]={0xa0,0xb0}; // C:1010 0000, D:1011 0000 
 
  for(HD_No=0; HD_No<=1; HD_No++) 
   { 
     f=0; 
     for(i=0;i<300;i++) //Get HDD Status, wait until HDD not busy 
      { 
        if((inportb(BasePort+7)&0x80)==0) 
         { 
           f=1; 
           break; 
         } 
        Sleep(2); 
      } 
     if(!f)continue; 
 
     outportb(BasePort+6, HD_Selection[HD_No]); //0# HDD Drive/Head Register 
     outportb(BasePort+7, 0x10);                //0# HDD Status, Head back to Track 0 
 
     f=0; 
     for(i=0;i<300;i++) //Get HDD Status, wait until HDD not busy 
      { 
        if((inportb(BasePort+7)&0x80)==0) 
         { 
           f=1; 
           break; 
         } 
        Sleep(2); 
      } 
     if(!f)continue; 
 
     if(inportb(BasePort+7)==0x50) // HDD ready: 0101 0000 
      { 
        HD_Detected|=(1<=300) 
      { 
        Err=1; 
        break; 
      } 
     Sleep(2); 
     i++; 
   } 
 
  if(!Err) 
   for(i=0;i<=255;i++) 
    Info->w[i]=inportw(BasePort); 
  return Err; 
} 
//--------------------------------------------------------------------------- 
void WordToStr(unsigned char *s, unsigned short *w, int n) 
{ 
  int i; 
  for(i=0; i>8; 
     s[i*2+1] = w[i]&0x00ff; 
   } 
  s[i*2]=0; 
} 
//---------------------------------------------------------------------------