keyacc3.asm
上传用户:xiaoan1112
上传日期:2013-04-11
资源大小:19621k
文件大小:4k
源码类别:

操作系统开发

开发平台:

Visual C++

  1. ;
  2. ; CW : Character Windows Drivers
  3. ;
  4. ; keyacc3.asm : DOS 3 accessory functions
  5. ;----------------------------------------------------------------------------
  6. NonStandard PollKeyboardKbd
  7. NonStandard FlushKeyRgchKbd
  8. NonStandard SetShiftKkKbd
  9. ;********** PollKeyboardKbd **********
  10. ;* entry / exit : n/a
  11. ;* * Poll the keyboard, send keyboard messages as needed
  12. cProc PollKeyboardKbd,<FAR, PUBLIC, ATOMIC>,<DI>
  13. cBegin PollKeyboardKbd
  14. mov di,OFF_lpwDataKbd ;* Data in data segment
  15. retry_polling:
  16. ;{{
  17. ; fPollKeyboard = FALSE;
  18. ; if (!FTestKeyboardEmpty())
  19. ; /* keyboard is not empty enough */
  20. ; return;
  21. ;}}
  22. mov bx,[di].pinkbCur
  23. IFNDEF KANJI
  24. ;* * don't poll all the time
  25. mov [bx].fPollKeyboardInkb,0
  26. ELSE
  27. ;* * OAX keyboard is weird -- poll all the time
  28. mov [bx].fPollKeyboardInkb,1
  29. ENDIF ;KANJI
  30. cCall [bx].lpfnFTestKeyboardEmptyInkb
  31. or ax,ax
  32. jz end_polling ; Jump if no room in queue.
  33. ;{{
  34. ; // note : for MSKEY and TSRs that introduce waits, we will poll 3
  35. ; times before deciding we don't have anything
  36. ; c = 3;
  37. ; while (c--)
  38. ; if ((key = InKey()) != 0 || ss != ssOld)
  39. ; goto got_something;
  40. ;}}
  41. mov cx,3
  42. retry_inkey:
  43. Save <cx>
  44. cCall InKey ;* DX:AX = value
  45. or ax,ax
  46. jnz got_something
  47. ;* * are the shift states changed ??
  48. cmp dx,[di].ssOld
  49. jne got_something
  50. loop retry_inkey
  51. ;{{ /* Now that we've taken care of all "real" keys (including TSRs),
  52. ; we handle artificial keys from software autorepeat */
  53. ; if (ckeyRepeat > 0)
  54. ; {
  55. ; ss = ssPrev;
  56. ; sc = scPrev;
  57. ; ch = chPrev;
  58. ; ckeyRepeat--;
  59. ; XlateKey(key);
  60. ; }
  61. ; return;
  62. ;}}
  63. cmp [di].ckeyRepeat, 0
  64. jle end_polling
  65. mov ax, word ptr [di].chPrev
  66. mov dx, [di].ssPrev
  67. dec [di].ckeyRepeat
  68. cCall XlateKey
  69. jmp short end_polling
  70. got_something:
  71. ;{{ /* Save the key to prepare for software autorepeat */
  72. ; scPrev = sc;
  73. ; chPrev = ch;
  74. ; ssPrev = ss;
  75. ;}}
  76. mov word ptr [di].chPrev, ax
  77. mov [di].ssPrev, dx
  78. ;{{
  79. ; XlateKey(key);
  80. ;}}
  81. cCall XlateKey ;* parameters in AX/DX
  82. jmp retry_polling ;* keep going till Queue empty
  83. end_polling:
  84. cEnd PollKeyboardKbd
  85. ;*****************************************************************************
  86. ;********** FlushKeyRgchKbd **********
  87. ;* * KBD entry point (see documentation for interface)
  88. ;* * poke key events into BIOS buffer
  89. cProc FlushKeyRgchKbd, <FAR, PUBLIC, ATOMIC>, <SI, DI>
  90.     parmDP  rgchBuffer
  91. cBegin FlushKeyRgchKbd
  92. mov di,OFF_lpwDataKbd ;* Data in data segment
  93. AssertEQ [di].fKeyboardEnabled,0 ;* keyboard must be disabled
  94. ;* * First flush the CW event queue buffer
  95. mov si,rgchBuffer
  96. loop_flush_1:
  97. lodsb
  98. or al,al
  99. jz done_flush_1
  100. xor ah,ah ;* scan code info gone
  101. cCall PokeCh
  102. jmp short loop_flush_1
  103. done_flush_1:
  104. ;* * now flush the low level buffer
  105. loop_flush_2:
  106. lea si,[di].queueKb
  107. mov bx,[si].pHeadQueue
  108. cmp bx,[si].pTailQueue
  109. je done_flush_2
  110. mov ax,[bx]
  111. cCall IncQueuePtr
  112. mov [si].pHeadQueue,bx
  113. cCall PokeCh
  114. jmp short loop_flush_2
  115. done_flush_2:
  116. cEnd FlushKeyRgchKbd
  117. ;********** PokeCh **********
  118. ;* entry: al = character, ah = scan code
  119. ;* * Poke key event back into BIOS buffer
  120. ;* exit: n/a
  121. cProc PokeCh, <NEAR, ATOMIC>, <DS>
  122. cBegin PokeCh
  123. CLI
  124. xor cx,cx
  125. mov ds,cx
  126. mov cx,DS:[BUFFER_TAIL]
  127. mov bx,cx
  128. ;* * increment buffer pointer
  129. inc cx
  130. inc cx
  131. cmp cx,DS:[BUFFER_END]
  132. jne @F
  133. mov cx,DS:[BUFFER_START]
  134. @@:
  135. cmp cx,DS:[BUFFER_HEAD] ;* full ??
  136. je end_poke ;* no room!
  137. mov DS:[BUFFER_TAIL],cx
  138. add bx,400H ;* bias for seg 40:
  139. mov DS:[bx],ax
  140. end_poke:
  141. STI
  142. cEnd PokeCh
  143. ;*****************************************************************************
  144. BIOS_SHIFT equ 417h
  145. ;*********** SetShiftKkKbd *************
  146. ;* * KBD entry point
  147. ;* * set the BIOS shift states given a KK
  148. cProc SetShiftKkKbd, <FAR, PUBLIC, ATOMIC>, <DI>
  149. parmW kkParm
  150. cBegin SetShiftKkKbd
  151. mov di,OFF_lpwDataKbd
  152. ;* translate KK to SS
  153. mov ax, (kkParm)
  154. mov al, ah
  155. and al, SS_CAPLOCK or SS_NUMLOCK or SS_SCRLOCK or SS_ALT or SS_CONTROL or SS_LSHIFT
  156. ;* modify BIOS shift state
  157. xor cx, cx
  158. mov es, cx
  159. mov es:[BIOS_SHIFT], al
  160. xor ah, ah
  161. cCall DoShift, <ax>
  162. cEnd SetShiftKkKbd