forked from KolibriOS/kolibrios
037099f50d
git-svn-id: svn://kolibrios.org@2288 a494cfbc-eb01-0410-851d-a64ba20cac60
457 lines
11 KiB
PHP
457 lines
11 KiB
PHP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;; ;;
|
|
;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
|
|
;; Distributed under terms of the GNU General Public License ;;
|
|
;; ;;
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
$Revision$
|
|
|
|
|
|
; 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
|
|
|
|
iglobal
|
|
mouse_delay dd 10
|
|
mouse_speed_factor:
|
|
dd 3
|
|
mouse_timer_ticks dd 0
|
|
endg
|
|
|
|
;include 'm_com.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
|
|
|
|
cmp [_display.restore_cursor], 0
|
|
je @F
|
|
|
|
pushad
|
|
movzx eax, word [X_UNDER]
|
|
movzx ebx, word [Y_UNDER]
|
|
stdcall [_display.restore_cursor], eax, ebx
|
|
popad
|
|
ret
|
|
@@:
|
|
pushad
|
|
xor ecx, ecx
|
|
xor edx, edx
|
|
align 4
|
|
mres:
|
|
movzx eax, word [X_UNDER]
|
|
movzx ebx, word [Y_UNDER]
|
|
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
|
|
mov edi, 1;force
|
|
call [putpixel]
|
|
pop edx
|
|
pop ecx
|
|
inc ecx
|
|
cmp ecx, 16
|
|
jnz mres
|
|
xor ecx, ecx
|
|
inc edx
|
|
cmp edx, 24
|
|
jnz mres
|
|
popad
|
|
ret
|
|
|
|
save_draw_mouse:
|
|
|
|
cmp [_display.move_cursor], 0
|
|
je .no_hw_cursor
|
|
pushad
|
|
|
|
mov [X_UNDER], ax
|
|
mov [Y_UNDER], bx
|
|
movzx eax, word [MOUSE_Y]
|
|
movzx ebx, word [MOUSE_X]
|
|
push eax
|
|
push ebx
|
|
|
|
mov ecx, [Screen_Max_X]
|
|
inc ecx
|
|
mul ecx
|
|
add eax, [_WinMapAddress]
|
|
movzx edx, byte [ebx+eax]
|
|
shl edx, 8
|
|
mov esi, [edx+SLOT_BASE+APPDATA.cursor]
|
|
|
|
cmp esi, [current_cursor]
|
|
je .draw
|
|
|
|
push esi
|
|
call [_display.select_cursor]
|
|
mov [current_cursor], esi
|
|
.draw:
|
|
stdcall [_display.move_cursor], esi
|
|
popad
|
|
ret
|
|
.fail:
|
|
mov ecx, [def_cursor]
|
|
mov [edx+SLOT_BASE+APPDATA.cursor], ecx
|
|
stdcall [_display.move_cursor], ecx ; stdcall: [esp]=ebx,eax
|
|
popad
|
|
ret
|
|
|
|
.no_hw_cursor:
|
|
pushad
|
|
; save & draw
|
|
mov [X_UNDER], ax
|
|
mov [Y_UNDER], bx
|
|
push eax
|
|
push ebx
|
|
mov ecx, 0
|
|
mov edx, 0
|
|
align 4
|
|
drm:
|
|
push eax
|
|
push ebx
|
|
push ecx
|
|
push edx
|
|
; helloworld
|
|
push ecx
|
|
add eax, ecx; save picture under mouse
|
|
add ebx, edx
|
|
push ecx
|
|
call getpixel
|
|
mov [COLOR_TEMP], ecx
|
|
pop ecx
|
|
mov eax, edx
|
|
shl eax, 6
|
|
shl ecx, 2
|
|
add eax, ecx
|
|
add eax, mouseunder
|
|
mov ebx, [COLOR_TEMP]
|
|
mov [eax], ebx
|
|
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, [MOUSE_PICTURE] ; we have our str address
|
|
mov esi, edi
|
|
add esi, 16*24*3
|
|
push ecx
|
|
mov ecx, [COLOR_TEMP]
|
|
call combine_colors
|
|
mov [MOUSE_COLOR_MEM], 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
|
|
mov ecx, [MOUSE_COLOR_MEM]
|
|
mov edi, 1
|
|
call [putpixel]
|
|
pop ecx
|
|
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
|
|
add esp, 8
|
|
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]
|
|
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]
|
|
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]
|
|
mul ebx
|
|
shr eax, 8
|
|
add ecx, eax
|
|
pop eax
|
|
pop edx
|
|
pop ebx
|
|
pop eax
|
|
ret
|
|
|
|
|
|
__sys_disable_mouse:
|
|
cmp dword [MOUSE_VISIBLE], dword 0
|
|
je @f
|
|
ret
|
|
@@:
|
|
pushad
|
|
cmp [CURRENT_TASK], dword 1
|
|
je disable_m
|
|
mov edx, [CURRENT_TASK]
|
|
shl edx, 5
|
|
add edx, window_data
|
|
movzx eax, word [MOUSE_X]
|
|
movzx ebx, word [MOUSE_Y]
|
|
mov ecx, [Screen_Max_X]
|
|
inc ecx
|
|
imul ecx, ebx
|
|
add ecx, eax
|
|
add ecx, [_WinMapAddress]
|
|
mov eax, [CURRENT_TASK]
|
|
cmp al, [ecx]
|
|
je yes_mouse_disable
|
|
cmp al, [ecx+16]
|
|
je yes_mouse_disable
|
|
add ebx, 10
|
|
cmp ebx, [Screen_Max_Y]
|
|
jae no_mouse_disable
|
|
mov ebx, [Screen_Max_X]
|
|
inc ebx
|
|
imul ebx, 10
|
|
add ecx, ebx
|
|
cmp al, [ecx]
|
|
je yes_mouse_disable
|
|
cmp al, [ecx+16]
|
|
je yes_mouse_disable
|
|
jmp no_mouse_disable
|
|
yes_mouse_disable:
|
|
mov edx, [CURRENT_TASK]
|
|
shl edx, 5
|
|
add edx, window_data
|
|
movzx eax, word [MOUSE_X]
|
|
movzx ebx, word [MOUSE_Y]
|
|
mov ecx, [edx+0]; mouse inside the area ?
|
|
add eax, 10
|
|
cmp eax, ecx
|
|
jb no_mouse_disable
|
|
sub eax, 10
|
|
add ecx, [edx+8]
|
|
cmp eax, ecx
|
|
jg no_mouse_disable
|
|
mov ecx, [edx+4]
|
|
add ebx, 14
|
|
cmp ebx, ecx
|
|
jb no_mouse_disable
|
|
sub ebx, 14
|
|
add ecx, [edx+12]
|
|
cmp ebx, ecx
|
|
jg no_mouse_disable
|
|
disable_m:
|
|
cmp dword [MOUSE_VISIBLE], dword 0
|
|
jne no_mouse_disable
|
|
pushf
|
|
cli
|
|
call draw_mouse_under
|
|
popf
|
|
mov [MOUSE_VISIBLE], dword 1
|
|
no_mouse_disable:
|
|
popad
|
|
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
|
|
pushad
|
|
cmp dword [MOUSE_VISIBLE], dword 0; mouse visible ?
|
|
je chms00
|
|
mov [MOUSE_VISIBLE], dword 0
|
|
movzx ebx, word [MOUSE_Y]
|
|
movzx eax, word [MOUSE_X]
|
|
pushfd
|
|
cli
|
|
call save_draw_mouse
|
|
popfd
|
|
nodmu2:
|
|
popad
|
|
ret
|
|
chms00:
|
|
movzx ecx, word [X_UNDER]
|
|
movzx edx, word [Y_UNDER]
|
|
movzx ebx, word [MOUSE_Y]
|
|
movzx eax, word [MOUSE_X]
|
|
cmp eax, ecx
|
|
jne redrawmouse
|
|
cmp ebx, edx
|
|
jne redrawmouse
|
|
jmp nodmp
|
|
redrawmouse:
|
|
pushfd
|
|
cli
|
|
call draw_mouse_under
|
|
call save_draw_mouse
|
|
popfd
|
|
nodmp:
|
|
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, [Screen_Max_X];ScreenLength
|
|
jl @@M2
|
|
mov ax, [Screen_Max_X];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, [Screen_Max_Y];ScreenHeigth
|
|
jl @@M4
|
|
mov ax, [Screen_Max_Y];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
|
|
|