Keyboard Scan Codes

 When the keyboard forces a hardware interrupt, it passes a Scan Code to
 the INT 09H interrupt handler.  The handler converts this to an ASCII or
 Extended ASCII value.  For compatibility across the various keyboards, it
 is wise to avoid using scan codes and stick to the BIOS translation of a
 keystroke.

ŪŻOriginal PC/XT KeyboardŽŪ
  When a key is released, the keyboard sends the same value, ORed with 80H
  (e.g., [Ctrl] sends 1dH when pressed and 9dH when released).

ÄÄÄÄÄÄÄÄÄÄÄÄĀÄÄÄÄÄÄÄÄÄÄÄÄÄĀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
Hex Dec Key ³Hex Dec Key  ³Hex Dec Key    ³Hex Dec Key    ³Hex Dec Key
ÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
01   1  Esc ³12  18  E    ³23  35  H      ³34  52  . >    ³45  69  NumLock
02   2  1 ! ³13  19  R    ³24  36  J      ³35  53  / ?    ³46  70  ScrollLck
03   3  2 @ ³14  20  T    ³25  37  K      ³36  54  Shft(R)³47  71  Home [7]
04   4  3 # ³15  21  Y    ³26  38  L      ³37  55  * PrtSc³48  72  ^    [8]
05   5  4 $ ³16  22  U    ³27  39  ; :    ³38  56  Alt    ³49  73  PgUp [9]
06   6  5 % ³17  23  I    ³28  40  " '    ³39  57  space  ³4a  74  K -
07   7  6 ^ ³18  24  O    ³29  41  ` ~    ³3a  58  CapsLck³4b  75  <    [4]
08   8  7 & ³19  25  P    ³2a  42  Shft(L)³3b  59  F1     ³4c  76       [5]
09   9  8 * ³1a  26  [ {  ³2b  43  \ |    ³3c  60  F2     ³4d  77  >    [6]
0a  10  9 ( ³1b  27  ] }  ³2c  44  Z      ³3d  61  F3     ³4e  78  K +
0b  11  0 ) ³1c  28  Enter³2d  45  X      ³3e  62  F4     ³4f  79  End  [1]
0c  12  - _ ³1d  29  Ctrl ³2e  46  C      ³3f  63  F5     ³50  80  v    [2]
0d  13  + = ³1e  30  A    ³2f  47  V      ³40  64  F6     ³51  81  PgDn [3]
0e  14  bksp³1f  31  S    ³30  48  B      ³41  65  F7     ³52  82  Ins  [0]
0f  15  Tab ³20  32  D    ³31  49  N      ³42  66  F8     ³53  83  Del  [.]
10  16  Q   ³21  33  F    ³32  50  M      ³43  67  F9     ³
11  17  W   ³22  34  G    ³33  51  , <    ³44  68  F10    ³
ÄÄÄÄÄÄÄÄÄÄÄÄĮÄÄÄÄÄÄÄÄÄÄÄÄÄĮÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĮÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĮÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
    K indicates a key on the numeric keypad^ (when not in NumLock mode)

ŪŻ84-key AT KeyboardŽŪ
  The 84-key keyboard sends the same scan codes as the 83-key (original PC)
  keyboard with the addition that

              [SysReq] sends scan code 54H (84 decimal).

  However, the BIOS never lets an application program see this scan code.
  Instead, it invokes INT 15H 85H on make or break of the SysReq key.

  The 'break' (release of a key) is handled differently.  Upon a break, the
  keyboard sends a two-byte sequence:  0f0H, followed by the 'make' scan
  code.  See AT Keyboard Functions for information on programming this
  keyboard.

ŪŻ101-key KeyboardŽŪ
  This keyboard has three separate mappings of the scan codes, selected by
  communication through port 64H.  The keyboard comes to life with scan code
  set 2 (which is wildly different from the 84-key mapping.  However, the
  scan codes are translated by the hardware keyboard interface before they
  are made available to programs that read the keyboard.

  The result is that all of the scan codes identified in the above table are
  valid when the 101-key 'board comes up naturally.  The following table
  lists the additional scan-codes that are sent by the 101-key 'board.  Note
  that all keys mentioned here refer to the keys that are unique to this
  keyboard; e.g., [Insert] is the dedicated insert key (not KeyPad Ins).

  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  Key                       Hex Sequence      ³ Key           Hex Sequence
  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
  F11 ..................... 57                ³ Home ........ e0 47
  F12 ..................... 58                ³ Shft-Home ... e0 aa e0 47
  Right-Alt ............... e0 38             ³ End ......... e0 4f
  Right-Ctrl .............. e0 1d             ³ Shft-End .... e0 aa e0 4f
  PrintScreen ............. e0 2a e0 37       ³ ^ ........... e0 48
  Shft-PrintScreen (SysReq) e0 37             ³ Shft-^ ...... e0 aa e0 48
  Ctrl-PrintScreen (SysReq) e0 37             ³ v ........... e0 50
  Alt-PrintScreen ......... 54                ³ Shft-v ...... e0 aa e0 50
  Pause ................... e1 1d 45 e1 9d c5 ³ PageUp ...... e0 49
  Ctrl-Pause (Break) ...... e0 46 e0 c6       ³ Shft-PageUp . e0 aa e0 49
  Insert .................. e0 52             ³ PageDown .... e0 51
  Shft-Insert ............. e0 aa e0 52       ³ Shft-PageDown e0 aa e0 51
  Delete .................. e0 53             ³ > ........... e0 4d
  Shft-Delete ............. e0 aa e0 53       ³ Shft-> ...... e0 aa e0 4d
  < ....................... e0 4b             ³ K Enter ..... e0 1c
  Shft-< .................. e0 aa e0 4b       ³ K / ......... e0 35
                                              ³ Shft-K / .... e0 aa e0 35
  ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄĮÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                 K indicates a key on the numeric keypad^

  Note that in cases where a key is similar to another (pre-101) key, the
  second scan code byte is the same as the original key.  Thus, some
  programs that work at the scan-code level can get away with simply
  ignoring the e0H prefix.

See Also: INT 09H
          Keyboard Flags
          Extended ASCII Keystrokes
          INT 16H
                                    -*-