home *** CD-ROM | disk | FTP | other *** search
- /* ------------------------------------------------------ */
- /* FORMAT.C */
- /* PC-Controllerprogrammierung in Turbo C */
- /* (c) 1990 Ulrich Schmitz & TOOLBOX */
- /* ------------------------------------------------------ */
- #include<dos.h>
- #include<stdio.h>
- #include<ctype.h>
- #include<graphics.h>
-
- typedef unsigned char byte; /* neuer Variablentyp BYTE */
- static int katastrophe;
-
- /* beschreibt das Format eines Sektors */
- struct FormatDes { byte Spur,
- Seite,
- Sektor,
- Laenge; };
-
- #ifndef MK_FP
- #define MK_FP(seg,ofs)((void far *)((unsigned long)(seg)<<16|ofs))
- #define peekb(seg, ofs) *((char far *) MK_FP(seg, ofs))
- #endif
-
- /* ****************************************************** */
- /* RESET aller angeschlossenen Diskettenlaufwerke */
- /* ****************************************************** */
-
- byte ResetDisk()
- {
- union REGS Register;
- Register.h.ah = 0;
- int86(0x13, &Register, &Register);
- return(Register.h.ah);
- }
-
- /* ****************************************************** */
- /* Fehlererkennung und Bewertung */
- /* ****************************************************** */
-
- byte WDS(Status)
- byte Status;
- {
- if (Status) {
- printf("\n"); gotoxy(5,22);
- printf("Fehler: ");
- gotoxy(20,22);
- katastrophe++;
- switch (Status) {
- case 0x01 :
- printf("Nicht erlaubte Funktionsnummer ");
- break;
- case 0x02 :
- printf("Addreß-Markierung nicht gefunden ");
- break;
- case 0x03 :
- printf("Diskette ist schreibgeschützt ");
- break;
- case 0x04 :
- printf("Sektor nicht gefunden ");
- break;
- case 0x06 :
- printf("Diskette wurde gewechselt ! ");
- break;
- case 0x08 :
- printf("DMA-Überlauf ");
- break;
- case 0x09 :
- printf("Datenübertragung über Segmentgrenze ");
- break;
- case 0x10 :
- printf("Lesefehler ");
- break;
- case 0x20 :
- printf("Fehler des Disk-Controllers ");
- break;
- case 0x40 :
- printf("Spur nicht gefunden ");
- break;
- case 0x80 :
- printf("Timeout-Fehler ");
- break;
- case 0xff :
- printf("Unzulässige Parameter ! ");
- break;
- default :
- printf("Toll!, Fehler Nr.%d unbekannt! ",Status);
- }
- delay(5000); /* wartet 3-4 Sekunden */
- ResetDisk();
- }
- return(!Status);
- }
-
- /* ****************************************************** */
- /* FORMAT: formatiert eine oder mehrere Spuren */
- /* Eingabe: s.u. */
- /* Ausgabe: Fehlerstatus */
- /* ****************************************************** */
-
- byte Format(Laufwerk, Seite, Spur, Anzahl, Bytes)
- byte Laufwerk, /* 0 oder 1 */
- Seite, /* 0 oder 1 */
- Spur, /* 0 bis 39 */
- Anzahl, /* 9 (AT-Laufwerk 15), Sektoren pro Track */
- Bytes; /* 0=128 1=256 2=512 3=1024 Bytes */
-
- {
- union REGS Register, Aus_Reg;
- struct SREGS segreg;
- struct FormatDes Formate[15];
- byte i;
-
- /* Format festlegen */
-
- Register.h.ah = 0x17; /* Funktion 'Format festlegen' */
- Register.h.al = 2; /* Drive Typ
- 01 -> 320/360 KByte
- 02 -> 360 KByte in 1.2 MByte Drive
- 03 -> 1.2 MByte in 1.2 MByte Drive
- 04 -> 720 KByte in 720 KByte Drive */
-
- Register.h.dl = 0; /* Ziel - Drive (0 oder 1) */
- int86(0x13, &Register, &Aus_Reg);
-
- /* Spur formatieren */
-
- for(i = 1; i < Anzahl; i++) {
- Formate[i].Spur = Spur;
- Formate[i].Seite = Seite;
- Formate[i].Sektor = i;
- Formate[i].Laenge = Bytes;
- }
-
- Register.h.ah = 5; /* Funktion formatieren */
- Register.h.al = Anzahl;
- Register.h.dh = Seite;
- Register.h.dl = Laufwerk;
- Register.h.ch = Spur;
- Register.x.bx = (unsigned int) Formate;
- int86(0x13, &Register, &Aus_Reg);
- return(Aus_Reg.h.ah);
- }
-
-
- main()
- {
- static byte Status, Laufwerk=0, Seite=0, Spur, Anzahl=9;
- static int i, Bytes, X_Bytes, start, ende,
- erste_Spur, letzte_Spur;
-
- clrscr();
- ResetDisk();
-
- printf("Bitte Seite angeben (0/1/2) :");
- scanf("%d", &Seite);
-
- gotoxy(0,3);
- printf("Von Spur (0-39):");
- scanf("%d",&erste_Spur);
-
- gotoxy(20,2);
- printf("bis Spur (0-39):");
- scanf("%d",&letzte_Spur);
-
- printf("Bytes pro Sektor angeben ");
- printf("0=128, 1=256, 2=512, 3=1024) normal=2 :");
- scanf("%d",&Bytes);
-
- printf("Anzahl Sektoren pro Spur ");
- printf("(9=normal, bei AT HD-Laufwerken 15):");
- scanf("%d",&Anzahl);
-
- X_Bytes = 64;
-
- for(i = 0; i <= Bytes; i++) X_Bytes = X_Bytes * 2;
-
- start = Seite;
- ende = Seite;
-
- if (Seite == 2) {
- start = 0;
- ende = 1;
- }
- for(Seite = start; Seite <= ende; Seite++) {
- for(Spur = erste_Spur; Spur <= letzte_Spur; Spur++) {
- Status = 0;
- while((Status != 1) && (katastrophe <= 2)) {
- Status =
- WDS(Format(Laufwerk, Seite, Spur, Anzahl, Bytes));
- gotoxy(2,22);
- printf(" Drive:%d Seite:%d Spur:%02d Sektoren/Track:%02d Bytes/Sektor:%4d",Laufwerk,Seite,Spur,Anzahl, X_Bytes);
- }
- }
- }
- if (katastrophe <= 2) {
- gotoxy(21,21);
- printf("Formatieren erfolgreich abgeschlossen!");
- }
- else {
- gotoxy(18,21);
- printf("Es sind Fehler beim Formatieren aufgetreten!");
- }
- getch();
- clrscr();
- return(0);
- }
- /* ------------------------------------------------------ */
- /* Ende von FORMAT.C */