keyboard.inc 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. {
  2. System independent keyboard interface for go32v2
  3. <<<<<<< keyboard.inc
  4. $Id$
  5. WARNING this code needs %fs to contain the DOS memory selector
  6. don't forget to reload it after calling C functions
  7. that could change it PM
  8. =======
  9. $Id$
  10. >>>>>>> 1.3
  11. }
  12. uses
  13. go32;
  14. procedure InitKeyboard;
  15. begin
  16. end;
  17. procedure DoneKeyboard;
  18. begin
  19. end;
  20. function GetKeyEvent: TKeyEvent;
  21. var
  22. regs : trealregs;
  23. begin
  24. if PendingKeyEvent<>0 then
  25. begin
  26. GetKeyEvent:=PendingKeyEvent;
  27. PendingKeyEvent:=0;
  28. exit;
  29. end;
  30. regs.ah:=$10;
  31. realintr($16,regs);
  32. if (regs.al=$e0) and (regs.ah<>0) then
  33. regs.al:=0;
  34. GetKeyEvent:=regs.ax or ((mem[$40:$17] and $f) shl 16);
  35. end;
  36. function PollKeyEvent: TKeyEvent;
  37. var
  38. regs : trealregs;
  39. begin
  40. if PendingKeyEvent<>0 then
  41. exit(PendingKeyEvent);
  42. regs.ah:=$11;
  43. realintr($16,regs);
  44. if (regs.realflags and zeroflag<>0) then
  45. exit(0);
  46. if (regs.al=$e0) and (regs.ah<>0) then
  47. regs.al:=0;
  48. PollKeyEvent:=regs.ax or ((mem[$40:$17] and $f) shl 16);
  49. end;
  50. function PollShiftStateEvent: TKeyEvent;
  51. begin
  52. PollShiftStateEvent:=((mem[$40:$17] and $f) shl 16);
  53. end;
  54. { Function key translation }
  55. type
  56. TTranslationEntry = packed record
  57. Min, Max: Byte;
  58. Offset: Word;
  59. end;
  60. const
  61. TranslationTableEntries = 12;
  62. TranslationTable: array [1..TranslationTableEntries] of TTranslationEntry =
  63. ((Min: $3B; Max: $44; Offset: kbdF1), { function keys F1-F10 }
  64. (Min: $54; Max: $5D; Offset: kbdF1), { Shift fn keys F1-F10 }
  65. (Min: $5E; Max: $67; Offset: kbdF1), { Ctrl fn keys F1-F10 }
  66. (Min: $68; Max: $71; Offset: kbdF1), { Alt fn keys F1-F10 }
  67. (Min: $85; Max: $86; Offset: kbdF11), { function keys F11-F12 }
  68. (Min: $87; Max: $88; Offset: kbdF11), { Shift+function keys F11-F12 }
  69. (Min: $89; Max: $8A; Offset: kbdF11), { Ctrl+function keys F11-F12 }
  70. (Min: $8B; Max: $8C; Offset: kbdF11), { Alt+function keys F11-F12 }
  71. (Min: 71; Max: 73; Offset: kbdHome), { Keypad keys kbdHome-kbdPgUp }
  72. (Min: 75; Max: 77; Offset: kbdLeft), { Keypad keys kbdLeft-kbdRight }
  73. (Min: 79; Max: 81; Offset: kbdEnd), { Keypad keys kbdEnd-kbdPgDn }
  74. (Min: $52; Max: $53; Offset: kbdInsert));
  75. function TranslateKeyEvent(KeyEvent: TKeyEvent): TKeyEvent;
  76. var
  77. I: Integer;
  78. ScanCode: Byte;
  79. begin
  80. if KeyEvent and $03000000 = $03000000 then
  81. begin
  82. if KeyEvent and $000000FF <> 0 then
  83. begin
  84. TranslateKeyEvent := KeyEvent and $00FFFFFF;
  85. exit;
  86. end
  87. else
  88. begin
  89. { This is a function key }
  90. ScanCode := (KeyEvent and $0000FF00) shr 8;
  91. for I := 1 to TranslationTableEntries do
  92. begin
  93. if (TranslationTable[I].Min <= ScanCode) and (ScanCode <= TranslationTable[I].Max) then
  94. begin
  95. TranslateKeyEvent := $02000000 + (KeyEvent and $00FF0000) +
  96. (ScanCode - TranslationTable[I].Min) + TranslationTable[I].Offset;
  97. exit;
  98. end;
  99. end;
  100. end;
  101. end;
  102. TranslateKeyEvent := KeyEvent;
  103. end;
  104. function TranslateKeyEventUniCode(KeyEvent: TKeyEvent): TKeyEvent;
  105. begin
  106. TranslateKeyEventUniCode := KeyEvent;
  107. ErrorHandler(errKbdNotImplemented, nil);
  108. end;
  109. {
  110. $Log$
  111. Revision 1.2 2000-07-13 11:32:24 michael
  112. + removed logs
  113. }