forked from KolibriOS/kolibrios
CAPS LOCK for ASCII key
git-svn-id: svn://kolibrios.org@2171 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
8a41ae1b3e
commit
213f39d0cd
@ -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 ;;
|
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;;
|
||||||
;; Distributed under terms of the GNU General Public License ;;
|
;; Distributed under terms of the GNU General Public License ;;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
@ -8,8 +8,6 @@
|
|||||||
$Revision$
|
$Revision$
|
||||||
|
|
||||||
|
|
||||||
;// mike.dld [
|
|
||||||
|
|
||||||
VKEY_LSHIFT = 0000000000000001b
|
VKEY_LSHIFT = 0000000000000001b
|
||||||
VKEY_RSHIFT = 0000000000000010b
|
VKEY_RSHIFT = 0000000000000010b
|
||||||
VKEY_LCONTROL = 0000000000000100b
|
VKEY_LCONTROL = 0000000000000100b
|
||||||
@ -51,301 +49,347 @@ hotkey_tests dd hotkey_test0
|
|||||||
dd hotkey_test4
|
dd hotkey_test4
|
||||||
hotkey_tests_num = 5
|
hotkey_tests_num = 5
|
||||||
endg
|
endg
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_test0:
|
hotkey_test0:
|
||||||
test al, al
|
test al,al
|
||||||
setz al
|
setz al
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_test1:
|
hotkey_test1:
|
||||||
test al, al
|
test al,al
|
||||||
setnp al
|
setnp al
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_test2:
|
hotkey_test2:
|
||||||
cmp al, 3
|
cmp al,3
|
||||||
setz al
|
setz al
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_test3:
|
hotkey_test3:
|
||||||
cmp al, 1
|
cmp al,1
|
||||||
setz al
|
setz al
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_test4:
|
hotkey_test4:
|
||||||
cmp al, 2
|
cmp al,2
|
||||||
setz al
|
setz al
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
hotkey_do_test:
|
hotkey_do_test:
|
||||||
push eax
|
push eax
|
||||||
mov edx, [kb_state]
|
mov edx,[kb_state]
|
||||||
shr edx, cl
|
shr edx,cl
|
||||||
add cl, cl
|
add cl,cl
|
||||||
mov eax, [eax+4]
|
mov eax,[eax+4]
|
||||||
shr eax, cl
|
shr eax,cl
|
||||||
and eax, 15
|
and eax,15
|
||||||
cmp al, hotkey_tests_num
|
cmp al,hotkey_tests_num
|
||||||
jae .fail
|
jae .fail
|
||||||
xchg eax, edx
|
|
||||||
and al, 3
|
xchg eax,edx
|
||||||
|
and al,3
|
||||||
call [hotkey_tests + edx*4]
|
call [hotkey_tests + edx*4]
|
||||||
cmp al, 1
|
cmp al,1
|
||||||
pop eax
|
pop eax
|
||||||
ret
|
ret
|
||||||
|
;--------------------------------------
|
||||||
.fail:
|
.fail:
|
||||||
stc
|
stc
|
||||||
pop eax
|
pop eax
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
|
|
||||||
set_keyboard_data:
|
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
|
||||||
|
|
||||||
movzx eax,word[TASK_COUNT] ; top window process
|
mov eax,ecx
|
||||||
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
|
|
||||||
|
|
||||||
|
push ebx esi edi ebp
|
||||||
|
call send_scancode
|
||||||
|
pop ebp edi esi ebx
|
||||||
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
align 4
|
align 4
|
||||||
irq1:
|
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
|
||||||
|
|
||||||
movzx eax,word[TASK_COUNT] ; top window process
|
in al,0x60
|
||||||
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:
|
send_scancode:
|
||||||
|
mov [keyboard_data],al
|
||||||
mov [keyboard_data],al
|
|
||||||
|
|
||||||
; ch = scancode
|
; ch = scancode
|
||||||
; cl = ext_code
|
; cl = ext_code
|
||||||
; bh = 0 - normal key
|
; bh = 0 - normal key
|
||||||
; bh = 1 - modifier (Shift/Ctrl/Alt)
|
; bh = 1 - modifier (Shift/Ctrl/Alt)
|
||||||
; bh = 2 - extended code
|
; bh = 2 - extended code
|
||||||
|
mov ch,al
|
||||||
|
cmp al,0xE0
|
||||||
|
je @f
|
||||||
|
|
||||||
mov ch,al
|
cmp al,0xE1
|
||||||
cmp al,0xE0
|
jne .normal_code
|
||||||
je @f
|
@@:
|
||||||
cmp al,0xE1
|
mov bh,2
|
||||||
jne .normal_code
|
mov [ext_code],al
|
||||||
@@:
|
|
||||||
mov bh, 2
|
|
||||||
mov [ext_code], al
|
|
||||||
jmp .writekey
|
jmp .writekey
|
||||||
.normal_code:
|
;--------------------------------------
|
||||||
mov cl, 0
|
.normal_code:
|
||||||
xchg cl, [ext_code]
|
mov cl,0
|
||||||
and al,0x7F
|
xchg cl,[ext_code]
|
||||||
mov bh, 1
|
and al,0x7F
|
||||||
@@: cmp al,0x2A
|
mov bh,1
|
||||||
jne @f
|
@@:
|
||||||
cmp cl,0xE0
|
cmp al,0x2A
|
||||||
je .writekey
|
jne @f
|
||||||
mov eax,VKEY_LSHIFT
|
|
||||||
jmp .modifier
|
cmp cl,0xE0
|
||||||
@@: cmp al,0x36
|
je .writekey
|
||||||
jne @f
|
|
||||||
cmp cl,0xE0
|
mov eax,VKEY_LSHIFT
|
||||||
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
|
|
||||||
jmp .modifier
|
jmp .modifier
|
||||||
@@: cmp al,0x1D
|
;--------------------------------------
|
||||||
jne @f
|
@@:
|
||||||
mov eax, VKEY_LCONTROL
|
cmp al,0x36
|
||||||
test cl, cl
|
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
|
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
|
jz .modifier
|
||||||
mov [ext_code], cl
|
|
||||||
|
mov al,VKEY_RCONTROL
|
||||||
|
cmp cl,0xE0
|
||||||
|
jz .modifier
|
||||||
|
|
||||||
|
mov [ext_code],cl
|
||||||
jmp .writekey
|
jmp .writekey
|
||||||
@@: cmp al,0x3A
|
;--------------------------------------
|
||||||
jne @f
|
@@:
|
||||||
mov bl,4
|
cmp al,0x3A
|
||||||
mov eax,VKEY_CAPSLOCK
|
jne @f
|
||||||
jmp .no_key.xor
|
|
||||||
@@: cmp al,0x45
|
mov bl,4
|
||||||
jne @f
|
mov eax,VKEY_CAPSLOCK
|
||||||
test cl, cl
|
jmp .no_key.xor
|
||||||
|
;--------------------------------------
|
||||||
|
@@:
|
||||||
|
cmp al,0x45
|
||||||
|
jne @f
|
||||||
|
test cl,cl
|
||||||
jnz .writekey
|
jnz .writekey
|
||||||
mov bl,2
|
|
||||||
mov eax,VKEY_NUMLOCK
|
mov bl,2
|
||||||
jmp .no_key.xor
|
mov eax,VKEY_NUMLOCK
|
||||||
@@: cmp al,0x46
|
jmp .no_key.xor
|
||||||
jne @f
|
;--------------------------------------
|
||||||
mov bl,1
|
@@:
|
||||||
mov eax,VKEY_SCRLOCK
|
cmp al,0x46
|
||||||
jmp .no_key.xor
|
jne @f
|
||||||
@@:
|
|
||||||
xor ebx,ebx
|
mov bl,1
|
||||||
test ch,ch
|
mov eax,VKEY_SCRLOCK
|
||||||
js .writekey
|
jmp .no_key.xor
|
||||||
movzx eax,ch ; plain key
|
;--------------------------------------
|
||||||
mov bl,[keymap+eax]
|
@@:
|
||||||
mov edx,[kb_state]
|
xor ebx,ebx
|
||||||
test dl,VKEY_CONTROL ; ctrl alt del
|
test ch,ch
|
||||||
jz .noctrlaltdel
|
js .writekey
|
||||||
test dl,VKEY_ALT
|
|
||||||
jz .noctrlaltdel
|
movzx eax,ch ; plain key
|
||||||
cmp ch,53h
|
mov bl,[keymap+eax]
|
||||||
jne .noctrlaltdel
|
mov edx,[kb_state]
|
||||||
mov [ctrl_alt_del],1
|
test dl,VKEY_CONTROL ; ctrl alt del
|
||||||
.noctrlaltdel:
|
jz .noctrlaltdel
|
||||||
test dl,VKEY_CONTROL ; ctrl on ?
|
|
||||||
jz @f
|
test dl,VKEY_ALT
|
||||||
sub bl,0x60
|
jz .noctrlaltdel
|
||||||
@@: test dl,VKEY_SHIFT ; shift on ?
|
|
||||||
jz @f
|
cmp ch,53h
|
||||||
mov bl,[keymap_shift+eax]
|
jne .noctrlaltdel
|
||||||
@@: test dl,VKEY_ALT ; alt on ?
|
|
||||||
jz @f
|
mov [ctrl_alt_del],1
|
||||||
mov bl,[keymap_alt+eax]
|
.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
|
jmp .writekey
|
||||||
|
;--------------------------------------
|
||||||
.modifier:
|
.modifier:
|
||||||
test ch, ch
|
test ch, ch
|
||||||
js .modifier.up
|
js .modifier.up
|
||||||
or [kb_state], eax
|
or [kb_state],eax
|
||||||
jmp .writekey
|
jmp .writekey
|
||||||
|
;--------------------------------------
|
||||||
.modifier.up:
|
.modifier.up:
|
||||||
not eax
|
not eax
|
||||||
and [kb_state], eax
|
and [kb_state],eax
|
||||||
jmp .writekey
|
jmp .writekey
|
||||||
|
;--------------------------------------
|
||||||
.no_key.xor:
|
.no_key.xor:
|
||||||
mov bh, 0
|
mov bh,0
|
||||||
test ch, ch
|
test ch,ch
|
||||||
js .writekey
|
js .writekey
|
||||||
xor [kb_state], eax
|
|
||||||
xor [kb_lights], bl
|
|
||||||
call set_lights
|
|
||||||
|
|
||||||
|
xor [kb_state],eax
|
||||||
|
xor [kb_lights],bl
|
||||||
|
call set_lights
|
||||||
.writekey:
|
.writekey:
|
||||||
; test for system hotkeys
|
; test for system hotkeys
|
||||||
movzx eax, ch
|
movzx eax,ch
|
||||||
cmp bh, 1
|
cmp bh,1
|
||||||
ja .nohotkey
|
ja .nohotkey
|
||||||
jb @f
|
jb @f
|
||||||
xor eax, eax
|
|
||||||
|
xor eax,eax
|
||||||
@@:
|
@@:
|
||||||
mov eax, [hotkey_scancodes + eax*4]
|
mov eax, [hotkey_scancodes + eax*4]
|
||||||
.hotkey_loop:
|
.hotkey_loop:
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jz .nohotkey
|
jz .nohotkey
|
||||||
mov cl, 0
|
|
||||||
|
mov cl,0
|
||||||
call hotkey_do_test
|
call hotkey_do_test
|
||||||
jc .hotkey_cont
|
jc .hotkey_cont
|
||||||
mov cl, 2
|
|
||||||
|
mov cl,2
|
||||||
call hotkey_do_test
|
call hotkey_do_test
|
||||||
jc .hotkey_cont
|
jc .hotkey_cont
|
||||||
mov cl, 4
|
|
||||||
|
mov cl,4
|
||||||
call hotkey_do_test
|
call hotkey_do_test
|
||||||
jnc .hotkey_found
|
jnc .hotkey_found
|
||||||
.hotkey_cont:
|
.hotkey_cont:
|
||||||
mov eax, [eax]
|
mov eax,[eax]
|
||||||
jmp .hotkey_loop
|
jmp .hotkey_loop
|
||||||
|
;--------------------------------------
|
||||||
.hotkey_found:
|
.hotkey_found:
|
||||||
mov eax, [eax+8]
|
mov eax,[eax+8]
|
||||||
; put key in buffer for process in slot eax
|
; 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
|
jz .found_free
|
||||||
add edi, 8
|
|
||||||
cmp edi, hotkey_buffer+120*8
|
add edi,8
|
||||||
|
cmp edi,hotkey_buffer+120*8
|
||||||
jb @b
|
jb @b
|
||||||
; no free space - replace first entry
|
; no free space - replace first entry
|
||||||
mov edi, hotkey_buffer
|
mov edi,hotkey_buffer
|
||||||
.found_free:
|
.found_free:
|
||||||
mov [edi], eax
|
mov [edi],eax
|
||||||
movzx eax, ch
|
movzx eax,ch
|
||||||
cmp bh, 1
|
cmp bh,1
|
||||||
jnz @f
|
jnz @f
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
@@:
|
@@:
|
||||||
mov [edi+4], ax
|
mov [edi+4],ax
|
||||||
mov eax, [kb_state]
|
mov eax,[kb_state]
|
||||||
mov [edi+6], ax
|
mov [edi+6],ax
|
||||||
jmp .exit.irq1
|
jmp .exit.irq1
|
||||||
|
;--------------------------------------
|
||||||
.nohotkey:
|
.nohotkey:
|
||||||
cmp [keyboard_mode],0 ; return from keymap
|
cmp [keyboard_mode],0 ; return from keymap
|
||||||
jne .scancode
|
jne .scancode
|
||||||
test bh, bh
|
|
||||||
|
test bh,bh
|
||||||
jnz .exit.irq1
|
jnz .exit.irq1
|
||||||
test bl, bl
|
|
||||||
|
test bl,bl
|
||||||
jz .exit.irq1
|
jz .exit.irq1
|
||||||
|
|
||||||
;.........................Part1 Start.......Code by Rus, optimize by Ghost...................................
|
test [kb_state],VKEY_NUMLOCK
|
||||||
test [kb_state], VKEY_NUMLOCK
|
jz .dowrite
|
||||||
jz .dowrite
|
|
||||||
cmp cl, 0xE0
|
|
||||||
jz .dowrite
|
|
||||||
|
|
||||||
cmp ch, 55
|
cmp cl,0xE0
|
||||||
|
jz .dowrite
|
||||||
|
|
||||||
|
cmp ch,55
|
||||||
jnz @f
|
jnz @f
|
||||||
mov bl, 0x2A ;*
|
|
||||||
|
mov bl,0x2A ;*
|
||||||
jmp .dowrite
|
jmp .dowrite
|
||||||
@@:
|
;--------------------------------------
|
||||||
cmp ch, 71
|
@@:
|
||||||
|
cmp ch,71
|
||||||
jb .dowrite
|
jb .dowrite
|
||||||
cmp ch, 83
|
|
||||||
|
cmp ch,83
|
||||||
ja .dowrite
|
ja .dowrite
|
||||||
;push eax
|
|
||||||
movzx eax, ch
|
movzx eax, ch
|
||||||
mov bl, [numlock_map + eax - 71]
|
mov bl,[numlock_map + eax - 71]
|
||||||
;pop eax
|
|
||||||
|
|
||||||
;.........................Part1 End.................................................
|
|
||||||
|
|
||||||
jmp .dowrite
|
jmp .dowrite
|
||||||
|
;--------------------------------------
|
||||||
.scancode:
|
.scancode:
|
||||||
mov bl, ch
|
mov bl,ch
|
||||||
.dowrite:
|
.dowrite:
|
||||||
movzx eax,byte[KEY_COUNT]
|
movzx eax,byte[KEY_COUNT]
|
||||||
cmp al,120
|
cmp al,120
|
||||||
jae .exit.irq1
|
jae .exit.irq1
|
||||||
inc eax
|
inc eax
|
||||||
mov [KEY_COUNT],al
|
mov [KEY_COUNT],al
|
||||||
mov [KEY_COUNT+eax],bl
|
mov [KEY_COUNT+eax],bl
|
||||||
|
.exit.irq1:
|
||||||
.exit.irq1:
|
mov [check_idle_semaphore],5
|
||||||
mov [check_idle_semaphore],5
|
|
||||||
|
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
set_lights:
|
set_lights:
|
||||||
mov al,0xED
|
mov al,0xED
|
||||||
call kb_write
|
call kb_write
|
||||||
mov al,[kb_lights]
|
mov al,[kb_lights]
|
||||||
call kb_write
|
call kb_write
|
||||||
ret
|
ret
|
||||||
|
;---------------------------------------------------------------------
|
||||||
;// mike.dld ]
|
|
||||||
;..........................Part2 Start.......Code by Rus.......................................
|
|
||||||
numlock_map:
|
numlock_map:
|
||||||
db 0x37 ;Num 7
|
db 0x37 ;Num 7
|
||||||
db 0x38 ;Num 8
|
db 0x38 ;Num 8
|
||||||
@ -360,4 +404,4 @@ numlock_map:
|
|||||||
db 0x33 ;Num 3
|
db 0x33 ;Num 3
|
||||||
db 0x30 ;Num 0
|
db 0x30 ;Num 0
|
||||||
db 0x2E ;Num .
|
db 0x2E ;Num .
|
||||||
;..........................Part2 End................................................
|
;---------------------------------------------------------------------
|
||||||
|
Loading…
Reference in New Issue
Block a user