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

📄 floppy.pp

📁 基于dsp的软驱控制源程序
💻 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 + -