home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************
-
- Programm zum Formatieren von Disketten
-
- wr 18.04.90-02.06.90
-
- zum Aufruf als TTP oder von der Okami-Shell
-
- Änderungen:
-
- 20.10.90 Volume Label (-l)
-
- **********************************************************************/
-
- #include <stdio.h>
- #include <osbind.h>
- #include <ctype.h>
-
- #define PRGNAME "format" /* eigentlich: argv[0] */
- #define FLAG_NOBOOT (-99) /* Flag für keinen Bootsektor anlegen */
- #define FLAG_NOFMT (-987) /* Flag für nur Bootsektor anlegen */
- #define MAGIC 0x87654321L /* Magische Zahl, hexhexhex */
- #define SECSIZE 512 /* Bytes pro Sektor */
- #define FMTBUFSIZE 0x3000 /* Formatierpuffer */
-
- /* VT52-Steuercodes */
- #define C_SAVE "\033j"
- #define C_RESTORE "\033k"
-
-
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- int devno; /* Laufwerksnummer: 0 A:, 1 B: */
- int spt; /* Sektoren pro Track */
- int Sides; /* Anzahl Seiten (1/2) */
- int Tracks; /* Anzahl Tracks */
- int interlv; /* Interleave-Faktor */
- int virgin; /* Virgin-Wort für Sektoren */
- long SerNo; /* Seriennummer für Bootsektor */
- int Exec; /* Bootsektor ausführbar */
- int Quiet; /* Flag Sicherheitsabfragen: 0 ja,1 nein */
- char *VolLbl; /* Diskettenname oder NULL */
-
- int i;
-
- /* Standardwerte initialisieren */
- devno = 0; /* Laufwerk A: */
- spt = 9; /* 9 Sektoren pro Track */
- Sides = 2; /* 2 Seiten pro Diskette */
- Tracks = 80; /* 79 Tracks pro Diskette */
- interlv = 1; /* Kein Interleave */
- virgin = 0xe5e5; /* Normalerweise immer */
- SerNo = 0x01000001L; /* zufällige Seriennummer */
- Exec = 0; /* nicht ausführbar */
- Quiet = 0; /* mit Sicherheitsabfragen */
- VolLbl = NULL; /* kein Diskettenname */
-
- if (argc==1) /* keine Parameter angegeben */
- {
- Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet);
- exit(0);
- }
-
- /* Parameter scannen */
- for (i=1;i<argc;i++)
- {
- if (argv[i][0]=='-') /* Flag */
- switch(argv[i][1])
- {
- case 's': /* Sektoren pro Track */
- spt=atoi(argv[i][2]);
- break;
- case 't': /* Tracks pro Disk */
- Tracks=atoi(argv[i][2]);
- break;
- case '1': /* Einseitig */
- Sides=1;
- break;
- case 'i': /* Interleaf-Faktor */
- interlv=atoi(argv[i][2]);
- break;
- case 'v': /* Virgin-Wort */
- virgin=atoi(argv[i][2]);
- break;
- case 'n': /* Seriennummer */
- SerNo=atol(argv[i][2]);
- break;
- case 'N': /* kein Bootsektor */
- Exec=FLAG_NOBOOT;
- break;
- case 'B': /* nur Bootsektor */
- Exec=FLAG_NOFMT;
- break;
- case 'x': /* Bootsektor ausführbar*/
- Exec=1;
- break;
- case 'q': /* keine Sicherheitsabfragen */
- Quiet=1;
- break;
- case 'l': /* Diskettenname */
- VolLbl= &(argv[i][2]);
- break;
- default: /* Falsches Flag */
- Usage(PRGNAME);
- }
- else /* Laufwerksnummer */
- devno=tolower(argv[i][0])-'a';
-
- } /* for */
-
- Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl);
-
- exit(0);
- }
-
-
- Format(devno,spt,Sides,Tracks,interlv,virgin,SerNo,Exec,Quiet,VolLbl)
- int devno,spt,interlv,virgin,Exec,Quiet;
- register int Tracks,Sides;
- long SerNo;
- char *VolLbl;
- {
- register int i,j;
- register char *Buf;
-
- if (Exec!=FLAG_NOFMT)
- {
-
- if (!Quiet)
- {
-
- /* Parameter checken */
- if (devno!=0 && devno!=1)
- {
- printf("You are about to format drive %c.\n",(char)devno+'A');
- YesOrNo();
- }
-
- if (virgin!=0xe5e5)
- {
- printf("You are about to format with a virgin of 0x%x.\n",virgin);
- YesOrNo();
- }
-
-
- /* Letzte Warnung */
- printf(
- "LAST CHANCE TO STOP:\nYou are about to format the disk in drive %c.\n",
- (char)devno+'A');
-
- YesOrNo();
-
- } /* if (!Quiet) */
-
- /* Los gehts */
-
- /* Speicher für Rückgabewert */
- Buf=calloc(FMTBUFSIZE,sizeof(int));
- if (Buf==NULL)
- {
- fprintf("%s: Out of memory (need %d bytes)\n",PRGNAME,
- FMTBUFSIZE*sizeof(int));
- exit(0);
- }
-
- /* *** FORMATIEREN *** */
-
- printf("Formatting disk %c, %d side(s), %d tracks, %d sec/track\n%s",
- (char)devno+'A',Sides,Tracks,spt,C_SAVE);
-
- for (i=Tracks-1;i>=0;i--)
- for (j=0;j<Sides;j++)
- {
- printf("%s%sSide %d Track 0x%02x",C_RESTORE,C_SAVE,j,i);
- fflush(stdout);
- Flopfmt((int *)Buf,0L,devno,spt,i,j,interlv,MAGIC,
- i>1 ? virgin : 0);
- /* (Sektor 0 und 1 nullen wegen FAT) */
- }
-
- free(Buf);
- fputs(C_RESTORE,stdout);
-
- } /* if (Formatieren) */
-
- /* *** BOOTSEKTOR *** */
-
- if (Exec!=FLAG_NOBOOT)
- {
- printf("Creating %sexecutable boot sector",Exec ? "" : "non-");
- fflush(stdout);
- Buf=malloc(SECSIZE);
- Protobt(Buf,SerNo,(Sides-1)+(((Tracks/40)-1)<<1),Exec);
- Flopwr(Buf,0L,devno,1,0,0,1);
- free(Buf);
- }
-
- fputc('\n',stdout);
-
- /* Diskettenname erzeugen */
- if (VolLbl!=NULL && *VolLbl!='\0')
- {
- int Fd;
- char Path[80+1];
-
- printf("Creating volume label\n");
- sprintf(Path,"%c:\\%s",devno+'A',VolLbl);
- Fd = Fcreate(Path,0);
- if (Fd<0)
- printf("*** Error: cannot create volume label\n");
- else
- {
- Fclose(Fd);
- Fattrib(Path,1,1<<3);
- }
- }
- }
-
-
- YesOrNo()
- {
- register int c; /* Warum register? Warum nicht? */
-
- printf("Do you really want to do that? (y or n)\n");
- c=fgetc(stdin);
-
- if (tolower(c)!='y')
- exit(0); /* ja, es IST miserabler Stil, aber es ist einfach */
-
- }
-
-
- Usage(PrgName)
- char PrgName[];
- {
- fprintf(stderr,
- "Usage: %s [-s(Sec/Trk)] [-t(Trk/Dsk)] [-1] [-i(interlv)] \\\n%s",PrgName,
- " [-v(virgin)] [-n(SerNo)] [-(N|B)] [-x] [-q] [-l(VolLbl)] [Drive]");
- fprintf(stderr,"\nDefaults: -s9 -t80 -i1 -v0xE5E5 A:\n\n");
- fprintf(stderr,"-1: Format Single Sided\n%s\n%s\n%s\n%s\n%s\n%s\n",
- "-N: No Boot Sector",
- "-B: Boot Sector only",
- "-x: Executable Boot Sector",
- "-q: No security requests",
- "-l: Volume Label (default: none)",
- "Drive: A or B (floppy disk drives only, no hard disks!)");
-
- exit(0);
- }
-
-