keyboard.inc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. {
  2. System independent keyboard interface for tp7
  3. $Id$
  4. }
  5. procedure InitKeyboard;
  6. begin
  7. end;
  8. procedure DoneKeyboard;
  9. begin
  10. end;
  11. function GetKeyEvent: TKeyEvent; assembler;
  12. asm
  13. mov ax,[word ptr PendingKeyEvent+0]
  14. or ax,[word ptr PendingKeyEvent+2]
  15. je @@1
  16. mov ax,[word ptr PendingKeyEvent+0]
  17. mov dx,[word ptr PendingKeyEvent+2]
  18. mov [word ptr PendingKeyEvent+0],0
  19. mov [word ptr PendingKeyEvent+2],0
  20. jmp @@99
  21. @@1:
  22. mov ax,40h
  23. mov es,ax
  24. mov ah, 10h { get extended key }
  25. int 16h
  26. mov dh,3
  27. mov dl,[byte ptr es:17h] { shift state }
  28. and dl,0fh
  29. cmp al,0e0h
  30. jne @@2
  31. or ah,ah
  32. jz @@2
  33. mov al,0
  34. @@2:
  35. @@99:
  36. end;
  37. function PollKeyEvent: TKeyEvent; assembler;
  38. asm
  39. mov ax,[word ptr PendingKeyEvent+0]
  40. or ax,[word ptr PendingKeyEvent+2]
  41. je @@1
  42. mov ax,[word ptr PendingKeyEvent+0]
  43. mov dx,[word ptr PendingKeyEvent+2]
  44. jmp @@2
  45. @@1:
  46. mov ax,40h
  47. mov es,ax
  48. mov ah,11h
  49. int 16h
  50. jnz @@2
  51. xor ax,ax
  52. xor dx,dx
  53. jmp @@99
  54. @@2: mov dh,3
  55. mov dl,[byte ptr es:17h] { shift state }
  56. and dl,0fh
  57. cmp al,0e0h
  58. jne @@3
  59. or ah,ah
  60. jz @@3
  61. mov al,0
  62. @@3:
  63. @@99:
  64. end;
  65. function PollShiftStateEvent: TKeyEvent;assembler;
  66. asm
  67. mov ax,40h
  68. mov es,ax
  69. xor dx,dx
  70. xor ax,ax
  71. mov dl,byte ptr es:[17h] { shift state}
  72. and dl,0fh
  73. end;
  74. { Function key translation }
  75. type
  76. TTranslationEntry = record
  77. Min, Max: Byte;
  78. Offset: Word;
  79. end;
  80. const
  81. TranslationTableEntries = 12;
  82. TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
  83. ((Min: $3B; Max: $44; Offset: kbdF1), { function keys F1-F10 }
  84. (Min: $54; Max: $5D; Offset: kbdF1), { Shift fn keys F1-F10 }
  85. (Min: $5E; Max: $67; Offset: kbdF1), { Ctrl fn keys F1-F10 }
  86. (Min: $68; Max: $71; Offset: kbdF1), { Alt fn keys F1-F10 }
  87. (Min: $85; Max: $86; Offset: kbdF11), { function keys F11-F12 }
  88. (Min: $87; Max: $88; Offset: kbdF11), { Shift+function keys F11-F12 }
  89. (Min: $89; Max: $8A; Offset: kbdF11), { Ctrl+function keys F11-F12 }
  90. (Min: $8B; Max: $8C; Offset: kbdF11), { Alt+function keys F11-F12 }
  91. (Min: 71; Max: 73; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
  92. (Min: 75; Max: 77; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
  93. (Min: 79; Max: 81; Offset: kbdEnd), { Keypad keys kbdEnd-kbdPgDn }
  94. (Min: $52; Max: $53; Offset: kbdInsert));
  95. function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
  96. var
  97. I: Integer;
  98. ScanCode: Byte;
  99. begin
  100. if KeyEvent and $03000000 = $03000000 then
  101. begin
  102. if KeyEvent and $000000FF <> 0 then
  103. begin
  104. TranslateKeyEvent := KeyEvent and $00FFFFFF;
  105. exit;
  106. end
  107. else
  108. begin
  109. { This is a function key }
  110. ScanCode := (KeyEvent and $0000FF00) shr 8;
  111. for I := 1 to TranslationTableEntries do
  112. begin
  113. if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
  114. begin
  115. TranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
  116. (ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
  117. exit;
  118. end;
  119. end;
  120. end;
  121. end;
  122. TranslateKeyEvent := KeyEvent;
  123. end;
  124. function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
  125. begin
  126. TranslateKeyEventUniCode := KeyEvent;
  127. ErrorHandler(errKbdNotImplemented, nil);
  128. end;
  129. {
  130. $Log$
  131. Revision 1.1 2000-01-06 01:20:31 peter
  132. * moved out of packages/ back to topdir
  133. Revision 1.1 1999/11/24 23:36:38 peter
  134. * moved to packages dir
  135. Revision 1.2 1998/12/12 19:13:13 peter
  136. * keyboard updates
  137. * make test target, make all only makes units
  138. Revision 1.1 1998/12/04 12:48:57 peter
  139. * moved some dirs
  140. Revision 1.3 1998/11/01 20:28:25 peter
  141. * fixed strange al=$e0 after int $16 call
  142. Revision 1.2 1998/10/28 21:18:27 peter
  143. * more fixes
  144. Revision 1.1 1998/10/26 11:31:49 peter
  145. + inital include files
  146. }