home *** CD-ROM | disk | FTP | other *** search
- (* ====================================================== *)
- (* SAVELPT.PAS *)
- (* (c) 1993 Jörg Braun & DMV-Verlag *)
- (* Compiler: Turbo/Borland Pascal 7.0 Real-Mode-Targert *)
- (* Das Programm sichert die Portadressen der seriellen *)
- (* und parallelen Schnittstellen aus dem BIOS-Datenseg- *)
- (* ment und schreibt sie in eine Datei, die den selben *)
- (* Namen wie das Programm besitzt und auch im selben *)
- (* Verzeichnis ist. Bei erneutem Aufruf werden die in der *)
- (* Datei befindlichen Daten wieder in das BIOS-Datenseg- *)
- (* ment ab der Adresse Seg0040:0000 zurückgeschrieben. *)
- (* Bei Aufruf mit dem Parameter -r wird die Datei neu *)
- (* angelegt, auch wenn sie bereits vorhanden ist. *)
- (* Die Datei wird automatisch »hidden« gesetzt. *)
- (* ====================================================== *)
- {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
- {$M $1000,0,$100}
- PROGRAM Save_And_Restore_Adapter_BIOS_Informations;
-
- USES DOS;
-
- CONST
- Msg : STRING[28] = 'Adapter-Portadressen wurden ';
- COM : STRING[6] = 'COMx: ';
- LPT : STRING[6] = 'LPTx: ';
- VAR
- f : File OF WORD;
- fName : PathStr;
- Dir : DirStr;
- Name : NameStr;
- Ext : ExtStr;
- i : INTEGER;
- w : WORD;
- sr : SearchRec;
-
- FUNCTION HexW(w: WORD): STRING;
- CONST
- HexStr: ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
- BEGIN
- HexW := '0000h'^I;
- HexW[1] := HexStr[Hi(W) DIV $10];
- HexW[2] := HexStr[Hi(W) MOD $10];
- HexW[3] := HexStr[Lo(W) DIV $10];
- HexW[4] := HexStr[Lo(W) MOD $10];
- END;
-
- BEGIN
- WriteLn(^M^J'Sichern/Restaurieren der Schnittstellen');
- FSplit(ParamStr(0), Dir, Name, Ext);
- fName := Dir + Name + '.DAT';
- FindFirst(fName, AnyFile - Directory - VolumeId, sr);
- Assign(f, fName);
- IF Pos(sr.Name, fName) <> 0 THEN SetFAttr(f, Archive);
- IF (Pos(sr.Name, fName) = 0) OR
- (Pos('r', ParamStr(1)) > 0) OR
- (Pos('R', ParamStr(1)) > 0) THEN BEGIN
- FileMode := 1; (* Write Only *)
- Rewrite(f); (* Datei neu anlegen *)
- FOR i := 0 TO 15 DO BEGIN
- Write(f, Word(Ptr(Seg0040, i)^)); (* schreiben *)
- IF i < 7 THEN BEGIN
- COM[4] := Chr(i DIV 2 + 49);
- Write(COM, HexW(Word(Ptr(Seg0040, i)^)));
- END ELSE BEGIN
- LPT[4] := Chr(i DIV 2 + 45);
- Write(LPT, HexW(Word(Ptr(Seg0040, i)^)));
- END;
- IF (i = 6) OR (i = 14) THEN WriteLn; (* Zeilenumbr. *)
- Inc(i); (* i = 0, 2, 4, 6, 8, 10, 12, 14 *)
- END; (* --> jede 2. Adresse *)
- WriteLn(Msg, 'gesichert.');
- END ELSE BEGIN
- FileMode := 0; (* Read Only *)
- Reset(f); (* vorhandene Datei öffnen *)
- Msg[23] := 'e'; WriteLn(Msg, 'restauriert:');
- FOR i := 0 TO 15 DO BEGIN
- Read(f, w); (* aus Datei lesen *)
- Move(w, Word(Ptr(Seg0040, i)^), 2); (* .. schreiben *)
- IF i < 7 THEN BEGIN
- COM[4] := Chr(i DIV 2 + 49);
- Write(COM, HexW(Word(Ptr(Seg0040, i)^)));
- END ELSE BEGIN
- LPT[4] := Chr(i DIV 2 + 45);
- Write(LPT, HexW(Word(Ptr(Seg0040, i)^)));
- END;
- IF (i = 6) OR (i = 14) THEN WriteLn; (* Zeilenumbr. *)
- Inc(i); (* i = 0, 2, 4, 6, 8, ... *)
- END; (* --> jede 2. Adresse *)
- END;
- Close(f); (* »f« schließen *)
- SetFAttr(f, Archive + Hidden); (* Datei verstecken *)
- END.
-
- (* ====================================================== *)
- (* Ende von LPT/COM-HOLD.PAS *)
-