/kernel/tags/kolibri0.5.3.0/hid/m_com1.inc |
---|
0,0 → 1,118 |
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
MouseByteNumber DB 0 |
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
FirstByte DB 0 |
SecondByte DB 0 |
ThirdByte DB 0 |
;*************************************** |
;* ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ * |
;*************************************** |
check_mouse_data_com1: |
; cmp [com1_mouse_detected],0 |
; je @@EndMouseInterrupt |
; Ïðîâåðèòü íàëè÷èå äàííûõ |
mov DX,3F8h ;[COMPortBaseAddr] |
add DX,5 ;xFDh |
in AL,DX |
test AL,1 ;Äàííûå ãîòîâû? |
jz @@Error |
; Ââåñòè äàííûå |
mov DX,3F8h ;[COMPortBaseAddr] ;xF8h |
in AL,DX |
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò |
and AL,01111111b |
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
cmp [MouseByteNumber],0 |
je @@FirstByte |
cmp [MouseByteNumber],1 |
je @@SecondByte |
cmp [MouseByteNumber],2 |
je @@ThirdByte |
jmp @@Error |
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ |
@@FirstByte: |
test AL,1000000b ;Ïåðâûé áàéò ïîñûëêè? |
jz @@Error |
mov [FirstByte],AL |
inc [MouseByteNumber] ;óâåëè÷èòü ñ÷åò÷èê |
jmp @@EndMouseInterrupt |
; Ñîõðàíèòü âòîðîé áàéò äàííûõ |
@@SecondByte: |
test AL,1000000b |
jnz @@Error |
mov [SecondByte],AL |
inc [MouseByteNumber] ;óâåëè÷èòü ñ÷åò÷èê |
jmp @@EndMouseInterrupt |
; Ñîõðàíèòü òðåòèé áàéò äàííûõ |
@@ThirdByte: |
test AL,1000000b |
jnz @@Error |
mov [ThirdByte],AL ;óâåëè÷èòü ñ÷åò÷èê |
mov [MouseByteNumber],0 |
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ). |
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè |
mov al,[FirstByte] ;[0xfb01] |
mov ah,al |
shr al,3 |
and al,2 |
shr ah,5 |
and ah,1 |
add al,ah |
mov [0xfb40],al |
mov [mouse_active],1 |
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X |
mov AL,[FirstByte] |
shl AL,6 |
or AL,[SecondByte] |
cbw |
shl ax,1 |
add AX,[0xFB0A] ;[XCoordinate] |
; Êóðñîð íå äîëæåí âûõîäèòü çà ëåâóþ èëè |
; ïðàâóþ ãðàíèöó ýêðàíà |
js @@X1 |
cmp AX,[0xFE00] ;ScreenLength |
jb @@X2 |
; Óñòàíîâèòü êîîðäèíàòó X ïî ïðàâîé ãðàíèöå |
mov AX,[0xFE00] ;ScreenLength-1 |
dec ax |
jmp @@X2 |
@@X1: |
; Óñòàíîâèòü êîîðäèíàòó X ïî ëåâîé ãðàíèöå |
xor AX,AX |
@@X2: |
mov [0xFB0A],AX ;[XCoordinate] |
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y |
mov AL,[FirstByte] |
and AL,00001100b |
shl AL,4 |
or AL,[ThirdByte] |
cbw |
shl ax,1 |
add AX,[0xFB0C] ;[YCoordinate] |
; Êóðñîð íå äîëæåí âûõîäèòü çà âåðõíþþ èëè |
; íèæíþþ ãðàíèöó ýêðàíà |
js @@Y1 |
cmp AX,[0xFE04] ;ScreenHeigth |
jb @@Y2 |
; Óñòàíîâèòü êîîðäèíàòó X ïî íèæíåé ãðàíèöå |
mov AX,[0xFE04] ;ScreenHeigth-1 |
dec ax |
jmp @@Y2 |
@@Y1: |
; Óñòàíîâèòü êîîðäèíàòó X ïî âåðõíåé ãðàíèöå |
xor AX,AX |
@@Y2: |
mov [0xFB0C],AX ;[YCoordinate] |
jmp @@EndMouseInterrupt |
@@Error: |
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò |
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ |
mov [MouseByteNumber],0 |
@@EndMouseInterrupt: |
call ready_for_next_irq |
ret |
/kernel/tags/kolibri0.5.3.0/hid/m_com2.inc |
---|
0,0 → 1,118 |
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
MouseByteNumber_1 DB 0 |
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
FirstByte_1 DB 0 |
SecondByte_1 DB 0 |
ThirdByte_1 DB 0 |
;*************************************** |
;* ÍÎÂÛÉ ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ * |
;*************************************** |
check_mouse_data_com2: |
; cmp [com2_mouse_detected],0 |
; je @@EndMouseInterrupt_1 |
; Ïðîâåðèòü íàëè÷èå äàííûõ |
mov DX,2F8h ;[COMPortBaseAddr] |
add DX,5 ;xFDh |
in AL,DX |
test AL,1 ;Äàííûå ãîòîâû? |
jz @@Error_1 |
; Ââåñòè äàííûå |
mov DX,2F8h ;[COMPortBaseAddr] ;xF8h |
in AL,DX |
; Ñáðîñèòü ñòàðøèé íåçíà÷àùèé áèò |
and AL,01111111b |
; Îïðåäåëèòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
cmp [MouseByteNumber_1],0 |
je @@FirstByte_1 |
cmp [MouseByteNumber_1],1 |
je @@SecondByte_1 |
cmp [MouseByteNumber_1],2 |
je @@ThirdByte_1 |
jmp @@Error_1 |
; Ñîõðàíèòü ïåðâûé áàéò äàííûõ |
@@FirstByte_1: |
test AL,1000000b ;Ïåðâûé áàéò ïîñûëêè? |
jz @@Error_1 |
mov [FirstByte_1],AL |
inc [MouseByteNumber_1] ;óâåëè÷èòü ñ÷åò÷èê |
jmp @@EndMouseInterrupt_1 |
; Ñîõðàíèòü âòîðîé áàéò äàííûõ |
@@SecondByte_1: |
test AL,1000000b |
jnz @@Error_1 |
mov [SecondByte_1],AL |
inc [MouseByteNumber_1] ;óâåëè÷èòü ñ÷åò÷èê |
jmp @@EndMouseInterrupt_1 |
; Ñîõðàíèòü òðåòèé áàéò äàííûõ |
@@ThirdByte_1: |
test AL,1000000b |
jnz @@Error_1 |
mov [ThirdByte_1],AL ;óâåëè÷èòü ñ÷åò÷èê |
mov [MouseByteNumber_1],0 |
; (Ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ). |
; Çàïèñàòü íîâîå çíà÷åíèå ñîñòîÿíèÿ êíîïîê ìûøè |
mov al,[FirstByte_1] ;[0xfb01] |
mov ah,al |
shr al,3 |
and al,2 |
shr ah,5 |
and ah,1 |
add al,ah |
mov [0xfb40],al |
mov [mouse_active],1 |
; Ïðèáàâèòü ïåðåìåùåíèå ïî X ê êîîðäèíàòå X |
mov AL,[FirstByte_1] |
shl AL,6 |
or AL,[SecondByte_1] |
cbw |
shl ax,1 |
add AX,[0xFB0A] ;[XCoordinate] |
; Êóðñîð íå äîëæåí âûõîäèòü çà ëåâóþ èëè |
; ïðàâóþ ãðàíèöó ýêðàíà |
js @@X1_1 |
cmp AX,[0xFE00] ;ScreenLength |
jb @@X2_1 |
; Óñòàíîâèòü êîîðäèíàòó X ïî ïðàâîé ãðàíèöå |
mov AX,[0xFE00] ;ScreenLength-1 |
dec ax |
jmp @@X2_1 |
@@X1_1: |
; Óñòàíîâèòü êîîðäèíàòó X ïî ëåâîé ãðàíèöå |
xor AX,AX |
@@X2_1: |
mov [0xFB0A],AX ;[XCoordinate] |
; Ïðèáàâèòü ïåðåìåùåíèå ïî Y ê êîîðäèíàòå Y |
mov AL,[FirstByte_1] |
and AL,00001100b |
shl AL,4 |
or AL,[ThirdByte_1] |
cbw |
shl ax,1 |
add AX,[0xFB0C] ;[YCoordinate] |
; Êóðñîð íå äîëæåí âûõîäèòü çà âåðõíþþ èëè |
; íèæíþþ ãðàíèöó ýêðàíà |
js @@Y1_1 |
cmp AX,[0xFE04] ;ScreenHeigth |
jb @@Y2_1 |
; Óñòàíîâèòü êîîðäèíàòó X ïî íèæíåé ãðàíèöå |
mov AX,[0xFE04] ;ScreenHeigth-1 |
dec ax |
jmp @@Y2_1 |
@@Y1_1: |
; Óñòàíîâèòü êîîðäèíàòó X ïî âåðõíåé ãðàíèöå |
xor AX,AX |
@@Y2_1: |
mov [0xFB0C],AX ;[YCoordinate] |
jmp @@EndMouseInterrupt_1 |
@@Error_1: |
; Ïðîèçîøåë ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò |
; ìûøè, îáíóëèòü ñ÷åò÷èê áàéòîâ ïàêåòà äàííûõ |
mov [MouseByteNumber_1],0 |
@@EndMouseInterrupt_1: |
call ready_for_next_irq |
ret |
/kernel/tags/kolibri0.5.3.0/hid/keyboard.inc |
---|
0,0 → 1,224 |
;// 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: |
save_ring3_context |
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 |
restore_ring3_context |
iret |
set_lights: |
mov al,0xED |
call kb_write |
mov al,[kb_lights] |
call kb_write |
ret |
;// mike.dld ] |
/kernel/tags/kolibri0.5.3.0/hid/mousedrv.inc |
---|
0,0 → 1,423 |
; check mouse |
; |
; |
; FB00 -> FB0F mouse memory 00 chunk count - FB0A-B x - FB0C-D y |
; FB10 -> FB17 mouse color mem |
; FB21 x move |
; FB22 y move |
; FB30 color temp |
; FB28 high bits temp |
; FB4A -> FB4D FB4A-B x-under - FB4C-D y-under |
; FC00 -> FCFE com1/ps2 buffer |
; FCFF com1/ps2 buffer count starting from FC00 |
uglobal |
mousecount dd 0x0 |
mousedata dd 0x0 |
endg |
include 'm_ps2.inc' |
include 'm_com1.inc' |
include 'm_com2.inc' |
;test_mario79: |
; push esi |
; push eax |
; mov [write_error_to],process_test_m79+43 |
; movzx eax,al ;[DevErrorCode] |
; call writehex |
; mov esi,process_test_m79 |
; call sys_msg_board_str |
; pop eax |
; pop esi |
; ret |
;process_test_m79 db 'K : Process - test Mario79 error 00000000',13,10,0 |
draw_mouse_under: |
; return old picture |
pushad |
xor ecx,ecx |
xor edx,edx |
;cli ; !!!**** |
align 4 |
mres: |
movzx eax,word [0xfb4a] |
movzx ebx,word [0xfb4c] |
add eax,ecx |
add ebx,edx |
push ecx |
push edx |
push eax |
push ebx |
mov eax,edx |
shl eax,6 |
shl ecx,2 |
add eax,ecx |
add eax,mouseunder |
mov ecx,[eax] |
pop ebx |
pop eax |
;;;push edi |
mov edi, 1 ;force |
call [putpixel] |
;;;pop edi |
pop edx |
pop ecx |
inc ecx |
cmp ecx, 16 |
jnz mres |
xor ecx, ecx |
inc edx |
cmp edx, 24 |
jnz mres |
;sti ; !!!**** |
popad |
ret |
save_draw_mouse: |
pushad |
; save & draw |
mov [0xfb4a],ax |
mov [0xfb4c],bx |
push eax |
push ebx |
mov ecx,0 |
mov edx,0 |
;cli ; !!!**** |
align 4 |
drm: |
push eax |
push ebx |
push ecx |
push edx |
; helloworld |
push ecx |
; push eax ebx ecx |
add eax,ecx ; save picture under mouse |
add ebx,edx |
push ecx |
call getpixel |
mov [0xfb30],ecx |
pop ecx |
mov eax,edx |
shl eax,6 |
shl ecx,2 |
add eax,ecx |
add eax,mouseunder |
mov ebx,[0xfb30] |
mov [eax],ebx |
; pop ecx ebx eax |
pop ecx |
mov edi,edx ; y cycle |
shl edi,4 ; *16 bytes per row |
add edi,ecx ; x cycle |
mov esi, edi |
add edi, esi |
add edi, esi ; *3 |
add edi,[0xf200] ; we have our str address |
mov esi, edi |
add esi, 16*24*3 |
push ecx |
mov ecx, [0xfb30] |
call combine_colors |
mov [0xfb10], ecx |
pop ecx |
pop edx |
pop ecx |
pop ebx |
pop eax |
add eax,ecx ; we have x coord+cycle |
add ebx,edx ; and y coord+cycle |
; push ecx edi |
push ecx |
mov ecx, [0xfb10] |
mov edi, 1 |
call [putpixel] |
pop ecx |
; pop edi ecx |
; mnext: |
mov ebx,[esp+0] ; pure y coord again |
mov eax,[esp+4] ; and x |
inc ecx ; +1 cycle |
cmp ecx,16 ; if more than 16 |
jnz drm |
xor ecx, ecx |
inc edx |
cmp edx,24 |
jnz drm |
pop ebx |
pop eax |
;sti ; !!!**** |
popad |
ret |
combine_colors: |
; in |
; ecx - color ( 00 RR GG BB ) |
; edi - ref to new color byte |
; esi - ref to alpha byte |
; |
; out |
; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) ) |
push eax |
push ebx |
push edx |
push ecx |
xor ecx, ecx |
; byte 2 |
mov eax, 0xff |
sub al, [esi+0] |
mov ebx, [esp] |
shr ebx, 16 |
and ebx, 0xff |
mul ebx |
shr eax, 8 |
add ecx, eax |
; xor eax, eax |
; xor ebx, ebx |
; mov al, [edi+0] |
; mov bl, [esi+0] |
movzx eax, byte [edi+0] |
movzx ebx, byte [esi+0] |
mul ebx |
shr eax, 8 |
add ecx, eax |
shl ecx, 8 |
; byte 1 |
mov eax, 0xff |
sub al, [esi+1] |
mov ebx, [esp] |
shr ebx, 8 |
and ebx, 0xff |
mul ebx |
shr eax, 8 |
add ecx, eax |
; xor eax, eax |
; xor ebx, ebx |
; mov al, [edi+1] |
; mov bl, [esi+1] |
movzx eax, byte [edi+1] |
movzx ebx, byte [esi+1] |
mul ebx |
shr eax, 8 |
add ecx, eax |
shl ecx, 8 |
; byte 2 |
mov eax, 0xff |
sub al, [esi+2] |
mov ebx, [esp] |
and ebx, 0xff |
mul ebx |
shr eax, 8 |
add ecx, eax |
; xor eax, eax |
; xor ebx, ebx |
; mov al, [edi+2] |
; mov bl, [esi+2] |
movzx eax, byte [edi+2] |
movzx ebx, byte [esi+2] |
mul ebx |
shr eax, 8 |
add ecx, eax |
pop eax |
pop edx |
pop ebx |
pop eax |
ret |
__sys_disable_mouse: |
cmp dword [0xf204],dword 0 |
je @f |
ret |
@@: |
; cli |
pushad |
cmp [0x3000],dword 1 |
je disable_m |
mov edx,[0x3000] |
shl edx,5 |
add edx,window_data |
movzx eax, word [0xfb0a] |
movzx ebx, word [0xfb0c] |
mov ecx,[0xfe00] |
inc ecx |
imul ecx,ebx |
add ecx,eax |
add ecx, display_data |
movzx eax, byte [edx+twdw+0xe] |
movzx ebx, byte [ecx] |
cmp eax,ebx |
je yes_mouse_disable |
movzx ebx, byte [ecx+16] |
cmp eax,ebx |
je yes_mouse_disable |
; mov ebx,[0xfe00] |
; inc ebx |
; imul ebx,10 |
; add ecx,ebx |
; movzx ebx, byte [ecx] |
; cmp eax,ebx |
; je yes_mouse_disable |
mov ebx,[0xfe00] |
inc ebx |
imul ebx,10 |
add ecx,ebx |
movzx ebx, byte [ecx] |
cmp eax,ebx |
je yes_mouse_disable |
movzx ebx, byte [ecx+16] |
cmp eax,ebx |
je yes_mouse_disable |
jmp no_mouse_disable |
yes_mouse_disable: |
mov edx,[0x3000] |
shl edx,5 |
add edx,window_data |
movzx eax, word [0xfb0a] |
movzx ebx, word [0xfb0c] |
mov ecx,[edx+0] ; mouse inside the area ? |
add eax,14 |
cmp eax,ecx |
jb no_mouse_disable |
sub eax,14 |
add ecx,[edx+8] |
cmp eax,ecx |
jg no_mouse_disable |
mov ecx,[edx+4] |
add ebx,20 |
cmp ebx,ecx |
jb no_mouse_disable |
sub ebx,20 |
add ecx,[edx+12] |
cmp ebx,ecx |
jg no_mouse_disable |
disable_m: |
cmp dword [0xf204],dword 0 |
jne @f |
cli |
call draw_mouse_under |
sti |
; @@: |
mov [0xf204],dword 1 |
; inc dword [0xf204] |
@@: |
no_mouse_disable: |
popad |
; sti |
ret |
__sys_draw_pointer: |
cmp [mouse_pause],0 |
je @f |
ret |
@@: |
push eax |
mov eax,[timer_ticks] |
sub eax,[MouseTickCounter] |
cmp eax,1 |
ja @f |
pop eax |
ret |
@@: |
mov eax,[timer_ticks] |
mov [MouseTickCounter],eax |
pop eax |
; cli |
pushad |
cmp dword [0xf204],dword 0 ; mouse visible ? |
je chms00 |
mov [0xf204], dword 0 |
movzx ebx,word [0xfb0c] |
movzx eax,word [0xfb0a] |
cli |
call save_draw_mouse |
sti |
nodmu2: |
popad |
ret |
chms00: |
movzx ecx,word [0xfb4a] |
movzx edx,word [0xfb4c] |
movzx ebx,word [0xfb0c] |
movzx eax,word [0xfb0a] |
cmp eax,ecx |
jne redrawmouse |
cmp ebx,edx |
jne redrawmouse |
jmp nodmp |
redrawmouse: |
cli |
call draw_mouse_under |
call save_draw_mouse |
sti |
nodmp: |
popad |
; sti |
ret |
/kernel/tags/kolibri0.5.3.0/hid/m_ps2.inc |
---|
0,0 → 1,157 |
; Íîìåð ïðèíèìàåìîãî îò ìûøè áàéòà |
MouseByteNumber_2 DB 0 |
; Òðåõáàéòîâàÿ ñòðóêòóðà äàííûõ, ïåðåäàâàåìàÿ ìûøüþ |
FirstByte_2 DB 0 |
SecondByte_2 DB 0 |
ThirdByte_2 DB 0 |
;************************************** |
;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ PS/2 * |
;************************************** |
check_mouse_data_ps2: |
cmp [ps2_mouse_detected],0 |
je @@EndMouseInterrupt_2 |
call Wait8042BufferEmpty ;î÷èñòêà áóôåðà |
in AL,0x60 ;ïîëó÷èòü ñêýí-êîä |
; Âûáèðàòü ïîðÿäêîâûé íîìåð ïðèíèìàåìîãî áàéòà |
cmp [MouseByteNumber_2],0 |
je @@SaveFirstByte |
cmp [MouseByteNumber_2],1 |
je @@SaveSecondByte |
cmp [MouseByteNumber_2],2 |
je @@SaveThirdByte |
jmp @@Error_2 |
; Çàïèñàòü ïåðâûé áàéò ïîñûëêè |
@@SaveFirstByte: |
test AL,1000b ;ïåðâûé áàéò ïîñûëêè? |
jz @@Error_2 ;ñáîé ñèíõðîíèçàöèè |
mov [FirstByte_2],AL |
inc [MouseByteNumber_2] |
jmp @@EndMouseInterrupt_2 |
; Çàïèñàòü âòîðîé áàéò ïîñûëêè |
@@SaveSecondByte: |
mov [SecondByte_2],AL |
inc [MouseByteNumber_2] |
jmp @@EndMouseInterrupt_2 |
; Çàïèñàòü òðåòèé áàéò ïîñûëêè |
@@SaveThirdByte: |
mov [ThirdByte_2],AL |
mov [MouseByteNumber_2],0 |
; (ïàêåò äàííûõ îò ìûøè ïðèíÿò ïîëíîñòüþ) |
; Çàïèñàòü íîâîå çíà÷åíèå áàéòà ñîñòîÿíèÿ êíîïîê |
mov al,[FirstByte_2] ;[0xfb01] |
and eax,3 |
mov [0xfb40],al |
mov [mouse_active],1 |
; Âû÷èñëèòü íîâóþ X-êîîðäèíàòó êóðñîðà |
; Çàíåñòè â AX ïåðåìåùåíèå ïî X |
mov AH,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH |
mov AL,[FirstByte_2] |
test AL,10000b |
jz @@M0 |
mov AH,0FFh |
; Çàíåñòè â AL ìëàäøèé áàéò |
@@M0: |
mov AL,[SecondByte_2] |
shl ax,1 |
; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû |
; êóðñîðà ïî X |
add AX,[0xFB0A] ;[XCoordinate] |
cmp AX,0 |
jge @@M1 |
mov AX,0 |
jmp @@M2 |
@@M1: |
cmp AX,[0xFE00] ;ScreenLength |
jl @@M2 |
mov AX,[0xFE00] ;ScreenLength-1 |
dec ax |
@@M2: |
mov [0xFB0A],AX ;[XCoordinate] |
; Âû÷èñëÿåì íîâóþ Y-êîîðäèíàòó êóðñîðà |
; Çàíåñòè â AX ïåðåìåùåíèå ïî Y |
mov AH,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH |
mov AL,[FirstByte_2] |
test AL,100000b |
jz @@M3 |
mov AH,0FFh |
; Çàíåñòè â AL ìëàäøèé áàéò |
@@M3: |
mov AL,[ThirdByte_2] |
shl ax,1 |
; Âû÷èñëèòü íîâîå çíà÷åíèå êîîðäèíàòû êóðñîðà |
; ïî Y (Y-êîîðäèíàòà ìûøè PS/2 íàïðàâëåíà |
; ïðîòèâîïîëîæíî ýêðàííîé) |
neg AX |
add AX,[0xFB0C] ;[YCoordinate] |
cmp AX,0 |
jge @@M4 |
mov AX,0 |
jmp @@M5 |
@@M4: |
cmp AX,[0xFE04] ;ScreenHeigth |
jl @@M5 |
mov AX,[0xFE04] ;ScreenHeigth-1 |
dec ax |
@@M5: |
mov [0xFB0C],AX ;[YCoordinate] |
; Ïîêàçàòü êóðñîð â íîâîé ïîçèöèè |
jmp @@EndMouseInterrupt_2 |
; Îáíàðóæåí ñáîé â ïîðÿäêå ïåðåäà÷è èíôîðìàöèè îò ìûøè |
@@Error_2: |
mov [MouseByteNumber_2],0 |
; Íîðìàëüíîå çàâåðøåíèå ïðåðûâàíèÿ |
@@EndMouseInterrupt_2: |
call ready_for_next_irq_1 |
ret |
;*********************************************** |
;* ÎÆÈÄÀÍÈÅ Î×ÈÑÒÊÈ ÂÕÎÄÍÎÃÎ ÁÓÔÅÐÀ I8042 * |
;* Ïðè âûõîäå èç ïðîöåäóðû: * |
;* ôëàã ZF óñòàíîâëåí - íîðìàëüíîå çàâåðøåíèå, * |
;* ôëàã ZF ñáðîøåí - îøèáêà òàéì-àóòà. * |
;*********************************************** |
Wait8042BufferEmpty: |
; push CX |
; mov CX,0FFFFh ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ |
;@@kb: |
; in AL,64h ;ïîëó÷èòü ñòàòóñ |
; test AL,10b ;áóôåð i8042 ñâîáîäåí? |
; loopnz @@kb ;åñëè íåò, òî öèêë |
; pop CX |
push ecx |
xor ecx,ecx |
@@: |
in al,64h |
test al,00000010b |
loopnz @b |
pop ecx |
;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû ñáðîøåí |
;ôëàã ZF - îøèáêà |
ret ;âîçâðàò â ïîäïðîãðàììó |
;*************************************** |
;* ÎÆÈÄÀÍÈÅ ÏÎÑÒÓÏËÅÍÈß ÄÀÍÍÛÕ ÎÒ ÌÛØÈ * |
;*************************************** |
WaitMouseData: |
; push CX |
; mov CX,0FFFFh ;çàäàòü ÷èñëî öèêëîâ îæèäàíèÿ |
;@@mouse: |
; in AL,64h ;îïðîñèòü ðåãèñòð ñòàòóñà |
; test AL,100000b ;äàííûå ïîñòóïèëè? |
; loopz @@mouse ;åñëè íåò, òî öèêë |
; pop CX |
push ecx |
mov ECX,0FFFFh |
@@: |
in al,64h |
test al,100000b |
loopz @b |
pop ecx |
;Åñëè ïðè âûõîäå èç ïîäïðîãðàììû óñòàíîâëåí |
;ôëàã ZF - îøèáêà |
ret |
/kernel/tags/kolibri0.5.3.0/hid/set_dtc.inc |
---|
0,0 → 1,191 |
;setting date,time,clock and alarm-clock |
;add sys_settime at servetable as for ex. 22 fcn: |
; 22 - SETTING DATE TIME, CLOCK AND ALARM-CLOCK |
; ebx =0 - set time ecx - 00SSMMHH |
; ebx =1 - set date ecx=00DDMMYY |
; ebx =2 - set day of week ecx- 1-7 |
; ebx =3 - set alarm-clock ecx - 00SSMMHH |
; out: 0 -Ok 1 -wrong format 2 -battery low |
sys_settime: |
mov ecx,eax |
cli |
mov al,0x0d |
out 0x70,al |
in al,0x71 |
bt ax,7 |
jnc bat_low |
cmp ecx,2 ;day of week |
jne nosetweek |
test ebx,ebx ;test day of week |
je wrongtime |
cmp ebx,7 |
ja wrongtime |
mov dx,0x70 |
call startstopclk |
dec edx |
mov al,6 |
out dx,al |
inc edx |
mov al,bl |
out dx,al |
jmp endsettime |
nosetweek: ;set date |
cmp ecx,1 |
jne nosetdate |
cmp bl,0x99 ;test year |
ja wrongtime |
shl ebx,4 |
cmp bl,0x90 |
ja wrongtime |
cmp bh,0x99 ;test month |
ja wrongtime |
shr ebx,4 |
test bh,bh |
je wrongtime |
cmp bh,0x12 |
ja wrongtime |
shl ebx,8 |
bswap ebx ;ebx=00YYMMDD |
test bl,bl ;test day |
je wrongtime |
shl ebx,4 |
cmp bl,0x90 |
ja wrongtime |
shr ebx,4 |
cmp bh,2 ;February |
jne testday |
cmp bl,0x29 |
ja wrongtime |
jmp setdate |
testday: |
cmp bh,8 |
jb testday1 ;Aug-Dec |
bt bx,8 |
jnc days31 |
jmp days30 |
testday1: |
bt bx,8 ;Jan-Jul ex.Feb |
jnc days30 |
days31: |
cmp bl,0x31 |
ja wrongtime |
jmp setdate |
days30: |
cmp bl,0x30 |
ja wrongtime |
setdate: |
mov dx,0x70 |
call startstopclk |
dec edx |
mov al,7 ;set days |
out dx,al |
inc edx |
mov al,bl |
out dx,al |
dec edx |
mov al,8 ;set months |
out dx,al |
inc edx |
mov al,bh |
out dx,al |
dec edx |
mov al,9 ;set years |
out dx,al |
inc edx |
shr ebx,8 |
mov al,bh |
out dx,al |
jmp endsettime |
nosetdate: ;set time or alarm-clock |
cmp ecx,3 |
ja wrongtime |
cmp bl,0x23 |
ja wrongtime |
cmp bh,0x59 |
ja wrongtime |
shl ebx,4 |
cmp bl,0x90 |
ja wrongtime |
cmp bh,0x92 |
ja wrongtime |
shl ebx,4 |
bswap ebx ;00HHMMSS |
cmp bl,0x59 |
ja wrongtime |
shl ebx,4 |
cmp bl,0x90 |
ja wrongtime |
shr ebx,4 |
mov dx,0x70 |
call startstopclk |
dec edx |
cmp ecx,3 |
je setalarm |
xor eax,eax ;al=0-set seconds |
out dx,al |
inc edx |
mov al,bl |
out dx,al |
dec edx |
mov al,2 ;set minutes |
out dx,al |
inc edx |
mov al,bh |
out dx,al |
dec edx |
mov al,4 ;set hours |
out dx,al |
inc edx |
shr ebx,8 |
mov al,bh |
out dx,al |
jmp endsettime |
setalarm: |
mov al,1 ;set seconds for al. |
out dx,al |
inc edx |
mov al,bl |
out dx,al |
dec edx |
mov al,3 ;set minutes for al. |
out dx,al |
inc edx |
mov al,bh |
out dx,al |
dec edx |
mov al,5 ;set hours for al. |
out dx,al |
inc edx |
shr ebx,8 |
mov al,bh |
out dx,al |
dec edx |
mov al,0x0b ;enable irq's |
out dx,al |
inc dx |
in al,dx |
bts ax,5 ;set bit 5 |
out dx,al |
endsettime: |
dec edx |
call startstopclk |
sti |
mov [esp+36],dword 0 |
ret |
bat_low: |
sti |
mov [esp+36],dword 2 |
ret |
wrongtime: |
sti |
mov [esp+36],dword 1 |
ret |
startstopclk: |
mov al,0x0b |
out dx,al |
inc dx |
in al,dx |
btc ax,7 |
out dx,al |
ret |