Added Num Pad.

git-svn-id: svn://kolibrios.org@582 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Rus 2007-07-16 20:21:34 +00:00
parent b26531da12
commit 2199c90dd9

View File

@ -24,73 +24,73 @@ VKEY_ALT = 0000000000110000b
uglobal uglobal
align 4 align 4
kb_state dd 0 kb_state dd 0
ext_code db 0 ext_code db 0
keyboard_mode db 0 keyboard_mode db 0
keyboard_data db 0 keyboard_data db 0
altmouseb db 0 altmouseb db 0
ctrl_alt_del db 0 ctrl_alt_del db 0
kb_lights db 0 kb_lights db 0
align 4 align 4
hotkey_scancodes rd 256 ; we have 256 scancodes hotkey_scancodes rd 256 ; we have 256 scancodes
hotkey_list rd 256*4 ; max 256 defined hotkeys hotkey_list rd 256*4 ; max 256 defined hotkeys
hotkey_buffer rd 120*2 ; buffer for 120 hotkeys hotkey_buffer rd 120*2 ; buffer for 120 hotkeys
endg endg
iglobal iglobal
hotkey_tests dd hotkey_test0 hotkey_tests dd hotkey_test0
dd hotkey_test1 dd hotkey_test1
dd hotkey_test2 dd hotkey_test2
dd hotkey_test3 dd hotkey_test3
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 xchg eax, edx
and al, 3 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
irq1: irq1:
@ -120,14 +120,14 @@ irq1:
cmp al,0xE1 cmp al,0xE1
jne .normal_code jne .normal_code
@@: @@:
mov bh, 2 mov bh, 2
mov [ext_code], al mov [ext_code], al
jmp .writekey jmp .writekey
.normal_code: .normal_code:
mov cl, 0 mov cl, 0
xchg cl, [ext_code] xchg cl, [ext_code]
and al,0x7F and al,0x7F
mov bh, 1 mov bh, 1
@@: cmp al,0x2A @@: cmp al,0x2A
jne @f jne @f
cmp cl,0xE0 cmp cl,0xE0
@ -142,21 +142,21 @@ irq1:
jmp .modifier jmp .modifier
@@: cmp al,0x38 @@: cmp al,0x38
jne @f jne @f
mov eax, VKEY_LALT mov eax, VKEY_LALT
test cl, cl test cl, cl
jz .modifier jz .modifier
mov al, VKEY_RALT mov al, VKEY_RALT
jmp .modifier jmp .modifier
@@: cmp al,0x1D @@: cmp al,0x1D
jne @f jne @f
mov eax, VKEY_LCONTROL mov eax, VKEY_LCONTROL
test cl, cl test cl, cl
jz .modifier jz .modifier
mov al, VKEY_RCONTROL mov al, VKEY_RCONTROL
cmp cl, 0xE0 cmp cl, 0xE0
jz .modifier jz .modifier
mov [ext_code], cl mov [ext_code], cl
jmp .writekey jmp .writekey
@@: cmp al,0x3A @@: cmp al,0x3A
jne @f jne @f
mov bl,4 mov bl,4
@ -164,8 +164,8 @@ irq1:
jmp .no_key.xor jmp .no_key.xor
@@: cmp al,0x45 @@: cmp al,0x45
jne @f jne @f
test cl, cl test cl, cl
jnz .writekey jnz .writekey
mov bl,2 mov bl,2
mov eax,VKEY_NUMLOCK mov eax,VKEY_NUMLOCK
jmp .no_key.xor jmp .no_key.xor
@ -177,10 +177,10 @@ irq1:
@@: @@:
test ch,ch test ch,ch
js .writekey js .writekey
movzx eax,ch ; plain key movzx eax,ch ; plain key
mov bl,[keymap+eax] mov bl,[keymap+eax]
mov edx,[kb_state] mov edx,[kb_state]
test dl,VKEY_CONTROL ; ctrl alt del test dl,VKEY_CONTROL ; ctrl alt del
jz .noctrlaltdel jz .noctrlaltdel
test dl,VKEY_ALT test dl,VKEY_ALT
jz .noctrlaltdel jz .noctrlaltdel
@ -188,92 +188,113 @@ irq1:
jne .noctrlaltdel jne .noctrlaltdel
mov [ctrl_alt_del],1 mov [ctrl_alt_del],1
.noctrlaltdel: .noctrlaltdel:
test dl,VKEY_CONTROL ; ctrl on ? test dl,VKEY_CONTROL ; ctrl on ?
jz @f jz @f
sub bl,0x60 sub bl,0x60
@@: test dl,VKEY_SHIFT ; shift on ? @@: test dl,VKEY_SHIFT ; shift on ?
jz @f jz @f
mov bl,[keymap_shift+eax] mov bl,[keymap_shift+eax]
@@: test dl,VKEY_ALT ; alt on ? @@: test dl,VKEY_ALT ; alt on ?
jz @f jz @f
mov bl,[keymap_alt+eax] mov bl,[keymap_alt+eax]
@@: @@:
mov bh, 0 mov bh, 0
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_state], eax
xor [kb_lights], bl xor [kb_lights], bl
call set_lights 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 add edi, 8
cmp edi, hotkey_buffer+120*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
jmp .dowrite
;.........................Part1 Start.......Code by Rus, optimize by Ghost...................................
test [kb_state], VKEY_NUMLOCK
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: .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
@ -290,7 +311,7 @@ irq1:
; restore_ring3_context ; restore_ring3_context
; iret ; iret
ret ret
set_lights: set_lights:
mov al,0xED mov al,0xED
@ -300,3 +321,19 @@ set_lights:
ret ret
;// mike.dld ] ;// mike.dld ]
;..........................Part2 Start.......Code by Rus.......................................
numlock_map:
db 0x37 ;Num 7
db 0x38 ;Num 8
db 0x39 ;Num 9
db 0x2D ;Num -
db 0x34 ;Num 4
db 0x35 ;Num 5
db 0x36 ;Num 6
db 0x2B ;Num +
db 0x31 ;Num 1
db 0x32 ;Num 2
db 0x33 ;Num 3
db 0x30 ;Num 0
db 0x2E ;Num .
;..........................Part2 End................................................