home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9303 / dup / duputil.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1993-05-28  |  6.8 KB  |  197 lines

  1. {$A+,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-,X-}
  2. {$IFDEF Ver70} {$P-,Q-,T-,Y-} {$ENDIF}
  3. (*========================================================*)
  4. (*                       DUPUTIL.PAS                      *)
  5. (*  Copyright (c) 1993  Karsten Gieselmann & DMV-Verlag   *)
  6. (*--------------------------------------------------------*)
  7. (*   Unit mit allgemeinen Hilfsfunktionen für »DUP.PAS«   *)
  8. (*  Turbo/Borland Pascal ab 6.0, Stony Brook Pascal+ 6.0  *)
  9. (*                     DOS ab 3.30                        *)
  10. (*        * NICHT FÜR TURBO PASCAL 4.0 und 5.X! *         *)
  11. (*========================================================*)
  12.  
  13. Unit DupUtil;
  14.  
  15. INTERFACE
  16.  
  17. FUNCTION Long2Str(Num: LongInt): STRING;
  18. FUNCTION SameBytes(VAR a, b; Size: WORD): BOOLEAN;
  19. FUNCTION To_Upper(s: STRING): STRING;
  20. FUNCTION To_Lower(s: STRING): STRING;
  21. FUNCTION Pad(s: STRING; Width: BYTE): STRING;
  22. FUNCTION PadNumZero(w: WORD): STRING;
  23. FUNCTION GetTimerTicks: LongInt;
  24. FUNCTION HardDiskDrive(Drive: BYTE): BOOLEAN;
  25. FUNCTION LocalDrive(Drive: BYTE): BOOLEAN;
  26.  
  27. IMPLEMENTATION
  28.  
  29. TYPE
  30.   LongRec = RECORD                 (* so auch in der Unit *)
  31.     Lo, Hi: WORD;                  (* Objects definiert   *)
  32.   END;
  33.  
  34. FUNCTION Long2Str(Num: LongInt): STRING;
  35. (* Stellt einen numerischen Wert als Zeichenkette dar     *)
  36. VAR
  37.   s: STRING;
  38. BEGIN
  39.   Str(Num, s); Long2Str := s;
  40. END;
  41.  
  42. FUNCTION SameBytes(VAR a,b; Size: WORD): BOOLEAN; ASSEMBLER;
  43. (* Vergleicht zwei Speicherbereiche Byte für Byte auf     *)
  44. (* Gleichheit                                             *)
  45. ASM
  46.   MOV   DX, DS    (* Datensegment-Register sichern        *)
  47.   MOV   AX, TRUE  (* Default-Rückgabewert:                *)
  48.                   (*    SameBytes := True                 *)
  49.   MOV   CX, Size  (* Größe der Speicherbereiche als       *)
  50.                   (*    Zähler holen                      *)
  51.   JCXZ  @Done     (* bei Länge Null ist nichts zu tun     *)
  52.   LES   DI, a     (* ES:DI ==> a                          *)
  53.   LDS   SI, b     (* DS:SI ==> b                          *)
  54.   CLD             (* Inkrementierender Speicherzugriff    *)
  55.   REP   CMPSB     (* bis a[i] <> b[i] oder CX=0           *)
  56.   JE    @Done     (* letzter Vergleich war ok, also a=b   *)
  57.   MOV   AX, FALSE (* sonst SameBytes := False             *)
  58.  @Done:
  59.   MOV   DS, DX    (* Datensegment-Register restaurieren   *)
  60. END;
  61.  
  62. FUNCTION To_Upper(s: STRING): STRING; ASSEMBLER;
  63. (* Wandelt ASCII-Zeichenkette in Großbuchstaben um        *)
  64. ASM
  65.   MOV   DX, DS      (* Datensegment-Register sichern      *)
  66.   CLD               (* Inkrementierender Stringzugriff    *)
  67.   XOR   AX, AX      (* Arbeitsregister initialisieren     *)
  68.   LDS   SI, s       (* DS:SI ==> s                        *)
  69.   LES   DI, @Result (* ES:DI ==> Rückgabewert             *)
  70.   LODSB             (* Längenbyte holen ...               *)
  71.   STOSB             (* in die Zielvariable übertragen ... *)
  72.   XCHG  AX, CX      (* und als Schleifenzähler speichern  *)
  73.   JCXZ  @Done       (* falls Länge Null, dann fertig!     *)
  74.  @Next:
  75.   LODSB             (* nächstes Zeichen holen und prüfen  *)
  76.   CMP   AL, 'a'
  77.   JB    @putchar
  78.   CMP   AL, 'z'
  79.   JA    @putchar
  80.   SUB   AL, 20H     (* umwandeln, falls Kleinbuchstabe    *)
  81.  @putchar:
  82.   STOSB             (* in Zielvariable speichern          *)
  83.   LOOP  @Next       (* sooft bis alle Zeichen dran waren  *)
  84.  @Done:
  85.   MOV   DS, DX      (* Datensegment-Register restaurieren *)
  86. END;
  87.  
  88. FUNCTION To_Lower(s: STRING): STRING; ASSEMBLER;
  89. (* Wandelt ASCII-Zeichenkette in Kleinbuchstaben um       *)
  90. ASM
  91.   MOV   DX, DS      (* Datensegment-Register sichern      *)
  92.   CLD               (* Inkrementierender Stringzugriff    *)
  93.   XOR   AX, AX      (* Arbeitsregister initialisieren     *)
  94.   LDS   SI, s       (* DS:SI ==> s                        *)
  95.   LES   DI, @Result (* ES:DI ==> Rückgabewert             *)
  96.   LODSB             (* Längenbyte holen ...               *)
  97.   STOSB             (* in die Zielvariable übertragen ... *)
  98.   XCHG  AX, CX      (* und als Schleifenzähler speichern  *)
  99.   JCXZ  @Done       (* falls Länge Null, dann fertig!     *)
  100. @Next:
  101.   LODSB             (* nächstes Zeichen holen und prüfen  *)
  102.   CMP   AL, 'A'
  103.   JB    @putchar
  104.   CMP   AL, 'Z'
  105.   JA    @putchar
  106.   ADD   AL, 20H     (* umwandeln, falls Großbuchstabe     *)
  107. @putchar:
  108.   STOSB             (* in Zielvariable speichern          *)
  109.   LOOP    @Next     (* sooft bis alle Zeichen dran waren  *)
  110. @Done:
  111.   MOV     DS, DX    (* Datensegment-Register restaurieren *)
  112. END;
  113.  
  114. FUNCTION Pad(s: STRING; Width: BYTE): STRING;
  115. (* Füllt eine Zeichenkette bis zu einer bestimmten Länge  *)
  116. (* mit Blanks auf                                         *)
  117. VAR
  118.   i: BYTE;
  119. BEGIN
  120.   FOR i := Succ(Length(s)) TO Width DO s[i] := #32;
  121.   s[0] := Chr(Width);
  122.   Pad := s;
  123. END;
  124.  
  125. FUNCTION PadNumZero(w: WORD): STRING;
  126. (* Wandelt einen numerischen Wert in die entsprechende    *)
  127. (* Zeichenkette um und füllt gegebenfalls linksbündig mit *)
  128. (* Nullen auf                                             *)
  129. VAR
  130.   s: STRING;
  131. BEGIN
  132.   Str(w: 0, s);
  133.   IF Length(s) = 1 THEN s := '0' + s;
  134.   PadNumZero := s;
  135. END;
  136.  
  137.  
  138. FUNCTION GetTimerTicks: LongInt;
  139. (* Ermittelt die Systemzeit in Timer-Ticks (1/18,2 Sek.)  *)
  140. VAR
  141.   Ticks: LongRec;
  142. BEGIN
  143.   ASM
  144.     XOR AH, AH                (* AH := 0                  *)
  145.     INT 1Ah                   (* Systemzeit-Interrupt 1Ah *)
  146.     MOV Ticks.Hi, CX
  147.     MOV Ticks.Lo, DX
  148.   END;
  149.   GetTimerTicks := LongInt(Ticks);
  150. END;
  151.  
  152. FUNCTION HardDiskDrive(Drive: BYTE): BOOLEAN; ASSEMBLER;
  153. (* Prüft, ob ein Laufwerk auch ein Harddisk-Laufwerk ist  *)
  154. VAR
  155.   return: BOOLEAN;
  156. ASM
  157.   MOV  return, FALSE
  158.   MOV  AX, 4408h                    (* DOS 4408h - IOCTL: *)
  159.   MOV  BL, Drive                    (* Changeable Media   *)
  160.   INT  21h
  161.   JNS  @noerror                     (* CarryFlag gesetzt  *)
  162.   MOV  InOutRes, AX                 (* IoResult setzen    *)
  163.   JMP  @out
  164. @noerror:
  165.   OR   AX, AX                       (* AX = 0?            *)
  166.   JZ   @out
  167.   MOV  return, TRUE
  168. @out:
  169.   MOV  AL, return
  170. END;
  171.  
  172. FUNCTION LocalDrive(Drive: BYTE): BOOLEAN; ASSEMBLER;
  173. (* Prüft, ob ein Laufwerk lokal zum jeweiligen System ge- *)
  174. (* hört oder über ein Netz betrieben wird                 *)
  175. VAR
  176.   return: BOOLEAN;
  177. ASM
  178.   MOV  return, FALSE
  179.   MOV  AX, 4409h                   (* DOS 4409h - IOCTL:  *)
  180.   MOV  BL, Drive                   (* Device Local/Remote *)
  181.   INT  21h
  182.   JNS  @noerror                    (* CarryFlag gesetzt?  *)
  183.   MOV  InOutRes, AX                (* IoResult setzen     *)
  184.   JMP  @out
  185. @noerror:
  186.   AND  AX, 1000h                   (* AX = 1000h?         *)
  187.   JNZ  @out                        (* ja --> Remote Drive *)
  188.   MOV  return, TRUE
  189. @out:
  190.   MOV  AL, return
  191. END;
  192.  
  193. END.
  194.  
  195. (*========================================================*)
  196. (*                   Ende von DUPUTIL.PAS                 *)
  197.