home *** CD-ROM | disk | FTP | other *** search
- (*--------------------------------------------------------*)
- (* BOOT.PAS (Version 1.01) *)
- (* (c) 1991 J. Braun & TOOLBOX *)
- (* Compiler: Turbo Pascal 6.0 *)
- (* Schaltet zwischen verschiedenen Betriebssystemen auf *)
- (* einer Festplatte um *)
- (*--------------------------------------------------------*)
- {$A-,B-,D+,E-,F-,I+,L+,N-,O-,R-,S-,V-,X-,M 16384,0,0}
- PROGRAM Bootswitch;
-
- USES Dos, Absolute;
- VAR
- Regs : Registers;
- i : WORD;
- j, OldType, NewType, BootSystem, OldSystem : BYTE;
- BootSysMsg, YesNo, CmdLine : STRING;
- CONST
- Names : ARRAY [1..4] OF STRING[7] =
- ('PC-DOS', 'MS-DOS', 'MS-OS/2', 'DR-DOS');
-
- PROCEDURE WarmBoot; (* Warmstart für PC/XT und AT/AT386 *)
- BEGIN
- WriteLn('System wird neu gestartet, bitte warten ...');
- MemW[$0040:$0072] := $1234; (* Warmstart-Kennung *)
- IF Mem[$F000:$FEEE] = $FC THEN (* PC-ID-Byte für AT *)
- Inline($B0/$FE/$BA/$64/$00/$EE/$FE) (*AT: Tastaturport*)
- ELSE
- Inline($EA/$00/$00/$FF/$FF); (* XT: JMP FAR FFFFh:0h *)
- END;
-
- PROCEDURE Help; (* Hilfeanzeige bei Parametern /? und /H *)
- BEGIN (* außerdem beim Auftreten von Fehlern *)
- WriteLn(#13#10'Aufruf mit:');
- WriteLn(#9'BOOT /OS2 für OS2 V. 1.2');
- WriteLn(#9'BOOT /DOS für MS-DOS');
- WriteLn(#9'BOOT /DRS für DR-DOS 3.41');
- WriteLn(#9'BOOT /IBM für PC-DOS sowie DR-DOS 5.0'#13#10);
- WriteLn('Die Bootsektor-Dateien sowie die AUTOEXEC.XXX');
- WriteLn('und CONFIG.XXX müssen mit der entsprechenden');
- WriteLn('Dateiendung im Verzeichnis C:\SYSTEM stehen.');
- WriteLn;
- WriteLn('Ein Bootvorgang wird nur dann durchgeführt,');
- WriteLn('wenn ein anderes als das gerade aktive');
- WriteLn('Betriebssystem angefordert wird.');
- END;
-
- PROCEDURE Error(Message: BYTE); (* Fehlermeldung, Abbruch *)
- VAR
- MStr: STRING;
- BEGIN
- CASE Message OF
- 1: MStr := 'Datei mit Bootsektor fehlt';
- 2: MStr := 'Kein oder unbekanntes Betriebssystem';
- 3: MStr := 'Falscher Kommandozeilenparameter';
- 4: MStr := Names[OldType] + ' ist bereits aktiv';
- 5: MStr := 'Verzeichnis mit Bootdateien fehlt';
- 6: MStr := 'CONFIG/AUTOEXEC-Sicherungsdatei fehlt';
- 7: MStr := 'CONFIG.SYS kann nicht geschrieben werden';
- 8: MStr := 'Kann neue AUTOEXEC.BAT nicht schreiben';
- END;
- WriteLn(#7 + MStr + '!'); IF Message <> 4 THEN Help;
- WriteLn('Es wurde kein Bootswitch durchgeführt.'); Halt(1)
- END;
-
- FUNCTION CheckParams(Get: STRING): BYTE; (* Kommanodzeile *)
- VAR i, j: BYTE; (* überprüfen *)
- BEGIN
- FOR i := 1 TO 4 DO BEGIN
- j := Pos(Systems[i], Get);
- IF j > 0 THEN BEGIN CheckParams := i; EXIT; END;
- END;
- Error(3)
- END;
-
- PROCEDURE CopyFiles(FileType: BYTE);(* System vorbereiten *)
- VAR
- f1, f2, f3, f4 : TEXT;
- Line : STRING;
- f5 : FILE OF CHAR;
- BEGIN
- IF Lo(DosVersion) > 9 THEN BEGIN
- WriteLn('Sie müssen bei dieser Version des Programms');
- WriteLn('für die Umschaltung zuerst DOS von Diskette');
- WriteLn('starten, da OS/2 den Schreibzugriff auf die');
- WriteLn('Festplatte sperrt!');
- Halt(0);
- END;
- ChDir(SysDir); IF IOResult <> 0 THEN Error(5);
- WriteLn(#13#10'Schreibe AUTOEXEC.BAT und CONFIG.SYS ...');
- Assign(f1, 'C:\CONFIG.SYS'); SetFAttr(f1, Archive);
- Assign(f2, 'C:\AUTOEXEC.BAT'); SetFAttr(f2, Archive);
- Assign(f3, SysDir + '\CONFIG.' + Systems[FileType]);
- Assign(f4, SysDir + '\AUTOEXEC.' + Systems[FileType]);
- Assign(f5, SysDir + '\BOOT.' + Systems[FileType]);
- SetFAttr(f5, Archive);
- Reset(f3); IF IOResult <> 0 THEN Error(6); (* zuerst *)
- Reset(f4); IF IOResult <> 0 THEN Error(6); (* alle *)
- ReWrite(f1); IF IOResult <> 0 THEN Error(7); (* Files *)
- ReWrite(f2); IF IOResult <> 0 THEN Error(8); (* über- *)
- Reset(f5); IF IOResult <> 0 THEN Error(1); (* prüfen *)
- WriteLn('Schreibe neuen Bootsektor ...');
- Line := '';
- WHILE NOT EoF(f3) DO BEGIN
- ReadLn(f3, Line); IF Line <> '' THEN WriteLn(f1, Line);
- END;
- Line := '';
- WHILE NOT EoF(f4) DO BEGIN
- ReadLn(f4, Line); IF Line <> '' THEN WriteLn(f2, Line);
- END;
- Close(f1); Close(f2); Close(f3); Close(f4);
- FOR i := 0 TO 511 DO Read(f5, BootSector[i]);
- Close(f5); SetFAttr(f5, Archive + Hidden); AbsoluteWrite;
- END;
-
- BEGIN
- WriteLn;
- WriteLn('BOOTSwitcher v1.01, (c) 1991 J. Braun & toolbox');
- IF ParamCount = 0 THEN BEGIN
- BootSystem := CheckOldSystem;
- CASE BootSystem OF
- 0: Error(2);
- 1: BootSysMsg := 'IBM PC-DOS / DR-DOS 5.0';
- 2: BootSysMsg := Names[2];
- 3: BootSysMsg := Names[3];
- 4: BootSysMsg := 'DR-DOS (3.41)';
- END;
- WriteLn('Der aktuelle Bootsektor auf der '
- + 'Festplatte lädt ', BootSysMsg);
- END ELSE BEGIN
- CmdLine := ParamStr(1);
- FOR j := 1 TO Length(CmdLine) DO
- CmdLine[j] := UpCase(CmdLine[j]);
- IF (Pos('?', CmdLine) > 0) OR
- (Pos('H', CmdLine) > 0) THEN Help
- ELSE BEGIN
- OldType := CheckOldSystem;
- IF OldType = 0 THEN Error(2);
- NewType := CheckParams(CmdLine);
- IF OldType = NewType THEN Error(4);
- Write(#13#10'Bootsystem wird nach ', Names[NewType],
- ' geändert. Fortfahren? (J/N) ');
- ReadLn(YesNo);
- IF UpCase(YesNo[1]) IN ['Y', 'J'] THEN BEGIN
- CopyFiles(NewType); WarmBoot;
- END ELSE WriteLn('Programm wurde abgebrochen!');
- END;
- END;
- END.
- (*--------------------------------------------------------*)
- (* Ende von BOOT.PAS *)
-