📄 fdbios.cpp
字号:
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 + -