Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 478 → Rev 479

/kernel/trunk/build.bat
1,7 → 1,7
@echo off
 
set languages=en ru ge et
set drivers=sound sis infinity ati2d vmode
set drivers=sound sis infinity ati2d vmode ps2mouse
set targets=all kernel drivers skins clean
 
call :Check_Target %1
/kernel/trunk/const.inc
227,8 → 227,10
;unused
PS2_CHUNK equ (OS_BASE+0x000FB00)
 
MOUSE_SCROLL_H equ (OS_BASE+0x000FB08)
MOUSE_X equ (OS_BASE+0x000FB0A)
MOUSE_Y equ (OS_BASE+0x000FB0C)
MOUSE_SCROLL_V equ (OS_BASE+0x000FB0E)
 
MOUSE_COLOR_MEM equ (OS_BASE+0x000FB10)
COLOR_TEMP equ (OS_BASE+0x000FB30)
/kernel/trunk/core/dll.inc
141,6 → 141,7
jz .exit
 
call ebx
mov [check_idle_semaphore],5
 
.exit:
restore_ring3_context
/kernel/trunk/core/exports.inc
58,6 → 58,9
szLFBAddress db 'LFBAddress',0
szLoadFile db 'LoadFile',0
szSendEvent db 'SendEvent',0
szSetMouseData db 'SetMouseData',0
szSleep db 'Sleep',0
szGetTimerTicks db 'GetTimerTicks',0
 
 
align 16
109,6 → 112,9
dd szGetCurrentTask , get_curr_task
dd szLoadFile , load_file
dd szSendEvent , send_event
dd szSetMouseData , set_mouse_data
dd szSleep , delay_ms
dd szGetTimerTicks , get_timer_ticks
exp_lfb:
dd szLFBAddress , 0
dd 0
/kernel/trunk/core/sys32.inc
50,7 → 50,7
dd irq0 , irq_serv.irq_1, p_irq2 , p_irq3 ;irq_serv.irq_3
dd p_irq4 ,irq_serv.irq_5,p_irq6,irq_serv.irq_7
dd irq_serv.irq_8, irq_serv.irq_9, irq_serv.irq_10
dd irq_serv.irq_11,p_irq12,irqD ,p_irq14,p_irq15
dd irq_serv.irq_11,irq_serv.irq_12,irqD ,p_irq14,p_irq15
 
times 16 dd unknown_interrupt
 
274,15 → 274,6
restore_ring3_context
iret
 
p_irq12:
save_ring3_context
mov ax, app_data ;os_data
mov ds, ax
mov es, ax
call check_mouse_data_ps2
restore_ring3_context
iret
 
p_irq14:
save_ring3_context
mov ax, app_data ;os_data
/kernel/trunk/data32.inc
76,6 → 76,7
;szSound db 'SOUND',0
;szInfinity db 'INFINITY',0
szHwMouse db 'ATI2D',0
szPS2MDriver db 'PS2MOUSE',0
 
szSTART db 'START',0
szEXPORTS db 'EXPORTS',0
324,7 → 325,6
mouse_active rd 1
mouse_pause rd 1
MouseTickCounter rd 1
ps2_mouse_detected rb 1
com1_mouse_detected rb 1
com2_mouse_detected rb 1
;* end code - Mario79
/kernel/trunk/drivers/imports.inc
136,6 → 136,15
if used SendEvent
extrn SendEvent
end if
if used SetMouseData
extrn SetMouseData
end if
if used Sleep
extrn Sleep
end if
if used GetTimerTicks
extrn GetTimerTicks
end if
if used LFBAddress
extrn LFBAddress
end if
/kernel/trunk/drivers/ps2m_iofuncs.inc
0,0 → 1,141
kbd_read:
push ecx edx
 
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
kr_loop:
in al,0x64
test al,1
jnz kr_ready
loop kr_loop
mov ah,1
jmp kr_exit
kr_ready:
push ecx
mov ecx,32
kr_delay:
loop kr_delay
pop ecx
in al,0x60
xor ah,ah
kr_exit:
pop edx ecx
ret
 
 
kbd_write:
 
push ecx edx
 
mov dl,al
in al,0x60
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
kw_loop:
in al,0x64
test al,2
jz kw_ok
loop kw_loop
mov ah,1
jmp kw_exit
kw_ok:
mov al,dl
out 0x60,al
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
kw_loop3:
in al,0x64
test al,2
jz kw_ok3
loop kw_loop3
mov ah,1
jmp kw_exit
kw_ok3:
mov ah,8
kw_loop4:
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
kw_loop5:
in al,0x64
test al,1
jnz kw_ok4
loop kw_loop5
dec ah
jnz kw_loop4
kw_ok4:
xor ah,ah
kw_exit:
pop edx ecx
ret
 
 
kbd_cmd:
 
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
c_wait:
in al,0x64
test al,2
jz c_send
loop c_wait
jmp c_error
c_send:
mov al,bl
out 0x64,al
mov ecx,0x1ffff ; last 0xffff, new value in view of fast CPU's
c_accept:
in al,0x64
test al,2
jz c_ok
loop c_accept
c_error:
mov ah,1
jmp c_exit
c_ok:
xor ah,ah
c_exit:
ret
 
mouse_cmd:
mov [mouse_cmd_byte], al
mov [mouse_nr_resends], 5
.resend:
mov bl, 0xd4
call kbd_cmd
cmp ah,1
je .fail
 
mov al, [mouse_cmd_byte]
call kbd_write
cmp ah, 1
je .fail
call mouse_read
cmp al, 0xFA
jne .noack
clc
ret
.noack:
cmp al, 0xFE ; resend
jne .noresend
dec [mouse_nr_resends]
jnz .resend
.noresend:
.fail:
stc
ret
mouse_read:
mov [mouse_nr_tries], 100
.repeat:
call kbd_read
cmp ah, 1
jne .fin
mov esi, 10
call Sleep
dec [mouse_nr_tries]
jnz .repeat
 
stc
ret
 
.fin:
clc
ret
/kernel/trunk/drivers/ps2m_irqh.inc
0,0 → 1,120
;**************************************
;* ÎÁÐÀÁÎÒ×ÈÊ ÏÐÅÐÛÂÀÍÈß ÎÒ ÌÛØÈ PS/2 *
;**************************************
 
proc irq_handler
 
call Wait8042BufferEmpty ;î÷èñòêà áóôåðà
in al,0x60 ;ïîëó÷èòü ñêýí-êîä
 
cmp [mouse_byte],0
je .byte1
cmp [mouse_byte],1
je .byte2
cmp [mouse_byte],2
je .byte3
cmp [mouse_byte],3
je .byte4
jmp .error
 
.byte1:
test al,1000b ;ïåðâûé áàéò ïîñûëêè?
jz .error ;ñáîé ñèíõðîíèçàöèè
mov [first_byte],al
inc [mouse_byte]
jmp .exit
 
.byte2:
mov [second_byte],al
inc [mouse_byte]
jmp .exit
 
.byte3:
mov [third_byte],al
cmp [MouseType],MT_3B
je .full_packet
inc [mouse_byte]
jmp .exit
.byte4:
mov [fourth_byte],al
 
.full_packet:
mov [mouse_byte],0
mov al,byte [first_byte]
and eax,7
mov byte [ButtonState],al
cmp [MouseType],MT_3B
je .xy_moving
mov al,[fourth_byte]
cmp [MouseType],MT_3BScroll
je .z_moving
mov ah,al
and ah,00110000b
shr ah,1
or byte [ButtonState],ah
and al,00001111b
bt eax,3
jnc .z_moving
or al,11110000b
 
.z_moving:
movsx eax,al
mov [ZMoving],eax
 
.xy_moving:
mov ah,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH
mov al,[first_byte]
test al,10000b
jz @f
mov ah,0FFh
 
@@:
mov al,[second_byte]
cwd
mov [XMoving],eax
 
mov ah,0 ;äóáëèðóåì çíàê âî âñå ðàçðÿäû AH
mov al,[first_byte]
test al,100000b
jz @f
mov ah,0FFh
 
@@:
mov al,[third_byte]
cwd
 
@@:
mov [YMoving],eax
stdcall SetMouseData, [ButtonState], [XMoving], [YMoving], [ZMoving], 0
 
jmp .exit
 
.error:
mov [mouse_byte],0
 
.exit:
ret
endp
 
 
;***********************************************
;* ÎÆÈÄÀÍÈÅ Î×ÈÑÒÊÈ ÂÕÎÄÍÎÃÎ ÁÓÔÅÐÀ I8042 *
;* Ïðè âûõîäå èç ïðîöåäóðû: *
;* ôëàã ZF óñòàíîâëåí - íîðìàëüíîå çàâåðøåíèå, *
;* ôëàã ZF ñáðîøåí - îøèáêà òàéì-àóòà. *
;***********************************************
Wait8042BufferEmpty:
push ecx
xor ecx,ecx
@@:
in al,64h
test al,00000010b
loopnz @b
pop ecx
 
ret ;âîçâðàò â ïîäïðîãðàììó
/kernel/trunk/drivers/ps2mouse.asm
0,0 → 1,275
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
format MS COFF
 
include 'proc32.inc'
include 'imports.inc'
 
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
 
virtual at 0
IOCTL IOCTL
end virtual
 
public START
public version
 
DRV_ENTRY equ 1
DRV_EXIT equ -1
 
MT_3B equ 0
MT_3BScroll equ 1
MT_5BScroll equ 2
 
PS2_DRV_VER equ 1
 
section '.flat' code readable align 16
 
 
proc START stdcall, state:dword
 
cmp [state], DRV_ENTRY
jne .fin
.init:
 
call detect_mouse
test eax,eax
jnz .exit
 
mov [MouseType],MT_3B
 
call try_mode_ID3
test eax,eax
jnz .stop_try
mov [MouseType],MT_3BScroll
call try_mode_ID4
test eax,eax
jnz .stop_try
mov [MouseType],MT_5BScroll
.stop_try:
 
mov bl, 0x20 ; read command byte
call kbd_cmd
cmp ah,1
je .exit
 
call kbd_read
cmp ah,1
je .exit
 
or al, 10b
push eax
mov bl, 0x60 ; write command byte
call kbd_cmd
cmp ah,1
je .exit
 
pop eax
call kbd_write
cmp ah,1
je .exit
 
mov al, 0xF4 ; enable data reporting
call mouse_cmd
 
mov bl, 0xAE ; enable keyboard interface
call kbd_cmd
stdcall AttachIntHandler, 12, irq_handler
stdcall RegService, my_service, service_proc
ret
 
.fin:
;stdcall DetachIntHandler, 12, irq_handler
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
xor eax, eax
ret
 
.exit:
mov bl, 0xA7 ; disable mouse interface
call kbd_cmd
mov bl, 0xAE ; enable keyboard interface
call kbd_cmd
xor eax, eax
ret
endp
 
proc service_proc stdcall, ioctl:dword
mov edi, [ioctl]
mov eax, [edi+IOCTL.io_code]
test eax, eax
jz .getversion
cmp eax,1
jz .gettype
 
.err:
or eax, -1
ret
 
.ok:
xor eax, eax
ret
 
.getversion:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov dword [edi], PS2_DRV_VER ; version of driver
jmp .ok
.gettype:
cmp [edi+IOCTL.out_size], 4
jb .err
mov edi, [edi+IOCTL.output]
mov eax,[MouseType]
mov dword [edi], eax ; mouse type
jmp .ok
endp
 
detect_mouse:
 
mov bl, 0xAD ; disable keyboard interface
call kbd_cmd
cmp ah,1
je .fail
 
mov bl, 0xA8 ; enable mouse interface
call kbd_cmd
cmp ah,1
je .fail
 
mov al, 0xFF ; reset
call mouse_cmd
jc .fail
 
call mouse_read
jc .fail
cmp al, 0xAA
jne .fail ; dead mouse
 
; get device ID
call mouse_read
jc .fail
cmp al, 0x00
jne .fail ; unknown device
xor eax,eax
ret
 
.fail:
or eax,-1
ret
 
try_mode_ID3:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x64 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
 
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
 
call mouse_read
jc .fail
cmp al, 0x03
jne .fail
 
xor eax,eax
ret
.fail:
or eax,-1
ret
 
try_mode_ID4:
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;200d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0xC8 ;100d
call mouse_cmd
jc .fail
mov al, 0xF3 ;Set Sample Rate
call mouse_cmd
jc .fail
mov al, 0x50 ;80d
call mouse_cmd
jc .fail
 
mov al, 0xF2 ;Get device id
call mouse_cmd
jc .fail
 
call mouse_read
jc .fail
cmp al, 0x04
jne .fail
 
xor eax,eax
ret
 
.fail:
or eax,-1
ret
include 'ps2m_iofuncs.inc'
include 'ps2m_irqh.inc'
 
section '.data' data readable writable align 16
 
version dd 0x00050005
my_service db 'ps2mouse',0
 
;iofuncs data
mouse_cmd_byte db 0
mouse_nr_tries db 0
mouse_nr_resends db 0
 
;hid data
mouse_byte dd 0
 
first_byte db 0
second_byte db 0
third_byte db 0
fourth_byte db 0
 
;main data
MouseType dd 0
 
XMoving dd 0
YMoving dd 0
ZMoving dd 0
ButtonState dd 0
;timerTicks dd 0
/kernel/trunk/gui/window.inc
969,6 → 969,8
wacont2:
mov [KEY_COUNT], byte 0 ; empty keyboard buffer
mov [BTN_COUNT], byte 0 ; empty button buffer
mov [MOUSE_SCROLL_H], word 0 ; zero mouse z-index
mov [MOUSE_SCROLL_V], word 0 ; zero mouse z-index
popad
ret
 
/kernel/trunk/hid/mousedrv.inc
26,10 → 26,10
 
iglobal
mouse_delay dd 10
mouse_speed_factor dw 3
mouse_speed_factor: dd 3
mouse_timer_ticks dd 0
endg
 
include 'm_ps2.inc'
include 'm_com.inc'
 
 
388,3 → 388,65
popad
ret
 
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
mov eax,[BtnState]
mov [BTN_DOWN],eax
 
mov eax,[XMoving]
call mouse_acceleration
add ax,[MOUSE_X] ;[XCoordinate]
cmp ax,0
jge @@M1
mov eax,0
jmp @@M2
@@M1:
cmp ax,[ScreenWidth] ;ScreenLength
jl @@M2
mov ax,[ScreenWidth] ;ScreenLength-1
 
@@M2:
mov [MOUSE_X],ax ;[XCoordinate]
 
mov eax,[YMoving]
neg eax
call mouse_acceleration
 
add ax,[MOUSE_Y] ;[YCoordinate]
cmp ax,0
jge @@M3
mov ax,0
jmp @@M4
@@M3:
cmp ax,[ScreenHeight] ;ScreenHeigth
jl @@M4
mov ax,[ScreenHeight] ;ScreenHeigth-1
 
@@M4:
mov [MOUSE_Y],ax ;[YCoordinate]
 
mov eax,[VScroll]
add [MOUSE_SCROLL_V],ax
mov eax,[HScroll]
add [MOUSE_SCROLL_H],ax
 
mov [mouse_active],1
mov eax,[timer_ticks]
mov [mouse_timer_ticks],eax
ret
endp
 
mouse_acceleration:
push eax
mov eax,[timer_ticks]
sub eax,[mouse_timer_ticks]
cmp eax,[mouse_delay]
pop eax
ja @f
;push edx
imul eax,[mouse_speed_factor]
;pop edx
@@:
ret
 
/kernel/trunk/kernel.asm
583,6 → 583,7
mov esi,boot_devices
call boot_log
call detect_devices
stdcall load_driver, szPS2MDriver
 
; TIMER SET TO 1/100 S
 
1767,6 → 1768,10
mov [esp+36],dword 1
ret
 
get_timer_ticks:
mov eax,[timer_ticks]
ret
 
iglobal
align 4
mousefn dd msscreen, mswin, msbutton, msset
1773,6 → 1778,7
dd app_load_cursor
dd app_set_cursor
dd app_delete_cursor
dd msz
endg
 
readmousepos:
1784,8 → 1790,9
; eax=4 load cursor
; eax=5 set cursor
; eax=6 delete cursor ; reserved
; eax=7 get mouse_z
 
cmp eax, 6
cmp eax, 7
ja msset
jmp [mousefn+eax*4]
msscreen:
1816,6 → 1823,21
movzx eax,byte [BTN_DOWN]
mov [esp+36],eax
ret
msz:
mov edi, [TASK_COUNT]
movzx edi, word [WIN_POS + edi*2]
cmp edi, [CURRENT_TASK]
jne @f
mov ax,[MOUSE_SCROLL_H]
shl eax,16
mov ax,[MOUSE_SCROLL_V]
mov [esp+36],eax
mov [MOUSE_SCROLL_H],word 0
mov [MOUSE_SCROLL_V],word 0
ret
@@:
mov [esp+36],dword 0
ret
msset:
ret
 
1939,7 → 1961,7
detect_devices:
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
include 'detect/commouse.inc'
include 'detect/ps2mouse.inc'
;include 'detect/ps2mouse.inc'
;include 'detect/dev_fd.inc'
;include 'detect/dev_hdcd.inc'
;include 'detect/sear_par.inc'
2348,7 → 2370,6
and edx,0xFF000000 ;255*256*256*256
and ecx,0x00FFFFFF ;255*256*256+255*256+255
add edx,ecx
 
; mov [ebx+IMG_BACKGROUND],edx
push eax
mov eax,[img_background]
2395,8 → 2416,10
.fin:
ret
nosb5:
 
ret
 
 
align 4
 
sys_getbackground:
3298,24 → 3321,12
wrmsr_instr:
;now counter in ecx
;(edx:eax) esi:edi => edx:esi
; Fast Call MSR can't be destroy
; Íî MSR_AMD_EFER ìîæíî èçìåíÿòü, ò.ê. â ýòîì ðåãèñòðå ëèø
; âêëþ÷àþòñÿ/âûêëþ÷àþòñÿ ðàñøèðåííûå âîçìîæíîñòè
cmp ecx, MSR_SYSENTER_CS
je @f
cmp ecx, MSR_SYSENTER_ESP
je @f
cmp ecx, MSR_SYSENTER_EIP
je @f
cmp ecx, MSR_AMD_STAR
je @f
 
mov eax, esi
wrmsr
@@:
mov [esp+36],eax
mov [esp+24],edx ;ret in ebx?
ret
 
 
cache_disable:
mov eax,cr0
or eax,01100000000000000000000000000000b