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

  1. (* ------------------------------------------------------ *)
  2. (*                     CLEAN.PAS                          *)
  3. (* Dieses Programm löscht eine beliebige DOS-Diskette     *)
  4. (* durch Überschreiben der FAT und des ROOT               *)
  5. (*        (c) 1991 Erich Cadario jr. & TOOLBOX            *)
  6. (* ------------------------------------------------------ *)
  7. PROGRAM diskette_loeschen;
  8.  
  9. { Dem Programm muß beim Aufruf a oder b als Parameter      }
  10. { übergeben werden                                         }
  11.  
  12. USES Dos;
  13.  
  14. TYPE
  15.   Puffer = ARRAY [0..4607] OF BYTE;
  16.  
  17. VAR
  18.   Regs         : Registers;
  19.   i            : INTEGER;
  20.   Media        : BYTE;             { Code für Diskettenart }
  21.   hh           : CHAR;
  22.   hhh          : STRING;
  23.   Sektorpuffer : Puffer;
  24.    { maximal 9 Sektoren a 512 Byte                         }
  25.    { werden von Diskette komplett in diesen Puffer gelesen }
  26.  
  27.   Laufwerksnummer : BYTE;                { 0 für a,1 für b }
  28.  
  29.   Segment, Offset : WORD;
  30.                   { Segment bzw. Offsetadresse des Puffers }
  31.  
  32.  
  33.   FUNCTION Bitwert(zahl : WORD; position : BYTE) : BYTE;
  34.   (* liefert den Bitwert von <zahl> an der Stelle         *)
  35.   (* <position> ; ist wichtig zur Kontrolle der Flags     *)
  36.   VAR
  37.     help : BYTE;
  38.   BEGIN
  39.     IF (Position < 0) OR (Position > 15) THEN
  40.       WriteLn(^G)
  41.     ELSE BEGIN
  42.       help    := zahl SHL(15-Position);
  43.       Bitwert := help SHR 15;
  44.     END;
  45.   END;
  46.  
  47.   PROCEDURE Disk(Status       : BYTE; DiskNumber   : BYTE;
  48.                  DiskSeite    : BYTE; SpurNummer   : BYTE;
  49.                  Sektornummer : BYTE; SektorAnzahl : BYTE;
  50.                  PufferSegment, Pufferoffset : WORD);
  51.   (* Diese Prozedur liest/schreibt Sektoren auf Diskette  *)
  52.   (* mit Hilfe des BIOS-Interrupts $13                    *)
  53.   (* Status = 0 bedeutet lesen, Status = 1 schreiben      *)
  54.   VAR
  55.     Regs : Registers;
  56.   BEGIN
  57.     IF (Status <> 0) AND (Status <> 1) THEN
  58.       WriteLn(^G, 'Statusfehler')
  59.     ELSE BEGIN
  60.       WITH Regs DO BEGIN
  61.         IF Status = 0 THEN AH := 2
  62.                       ELSE AH := 3;
  63.         DL := DiskNumber;
  64.         DH := DiskSeite;
  65.         CH := SpurNummer;
  66.         CL := SektorNummer;
  67.         AL := SektorAnzahl;
  68.         ES := PufferSegment;
  69.         BX := PufferOffset;
  70.       END;
  71.       Intr($13, Regs);
  72.       IF Bitwert(Regs.Flags, 0) <> 0 THEN
  73.         WriteLn(^G, 'Fehler!');
  74.     END;
  75.   END;
  76.  
  77.   PROCEDURE Rootgehen;
  78.   (* setzt nach dem Löschen das ROOT als aktuelles        *)
  79.   (* Verzeichnis                                          *)
  80.   VAR
  81.     Pfad : STRING;
  82.     Regs : Registers;
  83.   BEGIN
  84.     IF laufwerksnummer = 0 THEN Pfad := 'a:\'
  85.                            ELSE Pfad := 'b:\';
  86.     Pfad := Pfad + Chr(0);
  87.     Regs.AH := $3B;
  88.     Regs.DS := Seg(Pfad);
  89.     Regs.DX := Ofs(Pfad)+1;
  90.     Intr($21, Regs);
  91.   END;
  92.  
  93.   PROCEDURE Mitteilen;
  94.   (* Nach dem Löschen wird diese undokumentierte Funktion *)
  95.   (* des DOS-Interrupts $21 aufgerufen um den DPB         *)
  96.   (* (Drive Parameter Block) des angesprochenen Laufwerks *)
  97.   (* zu ermitteln und dort 2 Werte zu verändern, damit    *)
  98.   (* das DOS den DiskPuffer beim nächsten Zugriff auf das *)
  99.   (* Laufwerk neu anlegt                                  *)
  100.   VAR
  101.     Regs : Registers;
  102.   BEGIN
  103.     Regs.AH := $32;
  104.     Regs.DL := LaufwerksNummer + 1;
  105.     Intr($21, Regs);
  106.     Mem[Regs.DS:(Regs.BX +  4)] := $FE;
  107.     Mem[Regs.DS:(Regs.BX + 23)] := $FF;
  108.   END;
  109.  
  110. BEGIN
  111.   IF ParamCount <> 1 THEN
  112.     WriteLn(^G, 'Parameter falsch')
  113.   ELSE BEGIN
  114.     hhh := ParamStr(1);
  115.     hh  := hhh[1];
  116.     CASE hh OF
  117.       'a', 'A' : LaufwerksNummer := 0;
  118.       'b', 'B' : LaufwerksNummer := 1;
  119.     ELSE
  120.       WriteLn(^G, 'Parameter falsch'); Exit;
  121.     END;
  122.     Segment := Seg(SektorPuffer);
  123.     Offset  := Ofs(SektorPuffer);
  124.     Regs.AH := $32;
  125.     Regs.DL := LaufwerksNummer + 1;
  126.     Intr($21, Regs);
  127.     Disk(0, LaufwerksNummer, 0, 0, 1, 1, Segment, Offset);
  128.      { Bootsektor einlesen }
  129.     Media := SektorPuffer[$15];
  130.     CASE media OF
  131.       $FE : BEGIN    { 160KB }
  132.               Disk(0, Laufwerksnummer, 0, 0, 1, 7,
  133.                    Segment, Offset);
  134.               FOR i :=  515 TO 1023 DO SektorPuffer[i] := 0;
  135.               FOR i := 1027 TO 1535 DO SektorPuffer[i] := 0;
  136.               FOR i := 1536 TO 3583 DO SektorPuffer[i] := 0;
  137.               Disk(1, Laufwerksnummer, 0, 0, 1, 7,
  138.                    Segment, Offset);
  139.             END;
  140.       $FF : BEGIN    { 320KB }
  141.               Disk(0, Laufwerksnummer, 0, 0, 1, 8,
  142.                    Segment, Offset);
  143.               FOR i :=  515 TO 1023 DO SektorPuffer[i] := 0;
  144.               FOR i := 1027 TO 1535 DO SektorPuffer[i] := 0;
  145.               FOR i := 1536 TO 4095 DO SektorPuffer[i] := 0;
  146.               Disk(1, Laufwerksnummer, 0, 0, 1, 8,
  147.                    Segment, Offset);
  148.               Disk(0, Laufwerksnummer, 1, 0, 1, 2,
  149.                    Segment, Offset);
  150.               FOR i := 0 TO 1023 DO Sektorpuffer[i] := 0;
  151.               Disk(1, Laufwerksnummer, 1, 0, 1, 2,
  152.                    Segment, Offset);
  153.             END;
  154.       $FC : BEGIN    { 180KB }
  155.               Disk(0, Laufwerksnummer, 0, 0, 1, 9,
  156.                    Segment, Offset);
  157.               FOR i :=  515 TO 1535 DO SektorPuffer[i] := 0;
  158.               FOR i := 1539 TO 2559 DO SektorPuffer[i] := 0;
  159.               FOR i := 2560 TO 4607 DO SektorPuffer[i] := 0;
  160.               Disk(1, Laufwerksnummer, 0, 0, 1, 9,
  161.                    Segment, Offset);
  162.             END;
  163.       $FD : BEGIN    { 360KB }
  164.               Disk(0, Laufwerksnummer, 0, 0, 1, 9,
  165.                    Segment, Offset);
  166.               FOR i :=  515 TO 1535 DO SektorPuffer[i] := 0;
  167.               FOR i := 1539 TO 2559 DO SektorPuffer[i] := 0;
  168.               FOR i := 2560 TO 4607 DO SektorPuffer[i] := 0;
  169.               Disk(1, Laufwerksnummer, 0, 0, 1, 9,
  170.                    Segment, Offset);
  171.               Disk(0, Laufwerksnummer, 1, 0, 1, 3,
  172.                    Segment, Offset);
  173.               FOR i := 0 TO 1535 DO SektorPuffer[i] := 0;
  174.               Disk(1, Laufwerksnummer, 1, 0, 1, 3,
  175.                    Segment, Offset);
  176.             END;
  177.       $F9 : BEGIN    { 1.2MB, 720KB }
  178.               IF (hh = 'a') OR (hh = 'A') THEN BEGIN
  179.                 Disk(0, Laufwerksnummer, 0, 0, 2, 7,
  180.                      Segment, Offset);
  181.                 FOR i := 3 TO 3583 DO SektorPuffer[i] := 0;
  182.                 Disk(1, Laufwerksnummer, 0, 0, 2, 7,
  183.                      Segment, Offset);
  184.                 Disk(0, Laufwerksnummer, 0, 0, 9, 1,
  185.                      Segment, Offset);
  186.                 FOR i := 3 TO 511 DO SektorPuffer[i] := 0;
  187.                 Disk(1, Laufwerksnummer, 0, 0, 9, 1,
  188.                      Segment, Offset);
  189.                 Disk(0, Laufwerksnummer, 0, 0, 10, 6,
  190.                      Segment, Offset);
  191.                 FOR i := 0 TO 3071 DO Sektorpuffer[i] := 0;
  192.                 Disk(1, Laufwerksnummer, 0, 0, 10, 6,
  193.                      Segment, Offset);
  194.                 Disk(0, Laufwerksnummer, 1, 0, 1, 9,
  195.                      Segment, Offset);
  196.                 FOR i := 0 TO 4607 DO Sektorpuffer[i] := 0;
  197.                 Disk(1, Laufwerksnummer, 1, 0, 1, 9,
  198.                      Segment, Offset);
  199.                 Disk(0, Laufwerksnummer, 1, 0, 10, 5,
  200.                      Segment, Offset);
  201.                 FOR i := 0 TO 2559 DO sektorpuffer[i] := 0;
  202.                 Disk(1, Laufwerksnummer, 1, 0, 10, 5,
  203.                      Segment, Offset);
  204.               END ELSE BEGIN
  205.                 Disk(0, laufwerksnummer, 0, 0, 1, 9,
  206.                      Segment, Offset);
  207.                 FOR i :=  515 TO 2047 DO Sektorpuffer[i]:=0;
  208.                 FOR i := 2051 TO 3583 DO Sektorpuffer[i]:=0;
  209.                 FOR i := 3584 TO 4607 DO Sektorpuffer[i]:=0;
  210.                 Disk(1, Laufwerksnummer, 0, 0, 1, 9,
  211.                      Segment, Offset);
  212.                 Disk(0, Laufwerksnummer, 1, 0, 1, 5,
  213.                      Segment, Offset);
  214.                 FOR i := 0 TO 2559 DO Sektorpuffer[i] := 0;
  215.                 Disk(1, Laufwerksnummer, 1, 0, 1, 5,
  216.                      Segment, Offset);
  217.               END;
  218.             END;
  219.       $F0 : BEGIN        { 1.4MB }
  220.               Disk(0, Laufwerksnummer, 0, 0, 2, 9,
  221.                    Segment, Offset);
  222.               FOR i := 3 TO 4607 DO Sektorpuffer[i] := 0;
  223.               Disk(1, Laufwerksnummer, 0, 0, 2, 9,
  224.                    Segment, Offset);
  225.               Disk(0, Laufwerksnummer, 0, 0, 11, 8,
  226.                    Segment, Offset);
  227.               FOR i := 3 TO 4095 DO Sektorpuffer[i] := 0;
  228.               Disk(1, Laufwerksnummer, 0, 0, 11, 8,
  229.                    Segment, Offset);
  230.               Disk(0, Laufwerksnummer, 1, 0, 1, 9,
  231.                    Segment, Offset);
  232.               FOR i := 0 TO 4607 DO Sektorpuffer[i] := 0;
  233.               Disk(1, Laufwerksnummer, 1, 0, 1, 9,
  234.                    Segment, Offset);
  235.               Disk(0, Laufwerksnummer, 1, 0, 10, 6,
  236.                    Segment, Offset);
  237.               FOR i := 0 TO 3071 DO Sektorpuffer[i] := 0;
  238.               Disk(1, Laufwerksnummer, 1, 0, 10, 6,
  239.                    Segment, Offset);
  240.             END;
  241.     ELSE
  242.       WriteLn(^G, 'Unbekannter media descriptor');
  243.     END;
  244.     Mitteilen;
  245.     Rootgehen;
  246.   END;
  247. END.
  248. (* ----------------------------------------------------- *)
  249. (*               Ende von CLEAN.PAS                      *)
  250.  
  251.  
  252.