home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / cebit_91 / boot / boot.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-03-01  |  5.6 KB  |  151 lines

  1. (*--------------------------------------------------------*)
  2. (*                BOOT.PAS   (Version 1.01)               *)
  3. (*               (c) 1991 J. Braun & TOOLBOX              *)
  4. (*               Compiler:  Turbo Pascal 6.0              *)
  5. (*   Schaltet zwischen verschiedenen Betriebssystemen auf *)
  6. (*                einer Festplatte um                     *)
  7. (*--------------------------------------------------------*)
  8. {$A-,B-,D+,E-,F-,I+,L+,N-,O-,R-,S-,V-,X-,M 16384,0,0}
  9. PROGRAM Bootswitch;
  10.  
  11. USES Dos, Absolute;
  12. VAR
  13.   Regs                                       : Registers;
  14.   i                                          : WORD;
  15.   j, OldType, NewType, BootSystem, OldSystem : BYTE;
  16.   BootSysMsg, YesNo, CmdLine                 : STRING;
  17. CONST
  18.   Names   : ARRAY [1..4] OF STRING[7] =
  19.         ('PC-DOS', 'MS-DOS', 'MS-OS/2', 'DR-DOS');
  20.  
  21. PROCEDURE WarmBoot;  (* Warmstart für PC/XT und AT/AT386  *)
  22. BEGIN
  23.   WriteLn('System wird neu gestartet, bitte warten ...');
  24.   MemW[$0040:$0072] := $1234;     (* Warmstart-Kennung    *)
  25.   IF Mem[$F000:$FEEE] = $FC THEN  (* PC-ID-Byte für AT    *)
  26.     Inline($B0/$FE/$BA/$64/$00/$EE/$FE) (*AT: Tastaturport*)
  27.   ELSE
  28.     Inline($EA/$00/$00/$FF/$FF);  (* XT: JMP FAR FFFFh:0h *)
  29. END;
  30.  
  31. PROCEDURE Help; (* Hilfeanzeige bei Parametern /?  und /H *)
  32. BEGIN           (* außerdem beim Auftreten von Fehlern    *)
  33.   WriteLn(#13#10'Aufruf mit:');
  34.   WriteLn(#9'BOOT /OS2 für OS2 V. 1.2');
  35.   WriteLn(#9'BOOT /DOS für MS-DOS');
  36.   WriteLn(#9'BOOT /DRS für DR-DOS 3.41');
  37.   WriteLn(#9'BOOT /IBM für PC-DOS sowie DR-DOS 5.0'#13#10);
  38.   WriteLn('Die Bootsektor-Dateien sowie die AUTOEXEC.XXX');
  39.   WriteLn('und CONFIG.XXX müssen mit der entsprechenden');
  40.   WriteLn('Dateiendung im Verzeichnis C:\SYSTEM stehen.');
  41.   WriteLn;
  42.   WriteLn('Ein Bootvorgang wird nur dann durchgeführt,');
  43.   WriteLn('wenn ein anderes als das gerade aktive');
  44.   WriteLn('Betriebssystem angefordert wird.');
  45. END;
  46.                 
  47. PROCEDURE Error(Message: BYTE); (* Fehlermeldung, Abbruch *)
  48. VAR
  49.   MStr: STRING;
  50. BEGIN
  51.   CASE Message OF
  52.     1: MStr := 'Datei mit Bootsektor fehlt';
  53.     2: MStr := 'Kein oder unbekanntes Betriebssystem';
  54.     3: MStr := 'Falscher Kommandozeilenparameter';
  55.     4: MStr :=  Names[OldType] + ' ist bereits aktiv';
  56.     5: MStr := 'Verzeichnis mit Bootdateien fehlt';
  57.     6: MStr := 'CONFIG/AUTOEXEC-Sicherungsdatei fehlt';
  58.     7: MStr := 'CONFIG.SYS kann nicht geschrieben werden';
  59.     8: MStr := 'Kann neue AUTOEXEC.BAT nicht schreiben';
  60.   END;
  61.   WriteLn(#7 + MStr + '!'); IF Message <> 4 THEN Help;
  62.   WriteLn('Es wurde kein Bootswitch durchgeführt.'); Halt(1)
  63. END;
  64.  
  65. FUNCTION CheckParams(Get: STRING): BYTE; (* Kommanodzeile *)
  66. VAR i, j: BYTE;                          (* überprüfen    *)
  67. BEGIN
  68.   FOR i := 1 TO 4 DO BEGIN
  69.     j := Pos(Systems[i], Get);
  70.     IF j > 0 THEN BEGIN CheckParams := i; EXIT; END;
  71.   END;
  72.   Error(3)
  73. END;
  74.  
  75. PROCEDURE CopyFiles(FileType: BYTE);(* System vorbereiten *)
  76. VAR
  77.   f1, f2, f3, f4 : TEXT;
  78.   Line           : STRING;
  79.   f5             : FILE OF CHAR;
  80. BEGIN
  81.   IF Lo(DosVersion) > 9 THEN BEGIN
  82.     WriteLn('Sie müssen bei dieser Version des Programms');
  83.     WriteLn('für die Umschaltung zuerst DOS von Diskette');
  84.     WriteLn('starten, da OS/2 den Schreibzugriff auf die');
  85.     WriteLn('Festplatte sperrt!');
  86.     Halt(0);
  87.   END;
  88.   ChDir(SysDir); IF IOResult <> 0 THEN Error(5);
  89.   WriteLn(#13#10'Schreibe AUTOEXEC.BAT und CONFIG.SYS ...');
  90.   Assign(f1, 'C:\CONFIG.SYS');    SetFAttr(f1, Archive);
  91.   Assign(f2, 'C:\AUTOEXEC.BAT');  SetFAttr(f2, Archive);
  92.   Assign(f3, SysDir + '\CONFIG.'   + Systems[FileType]);
  93.   Assign(f4, SysDir + '\AUTOEXEC.' + Systems[FileType]);
  94.   Assign(f5, SysDir + '\BOOT.'     + Systems[FileType]);
  95.   SetFAttr(f5, Archive);
  96.   Reset(f3);   IF IOResult <> 0 THEN Error(6);  (* zuerst *)
  97.   Reset(f4);   IF IOResult <> 0 THEN Error(6);  (* alle   *)
  98.   ReWrite(f1); IF IOResult <> 0 THEN Error(7);  (* Files  *)
  99.   ReWrite(f2); IF IOResult <> 0 THEN Error(8);  (* über-  *)
  100.   Reset(f5);   IF IOResult <> 0 THEN Error(1);  (* prüfen *)
  101.   WriteLn('Schreibe neuen Bootsektor ...');
  102.   Line := '';
  103.   WHILE NOT EoF(f3) DO BEGIN
  104.     ReadLn(f3, Line); IF Line <> '' THEN WriteLn(f1, Line);
  105.   END;
  106.   Line := '';
  107.   WHILE NOT EoF(f4) DO BEGIN
  108.     ReadLn(f4, Line); IF Line <> '' THEN WriteLn(f2, Line);
  109.   END;
  110.   Close(f1); Close(f2); Close(f3); Close(f4);
  111.   FOR i := 0 TO 511 DO Read(f5, BootSector[i]);
  112.   Close(f5); SetFAttr(f5, Archive + Hidden); AbsoluteWrite;
  113. END;
  114.  
  115. BEGIN
  116.   WriteLn;
  117.   WriteLn('BOOTSwitcher v1.01, (c) 1991 J. Braun & toolbox');
  118.   IF ParamCount = 0 THEN BEGIN
  119.     BootSystem := CheckOldSystem;
  120.     CASE BootSystem OF
  121.       0: Error(2);
  122.       1: BootSysMsg := 'IBM PC-DOS / DR-DOS 5.0';
  123.       2: BootSysMsg := Names[2];
  124.       3: BootSysMsg := Names[3];
  125.       4: BootSysMsg := 'DR-DOS (3.41)';
  126.     END;
  127.     WriteLn('Der aktuelle Bootsektor auf der '
  128.       + 'Festplatte lädt ', BootSysMsg);
  129.   END ELSE BEGIN
  130.     CmdLine := ParamStr(1);
  131.     FOR j := 1 TO Length(CmdLine) DO
  132.       CmdLine[j] := UpCase(CmdLine[j]);
  133.     IF (Pos('?', CmdLine) > 0) OR
  134.        (Pos('H', CmdLine) > 0) THEN Help
  135.     ELSE BEGIN
  136.       OldType := CheckOldSystem;
  137.       IF OldType = 0 THEN Error(2);
  138.       NewType := CheckParams(CmdLine);
  139.       IF OldType = NewType THEN Error(4);
  140.       Write(#13#10'Bootsystem wird nach ', Names[NewType],
  141.           ' geändert. Fortfahren? (J/N) ');
  142.       ReadLn(YesNo);
  143.       IF UpCase(YesNo[1]) IN ['Y', 'J'] THEN BEGIN
  144.     CopyFiles(NewType); WarmBoot;
  145.       END ELSE WriteLn('Programm wurde abgebrochen!');
  146.     END;
  147.   END;
  148. END.
  149. (*--------------------------------------------------------*)
  150. (*                   Ende von BOOT.PAS                    *)
  151.