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

📄 floppy.c

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