home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / remote / savelpt.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1993-08-09  |  3.7 KB  |  96 lines

  1. (* ====================================================== *)
  2. (*                       SAVELPT.PAS                      *)
  3. (*            (c) 1993 Jörg Braun & DMV-Verlag            *)
  4. (*  Compiler:  Turbo/Borland Pascal 7.0 Real-Mode-Targert *)
  5. (* Das Programm sichert die Portadressen der seriellen    *)
  6. (* und parallelen Schnittstellen aus dem BIOS-Datenseg-   *)
  7. (* ment und schreibt sie in eine Datei, die den selben    *)
  8. (* Namen wie das Programm besitzt und auch im selben      *)
  9. (* Verzeichnis ist. Bei erneutem Aufruf werden die in der *)
  10. (* Datei befindlichen Daten wieder in das BIOS-Datenseg-  *)
  11. (* ment ab der Adresse Seg0040:0000 zurückgeschrieben.    *)
  12. (* Bei Aufruf mit dem Parameter -r wird die Datei neu     *)
  13. (* angelegt, auch wenn sie bereits vorhanden ist.         *)
  14. (* Die Datei wird automatisch »hidden« gesetzt.           *)
  15. (* ====================================================== *)
  16. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-,Y-}
  17. {$M $1000,0,$100}
  18. PROGRAM Save_And_Restore_Adapter_BIOS_Informations;
  19.  
  20. USES DOS;
  21.  
  22. CONST
  23.   Msg   : STRING[28] = 'Adapter-Portadressen wurden ';
  24.   COM   : STRING[6]  = 'COMx: ';
  25.   LPT   : STRING[6]  = 'LPTx: ';
  26. VAR
  27.   f     : File OF WORD;
  28.   fName : PathStr;
  29.   Dir   : DirStr;
  30.   Name  : NameStr;
  31.   Ext   : ExtStr;
  32.   i     : INTEGER;
  33.   w     : WORD;
  34.   sr    : SearchRec;
  35.  
  36. FUNCTION HexW(w: WORD): STRING;
  37. CONST
  38.   HexStr: ARRAY [0..15] OF CHAR = '0123456789ABCDEF';
  39. BEGIN
  40.   HexW := '0000h'^I;
  41.   HexW[1] := HexStr[Hi(W) DIV $10];
  42.   HexW[2] := HexStr[Hi(W) MOD $10];
  43.   HexW[3] := HexStr[Lo(W) DIV $10];
  44.   HexW[4] := HexStr[Lo(W) MOD $10];
  45. END;
  46.  
  47. BEGIN
  48.   WriteLn(^M^J'Sichern/Restaurieren der Schnittstellen');
  49.   FSplit(ParamStr(0), Dir, Name, Ext);
  50.   fName := Dir + Name + '.DAT';
  51.   FindFirst(fName, AnyFile - Directory - VolumeId, sr);
  52.   Assign(f, fName);
  53.   IF Pos(sr.Name, fName) <> 0 THEN SetFAttr(f, Archive);
  54.   IF (Pos(sr.Name, fName) = 0) OR
  55.      (Pos('r', ParamStr(1)) > 0) OR
  56.      (Pos('R', ParamStr(1)) > 0) THEN BEGIN
  57.     FileMode := 1;                          (* Write Only *)
  58.     Rewrite(f);                      (* Datei neu anlegen *)
  59.     FOR i := 0 TO 15 DO BEGIN
  60.       Write(f, Word(Ptr(Seg0040, i)^));     (* schreiben  *)
  61.       IF i < 7 THEN BEGIN
  62.         COM[4] := Chr(i DIV 2 + 49);
  63.         Write(COM, HexW(Word(Ptr(Seg0040, i)^)));
  64.       END ELSE BEGIN
  65.         LPT[4] :=  Chr(i DIV 2 + 45);
  66.         Write(LPT, HexW(Word(Ptr(Seg0040, i)^)));
  67.       END;
  68.       IF (i = 6) OR (i = 14) THEN WriteLn; (* Zeilenumbr. *)
  69.       Inc(i);           (* i = 0, 2, 4, 6, 8, 10, 12, 14  *)
  70.     END;                          (* --> jede 2. Adresse  *)
  71.     WriteLn(Msg, 'gesichert.');
  72.   END ELSE BEGIN
  73.     FileMode := 0;             (* Read Only               *)
  74.     Reset(f);                  (* vorhandene Datei öffnen *)
  75.     Msg[23] := 'e'; WriteLn(Msg, 'restauriert:');
  76.     FOR i := 0 TO 15 DO BEGIN
  77.       Read(f, w);                      (* aus Datei lesen *)
  78.       Move(w, Word(Ptr(Seg0040, i)^), 2); (* .. schreiben *)
  79.       IF i < 7 THEN BEGIN
  80.         COM[4] := Chr(i DIV 2 + 49);
  81.         Write(COM, HexW(Word(Ptr(Seg0040, i)^)));
  82.       END ELSE BEGIN
  83.         LPT[4] := Chr(i DIV 2 + 45);
  84.         Write(LPT, HexW(Word(Ptr(Seg0040, i)^)));
  85.       END;
  86.       IF (i = 6) OR (i = 14) THEN WriteLn; (* Zeilenumbr. *)
  87.       Inc(i);                  (* i = 0, 2, 4, 6, 8, ...  *)
  88.     END;                          (* --> jede 2. Adresse  *)
  89.   END;
  90.   Close(f);                           (* »f« schließen    *)
  91.   SetFAttr(f, Archive + Hidden);      (* Datei verstecken *)
  92. END.
  93.  
  94. (* ====================================================== *)
  95. (*                  Ende von LPT/COM-HOLD.PAS             *)
  96.