home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / keyboard / enhanced / enhkbd.pas < prev   
Pascal/Delphi Source File  |  1990-11-14  |  7KB  |  160 lines

  1.                          {$R-,S-}
  2.  
  3. unit EnhKbd;
  4.  
  5. {
  6.  This unit activates the IBM enhanced keyboard for machines that have one, and
  7.  simulates an enhanced keyboard for machines that don't. The enhanced scan
  8.  codes will be returned by all normal calls which read the keyboard, e.g,
  9.  ReadKey (from CRT), ReadKeyWord (from TPCRT and supplied here), and even when
  10.  DOS reads from the keyboard. This unit should be USEd early in a program's
  11.  USES list. There are no procedures to call here -- operation is completely
  12.  transparent to the program.
  13.  
  14.  The unit interfaces a variable, HasEnhancedKbd, which will be True if an
  15.  enhanced keyboard was detected, False otherwise. It interfaces a second
  16.  variable, EnableEnhanced, which defaults to true. If you set this variable to
  17.  False, the ENHKBD special functions will be disabled until you set the
  18.  variable to true again.
  19.  
  20.  The following table summarizes the keys which are affected by using this
  21.  unit. The entries are the values of the scan word in hex. The high byte of
  22.  the scan word is the scan code, the low byte the ASCII character. If the low
  23.  byte is 00, the high byte will be returned on the next call to ReadKey. Any
  24.  keys not listed are returned in the usual manner (see the Turbo Pascal 4.0
  25.  manual, first printing pages 571-572, for a scan code chart). See Notes,
  26.  following the table, for the key to special symbols.
  27.  
  28.                Plain     Shift     Control   Alt
  29.                -----     -----     -------   ----
  30.  F11           8500%     8700%     8900%     8B00%
  31.  F12           8600%     8800%     8A00%     8C00%
  32.  Esc           011B      011B      011B      0100*
  33.  Backquote     2960      297E      2960      2900*
  34.  Backspace     0E08      0E08      0E7F      0E00*
  35.  Tab           0F09      0F00      9400*     A500*
  36.  Left Brack    1A5B      1A7B      1A1B      1A00*
  37.  Right Brack   1B5D      1B7D      1B1D      1B00*
  38.  Backslash     2B5C      2B7C      2B1C      2B00*
  39.  Semicolon     273B      273A       -        2700*
  40.  Quote         2827      2822       -        2800*
  41.  Enter         1C0D      1C0D      1C0A      1C00*
  42.  Comma         332C      333C       -        3300*
  43.  Period        342E      343E       -        3400*
  44.  Slash         352F      353F       -        3500*
  45.  Insert        5200      5230      9200*     A200#
  46.  Del           5300      532E      9300*     A300#
  47.  Home          4700      4737      7700      9700#
  48.  End           4F00      4F31      7500      9F00#
  49.  PgUp          4900      4939      8400      9900#
  50.  PgDn          5100      5133      7600      A100#
  51.  Up            4800      4838      8D00*     9800#
  52.  Down          5000      5032      9100*     A000#
  53.  Left          4B00      4B34      7300      9B00#
  54.  Right         4D00      4D36      7400      9D00#
  55.  Pad-Asterisk  372A       !         !        3700#  (numeric keypad keys)
  56.  Pad-Minus     4A2D      4A2D      8E00*     4A00#
  57.  Pad-Plus      4E2B      4E2B      9000*     4E00#
  58.  Pad-5         4C00*     4C35      8F00*     9C00#
  59.  
  60. Notes:
  61. - These keystrokes are ignored.
  62. * These keystrokes are not normally returned by the non-enhanced keyboard.
  63. # These keystrokes are not normally returned by the enhanced keyboard.
  64. ! These keystrokes control printscreen and print echoing. They cannot
  65.   simulate the effect of the enhanced keyboard, which has the Asterisk and
  66.   PrtSc keys separated.
  67. % The F11 and F12 keys are returned only if they actually exist on the
  68.   keyboard.
  69.  
  70.  With a few exceptions, the EnhKbd unit returns results identical to those of
  71.  the enhanced keyboard BIOS. One difference makes the enhanced keyboard
  72.  simpler to use in a program: those scan words which normally contain E0 in
  73.  the low byte to indicate that the key is specific to the enhanced keyboard
  74.  (like the dedicated cursor keys) will have the low cleared to zero by EnhKbd.
  75.  
  76.  Keys marked with # are normally ignored by the enhanced BIOS. By defining
  77.  these numeric keypad keys when Alt is pressed, the usual ability to enter
  78.  arbitrary keys on the numeric keypad is disabled. Within applications, the
  79.  ability to use alt-shifted arrow keys will generally be more useful. The
  80.  arbitrary keys from the numeric keypad are still available by pressing both
  81.  Alt and Left Shift simultaneously.
  82.  
  83.  Because this unit takes over interrupt 9, it will crash the system if
  84.  SideKick is installed and another TSR that takes over interrupt 9 has been
  85.  loaded after SideKick. You must exercise similar caution in using this unit
  86.  in programs that must take over interrupt 9 for other reasons. If you have
  87.  Turbo Professional, see SMACS.PAS for an example of implementing EnhKbd in a
  88.  TSR.
  89.  
  90.  Information pertinent to writing this unit was found in:
  91.    PC Tech Journal, July 1987, Bob Smith, "Keying on a Standard", page 134.
  92.    PC Magazine, 1/26/88, Jeff Prosise, "Dress up your Help Screens", page 291.
  93.  
  94.  Written by Kim Kokkonen, TurboPower Software, 1/3/88.
  95.  Version 1.2. See ENHKBD.ASM for notes.
  96.  
  97.  Thanks to Brian Foley for his help with version 1.2, and to Scott Bussinger
  98.  for pointing out problems in earlier versions.
  99.  Released to the public domain.
  100. }
  101.  
  102. interface
  103.  
  104. const
  105.   EnableEnhanced : Boolean = True; {Set false to temporarily disable handlers}
  106. var
  107.   HasEnhancedKbd : Boolean;  {True when enhanced keyboard is detected}
  108.  
  109.   procedure RestoreKbdVectors;
  110.     {-Restores original vectors for INT's $09 and $16. Needed only for TSR's.}
  111.  
  112.   {=========================================================================}
  113.  
  114. implementation
  115.  
  116. var
  117.   SaveExit : Pointer;
  118.   SaveInt09 : Pointer;
  119.   SaveInt16 : Pointer;
  120.  
  121.   {$L ENHKBD}
  122.   procedure GetIntVec(IntNo : Byte; var Vector : Pointer); external;
  123.   procedure SetIntVec(IntNo : Byte; Vector : Pointer); external;
  124.   procedure InitVectors; external;
  125.   function EnhancedKbd : Boolean; external;
  126.   procedure NewInt09; external;
  127.   procedure NewInt16; external;
  128.  
  129.   procedure RestoreKbdVectors;
  130.     {-Restores original vectors for INT's $09 and $16. Needed only for TSR's.}
  131.   begin
  132.     SetIntVec($09, SaveInt09);
  133.     SetIntVec($16, SaveInt16);
  134.   end;
  135.  
  136.   {$F+}
  137.   procedure ExitHandler;
  138.     {-Deactive interrupt handlers}
  139.   begin
  140.     ExitProc := SaveExit;
  141.     RestoreKbdVectors;
  142.   end;
  143.   {$F-}
  144.  
  145. begin
  146.   {See if enhanced keyboard BIOS installed}
  147.   HasEnhancedKbd := EnhancedKbd;
  148.  
  149.   {Initialize interrupt vectors}
  150.   GetIntVec($09, SaveInt09);
  151.   GetIntVec($16, SaveInt16);
  152.   InitVectors;
  153.  
  154.   {Install exit handler}
  155.   SaveExit := ExitProc;
  156.   ExitProc := @ExitHandler;
  157. end.
  158.  
  159.  
  160.