home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
1991
/
06
/
tricks
/
clean.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1991-02-26
|
10KB
|
252 lines
(* ------------------------------------------------------ *)
(* 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 *)