CoolKey.pas 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. {$G+}
  2. UNIT CoolKey; {“¤®¡­ ï,   £« ¢­®¥ ¡ëáâà ï à ¡®â  á ª« ¢¨ âãன.
  3. �®«ì訥 ¢®§¬®¦­®áâ¨}
  4. INTERFACE
  5. {$C FIXED PRELOAD PERMANENT}
  6. Uses Dos;
  7. {$F+,S-,W-}
  8. Type
  9. EScanCode = (SC_BUFFULL, SC_ESCAPE, SC_1, SC_2, SC_3, SC_4, SC_5 ,SC_6, SC_7,
  10. SC_8, SC_9, SC_0, SC_MINUS, SC_EQUAL, SC_BACKSPACE, SC_TAB,
  11. SC_Q,SC_W,SC_E,SC_R,SC_T,SC_Y,SC_U,SC_I,SC_O,SC_P,SC_RBR,SC_LBR,
  12. SC_ENTER,SC_LCTRL,SC_A,SC_S,SC_D,SC_F,SC_G,SC_H,SC_J,SC_K,SC_L,
  13. SC_SEMICOLON,SC_AMPERSAND,SC_TILDE,SC_LSHIFT,SC_BACKSLASH,
  14. SC_Z,SC_X,SC_C,SC_V,SC_B,SC_N,SC_M,SC_COMMA,SC_PERIOD,SC_SLASH,
  15. SC_RSHIFT,SC_GREY_MUL,SC_LALT,SC_SPACE,SC_CAPSLOCK,SC_F1,SC_F2,
  16. SC_F3,SC_F4,SC_F5,SC_F6,SC_F7,SC_F8,SC_F9,SC_F10,SC_NUMLOCK,
  17. SC_SCROLLLOCK,SC_PAD_HOME,SC_PAD_UP,SC_PAD_PGUP,SC_GRAY_SUB,
  18. SC_PAD_LEFT,SC_PAD_5,SC_PAD_RIGHT,SC_GRAY_ADD,SC_PAD_END,
  19. SC_PAD_DOWN,SC_PAD_PGDN,SC_PAD_INS,SC_PAD_DEL, {Primary over}
  20. SC_SYSREQ,SC_NOTE1_F11,SC_L102,SC_F11,SC_F12,SC_NOTE1_F15,
  21. SC_PA1,SC_LWin,SC_RWIN,SC_MENU,SC_5E,SC_5F,SC_60,SC_61,SC_62,
  22. SC_F16,SC_F17,SC_F18,SC_F19,SC_F20,SC_F21,SC_F22,SC_F23,SC_F24,
  23. SC_6C,SC_ERASEOEF,SC_6E,SC_COPYPLAY,SC_70,SC_71,SC_CrSel,SC_DELTA,
  24. SC_EXSEL,SC_75,SC_CLEAR,SC_77,SC_78,SC_79,SC_7A,SC_7B,SC_7C,SC_7D,
  25. SC_7E,SC_7F,
  26. {ADDITION TO TABLE, prefixed by 0E0h }
  27. SC_80,SC_81,SC_82,SC_83,SC_84,SC_85,SC_86,SC_87,SC_88,SC_89,SC_8A,SC_8B,SC_8C,SC_8D,SC_8E,SC_8F,
  28. SC_90,SC_91,SC_92,SC_93,SC_94,SC_95,SC_96,SC_97,SC_98,SC_99,SC_9A,SC_9B,SC_PAD_ENTER,SC_RCTRL,SC_9E,SC_9F,
  29. SC_A0,SC_A1,SC_A2,SC_A3,SC_A4,SC_A5,SC_A6,SC_A7,SC_A8,SC_A9,SC_PREFIX,SC_AB,SC_AC,SC_AD,SC_AE,SC_AF,
  30. SC_B0,SC_B1,SC_B2,SC_B3,SC_B4,SC_PAD_DIV,SC_B6,SC_PRINTSCREEN,SC_RALT,SC_B9,SC_BA,SC_BB,SC_BC,SC_BD,SC_BE,SC_BF,
  31. SC_C0,SC_C1,SC_C2,SC_C3,SC_C4,SC_C5,SC_C6,SC_HOME,SC_UP,SC_PGUP,SC_CA,SC_LEFT,SC_CC,SC_RIGHT,SC_CE,SC_END,
  32. SC_DOWN,SC_PGDN,SC_INSERT,SC_DELETE,SC_D4,SC_D5,SC_D6,SC_D7,SC_D8,SC_D9,SC_DA,SC_DB,SC_DC,SC_DD,SC_DE,SC_DF,
  33. SC_E0,SC_E1,SC_E2,SC_E3,SC_E4,SC_E5,SC_E6,SC_E7,SC_E8,SC_E9,SC_EA,SC_EB,SC_EC,SC_ED,SC_EE,SC_EF,
  34. SC_F0,SC__F1,SC__F2,SC__F3,SC__F4,SC__F5,SC__F6,SC__F7,SC__F8,SC__F9,SC_FA,SC_FB,SC_FC,SC_FD,SC_FE,SC_FF);
  35. TKeyTable = array [EScanCode] of boolean;
  36. PKeyTable = ^TKeyTable; {ƒ« ¢­ë© ⨯ ¬®¤ã«ï, ¬ áᨢ ­ ¦ âëå ª­®¯®ª}
  37. CONST
  38. SC_NAME : array [EScanCode] of string [15] =
  39. ('','Escape','1','2','3','4','5','6','7','8','9','0','Substract',
  40. 'Equal','Backspace','Tab','Q','W','E','R','T','Y','U','I','O','P',
  41. 'Right Bracket','Left Bracket','Enter', 'Left Ctrl','A','S','D','F','G','H',
  42. 'J','K','L','Semicolon','Ampersand','Tilde','Left Shift','Back Slash','Z',
  43. 'X','C','V','B','N','M',
  44. 'Comma','Period','Slash','Right Shift','Grey *','Left Alt',
  45. 'SpaceBar','CapsLock','F1','F2','F3','F4','F5','F6','F7','F8','F9','F10',
  46. 'NumLock','ScrollLock','Pad Home','Pad Up','Pad PgUp','Gray -','Pad Left',
  47. 'Pad 5','Pad Right','Gray +','Pad End','Pad Down','Pad PgDn','Pad Ins',
  48. 'Pad Del','','','','F11','F12','','','Left Win','Right Win','Menu','5E','5F',
  49. '60','61','62','63','64','65','66','67','68','69','6A','6B','6C','6D','6E',
  50. '6F','70','71','72','73','74','75','76','77','78','79','7A','7B','7C','7D',
  51. '7E','7F', {Full Original PC/XT Keyboard}
  52. {Begining of 101-key}
  53. '80','81','!','@','#','$','%','^','&','*','(',')','_','+','8E','8F','90','91',
  54. '92','93','94','96','96','97','98','99','9A','9B','Pad Enter', 'Right Ctrl',
  55. '9E','9F','A0','A1','A2','A3','A4','A5','A6','A7','A8','A9','Prefix','AB',
  56. 'AC','AD','AE','AF','B0','B1','B2','B3','B4','Pad Div','Prefix','Printscreen',
  57. 'Right Alt','B9','BA','BB','BC','BD','BE','BF','C0','C1','C2','C3','C4','C5',
  58. 'C6','Home','Up','PgUp','CA','Left','CC','Right','CE','End','Down','PgDn',
  59. 'Insert','Delete','D4','D5','D6','D7','D8','D9','DA','Left Win','Right Win',
  60. 'Menu','DE','DF','E0','E1','E2','E3','E4','E5','E6','E7','E8','E9','EA',
  61. 'EB','EC','ED','EE','EF','F0','F1','F2','F3','F4','F5','F6','F7','F8','F9',
  62. 'FA','FB','FC','FD','FE','FF');
  63. Function InitKeyboard : PKeyTable; {�¥à¥å¢ â INT09. ‚®§¢à. 㪠­  â ¡«¨æã}
  64. Procedure CloseKeyboard; {‚®§¢à â ¯à¥à뢠­¨ï. ‚ë室}
  65. IMPLEMENTATION
  66. const
  67. gInited : boolean = false;
  68. lastPref : byte = 0;
  69. var
  70. KeyTable : TKeyTable;
  71. OldINT09 : Pointer;
  72. Procedure NewInt09;far;assembler;
  73. asm
  74. push ax
  75. push bx
  76. push si
  77. xor bx, bx
  78. xor ax, ax
  79. in al, 60h
  80. cmp al, 0E0h
  81. jz @@SETPREF
  82. mov bl, al {Save real value}
  83. and bl, 7Fh
  84. add bl, lastPref {Calculate table offset}
  85. mov si, offset KeyTable {Load table}
  86. add si, bx {Add index}
  87. (* test al, 80h {Get 7th bit of key (pressed/released}
  88. jz @@PRESSED
  89. mov byte ptr ds:[si], 0h {set table value false}
  90. mov lastPref, 0
  91. jmp @@OUT
  92. @@PRESSED:
  93. mov byte ptr ds:[si], 1h {set table value true}
  94. mov lastPref, 0
  95. jmp @@OUT
  96. *)
  97. shr al, 7
  98. not al
  99. and al, 1
  100. mov ds:[si], al
  101. mov lastPref, 0
  102. jmp @@OUT
  103. @@SETPREF:
  104. mov lastPref, 80h {This equals offset of extended keys}
  105. @@OUT:
  106. cli
  107. in al, 61h { Get value of keyboard control lines}
  108. mov ah, al { save it }
  109. or al, 80h { set the "enable kbt" bit }
  110. out 61h, al { and write it out the contorl port }
  111. xchg ah, al { fetch the original value }
  112. out 61h, al { and write it back }
  113. mov al, 20h { Send End-Of-Interrupt signal }
  114. out 20h, al { to the 8259 Interrupt Controller }
  115. sti
  116. pop si
  117. pop bx
  118. pop ax
  119. iret
  120. end;{NewInt09}
  121. {-------------------------------}
  122. Function InitKeyboard : PKeyTable; {�¥à¥å¢ â INT09. ‚®§¢à. 㪠­  â ¡«¨æã}
  123. begin
  124. if gInited then Exit;
  125. FillChar(KeyTable,256,0); {Zeroes keys table}
  126. GetIntVec($09,OldINT09);
  127. SetIntVec($09,Addr(NewINT09));
  128. gInited := true;
  129. InitKeyBoard := @KeyTable;
  130. end;{Init keyboard}
  131. {------------------------}
  132. Procedure CloseKeyboard; {‚®§¢à â ¯à¥à뢠­¨ï. ‚ë室}
  133. begin
  134. if not gInited then exit;
  135. SetIntVec($09,OldInt09);
  136. gInited := false;
  137. end;{CloseKeyboard}
  138. END.