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

📄 dosfmt.c

📁 ertfs文件系统里面既有完整ucos程序
💻 C
字号:
//< dosfmt.c >
#include "common.h"
#include "smil.h"
#include "dosfmt.h"
/***************************************************************************/
int Logical$Format(void);
/***************************************************************************/
static int Set$FmtParameter(void);
static void Set$MBSectData(void);
static void Set$PBSectData(void);
/***************************************************************************/
extern int Check$Parameter(unsigned short *,unsigned char *,unsigned char *);
extern int Media$OneSectWriteStart(unsigned long,unsigned char *);
extern int Media$OneSectWriteNext(unsigned char *);
extern int Media$OneSectWriteFlush(void);
extern void StringCopy(char *, char *, int);
extern int StringCmp(char *, char *, int);
/***************************************************************************/
static union BOOTSECT Boot;
static unsigned short HostCylinders;
static unsigned char HostHeads;
static unsigned char HostSectors;
static unsigned long HostAllSectors;
static unsigned short ClusterSize;
static unsigned short DirEntries;
static unsigned short HiddenSectors;
static unsigned long PartitionAll;
static unsigned char buf[SECTSIZE];
/***************************************************************************/
extern struct SSFDCTYPE Ssfdc;
/***************************************************************************
DOS Format Controll Subroutine
***************************************************************************/
int Logical$Format(void)
{
	unsigned int i,j;
	unsigned char buf[SECTSIZE];
	if(Set$FmtParameter()) return(ERROR);
	/* MasterBootSector */
	for(i=0;i<SECTSIZE;i++) Boot.Buffer[i]=0x00;
	Set$MBSectData();
	if(Media$OneSectWriteStart(0L,Boot.Buffer))
		return(ERROR);
	/* Reserved Area */
	for(i=0;i<SECTSIZE;i++) buf[i]=0x00;
	for(i=1;i<HiddenSectors;i++)
		if(Media$OneSectWriteNext(buf))
			return(ERROR);
	/* PartitionBootSector */
	for(i=0;i<SECTSIZE;i++) Boot.Buffer[i]=0x00;
		Set$PBSectData();
	if(Media$OneSectWriteNext(Boot.Buffer))
		return(ERROR);
	/* Reserved Sector */
	/*== not use ==*/
	/* FAT Area */
	for(i=0;i<Boot.PBSect.NumFATs;i++) {
		buf[0]=0xF8; buf[1]=0xFF; buf[2]=0xFF;
		if(StringCmp((char *)Boot.PBSect.FileSysType,"FAT12 ",8))
			buf[3]=0xFF;
		if(Media$OneSectWriteNext(buf))
			return(ERROR);
		buf[0]=0x00; buf[1]=0x00; buf[2]=0x00; buf[3]=0x00;
		for(j=1;j<Boot.PBSect.NumFATSectors;j++)
			if(Media$OneSectWriteNext(buf))
				return(ERROR);
	}
	/* Directory Entry */
	for(i=0;i<(Boot.PBSect.RootDirEntries*32)/SECTSIZE;i++)
		if(Media$OneSectWriteNext(buf))
			return(ERROR);
	/* Format End */
	if(Media$OneSectWriteFlush()) return(ERROR);
		return(SUCCESS);
}
/***************************************************************************
Format Controll Parameter Set Subroutine
***************************************************************************/
int Set$FmtParameter(void)
{
	if(Check$Parameter(&HostCylinders,&HostHeads,&HostSectors))
		return(ERROR);
	HostAllSectors=(unsigned long)HostCylinders*(unsigned long)HostHeads*(unsigned long)HostSectors;
	switch(Ssfdc.Model) {
	case SSFDC1MB:
		ClusterSize = 4; HiddenSectors = 13L; break;
	case SSFDC2MB:
		ClusterSize = 4; HiddenSectors = 11L; break;
	case SSFDC4MB:
		ClusterSize = 8; HiddenSectors = 27L; break;
	case SSFDC8MB:
		ClusterSize = 8; HiddenSectors = 25L; break;
	case SSFDC16MB:
		ClusterSize = 16; HiddenSectors = 41L; break;
	case SSFDC32MB:
		ClusterSize = 16; HiddenSectors = 35L; break;
	case SSFDC64MB:
		ClusterSize = 16; HiddenSectors = 55L; break;
	case SSFDC128MB:
		ClusterSize = 16; HiddenSectors = 47L; break;
	default:
		return(ERROR);
	}
	ClusterSize *= K_BYTE/SECTSIZE;
	DirEntries = 256;
	PartitionAll = HostAllSectors-HiddenSectors;
	return(SUCCESS);
}
/***************************************************************************
Master Boot Sector / Partition Boot Sector Write Subroutine
***************************************************************************/
void Set$MBSectData(void)
{
	Boot.MBSect.P1.x86boot = 0x80;
	Boot.MBSect.P1.StartHead = (char)(HiddenSectors/HostSectors);
	Boot.MBSect.P1.StartSector = (char)((HiddenSectors%HostSectors)+1);
	Boot.MBSect.P1.StartCylinder = 0x00;
	if(PartitionAll/ClusterSize>MAX_CLUSTERS12)
		Boot.MBSect.P1.PartitionType = 0x06;
	else Boot.MBSect.P1.PartitionType = 0x01;
	Boot.MBSect.P1.EndHead = (unsigned char)(HostHeads-1);
	Boot.MBSect.P1.EndSector = (unsigned char)((((HostCylinders-1)/0x04)&0xC0)+HostSectors);
	Boot.MBSect.P1.EndCylinder = (unsigned char)((HostCylinders-1)&0xFF);
	Boot.MBSect.P1.LogStartSector = (long)HiddenSectors;
	Boot.MBSect.P1.NumSectors = HostAllSectors-HiddenSectors;
	Boot.MBSect.Signature = 0xAA55;
}
/***************************************************************************/
void Set$PBSectData(void)
{
	Boot.PBSect.JmpCode[0]=0xE9;
	Boot.PBSect.JmpCode[1]=0x00;
	Boot.PBSect.JmpCode[2]=0x00;
	StringCopy((char *)Boot.PBSect.OEMName," ",8);
	Boot.PBSect.BytesPerSector = SECTSIZE;
	Boot.PBSect.SectorsPerCluster = (unsigned char)ClusterSize;
	Boot.PBSect.ReservedSectors = 0x0001;
	Boot.PBSect.NumFATs = 0x02;
	Boot.PBSect.RootDirEntries = DirEntries;
	if(HostAllSectors>0xFFFFL)
		Boot.PBSect.TotalSectors = 0x0000;
	else Boot.PBSect.TotalSectors = (unsigned short)(HostAllSectors-HiddenSectors);
	Boot.PBSect.MediaIDByte = 0xF8;
	if(PartitionAll/ClusterSize>MAX_CLUSTERS12)
		Boot.PBSect.NumFATSectors = (short)(((PartitionAll/ClusterSize)*4)/K_BYTE+1);
	else Boot.PBSect.NumFATSectors = (short)(((PartitionAll/ClusterSize)*3)/K_BYTE+1);
	Boot.PBSect.SectorsPerTrack = HostSectors;
	Boot.PBSect.NumHeads = HostHeads;
	Boot.PBSect.HiddenSectors = HiddenSectors;
	if(HostAllSectors>0xFFFFL)
		Boot.PBSect.HugeSectors = HostAllSectors-HiddenSectors;
	else Boot.PBSect.HugeSectors = 0x00000000L;
	StringCopy((char *)Boot.PBSect.VolumeLabel,"\0\0\0\0\0\0\0\0\0\0\0",11);
	if(PartitionAll/ClusterSize>MAX_CLUSTERS12)
		StringCopy((char *)Boot.PBSect.FileSysType,"FAT16 ",8);
	else StringCopy((char *)Boot.PBSect.FileSysType,"FAT12 ",8);
	Boot.PBSect.Signature = 0xAA55;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -