home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / dos / keys.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-05-13  |  6.0 KB  |  210 lines

  1. {$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S-,T-,V-,X-}
  2. (*===================================================================*)
  3. (*                               KEYS.PAS                            *)
  4. (* Unit mit den wichtigsten Interface-Routinen zu den Sondertasten   *)
  5. (* In dieser Unit sind nur Abfragen und kein Setzen der Tasten im-   *)
  6. (* plementiert. Die Abfragen gehen davon aus, daß der Rechner ein    *)
  7. (* AT ist. Alle Abfragen über das Statusbyte 2 klappen nämlich erst  *)
  8. (* mit einem AT-BIOS. Der XT kennt das Statusbyte 2 nicht. Falls die *)
  9. (* Unit auch mit einem XT verwendet werden soll, dürfen die Tasten-  *)
  10. (* abfragen mit dem Statusbyte 2 nicht verwendet werden.             *)
  11. (* Alle Abfragen nach dem Statusbyte 1 funktionieren natürlich auch  *)
  12. (* ohne Änderungen auf einem PC-XT.                                  *)
  13. (*-------------------------------------------------------------------*)
  14. (*            Copyright (C) 1993 te-wi Verlag, München               *)
  15. (*===================================================================*)
  16.  
  17. UNIT Keys;
  18.  
  19. INTERFACE
  20.  
  21. TYPE
  22.    tLED = (LEDScrollLock, LEDNumLock, LEDCapsLock);
  23.    tLEDSet = (ON, OFF, ignore);
  24.  
  25. FUNCTION TestMFKeyBoard: BOOLEAN;
  26.  
  27. PROCEDURE SetLockKey(ScrollLock, NumLock, CapsLock: tLEDSet);
  28.  
  29. FUNCTION AltPressed         : BOOLEAN;               { Statusbyte 1   }
  30. FUNCTION AltLeftPressed     : BOOLEAN;               { Statusbyte 2   }
  31. FUNCTION AltRightPressed    : BOOLEAN;               { Verknüpfung    }
  32.  
  33. FUNCTION CtrlPressed        : BOOLEAN;               { Statusbyte 1   }
  34. FUNCTION CtrlLeftPressed    : BOOLEAN;               { Statusbyte 2   }
  35. FUNCTION CtrlRightPressed   : BOOLEAN;               { Verknüpfung    }
  36.  
  37. FUNCTION ShiftPressed       : BOOLEAN;               { Statusbyte 1   }
  38. FUNCTION ShiftLeftPressed   : BOOLEAN;               { Statusbyte 1   }
  39. FUNCTION ShiftRightPressed  : BOOLEAN;               { Verknüpfung    }
  40. FUNCTION ShiftLockActive    : BOOLEAN;               { Statusbyte 1   }
  41.  
  42. FUNCTION NumLockActive      : BOOLEAN;               { Statusbyte 1   }
  43. FUNCTION NumLockPressed     : BOOLEAN;               { Statusbyte 2   }
  44.  
  45. FUNCTION ScrollLockActive   : BOOLEAN;               { Statusbyte 1   }
  46.  
  47. FUNCTION InsActive          : BOOLEAN;               { Statusbyte 1   }
  48. FUNCTION Insert             : BOOLEAN;               { Statusbyte 2   }
  49. FUNCTION OverWrite          : BOOLEAN;               { Statusbyte 2   }
  50.  
  51. FUNCTION SysReqPressed      : BOOLEAN;               { Statusbyte 2   }
  52.  
  53. FUNCTION LEDState(LED: tLED): BOOLEAN;               { LED-Statusbyte }
  54.  
  55. IMPLEMENTATION
  56.  
  57. FUNCTION AltPressed : BOOLEAN;
  58. BEGIN
  59.   AltPressed := (BYTE(Ptr(Seg0040, $17)^) AND $08 = $08);
  60. END;
  61.  
  62. FUNCTION AltLeftPressed: BOOLEAN;
  63. BEGIN
  64.   AltLeftPressed := BYTE(Ptr(Seg0040, $18)^) AND $02 = $02;
  65. END;
  66.  
  67. FUNCTION AltRightPressed: BOOLEAN;
  68. BEGIN
  69.   AltRightPressed := AltPressed AND (NOT AltLeftPressed);
  70. END;
  71.  
  72. FUNCTION CtrlPressed: BOOLEAN;
  73. BEGIN
  74.   CtrlPressed := BYTE(Ptr(Seg0040, $17)^) AND $04 = $04;
  75. END;
  76.  
  77. FUNCTION CtrlLeftPressed: BOOLEAN;
  78. BEGIN
  79.   CtrlLeftPressed := BYTE(Ptr(Seg0040, $18)^) AND $01 = $01;
  80. END;
  81.  
  82. FUNCTION CtrlRightPressed: BOOLEAN;
  83. BEGIN
  84.   IF CtrlPressed AND (NOT CtrlLeftPressed) THEN
  85.      CtrlRightPressed := TRUE
  86.   ELSE
  87.      CtrlRightPressed := FALSE;
  88. END;
  89.  
  90. FUNCTION ShiftLeftPressed: BOOLEAN;
  91. BEGIN
  92.   ShiftLeftPressed := BYTE(Ptr(Seg0040, $17)^) AND $02 = $02;
  93. END;
  94.  
  95. FUNCTION ShiftRightPressed: BOOLEAN;
  96. BEGIN
  97.   ShiftRightPressed := BYTE(Ptr(Seg0040, $17)^) AND $01 = $01;
  98. END;
  99.  
  100. FUNCTION ShiftPressed: BOOLEAN;
  101. BEGIN
  102.   IF ShiftRightPressed OR ShiftLeftPressed THEN
  103.     ShiftPressed := TRUE
  104.   ELSE
  105.     ShiftPressed := FALSE;
  106. END;
  107.  
  108. FUNCTION ScrollLockActive: BOOLEAN;
  109. BEGIN
  110.   ScrollLockActive := BYTE(Ptr(Seg0040, $17)^) AND $10 = $10;
  111. END;
  112.  
  113. FUNCTION ShiftLockActive: BOOLEAN;
  114. BEGIN
  115.  ShiftLockActive := BYTE(Ptr(Seg0040, $17)^) AND $40 = $40;
  116. END;
  117.  
  118. FUNCTION Insert: BOOLEAN;
  119. BEGIN
  120.   Insert := BYTE(Ptr(Seg0040, $18)^) AND $80 = $80;
  121. END;
  122.  
  123. FUNCTION OverWrite: BOOLEAN;
  124. BEGIN
  125.   OverWrite := NOT Insert;
  126. END;
  127.  
  128. FUNCTION InsActive: BOOLEAN;
  129. BEGIN
  130.   InsActive := BYTE(Ptr(Seg0040, $17)^) AND $80 = $80;
  131. END;
  132.  
  133. FUNCTION NumLockActive: BOOLEAN;
  134. BEGIN
  135.   NumLockActive := BYTE(Ptr(Seg0040, $17)^) AND $20 = $20;
  136. END;
  137.  
  138. FUNCTION NumLockPressed: BOOLEAN;
  139. BEGIN
  140.   NumLockPressed := BYTE(Ptr(Seg0040, $18)^) AND $20 = $20;
  141. END;
  142.  
  143. FUNCTION SysReqPressed: BOOLEAN;
  144. BEGIN
  145.   SysReqPressed := BYTE(Ptr(Seg0040, $18)^) AND $04 = $04;
  146. END;
  147.  
  148. FUNCTION LEDState(LED: tLED): BOOLEAN;
  149. BEGIN
  150.   ASM
  151.     MOV AH, 2
  152.     INT 16H
  153.   END;
  154.   CASE LED OF
  155.     LEDScrollLock: LEDState := BYTE(Ptr(Seg0040, $97)^) AND 1 = 1;
  156.     LEDNumLock   : LEDState := BYTE(Ptr(Seg0040, $97)^) AND 2 = 2;
  157.     LEDCapsLock  : LEDState := BYTE(Ptr(Seg0040, $97)^) AND 4 = 4;
  158.   END;
  159.   ASM
  160.     MOV AH, 2
  161.     INT 16H
  162.   END;
  163. END;
  164.  
  165. PROCEDURE SetLockKey(ScrollLock, NumLock, CapsLock: tLEDSet);
  166. BEGIN
  167.   IF ScrollLock = ON THEN
  168.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) OR $10
  169.   ELSE IF ScrollLock = OFF THEN
  170.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) AND (NOT $10)
  171.   ELSE IF ScrollLock = ignore THEN ;
  172.   IF NumLock = ON THEN
  173.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) OR $20
  174.   ELSE IF NumLock = OFF THEN
  175.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) AND (NOT $20)
  176.   ELSE IF NumLock = ignore THEN ;
  177.   IF CapsLock = ON THEN
  178.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) OR $40
  179.   ELSE IF CapsLock = OFF THEN
  180.     BYTE(Ptr(Seg0040, $17)^) := BYTE(Ptr(Seg0040, $17)^) AND (NOT $40)
  181.   ELSE IF CapsLock = ignore THEN ;
  182.   ASM
  183.     MOV AH, 1
  184.     INT 16H
  185.   END;
  186. END;
  187.  
  188. FUNCTION TestMFKeyBoard: BOOLEAN;
  189. VAR
  190.   got: BYTE;
  191. BEGIN
  192.   TestMFKeyBoard := FALSE;
  193.   ASM
  194.     MOV  AX, 1200H
  195.     INT  16H
  196.     CMP  AX, 1200H
  197.     JE   @none
  198.     MOV  got, 1
  199.     JMP  @ready
  200.    @none:
  201.     MOV got, 0
  202.     JMP @ready
  203.    @ready:
  204.   END;
  205.   IF got = 1 THEN TestMFKeyBoard := TRUE;
  206. END;
  207.  
  208. END.
  209.  
  210. (*===================================================================*)