From 213f39d0cd57ea1c3c9b6cf5aa30ca674924a4cc Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Sun, 11 Sep 2011 17:31:15 +0000 Subject: [PATCH] CAPS LOCK for ASCII key git-svn-id: svn://kolibrios.org@2171 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/hid/keyboard.inc | 454 +++++++++++++++++++--------------- 1 file changed, 249 insertions(+), 205 deletions(-) diff --git a/kernel/trunk/hid/keyboard.inc b/kernel/trunk/hid/keyboard.inc index fe058a0fca..f5b65d6ec9 100644 --- a/kernel/trunk/hid/keyboard.inc +++ b/kernel/trunk/hid/keyboard.inc @@ -1,6 +1,6 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; -;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; +;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; ;; Distributed under terms of the GNU General Public License ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -8,8 +8,6 @@ $Revision$ -;// mike.dld [ - VKEY_LSHIFT = 0000000000000001b VKEY_RSHIFT = 0000000000000010b VKEY_LCONTROL = 0000000000000100b @@ -51,301 +49,347 @@ hotkey_tests dd hotkey_test0 dd hotkey_test4 hotkey_tests_num = 5 endg - +;--------------------------------------------------------------------- hotkey_test0: - test al, al + test al,al setz al ret +;--------------------------------------------------------------------- hotkey_test1: - test al, al + test al,al setnp al ret +;--------------------------------------------------------------------- hotkey_test2: - cmp al, 3 + cmp al,3 setz al ret +;--------------------------------------------------------------------- hotkey_test3: - cmp al, 1 + cmp al,1 setz al ret +;--------------------------------------------------------------------- hotkey_test4: - cmp al, 2 + cmp al,2 setz al ret - +;--------------------------------------------------------------------- hotkey_do_test: push eax - mov edx, [kb_state] - shr edx, cl - add cl, cl - mov eax, [eax+4] - shr eax, cl - and eax, 15 - cmp al, hotkey_tests_num + mov edx,[kb_state] + shr edx,cl + add cl,cl + mov eax,[eax+4] + shr eax,cl + and eax,15 + cmp al,hotkey_tests_num jae .fail - xchg eax, edx - and al, 3 + + xchg eax,edx + and al,3 call [hotkey_tests + edx*4] - cmp al, 1 + cmp al,1 pop eax ret +;-------------------------------------- .fail: stc pop eax ret - - +;--------------------------------------------------------------------- align 4 - set_keyboard_data: - - movzx eax,word[TASK_COUNT] ; top window process - movzx eax,word[WIN_POS+eax*2] - shl eax,8 - mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] - mov [keyboard_mode],al - - mov eax, ecx - - push ebx - push esi - push edi - push ebp - - call send_scancode - - pop ebp - pop edi - pop esi - pop ebx - ret - + movzx eax,word[TASK_COUNT] ; top window process + movzx eax,word[WIN_POS+eax*2] + shl eax,8 + mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] + mov [keyboard_mode],al + + mov eax,ecx + + push ebx esi edi ebp + call send_scancode + pop ebp edi esi ebx + ret +;--------------------------------------------------------------------- align 4 irq1: - - movzx eax,word[TASK_COUNT] ; top window process - movzx eax,word[WIN_POS+eax*2] - shl eax,8 - mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] - mov [keyboard_mode],al - - in al,0x60 - + movzx eax,word[TASK_COUNT] ; top window process + movzx eax,word[WIN_POS+eax*2] + shl eax,8 + mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] + mov [keyboard_mode],al + + in al,0x60 +;-------------------------------------- send_scancode: - - mov [keyboard_data],al - + mov [keyboard_data],al ; ch = scancode ; cl = ext_code ; bh = 0 - normal key ; bh = 1 - modifier (Shift/Ctrl/Alt) ; bh = 2 - extended code - - mov ch,al - cmp al,0xE0 - je @f - cmp al,0xE1 - jne .normal_code - @@: - mov bh, 2 - mov [ext_code], al + mov ch,al + cmp al,0xE0 + je @f + + cmp al,0xE1 + jne .normal_code +@@: + mov bh,2 + mov [ext_code],al jmp .writekey - .normal_code: - mov cl, 0 - xchg cl, [ext_code] - and al,0x7F - mov bh, 1 - @@: cmp al,0x2A - jne @f - cmp cl,0xE0 - je .writekey - mov eax,VKEY_LSHIFT - jmp .modifier - @@: cmp al,0x36 - jne @f - cmp cl,0xE0 - je .writekey - mov eax,VKEY_RSHIFT - jmp .modifier - @@: cmp al,0x38 - jne @f - mov eax, VKEY_LALT - test cl, cl - jz .modifier - mov al, VKEY_RALT +;-------------------------------------- +.normal_code: + mov cl,0 + xchg cl,[ext_code] + and al,0x7F + mov bh,1 +@@: + cmp al,0x2A + jne @f + + cmp cl,0xE0 + je .writekey + + mov eax,VKEY_LSHIFT jmp .modifier - @@: cmp al,0x1D - jne @f - mov eax, VKEY_LCONTROL - test cl, cl +;-------------------------------------- +@@: + cmp al,0x36 + jne @f + + cmp cl,0xE0 + je .writekey + + mov eax,VKEY_RSHIFT + jmp .modifier +;-------------------------------------- +@@: + cmp al,0x38 + jne @f + + mov eax,VKEY_LALT + test cl,cl jz .modifier - mov al, VKEY_RCONTROL - cmp cl, 0xE0 + + mov al,VKEY_RALT + jmp .modifier +;-------------------------------------- +@@: + cmp al,0x1D + jne @f + + mov eax,VKEY_LCONTROL + test cl,cl jz .modifier - mov [ext_code], cl + + mov al,VKEY_RCONTROL + cmp cl,0xE0 + jz .modifier + + mov [ext_code],cl jmp .writekey - @@: cmp al,0x3A - jne @f - mov bl,4 - mov eax,VKEY_CAPSLOCK - jmp .no_key.xor - @@: cmp al,0x45 - jne @f - test cl, cl +;-------------------------------------- +@@: + cmp al,0x3A + jne @f + + mov bl,4 + mov eax,VKEY_CAPSLOCK + jmp .no_key.xor +;-------------------------------------- +@@: + cmp al,0x45 + jne @f + test cl,cl jnz .writekey - mov bl,2 - mov eax,VKEY_NUMLOCK - jmp .no_key.xor - @@: cmp al,0x46 - jne @f - mov bl,1 - mov eax,VKEY_SCRLOCK - jmp .no_key.xor - @@: - xor ebx,ebx - test ch,ch - js .writekey - movzx eax,ch ; plain key - mov bl,[keymap+eax] - mov edx,[kb_state] - test dl,VKEY_CONTROL ; ctrl alt del - jz .noctrlaltdel - test dl,VKEY_ALT - jz .noctrlaltdel - cmp ch,53h - jne .noctrlaltdel - mov [ctrl_alt_del],1 - .noctrlaltdel: - test dl,VKEY_CONTROL ; ctrl on ? - jz @f - sub bl,0x60 - @@: test dl,VKEY_SHIFT ; shift on ? - jz @f - mov bl,[keymap_shift+eax] - @@: test dl,VKEY_ALT ; alt on ? - jz @f - mov bl,[keymap_alt+eax] - @@: + + mov bl,2 + mov eax,VKEY_NUMLOCK + jmp .no_key.xor +;-------------------------------------- +@@: + cmp al,0x46 + jne @f + + mov bl,1 + mov eax,VKEY_SCRLOCK + jmp .no_key.xor +;-------------------------------------- +@@: + xor ebx,ebx + test ch,ch + js .writekey + + movzx eax,ch ; plain key + mov bl,[keymap+eax] + mov edx,[kb_state] + test dl,VKEY_CONTROL ; ctrl alt del + jz .noctrlaltdel + + test dl,VKEY_ALT + jz .noctrlaltdel + + cmp ch,53h + jne .noctrlaltdel + + mov [ctrl_alt_del],1 +.noctrlaltdel: + test dl,VKEY_CONTROL ; ctrl on ? + jz @f + + sub bl,0x60 +@@: + test dl,VKEY_CAPSLOCK ; caps lock on ? + jz .no_caps_lock + + test dl,VKEY_SHIFT ; shift on ? + jz .keymap_shif + + jmp @f +;-------------------------------------- +.no_caps_lock: + test dl,VKEY_SHIFT ; shift on ? + jz @f +.keymap_shif: + mov bl,[keymap_shift+eax] +@@: + test dl,VKEY_ALT ; alt on ? + jz @f + + mov bl,[keymap_alt+eax] +@@: jmp .writekey +;-------------------------------------- .modifier: test ch, ch js .modifier.up - or [kb_state], eax + or [kb_state],eax jmp .writekey +;-------------------------------------- .modifier.up: not eax - and [kb_state], eax + and [kb_state],eax jmp .writekey +;-------------------------------------- .no_key.xor: - mov bh, 0 - test ch, ch + mov bh,0 + test ch,ch js .writekey - xor [kb_state], eax - xor [kb_lights], bl + + xor [kb_state],eax + xor [kb_lights],bl call set_lights - .writekey: ; test for system hotkeys - movzx eax, ch - cmp bh, 1 + movzx eax,ch + cmp bh,1 ja .nohotkey jb @f - xor eax, eax + + xor eax,eax @@: mov eax, [hotkey_scancodes + eax*4] .hotkey_loop: test eax, eax jz .nohotkey - mov cl, 0 + + mov cl,0 call hotkey_do_test jc .hotkey_cont - mov cl, 2 + + mov cl,2 call hotkey_do_test jc .hotkey_cont - mov cl, 4 + + mov cl,4 call hotkey_do_test jnc .hotkey_found .hotkey_cont: - mov eax, [eax] + mov eax,[eax] jmp .hotkey_loop +;-------------------------------------- .hotkey_found: - mov eax, [eax+8] + mov eax,[eax+8] ; put key in buffer for process in slot eax - mov edi, hotkey_buffer + mov edi,hotkey_buffer @@: - cmp dword [edi], 0 + cmp dword [edi],0 jz .found_free - add edi, 8 - cmp edi, hotkey_buffer+120*8 + + add edi,8 + cmp edi,hotkey_buffer+120*8 jb @b ; no free space - replace first entry - mov edi, hotkey_buffer + mov edi,hotkey_buffer .found_free: - mov [edi], eax - movzx eax, ch - cmp bh, 1 + mov [edi],eax + movzx eax,ch + cmp bh,1 jnz @f + xor eax, eax @@: - mov [edi+4], ax - mov eax, [kb_state] - mov [edi+6], ax + mov [edi+4],ax + mov eax,[kb_state] + mov [edi+6],ax jmp .exit.irq1 +;-------------------------------------- .nohotkey: - cmp [keyboard_mode],0 ; return from keymap - jne .scancode - test bh, bh + cmp [keyboard_mode],0 ; return from keymap + jne .scancode + + test bh,bh jnz .exit.irq1 - test bl, bl + + test bl,bl jz .exit.irq1 -;.........................Part1 Start.......Code by Rus, optimize by Ghost................................... - test [kb_state], VKEY_NUMLOCK - jz .dowrite - cmp cl, 0xE0 - jz .dowrite - - cmp ch, 55 + test [kb_state],VKEY_NUMLOCK + jz .dowrite + + cmp cl,0xE0 + jz .dowrite + + cmp ch,55 jnz @f - mov bl, 0x2A ;* + + mov bl,0x2A ;* jmp .dowrite - @@: - cmp ch, 71 +;-------------------------------------- +@@: + cmp ch,71 jb .dowrite - cmp ch, 83 + + cmp ch,83 ja .dowrite - ;push eax + movzx eax, ch - mov bl, [numlock_map + eax - 71] - ;pop eax - -;.........................Part1 End................................................. - + mov bl,[numlock_map + eax - 71] jmp .dowrite +;-------------------------------------- .scancode: - mov bl, ch + mov bl,ch .dowrite: - movzx eax,byte[KEY_COUNT] - cmp al,120 - jae .exit.irq1 - inc eax - mov [KEY_COUNT],al - mov [KEY_COUNT+eax],bl - - .exit.irq1: - mov [check_idle_semaphore],5 - + movzx eax,byte[KEY_COUNT] + cmp al,120 + jae .exit.irq1 + inc eax + mov [KEY_COUNT],al + mov [KEY_COUNT+eax],bl +.exit.irq1: + mov [check_idle_semaphore],5 ret - +;--------------------------------------------------------------------- set_lights: - mov al,0xED - call kb_write - mov al,[kb_lights] - call kb_write - ret - -;// mike.dld ] -;..........................Part2 Start.......Code by Rus....................................... + mov al,0xED + call kb_write + mov al,[kb_lights] + call kb_write + ret +;--------------------------------------------------------------------- numlock_map: db 0x37 ;Num 7 db 0x38 ;Num 8 @@ -360,4 +404,4 @@ numlock_map: db 0x33 ;Num 3 db 0x30 ;Num 0 db 0x2E ;Num . -;..........................Part2 End................................................ +;---------------------------------------------------------------------