home *** CD-ROM | disk | FTP | other *** search
/ Power Programming / powerprogramming1994.iso / progtool / borland / jnfb88.arc / KEYINT.ARC / SHKEY.PAS < prev   
Pascal/Delphi Source File  |  1987-10-08  |  5KB  |  142 lines

  1. PROGRAM Shift_Key_Pressed;
  2. uses crt, dos;
  3. {=============}
  4. {BEGIN INCLUDE}
  5. {=============}
  6. VAR
  7.   Kbd_Vec, Exit_Vec : pointer;
  8. CONST
  9.   Kbd_Int = 9;
  10.  
  11.   {$I ERROR.INC}
  12.  
  13.   PROCEDURE CLI; INLINE($FA); {INLINE procedures are NICE!}
  14.   PROCEDURE STI; INLINE($FB);
  15.  
  16. CONST
  17.   (* Scan codes for seven shift keys *)
  18.   SC_LeftShift  = 42;
  19.   SC_RightShift = 54;
  20.   SC_CtrlShift  = 29;
  21.   SC_AltShift   = 56;
  22.   SC_NumLock    = 69;
  23.   SC_ScrollLock = 70;
  24.   SC_CapsLock   = 58;
  25.   SKP   : Boolean = False;{ShiftKeyPressed flag}
  26.   which : Byte = 0;
  27.  
  28.   PROCEDURE INT9_ISR(_Flags, _CS, _IP, _AX, _BX, _CX, _DX,
  29.                      _SI, _DI, _DS, _ES, _BP:word);
  30.   INTERRUPT;
  31.   BEGIN
  32.     INLINE(
  33.     $9C/                {PUSHF}
  34.     $E4/$60/            {IN   AL,$60 ;read keyboard port}
  35.     $3C/<SC_CAPSLOCK/   {CMP  AL,<SC_CAPSLOCK}
  36.     $74/$1F/            {JZ   Was_Pressed}
  37.     $3C/<SC_LEFTSHIFT/  {CMP  AL,<SC_LEFTSHIFT}
  38.     $74/$1B/            {JZ   Was_Pressed}
  39.     $3C/<SC_RIGHTSHIFT/ {CMP  AL,<SC_RIGHTSHIFT}
  40.     $74/$17/            {JZ   Was_Pressed}
  41.     $3C/<SC_CTRLSHIFT/  {CMP  AL,<SC_CTRLSHIFT}
  42.     $74/$13/            {JZ   Was_Pressed}
  43.     $3C/<SC_ALTSHIFT/   {CMP  AL,<SC_ALTSHIFT}
  44.     $74/$0F/            {JZ   Was_Pressed}
  45.     $3C/<SC_NUMLOCK/    {CMP  AL,<SC_NUMLOCK}
  46.     $74/$0B/            {JZ   Was_Pressed}
  47.     $3C/<SC_SCROLLLOCK/ {CMP  AL,<SC_SCROLLLOCK}
  48.     $74/$07/            {JZ   Was_Pressed}
  49.     (* ================================================= *)
  50.     (* IF you didn't jump by now, it wasn't a shift key  *)
  51.     (* ================================================= *)
  52.     $C6/$06/>SKP/$00/   {MOV  BYTE PTR [>SKP],+$00 ;set SKP FALSE}
  53.     $EB/$08/            {JMP  SHORT To_Normal}
  54. {Was_Pressed:}
  55.     $C6/$06/>SKP/$01/   {MOV  BYTE PTR [>SKP],+$01 ;set SKP TRUE}
  56.     $A2/>WHICH/         {MOV  [>WHICH],AL ;remember WHICH key}
  57. {To_Normal:}
  58.     (* ============================ *)
  59.     (* CHAIN to the regular INT 9   *)
  60.     (* ============================ *)
  61.     $9D/              {POPF         ;Restore the flags}
  62.     $A1/>KBD_VEC+2/   {MOV  AX,[>KBD_VEC+2] ;Old vector seg to AX}
  63.     $8B/$1E/>KBD_VEC/ {MOV  BX,[>KBD_VEC]   ;Old vector ofs to BX}
  64.     $87/$5E/$0E/      {XCHG BX,[BP+$0E] ;Swap ofs w/ return address}
  65.     $87/$46/$10/      {XCHG AX,[BP+$10] ;Swap seg w/ return address}
  66.     $89/$EC/          {MOV  SP,BP ;UNDO procedure's entry code}
  67.     $5D/              {POP  BP}
  68.     $07/              {POP  ES}
  69.     $1F/              {POP  DS}
  70.     $5F/              {POP  DI}
  71.     $5E/              {POP  SI}
  72.     $5A/              {POP  DX}
  73.     $59/              {POP  CX}
  74.     $CB);             {RETF ;in effect, JMP to old vector}
  75.   END;
  76.  
  77.   FUNCTION ShiftKeyPressed : Boolean;
  78.   (* ======================================= *)
  79.   (* Returns the value of flag variable SKP, *)
  80.   (* and resets it to FALSE                  *)
  81.   (* ======================================= *)
  82.   BEGIN
  83.     CLI; {Don't want it changing DURING this!}
  84.     ShiftKeyPressed := SKP;
  85.     SKP := false;
  86.     STI; {OK, can change now}
  87.   END;
  88.  
  89.   FUNCTION Read_SKP : Byte;
  90.   (* ================================== *)
  91.   (* Returns the value of flag variable *)
  92.   (* "WHICH", and resets it to 0        *)
  93.   (* ================================== *)
  94.   BEGIN
  95.     CLI; {Don't want it changing DURING this!}
  96.     Read_SKP := which;
  97.     which := 0;
  98.     STI; {OK, can change now}
  99.   END;
  100.  
  101. {=============}
  102. {END INCLUDE  }
  103. {=============}
  104.  
  105.   PROCEDURE Do_Demo;
  106.   VAR
  107.     CH : Char;
  108.   BEGIN
  109.     ClrScr;
  110.     WriteLn('   KEYBOARD INTERRUPT DEMO "Shift Keys"');
  111.     WriteLn('   ====================================');
  112.     WriteLn;
  113.     Write('   Press the various shift keys on the ');
  114.     WriteLn('keyboard.  The normal "KeyPressed"');
  115.     Write('   function doesn''t notice these keys.  ');
  116.     WriteLn('But the new "ShiftKeyPressed"');
  117.     WriteLn('   notices!  Hit <Ctrl><Break> to quit.');
  118.     REPEAT
  119.       REPEAT UNTIL KeyPressed OR ShiftKeyPressed;
  120.       WHILE KeyPressed DO CH := ReadKey;
  121.       CASE Read_SKP OF
  122.         SC_LeftShift  : WriteLn('Left Shift');
  123.         SC_RightShift : WriteLn('Right Shift');
  124.         SC_CtrlShift  : WriteLn('Control Shift');
  125.         SC_AltShift   : WriteLn('Alt Shift');
  126.         SC_NumLock    : WriteLn('Num Lock');
  127.         SC_ScrollLock : WriteLn('Scroll Lock');
  128.         SC_CapsLock   : WriteLn('Caps Lock');
  129.       END;
  130.     UNTIL FALSE;
  131.   END;
  132.  
  133. BEGIN
  134.   CheckBreak := TRUE;
  135.   GetIntVec(Kbd_Int, Kbd_Vec);   {save "old" INT9}
  136.   SetIntVec(Kbd_Int, @INT9_ISR); {install new}
  137.   Exit_Vec := ExitProc;          {save old ExitProc}
  138.   ExitProc := @My_Error;         {install new}
  139.   Do_Demo;                       {show yer stuff!}
  140.   {Old interrupt is restored by ExitProc}
  141. END.
  142.