Subversion Repositories Kolibri OS

Rev

Rev 3320 | Rev 3356 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
  4. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
  5. ;; Distributed under terms of the GNU General Public License    ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 3355 $
  9.  
  10.  
  11. VKEY_LSHIFT   = 0000000000000001b
  12. VKEY_RSHIFT   = 0000000000000010b
  13. VKEY_LCONTROL = 0000000000000100b
  14. VKEY_RCONTROL = 0000000000001000b
  15. VKEY_LALT     = 0000000000010000b
  16. VKEY_RALT     = 0000000000100000b
  17. VKEY_CAPSLOCK = 0000000001000000b
  18. VKEY_NUMLOCK  = 0000000010000000b
  19. VKEY_SCRLOCK  = 0000000100000000b
  20. VKEY_LWIN     = 0000001000000000b
  21. VKEY_RWIN     = 0000010000000000b
  22.  
  23. VKEY_SHIFT    = 0000000000000011b
  24. VKEY_CONTROL  = 0000000000001100b
  25. VKEY_ALT      = 0000000000110000b
  26.  
  27. uglobal
  28.   align 4
  29.   kb_state      dd 0
  30.   ext_code      db 0
  31.  
  32.   keyboard_mode db 0
  33.   keyboard_data db 0
  34.  
  35.   altmouseb     db 0
  36.   ctrl_alt_del  db 0
  37.  
  38.   kb_lights     db 0
  39.   old_kb_lights db 0
  40.  
  41. align 4
  42.         hotkey_scancodes        rd      256     ; we have 256 scancodes
  43.         hotkey_list             rd      256*4   ; max 256 defined hotkeys
  44.         hotkey_buffer           rd      120*2   ; buffer for 120 hotkeys
  45. endg
  46.  
  47. iglobal
  48. hotkey_tests    dd      hotkey_test0
  49.                 dd      hotkey_test1
  50.                 dd      hotkey_test2
  51.                 dd      hotkey_test3
  52.                 dd      hotkey_test4
  53. hotkey_tests_num = 5
  54. endg
  55. ;---------------------------------------------------------------------
  56. hotkey_test0:
  57.         test    al, al
  58.         setz    al
  59.         ret
  60. ;---------------------------------------------------------------------
  61. hotkey_test1:
  62.         test    al, al
  63.         setnp   al
  64.         ret
  65. ;---------------------------------------------------------------------
  66. hotkey_test2:
  67.         cmp     al, 3
  68.         setz    al
  69.         ret
  70. ;---------------------------------------------------------------------
  71. hotkey_test3:
  72.         cmp     al, 1
  73.         setz    al
  74.         ret
  75. ;---------------------------------------------------------------------
  76. hotkey_test4:
  77.         cmp     al, 2
  78.         setz    al
  79.         ret
  80. ;---------------------------------------------------------------------
  81. hotkey_do_test:
  82.         push    eax
  83.         mov     edx, [kb_state]
  84.         shr     edx, cl
  85.         add     cl, cl
  86.         mov     eax, [eax+4]
  87.         shr     eax, cl
  88.         and     eax, 15
  89.         cmp     al, hotkey_tests_num
  90.         jae     .fail
  91.        
  92.         xchg    eax, edx
  93.         and     al, 3
  94.         call    [hotkey_tests + edx*4]
  95.         cmp     al, 1
  96.         pop     eax
  97.         ret
  98. ;--------------------------------------
  99. .fail:
  100.         stc
  101.         pop     eax
  102.         ret
  103. ;---------------------------------------------------------------------
  104. align 4
  105. set_keyboard_data:
  106.         movzx   eax, word[TASK_COUNT]; top window process
  107.         movzx   eax, word[WIN_POS+eax*2]
  108.         shl     eax, 8
  109.         mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
  110.         mov     [keyboard_mode], al
  111.        
  112.         mov     eax, ecx
  113.        
  114.         push    ebx esi edi ebp
  115.         call    send_scancode
  116.         pop     ebp edi esi ebx
  117.         ret
  118. ;---------------------------------------------------------------------
  119. struct KEYBOARD
  120. next           dd      ?
  121. prev           dd      ?
  122. functions      dd      ?
  123. userdata       dd      ?
  124. ends
  125. struct KBDFUNC
  126. strucsize      dd      ?
  127. close          dd      ?
  128. setlights      dd      ?
  129. ends
  130.  
  131. iglobal
  132. keyboards:
  133.         dd      keyboards
  134.         dd      keyboards
  135. endg
  136. uglobal
  137. keyboard_list_mutex     MUTEX
  138. endg
  139.  
  140. register_keyboard:
  141.         push    ebx
  142.         push    sizeof.KEYBOARD
  143.         pop     eax
  144.         call    malloc
  145.         test    eax, eax
  146.         jz      .nothing
  147.         mov     ecx, [esp+4+4]
  148.         mov     [eax+KEYBOARD.functions], ecx
  149.         mov     ecx, [esp+8+4]
  150.         mov     [eax+KEYBOARD.userdata], ecx
  151.         xchg    eax, ebx
  152.         mov     ecx, keyboard_list_mutex
  153.         call    mutex_lock
  154.         mov     ecx, keyboards
  155.         mov     edx, [ecx+KEYBOARD.prev]
  156.         mov     [ebx+KEYBOARD.next], ecx
  157.         mov     [ebx+KEYBOARD.prev], edx
  158.         mov     [edx+KEYBOARD.next], ebx
  159.         mov     [ecx+KEYBOARD.prev], ebx
  160.         mov     ecx, [ebx+KEYBOARD.functions]
  161.         cmp     [ecx+KBDFUNC.strucsize], KBDFUNC.setlights
  162.         jbe     .unlock
  163.         mov     ecx, [ecx+KBDFUNC.setlights]
  164.         test    ecx, ecx
  165.         jz      .unlock
  166.         stdcall ecx, [ebx+KEYBOARD.userdata], dword [kb_lights]
  167. .unlock:
  168.         mov     ecx, keyboard_list_mutex
  169.         call    mutex_unlock
  170.         xchg    eax, ebx
  171. .nothing:
  172.         pop     ebx
  173.         ret     8
  174.  
  175. delete_keyboard:
  176.         push    ebx
  177.         mov     ebx, [esp+4+4]
  178.         mov     ecx, keyboard_list_mutex
  179.         call    mutex_lock
  180.         mov     eax, [ebx+KEYBOARD.next]
  181.         mov     edx, [ebx+KEYBOARD.prev]
  182.         mov     [eax+KEYBOARD.prev], edx
  183.         mov     [edx+KEYBOARD.next], eax
  184.         call    mutex_unlock
  185.         mov     ecx, [ebx+KEYBOARD.functions]
  186.         cmp     [ecx+KBDFUNC.strucsize], KBDFUNC.close
  187.         jbe     .nothing
  188.         mov     ecx, [ecx+KBDFUNC.close]
  189.         test    ecx, ecx
  190.         jz      .nothing
  191.         stdcall ecx, [ebx+KEYBOARD.userdata]
  192. .nothing:
  193.         pop     ebx
  194.         ret     4
  195. ;---------------------------------------------------------------------
  196. align 4
  197. irq1:
  198.         movzx   eax, word[TASK_COUNT]; top window process
  199.         movzx   eax, word[WIN_POS+eax*2]
  200.         shl     eax, 8
  201.         mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
  202.         mov     [keyboard_mode], al
  203.        
  204.         in      al, 0x60
  205. ;--------------------------------------
  206. send_scancode:
  207.         mov     [keyboard_data], al
  208. ; ch = scancode
  209. ; cl = ext_code
  210. ; bh = 0 - normal key
  211. ; bh = 1 - modifier (Shift/Ctrl/Alt)
  212. ; bh = 2 - extended code
  213.         mov     ch, al
  214.         cmp     al, 0xE0
  215.         je      @f
  216.        
  217.         cmp     al, 0xE1
  218.         jne     .normal_code
  219. @@:
  220.         mov     bh, 2
  221.         mov     [ext_code], al
  222.         jmp     .writekey
  223. ;--------------------------------------
  224. .normal_code:
  225.         mov     cl, 0
  226.         xchg    cl, [ext_code]
  227.         and     al, 0x7F
  228.         mov     bh, 1
  229. ;--------------------------------------
  230. @@:
  231.         cmp     al, 0x5B
  232.         jne     @f
  233.        
  234.         cmp     cl, 0xE0
  235.         jne     .writekey
  236.        
  237.         mov     eax, VKEY_LWIN
  238.         jmp     .modifier
  239. ;--------------------------------------
  240. @@:
  241.         cmp     al, 0x5C
  242.         jne     @f
  243.        
  244.         cmp     cl, 0xE0
  245.         jne     .writekey
  246.        
  247.         mov     eax, VKEY_RWIN
  248.         jmp     .modifier
  249. ;--------------------------------------
  250. @@:
  251.         cmp     al, 0x2A
  252.         jne     @f
  253.        
  254.         cmp     cl, 0xE0
  255.         je      .writekey
  256.        
  257.         mov     eax, VKEY_LSHIFT
  258.         jmp     .modifier
  259. ;--------------------------------------
  260. @@:
  261.         cmp     al, 0x36
  262.         jne     @f
  263.        
  264.         cmp     cl, 0xE0
  265.         je      .writekey
  266.        
  267.         mov     eax, VKEY_RSHIFT
  268.         jmp     .modifier
  269. ;--------------------------------------
  270. @@:
  271.         cmp     al, 0x38
  272.         jne     @f
  273.        
  274.         mov     eax, VKEY_LALT
  275.         test    cl, cl
  276.         jz      .modifier
  277.        
  278.         mov     al, VKEY_RALT
  279.         jmp     .modifier
  280. ;--------------------------------------
  281. @@:
  282.         cmp     al, 0x1D
  283.         jne     @f
  284.        
  285.         mov     eax, VKEY_LCONTROL
  286.         test    cl, cl
  287.         jz      .modifier
  288.        
  289.         mov     al, VKEY_RCONTROL
  290.         cmp     cl, 0xE0
  291.         jz      .modifier
  292.        
  293.         mov     [ext_code], cl
  294.         jmp     .writekey
  295. ;--------------------------------------
  296. @@:
  297.         cmp     al, 0x3A
  298.         jne     @f
  299.        
  300.         mov     bl, 4
  301.         mov     eax, VKEY_CAPSLOCK
  302.         jmp     .no_key.xor
  303. ;--------------------------------------
  304. @@:
  305.         cmp     al, 0x45
  306.         jne     @f
  307.         test    cl, cl
  308.         jnz     .writekey
  309.        
  310.         mov     bl, 2
  311.         mov     eax, VKEY_NUMLOCK
  312.         jmp     .no_key.xor
  313. ;--------------------------------------
  314. @@:
  315.         cmp     al, 0x46
  316.         jne     @f
  317.        
  318.         mov     bl, 1
  319.         mov     eax, VKEY_SCRLOCK
  320.         jmp     .no_key.xor
  321. ;--------------------------------------
  322. @@:
  323.         xor     ebx, ebx
  324.         test    ch, ch
  325.         js      .writekey
  326.        
  327.         movzx   eax, ch          ; plain key
  328.         mov     bl, [keymap+eax]
  329.         mov     edx, [kb_state]
  330.         test    dl, VKEY_CONTROL ; ctrl alt del
  331.         jz      .noctrlaltdel
  332.        
  333.         test    dl, VKEY_ALT
  334.         jz      .noctrlaltdel
  335.        
  336.         cmp     ch, 53h
  337.         jne     .noctrlaltdel
  338.        
  339.         mov     [ctrl_alt_del], 1
  340. .noctrlaltdel:
  341.         test    dl, VKEY_CONTROL ; ctrl on ?
  342.         jz      @f
  343.        
  344.         sub     bl, 0x60
  345. @@:
  346.         test    dl, VKEY_CAPSLOCK        ; caps lock on ?
  347.         jz      .no_caps_lock
  348.        
  349.         test    dl, VKEY_SHIFT   ; shift on ?
  350.         jz      .keymap_shif
  351.        
  352.         jmp     @f
  353. ;--------------------------------------
  354. .no_caps_lock:
  355.         test    dl, VKEY_SHIFT   ; shift on ?
  356.         jz      @f
  357. .keymap_shif:  
  358.         mov     bl, [keymap_shift+eax]
  359. @@:
  360.         test    dl, VKEY_ALT     ; alt on ?
  361.         jz      @f
  362.        
  363.         mov     bl, [keymap_alt+eax]
  364. @@:
  365.         jmp     .writekey
  366. ;--------------------------------------
  367. .modifier:
  368.         test    ch, ch
  369.         js      .modifier.up
  370.         or      [kb_state], eax
  371.         jmp     .writekey
  372. ;--------------------------------------
  373. .modifier.up:
  374.         not     eax
  375.         and     [kb_state], eax
  376.         jmp     .writekey
  377. ;--------------------------------------
  378. .no_key.xor:
  379.         mov     bh, 0
  380.         test    ch, ch
  381.         js      .writekey
  382.        
  383.         xor     [kb_state], eax
  384.         xor     [kb_lights], bl
  385. .writekey:
  386.         pushad
  387. ; test for system hotkeys
  388.         movzx   eax, ch
  389.         cmp     bh, 1
  390.         ja      .nohotkey
  391.         jb      @f
  392.        
  393.         xor     eax, eax
  394. @@:
  395.         mov     eax, [hotkey_scancodes + eax*4]
  396. .hotkey_loop:
  397.         test    eax, eax
  398.         jz      .nohotkey
  399.        
  400.         mov     cl, 0
  401.         call    hotkey_do_test
  402.         jc      .hotkey_cont
  403.        
  404.         mov     cl, 2
  405.         call    hotkey_do_test
  406.         jc      .hotkey_cont
  407.        
  408.         mov     cl, 4
  409.         call    hotkey_do_test
  410.         jnc     .hotkey_found
  411. .hotkey_cont:
  412.         mov     eax, [eax]
  413.         jmp     .hotkey_loop
  414. ;--------------------------------------
  415. .hotkey_found:
  416.         mov     eax, [eax+8]
  417. ; put key in buffer for process in slot eax
  418.         mov     edi, hotkey_buffer
  419. @@:
  420.         cmp     dword [edi], 0
  421.         jz      .found_free
  422.        
  423.         add     edi, 8
  424.         cmp     edi, hotkey_buffer+120*8
  425.         jb      @b
  426. ; no free space - replace first entry
  427.         mov     edi, hotkey_buffer
  428. .found_free:
  429.         mov     [edi], eax
  430.         movzx   eax, ch
  431.         cmp     bh, 1
  432.         jnz     @f
  433.        
  434.         xor     eax, eax
  435. @@:
  436.         mov     [edi+4], ax
  437.         mov     eax, [kb_state]
  438.         mov     [edi+6], ax
  439.  
  440.         cmp     [PID_lock_input], dword 0
  441.         je      .nohotkey
  442.  
  443.         popad
  444.         jmp     .exit.irq1
  445. ;--------------------------------------
  446. .nohotkey:
  447.         popad
  448.  
  449.         cmp     [keyboard_mode], 0; return from keymap
  450.         jne     .scancode
  451.        
  452.         test    bh, bh
  453.         jnz     .exit.irq1
  454.        
  455.         test    bl, bl
  456.         jz      .exit.irq1
  457.  
  458.         test    [kb_state], VKEY_NUMLOCK
  459.         jz      .dowrite
  460.        
  461.         cmp     cl, 0xE0
  462.         jz      .dowrite
  463.        
  464.         cmp     ch, 55
  465.         jnz     @f
  466.        
  467.         mov     bl, 0x2A        ;*
  468.         jmp     .dowrite
  469. ;--------------------------------------
  470. @@:
  471.         cmp     ch, 71
  472.         jb      .dowrite
  473.        
  474.         cmp     ch, 83
  475.         ja      .dowrite
  476.        
  477.         movzx   eax, ch
  478.         mov     bl, [numlock_map + eax - 71]
  479.         jmp     .dowrite
  480. ;--------------------------------------
  481. .scancode:
  482.         mov     bl, ch
  483. .dowrite:
  484.         movzx   eax, byte[KEY_COUNT]
  485.         cmp     al, 120
  486.         jae     .exit.irq1
  487.         inc     eax
  488.         mov     [KEY_COUNT], al
  489.         mov     [KEY_COUNT+eax], bl
  490. .exit.irq1:
  491.         mov     [check_idle_semaphore], 5
  492.         ret
  493. ;---------------------------------------------------------------------
  494. set_lights:
  495.         push    ebx esi
  496.         mov     ecx, keyboard_list_mutex
  497.         call    mutex_lock
  498.         mov     esi, keyboards
  499. .loop:
  500.         mov     esi, [esi+KEYBOARD.next]
  501.         cmp     esi, keyboards
  502.         jz      .done
  503.         mov     eax, [esi+KEYBOARD.functions]
  504.         cmp     dword [eax], KBDFUNC.setlights
  505.         jbe     .loop
  506.         mov     eax, [eax+KBDFUNC.setlights]
  507.         test    eax, eax
  508.         jz      .loop
  509.         stdcall eax, [esi+KEYBOARD.userdata], dword [kb_lights]
  510.         jmp     .loop
  511. .done:
  512.         mov     ecx, keyboard_list_mutex
  513.         call    mutex_unlock
  514.         pop     esi ebx
  515.         ret
  516.  
  517. ps2_set_lights:
  518.         stdcall disable_irq, 1
  519.         mov     al, 0xED
  520.         call    kb_write
  521.         mov     al, [esp+8]
  522.         call    kb_write
  523.         stdcall enable_irq, 1
  524.         ret     8
  525.  
  526. ;// mike.dld ]
  527. check_lights_state:
  528.         mov     al, [kb_lights]
  529.         cmp     al, [old_kb_lights]
  530.         jz      .nothing
  531.         mov     [old_kb_lights], al
  532.         call    set_lights
  533. .nothing:
  534.         ret
  535. ;---------------------------------------------------------------------
  536. numlock_map:
  537.     db   0x37   ;Num 7
  538.     db   0x38   ;Num 8
  539.     db   0x39   ;Num 9
  540.     db   0x2D   ;Num -
  541.     db   0x34   ;Num 4
  542.     db   0x35   ;Num 5
  543.     db   0x36   ;Num 6
  544.     db   0x2B   ;Num +
  545.     db   0x31   ;Num 1
  546.     db   0x32   ;Num 2
  547.     db   0x33   ;Num 3
  548.     db   0x30   ;Num 0
  549.     db   0x2E   ;Num .
  550. ;---------------------------------------------------------------------
  551.