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

操作系统开发

开发平台:

Visual C++

  1. ;*
  2. ;* CW : Character Windows
  3. ;*
  4. ;* kbd_ibm.asm : standard IBM procedures (and helpers)
  5. ifndef MkGetShiftStates_NonDefault
  6. ;*****************************************************************************
  7. ;********** MkGetShiftStatesKbd **********
  8. ;* * KBD entry point (see documentation for interface)
  9. ;* * return MK values from last saved shift states
  10. cProc MkGetShiftStatesKbd, <FAR, PUBLIC, ATOMIC>
  11. cBegin MkGetShiftStatesKbd
  12. mov bx,OFF_lpwDataKbd
  13. xor ax,ax
  14. mov dx,[bx].ssOld
  15. test dl,SS_SHIFT
  16. jz not_mk_shift
  17. Assert <MK_SHIFT LT 100H>
  18. or ax,MK_SHIFT
  19. not_mk_shift:
  20. test dl,SS_CONTROL
  21. jz not_mk_control
  22. Assert <MK_CONTROL LT 100H>
  23. or ax,MK_CONTROL
  24. not_mk_control:
  25. test dl,SS_ALT
  26. jz not_mk_menu
  27. Assert <MK_MENU GE 100H>
  28. or ah,HIGH MK_MENU
  29. not_mk_menu:
  30. cEnd MkGetShiftStatesKbd
  31. ;*****************************************************************************
  32. endif ;* MkGetShiftStates_NonDefault
  33. ;*****************************************************************************
  34. ;* * HELPER ROUTINES *
  35. ;********** DoShift **********
  36. ;* entry : ssNew = shift state
  37. ;* DS:DI => driver data
  38. ;* * set the new shift state
  39. ;* exit : n/a
  40. cProc DoShift, <NEAR, ATOMIC, PUBLIC>
  41.     parmW ssNew
  42. cBegin DoShift
  43. AssertEQ di,OFF_lpwDataKbd
  44. ;{{
  45. ; if (ssNew == ssOld)
  46. ; return;
  47. ;}}
  48. mov ax,ssNew
  49. mov dx,[di].ssOld
  50. cmp ax,dx
  51. je end_do_shift
  52. ;{{
  53. ; kkNew = KkOfSs(ssNew);
  54. ; kkOld = KkOfSs(ssOld);
  55. ; if (kkNew != kkOld)
  56. ; // special message for change in shift states
  57. ; KeyboardMessage(0, kkOld, kkNew, TRUE);
  58. ;}}
  59. cCall KkOfSs, <ax>
  60. mov cx,ax ;* cx = kkNew
  61. cCall KkOfSs, <dx> ;* ax = kkOld, dx = ssOld
  62. cmp ax,cx
  63. je done_update_shift_kk
  64. mov bx,[di].pinkbCur
  65. push dx ;* save ssOld
  66. push ax ;* save kkOld
  67. xor dx,dx
  68. IFDEF KANJI
  69. cCall [bx].lpfnKeyboardMessageInkb, <dx, dx, ax, cx, sp>
  70. ELSE
  71. cCall [bx].lpfnKeyboardMessageInkb, <dx, ax, cx, sp>
  72. ENDIF ; KANJI
  73. pop ax
  74. pop dx
  75. done_update_shift_kk: ;* ax = kkOld, dx = ssOld
  76. ;{{
  77. ; /* check for shift event up or down */
  78. ; ssDelta = ssOld ^ ssNew;
  79. ; if (ssDelta & SS_ALT)
  80. ; {
  81. ; KeyboardMessage(VwOfVk(VK_MENU), VwOfVk(VK_MENU), KkOfSs(ssNew),
  82. ;     ~ssNew & SS_ALT);
  83. ; }
  84. ; if ((ssDelta & SS_SPACE) && !(ssNew & SS_SPACE))
  85. ; {
  86. ; /* releasing SPACE key */
  87. ; KeyboardMessage(VwOfVk(VK_SPACE), VwOfVk(VK_SPACE),
  88. ;     KkOfSs(ssNew), TRUE);
  89. ; }
  90. ;}}
  91. mov ax,ssNew
  92. xor dx,ax ;* dx = ssDelta
  93. test dx,SS_ALT
  94. jz not_ss_menu
  95. mov bx,ax
  96. not bx
  97. and bx,SS_ALT ;* ssMask & ~ssNew
  98. mov cl,VwOfVk(VK_MENU)
  99. cCall KeyboardMessageShort
  100. not_ss_menu:
  101. test dx,SS_SPACE
  102. jz not_ss_space
  103. test ax,SS_SPACE
  104. jnz not_ss_space
  105. mov cl,VwOfVk(VK_SPACE)
  106. mov bx,sp ;* fUp = TRUE
  107. cCall KeyboardMessageShort
  108. not_ss_space:
  109. ;{{
  110. ; ssOld = ssNew;
  111. ;}}
  112. mov ax,ssNew
  113. mov [di].ssOld,ax
  114. end_do_shift:
  115. cEnd DoShift
  116. ;********** KeyboardMessageShort **********
  117. ;* entry : cl = vw
  118. ;* bx = fUp
  119. ;* ax = ssNew
  120. ;* DS:DI => driver data
  121. ;* * Call KeyboardMessage
  122. ;* exit : n/a
  123. ;* RETAINS : ax, dx
  124. cProc KeyboardMessageShort, <NEAR>, <AX, DX>
  125. cBegin KeyboardMessageShort
  126. AssertEQ di,OFF_lpwDataKbd
  127. IFDEF KANJI
  128. xor dx,dx
  129. push dx ;* sc
  130. ENDIF ; KANJI
  131. xor ch,ch
  132. push cx ;* vw
  133. inc ch ;* vw -> vk
  134. push cx ;* vk
  135. cCall KkOfSs, <ax> ;* KkOfSs(ssNew)
  136. push ax
  137. push bx ; fUp
  138. mov bx,[di].pinkbCur
  139. cCall [bx].lpfnKeyboardMessageInkb
  140. cEnd KeyboardMessageShort
  141. ;********** KkOfSs() **********
  142. ;* entry : ssParm contains shift states
  143. ;* * convert ss to kk values
  144. ;* exit : AX = kk
  145. ;* * TRASHES only AX
  146. cProc KkOfSs, <NEAR, ATOMIC, PUBLIC>
  147.     parmW ssParm
  148. cBegin KkOfSs
  149. mov ax,(ssParm)
  150. ;* * the following code assumes the SS_ and KK_ values !!!
  151. Assert <SS_SHIFT EQ 3> ;* lower 2 bits
  152. Assert <SS_CONTROL EQ 4>
  153. Assert <SS_ALT EQ 8>
  154. Assert <SS_SCRLOCK EQ 10H>
  155. Assert <SS_NUMLOCK EQ 20H>
  156. Assert <SS_CAPLOCK EQ 40H>
  157. Assert <SS_LSHIFT EQ HIGH(KK_SHIFT)>
  158. Assert <SS_CONTROL EQ HIGH(KK_CONTROL)>
  159. Assert <SS_ALT EQ HIGH(KK_ALT)>
  160. Assert <SS_SCRLOCK EQ HIGH(KK_SCRLOCK)>
  161. Assert <SS_NUMLOCK EQ HIGH(KK_NUMLOCK)>
  162. Assert <SS_CAPLOCK EQ HIGH(KK_CAPLOCK)>
  163. test al,SS_RSHIFT
  164. jz not_rshift
  165. or al,SS_LSHIFT ;* set lshift to reflect total shift
  166. not_rshift:
  167. and al,SS_CAPLOCK OR SS_NUMLOCK OR SS_SCRLOCK OR SS_ALT OR SS_CONTROL OR SS_LSHIFT
  168. xchg al,ah ;* convert ss to kk
  169. ifdef KANJI
  170. test al,HIGH(SS_EXTENDED)
  171. jz no_extend
  172. or ah,HIGH(KK_EXTENDED)
  173. no_extend:
  174. and al,KJ_KANA
  175. else
  176. and al,HIGH(SS_EXTENDED)
  177. jz no_extend
  178. xor al,al
  179. or ah,HIGH(KK_EXTENDED)
  180. no_extend:
  181. endif
  182. cEnd KkOfSs
  183. ;*****************************************************************************