kolibrios-fun/kernel/trunk/hid/keyboard.inc
Ivan Poddubny bd15d25cab No task gates in the IDT.
No TSSs for interrupt handlers.
More free memory.
Faster task switch and interrupt handling.
Smaller sys32.inc.

git-svn-id: svn://kolibrios.org@8 a494cfbc-eb01-0410-851d-a64ba20cac60
2005-10-16 13:30:23 +00:00

227 lines
5.2 KiB
PHP

;// mike.dld [
VKEY_LSHIFT = 0000000000000001b
VKEY_RSHIFT = 0000000000000010b
VKEY_LCONTROL = 0000000000000100b
VKEY_RCONTROL = 0000000000001000b
VKEY_LALT = 0000000000010000b
VKEY_RALT = 0000000000100000b
VKEY_CAPSLOCK = 0000000001000000b
VKEY_NUMLOCK = 0000000010000000b
VKEY_SCRLOCK = 0000000100000000b
VKEY_SHIFT = 0000000000000011b
VKEY_CONTROL = 0000000000001100b
VKEY_ALT = 0000000000110000b
uglobal
align 4
kb_state dd 0
ext_code db 0
keyboard_mode db 0
keyboard_data db 0
altmouseb db 0
ctrl_alt_del db 0
kb_lights db 0
endg
align 4
irq1:
pushad
push ds es
mov ax, os_data
mov ds, ax
mov es, ax
movzx eax,word[0x3004] ; top window process
movzx eax,word[0xC400+eax*2]
shl eax,8
mov al,[0x800B4+eax]
mov [keyboard_mode],al
in al,0x60
mov [keyboard_data],al
mov ch,al
cmp al,0xE0
je @f
cmp al,0xE1
jne .normal_code
@@: mov [ext_code],al
jmp .no_key.end
.normal_code:
mov cl,[ext_code]
mov [ext_code],0
and al,0x7F
@@: cmp al,0x2A
jne @f
cmp cl,0xE0
je .no_key.end
mov eax,VKEY_LSHIFT
jmp .no_key
@@: cmp al,0x36
jne @f
cmp cl,0xE0
je .no_key.end
mov eax,VKEY_RSHIFT
jmp .no_key
@@: cmp al,0x38
jne @f
cmp cl,0xE0
je .alt.r
mov eax,VKEY_LALT
jmp .no_key
.alt.r:
mov eax,VKEY_RALT
jmp .no_key
@@: cmp al,0x1D
jne @f
cmp cl,0
jne .ctrl.r
mov eax,VKEY_LCONTROL
jmp .no_key
.ctrl.r:
cmp cl,0xE1
jne .ctrl.r.2
mov [ext_code],cl
jmp .no_key.end
.ctrl.r.2:
mov eax,VKEY_RCONTROL
jmp .no_key
@@: cmp al,0x3A
jne @f
mov bl,4
mov eax,VKEY_CAPSLOCK
jmp .no_key.xor
@@: cmp al,0x45
jne @f
cmp cl,0
jne .no_key.end
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
@@:
test ch,0x80
jnz .no_key.end
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 bl,134+48
jne .noctrlaltdel
mov [ctrl_alt_del],1
jmp .no_key.end
.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]
; alt mouse ?
xor edx,edx
cmp bl,178
jnz .no_alt.up
mov edx,5*65536
jmp .mouse.change
.no_alt.up:
cmp bl,177
jnz .no_alt.down
mov edx,251*65536
jmp .mouse.change
.no_alt.down:
cmp bl,176
jnz .no_alt.left
mov edx,251*256
jmp .mouse.change
.no_alt.left:
cmp bl,179
jnz .no_alt.right
mov edx,5*256
jmp .mouse.change
.no_alt.right:
cmp bl,' '
jne @f
xor [altmouseb],1
.mouse.change:
mov byte[0xF604],1; ps2 data
mov byte[0xFB00],0; ps2 chunk count
mov word[0x2E0000+4096*12],3; mouse data count
mov dl,[altmouseb]
mov [0x2E0000+4096*12+0x10],edx
mov bl,0
@@:
cmp [keyboard_mode],0 ; return from keymap
jne .no_key.end
mov [keyboard_mode_sys],0
cmp bl,0
je .no_key.end
movzx eax,byte[0xF400]
cmp al,120
jae .no_key.end
inc al
mov [0xF400],al
mov [0xF400+eax],bl
jmp .no_key.end
.no_key:
test ch,0x80
jz .no_key.down
not eax
and [kb_state],eax
jmp .no_key.end
.no_key.xor:
test ch,0x80
jnz .no_key.end
xor [kb_state],eax
xor [kb_lights],bl
call set_lights
jmp .no_key.end
.no_key.down:
or [kb_state],eax
.no_key.end:
cmp [keyboard_mode],1 ; return scancode
jne .no_scancode
mov [keyboard_mode_sys],1
movzx eax,byte[0xF400]
cmp al,120
jae .no_scancode
inc al
mov [0xF400],al
mov [0xF400+eax],ch
.no_scancode:
.exit.irq1:
mov [check_idle_semaphore],5
mov al,0x20 ; ready for next irq
out 0x20,al
pop es ds
popad
iret
set_lights:
mov al,0xED
call kb_write
mov al,[kb_lights]
call kb_write
ret
;// mike.dld ]