1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; |
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa ;; |
;; Distributed under terms of the GNU General Public License ;; |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
8,6 → 8,8 |
$Revision$ |
|
|
;// mike.dld [ |
|
VKEY_LSHIFT = 0000000000000001b |
VKEY_RSHIFT = 0000000000000010b |
VKEY_LCONTROL = 0000000000000100b |
49,32 → 51,28 |
dd hotkey_test4 |
hotkey_tests_num = 5 |
endg |
;--------------------------------------------------------------------- |
|
hotkey_test0: |
test al,al |
setz al |
ret |
;--------------------------------------------------------------------- |
hotkey_test1: |
test al,al |
setnp al |
ret |
;--------------------------------------------------------------------- |
hotkey_test2: |
cmp al,3 |
setz al |
ret |
;--------------------------------------------------------------------- |
hotkey_test3: |
cmp al,1 |
setz al |
ret |
;--------------------------------------------------------------------- |
hotkey_test4: |
cmp al,2 |
setz al |
ret |
;--------------------------------------------------------------------- |
|
hotkey_do_test: |
push eax |
mov edx,[kb_state] |
85,7 → 83,6 |
and eax,15 |
cmp al,hotkey_tests_num |
jae .fail |
|
xchg eax,edx |
and al,3 |
call [hotkey_tests + edx*4] |
92,14 → 89,16 |
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 |
108,13 → 107,22 |
|
mov eax,ecx |
|
push ebx esi edi ebp |
push ebx |
push esi |
push edi |
push ebp |
|
call send_scancode |
pop ebp edi esi ebx |
|
pop ebp |
pop edi |
pop esi |
pop ebx |
ret |
;--------------------------------------------------------------------- |
|
align 4 |
irq1: |
|
movzx eax,word[TASK_COUNT] ; top window process |
movzx eax,word[WIN_POS+eax*2] |
shl eax,8 |
122,18 → 130,20 |
mov [keyboard_mode],al |
|
in al,0x60 |
;-------------------------------------- |
|
send_scancode: |
|
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 |
@@: |
140,148 → 150,100 |
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 |
@@: cmp al,0x2A |
jne @f |
|
cmp cl,0xE0 |
je .writekey |
|
mov eax,VKEY_LSHIFT |
jmp .modifier |
;-------------------------------------- |
@@: |
cmp al,0x36 |
@@: cmp al,0x36 |
jne @f |
|
cmp cl,0xE0 |
je .writekey |
|
mov eax,VKEY_RSHIFT |
jmp .modifier |
;-------------------------------------- |
@@: |
cmp al,0x38 |
@@: cmp al,0x38 |
jne @f |
|
mov eax,VKEY_LALT |
test cl,cl |
jz .modifier |
|
mov al,VKEY_RALT |
jmp .modifier |
;-------------------------------------- |
@@: |
cmp al,0x1D |
@@: cmp al,0x1D |
jne @f |
|
mov eax,VKEY_LCONTROL |
test cl,cl |
jz .modifier |
|
mov al,VKEY_RCONTROL |
cmp cl,0xE0 |
jz .modifier |
|
mov [ext_code],cl |
jmp .writekey |
;-------------------------------------- |
@@: |
cmp al,0x3A |
@@: cmp al,0x3A |
jne @f |
|
mov bl,4 |
mov eax,VKEY_CAPSLOCK |
jmp .no_key.xor |
;-------------------------------------- |
@@: |
cmp al,0x45 |
@@: cmp al,0x45 |
jne @f |
test cl,cl |
jnz .writekey |
|
mov bl,2 |
mov eax,VKEY_NUMLOCK |
jmp .no_key.xor |
;-------------------------------------- |
@@: |
cmp al,0x46 |
@@: 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 ? |
@@: test dl,VKEY_SHIFT ; shift on ? |
jz @f |
.keymap_shif: |
mov bl,[keymap_shift+eax] |
@@: |
test dl,VKEY_ALT ; alt on ? |
@@: 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 |
jmp .writekey |
;-------------------------------------- |
.modifier.up: |
not eax |
and [kb_state],eax |
jmp .writekey |
;-------------------------------------- |
.no_key.xor: |
mov bh,0 |
test ch,ch |
js .writekey |
|
xor [kb_state],eax |
xor [kb_lights],bl |
call set_lights |
|
.writekey: |
; test for system hotkeys |
movzx eax,ch |
288,7 → 250,6 |
cmp bh,1 |
ja .nohotkey |
jb @f |
|
xor eax,eax |
@@: |
mov eax, [hotkey_scancodes + eax*4] |
295,15 → 256,12 |
.hotkey_loop: |
test eax, eax |
jz .nohotkey |
|
mov cl,0 |
call hotkey_do_test |
jc .hotkey_cont |
|
mov cl,2 |
call hotkey_do_test |
jc .hotkey_cont |
|
mov cl,4 |
call hotkey_do_test |
jnc .hotkey_found |
310,7 → 268,6 |
.hotkey_cont: |
mov eax,[eax] |
jmp .hotkey_loop |
;-------------------------------------- |
.hotkey_found: |
mov eax,[eax+8] |
; put key in buffer for process in slot eax |
318,7 → 275,6 |
@@: |
cmp dword [edi],0 |
jz .found_free |
|
add edi,8 |
cmp edi,hotkey_buffer+120*8 |
jb @b |
329,7 → 285,6 |
movzx eax,ch |
cmp bh,1 |
jnz @f |
|
xor eax, eax |
@@: |
mov [edi+4],ax |
336,40 → 291,37 |
mov eax,[kb_state] |
mov [edi+6],ax |
jmp .exit.irq1 |
;-------------------------------------- |
.nohotkey: |
cmp [keyboard_mode],0 ; return from keymap |
jne .scancode |
|
test bh,bh |
jnz .exit.irq1 |
|
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 |
jnz @f |
|
mov bl,0x2A ;* |
jmp .dowrite |
;-------------------------------------- |
@@: |
cmp ch,71 |
jb .dowrite |
|
cmp ch,83 |
ja .dowrite |
|
;push eax |
movzx eax, ch |
mov bl,[numlock_map + eax - 71] |
;pop eax |
|
;.........................Part1 End................................................. |
|
jmp .dowrite |
;-------------------------------------- |
.scancode: |
mov bl,ch |
.dowrite: |
379,10 → 331,12 |
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 |
389,7 → 343,9 |
mov al,[kb_lights] |
call kb_write |
ret |
;--------------------------------------------------------------------- |
|
;// mike.dld ] |
;..........................Part2 Start.......Code by Rus....................................... |
numlock_map: |
db 0x37 ;Num 7 |
db 0x38 ;Num 8 |
404,4 → 360,4 |
db 0x33 ;Num 3 |
db 0x30 ;Num 0 |
db 0x2E ;Num . |
;--------------------------------------------------------------------- |
;..........................Part2 End................................................ |