//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "WinIO.h"
//---------------------------------------------------------------------------
unsigned char inportbNT(unsigned short p) { asm mov dx, p; asm in al, dx; return _AL; }
unsigned short inportwNT(unsigned short p) { asm mov dx, p; asm in ax, dx; return _AX; }
unsigned long inportdNT(unsigned short p) { asm mov dx, p; asm in eax,dx; return _EAX;}
void outportbNT(unsigned short p, unsigned char v) { asm mov dx, p; asm mov al, v; asm out dx,al; }
void outportwNT(unsigned short p, unsigned short v) { asm mov dx, p; asm mov ax, v; asm out dx,ax; }
void outportdNT(unsigned short p, unsigned long v) { asm mov dx, p; asm mov eax,v; asm out dx,eax;}
//---------------------------------------------------------------------------
unsigned char inportb9x(unsigned short p) { unsigned long v = 0; GetPortVal(p, &v, 1); return v; }
unsigned short inportw9x(unsigned short p) { unsigned long v = 0; GetPortVal(p, &v, 2); return v; }
unsigned long inportd9x(unsigned short p) { unsigned long v = 0; GetPortVal(p, &v, 4); return v; }
void outportb9x(unsigned short p, unsigned char v) { SetPortVal(p,v,1); }
void outportw9x(unsigned short p, unsigned short v) { SetPortVal(p,v,2); }
void outportd9x(unsigned short p, unsigned long v) { SetPortVal(p,v,4); }
//---------------------------------------------------------------------------
unsigned char (*inportb)(unsigned short) = inportbNT;
unsigned short (*inportw)(unsigned short) = inportwNT;
unsigned long (*inportd)(unsigned short) = inportdNT;
void (*outportb)(unsigned short, unsigned char ) = outportbNT;
void (*outportw)(unsigned short, unsigned short) = outportwNT;
void (*outportd)(unsigned short, unsigned long ) = outportdNT;
//---------------------------------------------------------------------------
void InitPortFuncs(void)
{
OSVERSIONINFO osVer = {sizeof(OSVERSIONINFO)};
GetVersionEx(&osVer);
if(osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
inportb = inportbNT; outportb = outportbNT;
inportw = inportwNT; outportw = outportwNT;
inportd = inportdNT; outportd = outportdNT;
}
else
{
inportb = inportb9x; outportb = outportb9x;
inportw = inportw9x; outportw = outportw9x;
inportd = inportd9x; outportd = outportd9x;
}
}
//---------------------------------------------------------------------------
bool ReadHddParams(unsigned short *params, int pn, int dn)
{
int i,IdePort[2] = {0x1f0, 0x170}; //primary & secondary IDE Controller
unsigned char HD_Selection[2]={0xa0,0xb0}; // Master Disk: 1010 0000, Slave Disk: 1011 0000
unsigned short BasePort = IdePort[pn];
for(i=0;i<500;i++) //Get HDC Status, wait until HDC not busy
{
if((inportb(BasePort+7)&0x80)==0)
break; //hdc is ready
Sleep(1);
}
if(i>=300)return false; //HDC no response
outportb(BasePort+6, HD_Selection[dn]); //master or slave hard disk
outportb(BasePort+7, 0x10); //HDD status
for(i=0;i<300;i++) //Get HDD Status, wait until HDD not busy
{
if((inportb(BasePort+7)&0x80)==0)
break;
Sleep(1);
}
if(i>=300)return false; //HDC no response
if(inportb(BasePort+7)!=0x50)return false; //HDD ready: 0101 0000
outportb(BasePort+6, HD_Selection[dn]); //master or slave hard disk
outportb(BasePort+7, 0xec); //HDD parameters
for(i=0;i<300;i++) //wait for parameters retrieved
{
if(inportb(BasePort+7)==0x58) //retrieved OK
break;
Sleep(1);
}
if(i>=300)return false; //parameters retrieved error
for(i=0;i<256;i++)
params[i]=inportw(BasePort);
return true;
}
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------
- 1
- 2
前往页