📄 floppy.pp
字号:
#line 3 "partion.h"
typedef struct
{
char Head;
char Sector;
char Cylinder;
}CHS;
typedef struct
{
int SectorBytes;
char SectorsPerCluster;
int ReservedSectors;
char nbrFat;
int RootEntry;
int TotalSectors;
char Media;
int SectorsPerFAT;
int SectorsPerTrack;
int Heads;
long hiddenSectors;
long BigTotalSectors;
}BPB_FAT;
typedef struct
{
char FileName[8];
char ExtendName[3];
char FileAttribute;
char Reserved[10];
int time;
int date;
int firstcluster;
long filesize;
}RootDirectory;
#line 4 "floppy.h"
int RecalFloppy(void);
int SeekCylInFloppy(int cylinder);
int WriteDataInFloppy(int logicAddr,char *data,int datalength);
int ReadDataFromFloppy(int logicAddr,char *data,int datalength);
int GetBiosParameterBlock(BPB_FAT *bpb);
#line 3 "gm82c765b.h"
int Recalibrate(void);
int ReadID(void);
int Seek(int newcylinder);
int SenseDriverStatus(void);
int SenseInterrupt(void);
int WriteData(int cylinder,int head,int sector,int numberofsector,
char *data,int datalength );
int ReadData(int cylinder,int head,int sector,int numberofsector,
char *data,int datalength );
#line 4 "global.h"
extern unsigned char databuffer[1024];
extern unsigned char databuffer1[512];
extern BPB_FAT bpb;
extern int curcylinder;
extern int filecounts;
extern int curFlashPage;
extern int curFlashOffset;
#line 6 "floppy.c"
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 + -