home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 03 / praxis / boottest.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-12-16  |  4.0 KB  |  192 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   BOOTTEST.PAS                         *)
  3. (*       (c) 1989 Andreas Schuster & TOOLBOX              *)
  4. (* ------------------------------------------------------ *)
  5. PROGRAM BootTest;
  6.  
  7. USES Dos,Crt;
  8.  
  9. CONST
  10.   Titel       = 'BootTest  ';
  11.   Version     = 'Version 1.0   ';
  12.   CopyRight   = '(c) 1989 A. Schuster 1988 & TOOLBOX';
  13.   DefaultName = 'BOOTTEST.DTA';
  14.  
  15. TYPE
  16.   Sektor = ARRAY[1..512] OF BYTE;
  17.  
  18. VAR
  19.   Regs       : Registers;
  20.   SaveDir,
  21.   Kommando,
  22.   OptionPfad : STRING;
  23.   Puffer     : Sektor;
  24.  
  25.  
  26. PROCEDURE Fehler(ErrCode : BYTE);
  27. BEGIN
  28.   CASE ErrCode OF
  29.     1 : WriteLn('Fehler beim Lesen');
  30.     2 : WriteLn('Fehler beim Schreiben');
  31.     3 : WriteLn('Laufwerk nicht unterstützt ',
  32.                 '- Programm abgebrochen');
  33.   ELSE
  34.     WriteLn('Unbekannter Fehler');
  35.   END;
  36.   WriteLn;
  37.   WriteLn;
  38.   ChDir(SaveDir);
  39.   Halt(1);
  40. END;
  41.  
  42.  
  43. FUNCTION Laufwerk(Bezeichner : CHAR) : BYTE;
  44. BEGIN
  45.   Bezeichner   := UpCase(Bezeichner);
  46.   IF Bezeichner = 'A' THEN Laufwerk := $00 ELSE
  47.     IF Bezeichner = 'B' THEN Laufwerk := $01 ELSE
  48.       Fehler(3);
  49. END;
  50.  
  51.  
  52. PROCEDURE Lesen(Drive : BYTE);
  53. BEGIN
  54.   WITH Regs DO BEGIN
  55.     DH := 0;
  56.     DL := Drive;
  57.     CH := 0;
  58.     CL := 1;
  59.     ES := Seg(Puffer);
  60.     BX := Ofs(Puffer);
  61.     AH := 2;
  62.     AL := 1;
  63.     Intr($13, Regs);
  64.     IF AH <> 0 THEN Fehler(1);
  65.   END;
  66. END;
  67.  
  68.  
  69. PROCEDURE Schreiben;
  70. VAR
  71.   Save: FILE OF Sektor;
  72. BEGIN
  73.   Assign(Save, DefaultName);
  74.   Rewrite(Save);
  75.   Write(Save, Puffer);
  76.   Close(Save);
  77. END;
  78.  
  79.  
  80. FUNCTION Vergleichen : BOOLEAN;
  81. VAR
  82.   RefFile  : FILE OF Sektor;
  83.   Referenz : Sektor;
  84.   i        : WORD;
  85. BEGIN
  86.   Assign(RefFile, DefaultName);
  87.   Reset(RefFile);
  88.   Read(RefFile, Referenz);
  89.   Vergleichen := TRUE;
  90.   FOR i := 1 TO 512 DO
  91.     IF Referenz[i] <> Puffer[i] THEN Vergleichen := FALSE;
  92. END;
  93.  
  94.  
  95. PROCEDURE HilfsText;
  96. BEGIN
  97.   WriteLn('Syntax : BOOTTEST /I [d:\pfad]  Initialisieren');
  98.   WriteLn('                  /T [d:\pfad]  Test');
  99.   WriteLn('                  /R [d:\pfad]  Reparieren');
  100.   WriteLn;
  101.   Halt(1);
  102. END;
  103.  
  104.  
  105. PROCEDURE Initialisierung;
  106. BEGIN
  107.   GetDir(0, SaveDir);
  108.   ChDir(OptionPfad);
  109.   Lesen(Laufwerk(OptionPfad[1]));
  110.   Schreiben;
  111.   ChDir(SaveDir);
  112.   WriteLn('BootTest initialisiert');
  113.   WriteLn;
  114.   WriteLn;
  115.   Halt(0);
  116. END;
  117.  
  118.  
  119. PROCEDURE Test;
  120. BEGIN
  121.   GetDir(0, SaveDir);
  122.   ChDir(OptionPfad);
  123.   Lesen(Laufwerk(OptionPfad[1]));
  124.   IF NOT Vergleichen THEN BEGIN
  125.     WriteLn('Bootsektor verändert ',
  126.             '- Restaurieren mit /R-Option');
  127.     WriteLn;
  128.     WriteLn;
  129.     ChDir(SaveDir);
  130.     Halt(2);
  131.   END ELSE
  132.     WriteLn('Bootsektor OK');
  133.     WriteLn;
  134.     WriteLn;
  135.     ChDir(SaveDir);
  136.     Halt(0);
  137. END;
  138.  
  139.  
  140. PROCEDURE Reparieren;
  141. VAR
  142.   SaveFile : FILE OF Sektor;
  143. BEGIN
  144.   GetDir(0, SaveDir);
  145.   ChDir(OptionPfad);
  146.   Assign(SaveFile, DefaultName);
  147.   Reset(SaveFile);
  148.   Read(SaveFile, Puffer);
  149.   Close(SaveFile);
  150.   WITH Regs DO BEGIN
  151.     DH := 0;
  152.     DL := Laufwerk(OptionPfad[1]);
  153.     CH := 0;
  154.     CL := 1;
  155.     ES := Seg(Puffer);
  156.     BX := Ofs(Puffer);
  157.     AL := 1;
  158.     AH := 3;
  159.     Intr($13, Regs);
  160.     IF AH <> 0 THEN Fehler(2);
  161.   END;
  162.   WriteLn('Bootsektor wiederhergestellt');
  163.   WriteLn;
  164.   WriteLn;
  165.   ChDir(SaveDir);
  166.   Halt(0);
  167. END;
  168.  
  169.  
  170. BEGIN  (* Hauptprogramm *)
  171.   ClrScr;
  172.   WriteLn(Titel, Version, CopyRight);
  173.   WriteLn;
  174.   IF ParamCount < 1 THEN HilfsText;
  175.   Kommando   := ParamStr(1);
  176.   OptionPfad := ParamStr(2);
  177.   IF Kommando = '?' THEN HilfsText;
  178.   IF (Pos('\', OptionPfad) = 0) AND
  179.      (Pos(':', OptionPfad) = 0) THEN
  180.     GetDir(0, OptionPfad);
  181.   IF Pos(':', OptionPfad) = Length(OptionPfad) THEN
  182.     OptionPfad:=OptionPfad+'\';
  183.   IF (Kommando='/I') OR (Kommando='/i') THEN
  184.     Initialisierung
  185.   ELSE
  186.     IF (Kommando='/T') OR (Kommando='/t') THEN Test
  187.     ELSE
  188.       IF (Kommando='/R') OR (Kommando='/r') THEN Reparieren
  189.       ELSE HilfsText;
  190. END.
  191. (* ------------------------------------------------------ *)
  192. (*                 Ende von BOOTTEST.PAS                  *)