home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* CLEAN.PAS *)
- (* Dieses Programm löscht eine beliebige DOS-Diskette *)
- (* durch Überschreiben der FAT und des ROOT *)
- (* (c) 1991 Erich Cadario jr. & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM diskette_loeschen;
-
- { Dem Programm muß beim Aufruf a oder b als Parameter }
- { übergeben werden }
-
- USES Dos;
-
- TYPE
- Puffer = ARRAY [0..4607] OF BYTE;
-
- VAR
- Regs : Registers;
- i : INTEGER;
- Media : BYTE; { Code für Diskettenart }
- hh : CHAR;
- hhh : STRING;
- Sektorpuffer : Puffer;
- { maximal 9 Sektoren a 512 Byte }
- { werden von Diskette komplett in diesen Puffer gelesen }
-
- Laufwerksnummer : BYTE; { 0 für a,1 für b }
-
- Segment, Offset : WORD;
- { Segment bzw. Offsetadresse des Puffers }
-
-
- FUNCTION Bitwert(zahl : WORD; position : BYTE) : BYTE;
- (* liefert den Bitwert von <zahl> an der Stelle *)
- (* <position> ; ist wichtig zur Kontrolle der Flags *)
- VAR
- help : BYTE;
- BEGIN
- IF (Position < 0) OR (Position > 15) THEN
- WriteLn(^G)
- ELSE BEGIN
- help := zahl SHL(15-Position);
- Bitwert := help SHR 15;
- END;
- END;
-
- PROCEDURE Disk(Status : BYTE; DiskNumber : BYTE;
- DiskSeite : BYTE; SpurNummer : BYTE;
- Sektornummer : BYTE; SektorAnzahl : BYTE;
- PufferSegment, Pufferoffset : WORD);
- (* Diese Prozedur liest/schreibt Sektoren auf Diskette *)
- (* mit Hilfe des BIOS-Interrupts $13 *)
- (* Status = 0 bedeutet lesen, Status = 1 schreiben *)
- VAR
- Regs : Registers;
- BEGIN
- IF (Status <> 0) AND (Status <> 1) THEN
- WriteLn(^G, 'Statusfehler')
- ELSE BEGIN
- WITH Regs DO BEGIN
- IF Status = 0 THEN AH := 2
- ELSE AH := 3;
- DL := DiskNumber;
- DH := DiskSeite;
- CH := SpurNummer;
- CL := SektorNummer;
- AL := SektorAnzahl;
- ES := PufferSegment;
- BX := PufferOffset;
- END;
- Intr($13, Regs);
- IF Bitwert(Regs.Flags, 0) <> 0 THEN
- WriteLn(^G, 'Fehler!');
- END;
- END;
-
- PROCEDURE Rootgehen;
- (* setzt nach dem Löschen das ROOT als aktuelles *)
- (* Verzeichnis *)
- VAR
- Pfad : STRING;
- Regs : Registers;
- BEGIN
- IF laufwerksnummer = 0 THEN Pfad := 'a:\'
- ELSE Pfad := 'b:\';
- Pfad := Pfad + Chr(0);
- Regs.AH := $3B;
- Regs.DS := Seg(Pfad);
- Regs.DX := Ofs(Pfad)+1;
- Intr($21, Regs);
- END;
-
- PROCEDURE Mitteilen;
- (* Nach dem Löschen wird diese undokumentierte Funktion *)
- (* des DOS-Interrupts $21 aufgerufen um den DPB *)
- (* (Drive Parameter Block) des angesprochenen Laufwerks *)
- (* zu ermitteln und dort 2 Werte zu verändern, damit *)
- (* das DOS den DiskPuffer beim nächsten Zugriff auf das *)
- (* Laufwerk neu anlegt *)
- VAR
- Regs : Registers;
- BEGIN
- Regs.AH := $32;
- Regs.DL := LaufwerksNummer + 1;
- Intr($21, Regs);
- Mem[Regs.DS:(Regs.BX + 4)] := $FE;
- Mem[Regs.DS:(Regs.BX + 23)] := $FF;
- END;
-
- BEGIN
- IF ParamCount <> 1 THEN
- WriteLn(^G, 'Parameter falsch')
- ELSE BEGIN
- hhh := ParamStr(1);
- hh := hhh[1];
- CASE hh OF
- 'a', 'A' : LaufwerksNummer := 0;
- 'b', 'B' : LaufwerksNummer := 1;
- ELSE
- WriteLn(^G, 'Parameter falsch'); Exit;
- END;
- Segment := Seg(SektorPuffer);
- Offset := Ofs(SektorPuffer);
- Regs.AH := $32;
- Regs.DL := LaufwerksNummer + 1;
- Intr($21, Regs);
- Disk(0, LaufwerksNummer, 0, 0, 1, 1, Segment, Offset);
- { Bootsektor einlesen }
- Media := SektorPuffer[$15];
- CASE media OF
- $FE : BEGIN { 160KB }
- Disk(0, Laufwerksnummer, 0, 0, 1, 7,
- Segment, Offset);
- FOR i := 515 TO 1023 DO SektorPuffer[i] := 0;
- FOR i := 1027 TO 1535 DO SektorPuffer[i] := 0;
- FOR i := 1536 TO 3583 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 1, 7,
- Segment, Offset);
- END;
- $FF : BEGIN { 320KB }
- Disk(0, Laufwerksnummer, 0, 0, 1, 8,
- Segment, Offset);
- FOR i := 515 TO 1023 DO SektorPuffer[i] := 0;
- FOR i := 1027 TO 1535 DO SektorPuffer[i] := 0;
- FOR i := 1536 TO 4095 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 1, 8,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 1, 2,
- Segment, Offset);
- FOR i := 0 TO 1023 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 1, 2,
- Segment, Offset);
- END;
- $FC : BEGIN { 180KB }
- Disk(0, Laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- FOR i := 515 TO 1535 DO SektorPuffer[i] := 0;
- FOR i := 1539 TO 2559 DO SektorPuffer[i] := 0;
- FOR i := 2560 TO 4607 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- END;
- $FD : BEGIN { 360KB }
- Disk(0, Laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- FOR i := 515 TO 1535 DO SektorPuffer[i] := 0;
- FOR i := 1539 TO 2559 DO SektorPuffer[i] := 0;
- FOR i := 2560 TO 4607 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 1, 3,
- Segment, Offset);
- FOR i := 0 TO 1535 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 1, 3,
- Segment, Offset);
- END;
- $F9 : BEGIN { 1.2MB, 720KB }
- IF (hh = 'a') OR (hh = 'A') THEN BEGIN
- Disk(0, Laufwerksnummer, 0, 0, 2, 7,
- Segment, Offset);
- FOR i := 3 TO 3583 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 2, 7,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 0, 0, 9, 1,
- Segment, Offset);
- FOR i := 3 TO 511 DO SektorPuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 9, 1,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 0, 0, 10, 6,
- Segment, Offset);
- FOR i := 0 TO 3071 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 10, 6,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 1, 9,
- Segment, Offset);
- FOR i := 0 TO 4607 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 1, 9,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 10, 5,
- Segment, Offset);
- FOR i := 0 TO 2559 DO sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 10, 5,
- Segment, Offset);
- END ELSE BEGIN
- Disk(0, laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- FOR i := 515 TO 2047 DO Sektorpuffer[i]:=0;
- FOR i := 2051 TO 3583 DO Sektorpuffer[i]:=0;
- FOR i := 3584 TO 4607 DO Sektorpuffer[i]:=0;
- Disk(1, Laufwerksnummer, 0, 0, 1, 9,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 1, 5,
- Segment, Offset);
- FOR i := 0 TO 2559 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 1, 5,
- Segment, Offset);
- END;
- END;
- $F0 : BEGIN { 1.4MB }
- Disk(0, Laufwerksnummer, 0, 0, 2, 9,
- Segment, Offset);
- FOR i := 3 TO 4607 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 2, 9,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 0, 0, 11, 8,
- Segment, Offset);
- FOR i := 3 TO 4095 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 0, 0, 11, 8,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 1, 9,
- Segment, Offset);
- FOR i := 0 TO 4607 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 1, 9,
- Segment, Offset);
- Disk(0, Laufwerksnummer, 1, 0, 10, 6,
- Segment, Offset);
- FOR i := 0 TO 3071 DO Sektorpuffer[i] := 0;
- Disk(1, Laufwerksnummer, 1, 0, 10, 6,
- Segment, Offset);
- END;
- ELSE
- WriteLn(^G, 'Unbekannter media descriptor');
- END;
- Mitteilen;
- Rootgehen;
- END;
- END.
- (* ----------------------------------------------------- *)
- (* Ende von CLEAN.PAS *)
-
-
-