📄 sys622.c
字号:
/***两系统文件目录表的前十一个字符***/
#define FDT0 "IO SYS"
#define FDT1 "MSDOS SYS"
/***在库文件中三个系统文件的长度,
即制作库文件时所采用文件的大小,下面boot
数组的大小即引用它们中间的最大值。***/
#define FLIO 40774L
#define FLMS 38138L
#define FLCO 54645L
#define OK "===>[OK]"
/***1.44M软盘文件目录表开始扇区及所占扇区***/
#define ST_M144 0x13
#define DL_M144 0x0e
#include <stdio.h>
#include <stdlib.h>
#include <dir.h>
#include <dos.h>
#include <bios.h>
#include <string.h>
char DiskFree();
void ErrMsg();/*错误信息*/
void main(int argc,char *argv[])
{FILE *fi,*fo;union REGS r;
unsigned int result,i,c,j,next,m=0;
unsigned char boot[FLCO],*bootp=&boot[0];
char *sys[]={"A:\\IO.SYS","A:\\MSDOS.SYS",
"A:\\COMMAND.COM"},sysa[]={7,7,1},disk;
unsigned long sysl[]={FLIO,FLMS,FLCO};
unsigned long fsys[]={FLIO+FLMS+FLCO,
FLMS+FLCO,FLCO};
char lib[80],*dat="LIB";
puts("");puts("Convert disk A or B to a MS-DOS 6.22 startup disk.");
puts("Written by Tu Yaohua,in Nanchang.");puts("");
disk=argv[1][0]|32;
if(argc!=2||argv[1][1]!=':'||argv[1][2]!='\0'
||disk!='a'&&disk!='b')
{puts("Usage:");
printf(" %s A:|B:\r\n",argv[0]);
puts("E.g:");
printf(" %s A:",argv[0]);
exit(1);
}
if(disk!='a')
for(i=0;i<3;i++)sys[i][0]=disk;
/***为防止系统盘或者用于备份的系统文件
被破坏,需要检查文件存在否***/
for(i=0;i<3;i++)
if(fopen(sys[i],"rb"))
ErrMsg(2);
/***检查磁盘空间***/
switch(DiskFree(disk-'a'))
{case 1:ErrMsg(0);
case 2:ErrMsg(3);
}
/***系统库文件是否存在***/
strcpy(lib,argv[0]);
lib[strlen(argv[0])-3]='\0';
strcat(lib,dat);
if((fi=fopen(lib,"rb"))==NULL)
ErrMsg(4);
/***读出引导扇区的信息并写入软盘***/
fseek(fi,-512L,2);
fread(&boot,1,512L,fi);
if(abswrite(disk-'a', 1, 0, &boot))
ErrMsg(1);
/***从库文件中读出三个必须文件并传送***/
for(i=0;i<3;i++)
{ fseek(fi,-(fsys[i]+512L),2);
fread(&boot,1,sysl[i]+0L,fi);
printf("Create %s file ",sys[i]);
if((fo=fopen(sys[i],"wb"))==NULL)
ErrMsg(5);
if(fwrite(&boot,1,sysl[i]+0L,fo)!=sysl[i])
ErrMsg(5);
else puts(OK);
fclose(fo);
/***中断调用设置文件的属性***/
r.h.ah=0x43;r.x.dx=(int)&sys[i][0];
r.h.al=1;r.x.cx=sysa[i];
intdos(&r,&r);
}
/***修改目录扇区中的系统文件的目录项位置***/
if(absread(disk-'a', DL_M144,ST_M144,&boot))
ErrMsg(0);
for(i=1;i<DL_M144*512/32;i++)
{if(!strncmp(bootp+i*32,FDT0,11))next=0;
else if(!strncmp(bootp+i*32,FDT1,11))
{if(i==1)m++;else next=1;}
else next=2;
if(next==0||next==1)
{ m++;
for(j=0;j<32;j++)
{ c=boot[j+next*32];
boot[j+next*32]=*(bootp+i*32+j);
*(bootp+i*32+j)=c;
}}
if(m==2)break;
}
/***修改后的结果回写***/
if(abswrite(disk-'a', DL_M144, ST_M144, &boot))
ErrMsg(1);
puts("Startup disk already finish!");
exit(1);
}
char DiskFree(int d)
{struct dfree disk;
unsigned cio,cms,cco,unc,needc,yio,yms,yco;
getdfree(d+1, &disk);
if (disk.df_sclus == 0xFFFF)return(1);
unc=disk.df_avail*disk.df_sclus;
cio=FLIO/512; yio=FLIO%512;
if(yio)cio+=1;
cms=FLMS/512; yms=FLMS%512;
if(yms)cms+=1;
cco=FLCO/512; yco=FLCO%512;
if(yco)cco+=1;
needc=cio+cms+cco;
if(needc<unc)return(0);
else return(2);
}
void ErrMsg(int c)
{ switch(c)
{case 0:puts("Read disk A error!");break;
case 1:puts("Write disk A error!");break;
case 2:puts("System file already exist!");break;
case 3:puts("Not enough disk space to load system file!");break;
case 4:puts("Read system file library failure!");break;
case 5:puts("failure...");
}
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -