📄 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<<HD_No);
}
}
return HD_Detected;
}
//---------------------------------------------------------------------------
int GetHDDInfo(TIDE_ID_Inf *Info, char DriveNo, unsigned int BasePort) //DriveNo ... 0:C, 1:D
{
unsigned int i=0;
int Err=0;
if(DriveNo==0)
outportb(BasePort+6, 0xa0); //select drive C:
else
outportb(BasePort+6, 0xb0); //select drive D:
outportb(BasePort+7, 0xec); //read HDD Info
while(inportb(BasePort+7)!=0x58) //0# HDD Status, wait for R/W ready 0101 0000
{
if(i>=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<n; i++)
{
s[i*2] = w[i]>>8;
s[i*2+1] = w[i]&0x00ff;
}
s[i*2]=0;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -