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;
}
//---------------------------------------------------------------------------