📄 dosfmt.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 + -