⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fdbios.cpp

📁 dos下直接对软盘控制器操作的C++类, 用它可以制作
💻 CPP
📖 第 1 页 / 共 2 页
字号:
									if( SendCommand(ucSectorBytesCode) )
									{
										
										if( SendCommand(ucLastSector) )
										{

											if( SendCommand(ucSectorL) )
											{
	
												if( SendCommand(0x0ff) )
												{
                          Delay(DELAY_WRITE_CRC_SECTOR);
													ResetController();
													if( IsComplete() )
													{
														if( GetErr(7) )
															return TRUE;

													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if( !CanRetry() )
			return FALSE;
	}
	if( uError==OK )
		return TRUE;
	else
		return FALSE;
}

int CFDBios::ReadDMACount(void)
{
	int ret=_inp(0x5);
	
	ret=ret<<8;
	ret=ret+_inp(0x5);
	return ret;
}

BOOL CFDBios::Format(USHORT ucTrack,USHORT ucHead,
	USHORT ucnSectors,USHORT ucSectorBytesCode,
	USHORT ucSectorL,USHORT ucSectorFillCode)
{
	for( int i=0;i<MAX_RETRY;i++)
	{
		if( Reset() )
		{
			if( GotoTrack(ucTrack) )
			{
				StartDMA(WRITE_DISK,ucnSectors,4,pBuffer);//MAX_ALL_BYTES,pBuffer);
				EnableINT();
				if( SendCommand(0x4d) )
				{
					
					CHAR tmp2= ucHead<<2;
					if( SendCommand(ucDiskNumber|tmp2) )
					{
						
						if( SendCommand(ucSectorBytesCode) )
						{
							
							if( SendCommand(ucnSectors) )
							{
								
								if( SendCommand(ucSectorL) )
								{
									
									if( SendCommand(ucSectorFillCode) )
									{
										if( IsComplete() )
										{
											if( GetErr(7) )
												return TRUE;
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if( !CanRetry() )
			return FALSE;
	}
	if( uError==OK )
		return TRUE;
	else
		return FALSE;
}

int CFDBios::GetSectorBytes(int ucSectorBytesCode)
{
 int tmp;
	switch ( ucSectorBytesCode )
	{
		case 0:	tmp=128;	 break;
		case 1:	tmp=256;   break;
		case 2:	tmp=512;   break;
		case 3:	tmp=1024;  break;
		case 4:	tmp=2048;  break;
		case 5:	tmp=4096;  break;
		case 6:	tmp=8192;  break;
		case 7:	tmp=16384; break;
		default:tmp=0;		 break;
	}
	return tmp;
}

CFDBios::CFDBios(char *p,ULONG ulBufferLength)
{
  bMotorWork=FALSE;
  if( ulBufferLength<MAX_BUFFER_SIZE )
	{
		uError=INVALID_BUFFER;
		return ;
	}
	this->pBuffer=p;
	DetectFD();

}

BOOL CFDBios::Init(char *p,ULONG ulBufferLength)
{

	if( ulBufferLength<MAX_BUFFER_SIZE )
	{
		uError=INVALID_BUFFER;
		return FALSE;
	}
	this->pBuffer=p;
	DetectFD();
	if( uError==NO_FD )
		return FALSE;
	return TRUE;
}

void CFDBios::EnableINT(void)
{
	_outp(0x21,0xbf&_inp(0x21));
#ifdef __DJGPP__
asm(" sti");
#else
	_asm sti;
#endif

	#ifdef __BORLANDC__	
		char *pcIntFlag=(char far*)MK_FP(0X40,0X3E);
		*pcIntFlag=0;
	#endif
		
  //enable();
}

void CFDBios::DisableINT(void)
{
	_outp(0x21,0x40|_inp(0x21));
#ifdef __DJGPP__
asm(" cli");
#else
	_asm cli;
#endif

  //disable();
}

void CFDBios::GetErrInfo(void)
{
	if(ucRetValueBuffer[1]&0x80)
	{
		uError=OVER_LAST_SECTOR;
	}
	if(ucRetValueBuffer[1]&0x20)
	{
		uError=ID_CRC;
	}
	if(ucRetValueBuffer[1]&0x10)
	{
		uError=DMA_OVER_TIME;
	}
	if(ucRetValueBuffer[1]&0x2)
	{
		uError=WRITE_PROTECT;
	}
		if(ucRetValueBuffer[1]&0x1)
	{
		uError=LOST_ID;
	}
	if(ucRetValueBuffer[2]&0x40)
	{
		uError=CONTRL_ID;
	}
	if(ucRetValueBuffer[2]&0x20)
	{
		uError=DATA_CRC;
	}
	if(ucRetValueBuffer[2]&0x10)
	{
		uError=TRACK_ERR;
	}
	if(ucRetValueBuffer[2]&0x2)
	{
		uError=BAD_TRACK;
	}
	if(ucRetValueBuffer[2]&0x1)
	{
		uError=ADDRESS_ID;
	}
}
BOOL CFDBios::ReadID(CHAR ucHead)
{
	for(int i=0;i<MAX_RETRY;i++)
	{
		EnableINT();
		if( SendCommand(0x4a) )
		{
			if( SendCommand(ucDiskNumber|(ucHead<<2)) )
			{
				if( IsComplete() )
				{
					if( GetErr(7) )
						return TRUE;
				}
			}
		}
		if( !CanRetry() )
			return FALSE;
	}
	uError=OVER_TIMES;
	return FALSE;
}
BOOL CFDBios::ReadTrack(CHAR ucTrack,CHAR ucHead,CHAR ucStartSector,
	CHAR ucnSectors,CHAR ucSectorBytesCode,CHAR ucLastSector,
	CHAR ucSectorL)
{
	for( int i=0;i<MAX_RETRY;i++)
	{
		if( Reset() )
		{
			if( GotoTrack(ucTrack) )
			{
				int tmp=GetSectorBytes(ucSectorBytesCode);
				StartDMA(READ_DISK,ucnSectors,tmp,pBuffer);//MAX_ALL_BYTES,pBuffer);
				EnableINT();
				if( SendCommand(0x042) )
				{
					
					CHAR tmp2= ucHead<<2;
					if( SendCommand(ucDiskNumber|tmp2) )
					{
						
						if( SendCommand(ucTrack) )
						{
							
							if( SendCommand(ucHead) )
							{
								
								if( SendCommand(ucStartSector) )
								{
									
									if( SendCommand(ucSectorBytesCode) )
									{
										
										if( SendCommand(ucLastSector) )
										{

											if( SendCommand(ucSectorL) )
											{
	
												if( SendCommand(0x0ff) )
												{
													if( IsComplete() )
													{
														if( GetErr(7) )
														{
															return TRUE;
														 }
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		if( !CanRetry() )
			return FALSE;
	}
	if( uError==OK )
		return TRUE;
	else
		return FALSE;
}

BOOL CFDBios::GetErr(int uCount)
{
	for(int i=0;i<uCount;i++)
	{
		if( IsReadReady() )
		{
			ucRetValueBuffer[i]=_inp(0x3f5);
		}
		else
		{
			return FALSE;
		}
	}
	TranResult(ucRetValueBuffer[0]);
	if(uError==OK)
		return  TRUE;
	GetErrInfo();
	return FALSE;
}

CFDTool::CFDTool()
{
	puBuffer =new char [MAX_BUFFER_SIZE+2];
	if(puBuffer==NULL)
	{
		uStatus=NO_ENOUGH_MEMORY;
		return;
	}
	Init(puBuffer,MAX_BUFFER_SIZE);
	uStatus=uError;
}

 CFDTool::~CFDTool()
{
	delete []puBuffer;
	ShutMotor();
}


int CFDTool::MakeKV3KKeyDisk(char *pszFileName)
{
	int fpKey;
	if( (fpKey=_open(pszFileName,O_RDONLY))==0xffff )
	{
		uStatus=OPEN_KEY_FILE_FAIL;
		return uStatus;
	}
  if(!Format1440(0x4a,0) )
      return FAIL;
	int i=0;
	for(i=0;i<6*4;i+=4)
	{
		puBuffer[i]=0x4a;
		puBuffer[i+1]=0;
		puBuffer[i+2]=0x6B;
		if(i==0)
			puBuffer[i+3]=6;
		else
			puBuffer[i+3]=2;
	}
	puBuffer[2]=0x43;
	if(Format(0x4a,0,2,4,0x54,0x6f))
	{
		if(_read(fpKey,puBuffer,0x176e)==0x176e)
		{
			_close(fpKey);
		}
		else
    {
    	_close(fpKey);
      uError=READ_KEY_FILE_FAIL;
      return FAIL;
    }
		if(WriteSector(0x4a,0,0x6b,1,
			2,0x6b,0x1b) )
		{
			for( i=0;i<8192;i++)
				puBuffer[i]='b';
			ReadSector(0x4a,0,0x6b,1,
				4,0X6b,0x1b);
			if(puBuffer[0x892]=='\0' && puBuffer[0x892]=='\6' &&
				puBuffer[0x892]=='\0')
			{
				uError=SUCCESS;
				return SUCCESS;
			}
			if( uError==EXCEPT_TERMINATE )
			{
				uError=SUCCESS;
				return SUCCESS;
			}
      uStatus=READ_SECOTOR_FAIL;
		}
		else
		{
      if( uError==EXCEPT_TERMINATE )
			{
				uError=SUCCESS;
				return SUCCESS;
			}
      uStatus=WRITE_SECOTOR_FAIL;
		}
	}
	else
	{
		uStatus=FORMAT_FAIL;
	}
	if(i>=3)
	{
		return uStatus;
	}
	return SUCCESS;
}

int CFDTool::MakeKV3KKeyDiskV70(char *pszFileName)
{
	int fpKey;
  if( (fpKey=_open(pszFileName,O_RDONLY))==0xffff )
	{
		uStatus=OPEN_KEY_FILE_FAIL;
		return uStatus;
	}
  if(!Format1440(0x4d,0) )
      return FAIL;
 int i=0;
	for(i=0;i<6*4;i+=4)
	{
		puBuffer[i]=0x4d;
		puBuffer[i+1]=0;
		puBuffer[i+2]=0x35;
		if(i==0)
			puBuffer[i+3]=6;
		else
			puBuffer[i+3]=2;
	}
	puBuffer[2]=0x35;
	if(Format(0x4d,0,2,4,0x54,0x6f))
	{

		if(_read(fpKey,puBuffer,0x176e)==0x176e)
		{
			_close(fpKey);
		}
    else
    {
			_close(fpKey);
      uError=READ_KEY_FILE_FAIL;
      return FAIL;
    }
		if(WriteSector(0x4d,0,0x6b,1,
			2,0x6b,0x1b) )
		{
			for( i=0;i<8192;i++)
				puBuffer[i]='b';
			ReadSector(0x4d,0,0x6b,1,
				4,0X6b,0x1b);
			if(puBuffer[0x892]=='\0' && puBuffer[0x892]=='\6' &&
				puBuffer[0x892]=='\0')
			{
				uError=SUCCESS;
				return SUCCESS;
			}
			if( uError==EXCEPT_TERMINATE )
			{
				uError=SUCCESS;
				return SUCCESS;
			}
      uStatus=READ_SECOTOR_FAIL;
		}
		else
		{
			if( uError==EXCEPT_TERMINATE )
			{
				uError=SUCCESS;
				return SUCCESS;
			}
      uStatus=WRITE_SECOTOR_FAIL;
		}
	}
	else
	{
		uStatus=FORMAT_FAIL;
	}

	if(i>=3)
	{
		return uStatus;
	}
	return SUCCESS;
}

int CFDTool::Analysice(PSECTOR_ID pID,int Count)
{
	int i,k;
	int id[MAX_SECTOR_ID];
	for(i=0;i<Count;i++)
	{
		id[i]=0;
	}
	id[0]=1;
	for(i=0;i<=Count;i++)
	{
		for(k=0;k<i;k++)
		{
			if(id[k]!=0 )
			{
				if(pID[i].ucTrack==pID[k].ucTrack &&
					 pID[i].ucHead==pID[k].ucHead &&
					 pID[i].ucSector==pID[k].ucSector &&
					 pID[i].ucBytesOfSectorCode==pID[k].ucBytesOfSectorCode )
				{
					id[k]=1;
				}
			}
		}
	}
	for(i=0;i<=Count;i++)
	{
		if(id[i]!=0)
		{
			while( id[Count]==0 )
				Count--;
			pID[i].ucTrack=pID[Count].ucTrack;
			pID[i].ucHead=pID[Count].ucHead;
			pID[i].ucSector=pID[Count].ucSector;
			pID[i].ucBytesOfSectorCode=pID[Count].ucBytesOfSectorCode;
			id[i]=1;
			id[Count]=0;
		}
	}
	return Count+1;
}

int CFDTool::ReadID(CHAR ucTrack,CHAR ucHead,
					int uReadTimes,PSECTOR_ID pID)
{
	int i;
	if(uReadTimes>MAX_SECTOR_ID )
	{
		uStatus=OVER_MAX_SECTOR_ID;
		return 0;
	}
	if( GotoTrack(ucTrack) )
	{
		for(i=0;i<uReadTimes;i++)
		{
			if( CFDBios::ReadID(ucHead) )
			{

				pID[i].ucTrack=ucRetValueBuffer[3];
				pID[i].ucHead=ucRetValueBuffer[4];
				pID[i].ucSector=ucRetValueBuffer[5];
				pID[i].ucBytesOfSectorCode=ucRetValueBuffer[6];
			}
		}
		uStatus=SUCCESS;
		return i;
	}
	else
	{
		uStatus=CANNT_FIND_TRACK;
	}
	return 0;
}

int CFDTool::ReadKV3KID(PSECTOR_ID p)
{
	 return ReadID(0x4a,0,8,p);
}

int CFDTool::ReadRiSingID(PSECTOR_ID p)
{
	 return ReadID(0x4f,0,30,p);
}

int CFDTool::MakeRiSingKeyDisk2002()
{
	int i;
	for(i=0;i<9*4;i+=4)
	{
		puBuffer[i]=0x4f;
		puBuffer[i+1]=1;
		puBuffer[i+2]=3;//+(i/4);
		puBuffer[i+3]=2;
	}
	if( Format(0x4f,1,9,3,0x54,0xf6) )
	{
		puBuffer[0]='S';
		puBuffer[1]='u';
		puBuffer[2]='N';
		for( i=3;i<1024;i++)
			puBuffer[i]=rand();
    if(!ReadSector(0x4F,1,0x3,1,2,0x3,0x1b) )
    {
      if(uError==DATA_CRC )
      {
        return SUCCESS;
      }
			else
      {
        uStatus=NO_CRC;
      }
    }
    else
    {
      uStatus=READ_SECTOR_FAIL;
    }
	}
	else
	{
		uStatus=FORMAT_FAIL;
	}
	return uStatus;

}

int CFDTool::MakeRiSingKeyDiskAll()
{
	int i,all;
  BOOL Sucess=FALSE;
	for (all=0;all<3;all++)
	{
		for(int head=0;head<2;head++)
		{
			for(i=0;i<9*4;i+=4)
			{
				puBuffer[i]=0x4F+all;
				puBuffer[i+1]=head;
				puBuffer[i+2]=3;//+(i/4);
				puBuffer[i+3]=2;
			}
      if( Format(0x4F+all,head,9,3,0x54,0xf6) )
      {
        puBuffer[0]='S';
        puBuffer[1]='u';
        puBuffer[2]='N';
        for( i=3;i<1024;i++)
          puBuffer[i]=rand();
        if(!ReadSector(0x4F+all,head,0x3,1,2,0x3,0x1b) )
        {
          if(uError==DATA_CRC||uError==EXCEPT_TERMINATE)
          {
            Sucess=TRUE;
            continue;
          }
          else
          {
            uStatus=NO_CRC;
          }
        }
        else
        {
          uStatus=READ_SECTOR_FAIL;
        }
      }
      else
      {
        uStatus=FORMAT_FAIL;
      }
    }
  }
  if(Sucess)
    return SUCCESS;
  return uStatus;
}

int CFDTool::MakeRiSingKeyDisk()
{

	int i;
	for(i=0;i<9*4;i+=4)
	{
		puBuffer[i]=0x4f;
		puBuffer[i+1]=0;
		puBuffer[i+2]=3;//+(i/4);
		puBuffer[i+3]=2;
	}
	if( Format(0x4f,0,9,3,0x54,0xf6) )
	{
		puBuffer[0]='S';
		puBuffer[1]='u';
		puBuffer[2]='N';
		for( i=3;i<1024;i++)
			puBuffer[i]=rand();
   if(!ReadSector(0x4F,0,0x3,1,2,0x3,0x1b) )
    {
      if(uError==DATA_CRC )
      {
        return SUCCESS;
      }
      else
      {
        uStatus=NO_CRC;
      }
    }
    else
    {
      uStatus=READ_SECTOR_FAIL;
    }
	}
	else
	{
		uStatus=FORMAT_FAIL;
	}
	return uStatus;
}

int CFDTool::Format1440(CHAR ucTrack,CHAR ucHead)
{
  int i;
  for(i=0;i<18*4;i+=4)
	{
		puBuffer[i]=ucTrack;
		puBuffer[i+1]=ucHead;
		puBuffer[i+2]=i+1;
    puBuffer[i+3]=2;
	}
	if( Format(ucTrack,ucHead,18,2,0x54,0xf6) )
  {
		uError=SUCCESS;
    return uError;
  }
  return FAIL;
}

void CFDTool::DisplayError(char *psErr)
{
	CFDBios::DisplayError(psErr);
	if( uError!=UNKNOWN_ERROR )
			return ;
	switch (uStatus)
	{
		case MAX_BUFFER_BYTES					 :sprintf(psErr,"max buffer bytes\n"); break;
		case OPEN_KEY_FILE_FAIL :sprintf(psErr,"No found file:\"jmkv3k10.bin\"\n"); break;
		case READ_SECOTOR_FAIL		 :sprintf(psErr,"Read secotor fail\n"); break;
		case WRITE_SECOTOR_FAIL	 :sprintf(psErr,"Write secotor fail \n"); break;
		case FORMAT_FAIL 		 :sprintf(psErr,"Format fail \n"); break;
		case SUCCESS :sprintf(psErr,"Successful\n"); break;
		case CANNT_FIND_TRACK 		 :sprintf(psErr,"Can't find track\n"); break;
		case NO_CRC		 :sprintf(psErr,"No CRC\n"); break;
		case READ_SECTOR_FAIL				 :sprintf(psErr,"Read sector fail\n"); break;
		case WRITE_SECTOR_FAIL 	 :sprintf(psErr,"Write sector fail \n"); break;
		case OVER_MAX_SECTOR_ID:sprintf(psErr,"Over max sector id\n"); break;
    case READ_KEY_FILE_FAIL:sprintf(psErr,"Read key file fail\n"); break;
    case FAIL:sprintf(psErr,"Fail\n"); break;
		default					: uStatus=UNKNOWN_ERROR;sprintf(psErr,"Unknow Error\n"); break;
	}
}

BOOL CFDBios::ExistDisk()
{

	if(_inp(0x3f7)&0x80)
	{
		Delay(DELAY_EXIST_DISK);
		if(_inp(0x3f7)&0x80)
		{
			Delay(DELAY_EXIST_DISK);
			if(_inp(0x3f7)&0x80)
				return FALSE;
		}
	}
	return TRUE;
/*  Delay(DELAY_EXIST_DISK);
	if(!(_inp(0x3f7)&0x80))
	{
		return TRUE;
	}
	*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -