📄 floppy.c
字号:
#include "floppy.h"
#include "gm82c765b.h"
#include "partion.h"
#include "global.h"
/************************************************************/
int RecalFloppy(void)
{
int i;
i=Recalibrate();
for(i=0;i<50;++i)
Delay4mS();
i=SenseInterrupt();
curcylinder=0;
return i;
}
/************************************************************/
/************************************************************/
int SeekCylInFloppy(int cylinder)
{
int i;
i=Seek(cylinder);
for(i=0;i<50;++i)
Delay4mS();
i=SenseInterrupt();
curcylinder=cylinder;
return i;
}
/*************************************************************/
int WriteDataInFloppy(int logicAddr,char *data,int datalength)
{
CHS chsaddr;
LogicAddrToCHSAddr(logicAddr,&chsaddr);
if(chsaddr.Cylinder!=curcylinder)
{
SeekCylInFloppy(chsaddr.Cylinder);
}
return WriteData(chsaddr.Cylinder,chsaddr.Head,chsaddr.Sector,2,databuffer,datalength);
}
/**************************************************************/
int ReadDataFromFloppy(int logicAddr,char *data,int datalength)
{
CHS chsaddr;
LogicAddrToCHSAddr(logicAddr,&chsaddr);
if(chsaddr.Cylinder!=curcylinder)
{
SeekCylInFloppy(chsaddr.Cylinder);
}
return ReadData(chsaddr.Cylinder,chsaddr.Head,chsaddr.Sector,2,databuffer,datalength);
}
/***************************************************************/
/************************************************************/
int GetBiosParameterBlock(BPB_FAT *bpb)
{
int i=0;
RecalFloppy();
if(ReadData(0,0,1,2,databuffer,512))
return -2;
if(databuffer[255]==0x55AA)
{
ParseBiosParmeterBlock(databuffer,bpb);
return 0;
}
else
{
return -1;
}
}
/**********************************************************/
void ParseBiosParmeterBlock(char *data,BPB_FAT *bpb)
{
bpb->SectorBytes=(data[5]&0xff)+(data[6]&0xff00);
bpb->SectorsPerCluster=(data[6]&0xff);
bpb->ReservedSectors=((data[7]&0xff00)>>8)+((data[7]&0xff)<<8);
bpb->nbrFat=(data[8]&0xff00)>>8;
bpb->RootEntry=(data[8]&0xff)+(data[9]&0xff00);
bpb->TotalSectors=(data[9]&0xff)+(data[10]&0xff00);
bpb->Media=data[10]&0xff;
bpb->SectorsPerFAT=((data[11]&0xff00)>>8)+((data[11]&0xff)<<8);
bpb->SectorsPerTrack=((data[12]&0xff00)>>8)+((data[12]&0xff)<<8);
bpb->Heads=((data[13]&0xff00)>>8)+((data[13]&0xff)<<8);
bpb->hiddenSectors=0;
bpb->BigTotalSectors=0;
}
/*********************************************************/
inline void LogicAddrToCHSAddr(int logicaddr, CHS *chsaddr)
{
chsaddr->Cylinder=logicaddr/(bpb.SectorsPerTrack*bpb.Heads);
chsaddr->Sector=(logicaddr%bpb.SectorsPerTrack)+1;
chsaddr->Head=(logicaddr-((chsaddr->Cylinder)*bpb.SectorsPerTrack*bpb.Heads))/bpb.SectorsPerTrack;
}
inline int GetCFClusterSize(void)
{
return bpb.SectorsPerCluster;
}
inline int GetDataLogicBlockAddr(void)
{
return bpb.hiddenSectors+bpb.ReservedSectors+bpb.nbrFat*bpb.SectorsPerFAT+(bpb.RootEntry*32+511)/512;
}
inline int GetFat1LogicBlockAddr(void)
{
return bpb.hiddenSectors+bpb.ReservedSectors;
}
inline int GetFat2LogicBlockAddr(void)
{
return bpb.hiddenSectors+bpb.ReservedSectors+bpb.SectorsPerFAT;
}
inline int GetRootDirLogicBlockAddr(void)
{
return bpb.hiddenSectors+bpb.ReservedSectors+bpb.nbrFat*bpb.SectorsPerFAT;
}
/*********************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -