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,54 → 49,57 |
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 |
105,24 → 106,15 |
mov al,[SLOT_BASE+eax+APPDATA.keyboard_mode] |
mov [keyboard_mode],al |
|
mov eax, ecx |
mov eax,ecx |
|
push ebx |
push esi |
push edi |
push ebp |
|
push ebx esi edi ebp |
call send_scancode |
|
pop ebp |
pop edi |
pop esi |
pop ebx |
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 |
130,200 → 122,256 |
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 |
@@: |
mov bh, 2 |
mov [ext_code], al |
@@: |
mov bh,2 |
mov [ext_code],al |
jmp .writekey |
.normal_code: |
mov cl, 0 |
xchg cl, [ext_code] |
;-------------------------------------- |
.normal_code: |
mov cl,0 |
xchg cl,[ext_code] |
and al,0x7F |
mov bh, 1 |
@@: cmp al,0x2A |
mov bh,1 |
@@: |
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 |
|
mov eax,VKEY_LALT |
test cl,cl |
jz .modifier |
mov al, VKEY_RALT |
|
mov al,VKEY_RALT |
jmp .modifier |
@@: cmp al,0x1D |
;-------------------------------------- |
@@: |
cmp al,0x1D |
jne @f |
mov eax, VKEY_LCONTROL |
test cl, cl |
|
mov eax,VKEY_LCONTROL |
test cl,cl |
jz .modifier |
mov al, VKEY_RCONTROL |
cmp cl, 0xE0 |
|
mov al,VKEY_RCONTROL |
cmp cl,0xE0 |
jz .modifier |
mov [ext_code], cl |
|
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 |
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: |
.noctrlaltdel: |
test dl,VKEY_CONTROL ; ctrl on ? |
jz @f |
|
sub bl,0x60 |
@@: test dl,VKEY_SHIFT ; shift on ? |
@@: |
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 ? |
@@: |
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 |
|
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 |
test [kb_state],VKEY_NUMLOCK |
jz .dowrite |
cmp cl, 0xE0 |
|
cmp cl,0xE0 |
jz .dowrite |
|
cmp ch, 55 |
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 |
331,12 → 379,10 |
inc eax |
mov [KEY_COUNT],al |
mov [KEY_COUNT+eax],bl |
|
.exit.irq1: |
.exit.irq1: |
mov [check_idle_semaphore],5 |
|
ret |
|
;--------------------------------------------------------------------- |
set_lights: |
mov al,0xED |
call kb_write |
343,9 → 389,7 |
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 |
360,4 → 404,4 |
db 0x33 ;Num 3 |
db 0x30 ;Num 0 |
db 0x2E ;Num . |
;..........................Part2 End................................................ |
;--------------------------------------------------------------------- |