forked from KolibriOS/kolibrios
VESA - new algorithm for showing mouse pointer without a blink
git-svn-id: svn://kolibrios.org@2430 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
d955a6bf75
commit
b39e0fcab7
@ -210,7 +210,7 @@ BANK_SWITCH equ (OS_BASE+0x000E030)
|
||||
;unused ? store mousepointer
|
||||
MOUSE_PICTURE equ (OS_BASE+0x000F200)
|
||||
|
||||
MOUSE_VISIBLE equ (OS_BASE+0x000F204)
|
||||
;MOUSE_VISIBLE equ (OS_BASE+0x000F204)
|
||||
WIN_TEMP_XY equ (OS_BASE+0x000F300)
|
||||
KEY_COUNT equ (OS_BASE+0x000F400)
|
||||
KEY_BUFF equ (OS_BASE+0x000F401)
|
||||
@ -512,8 +512,9 @@ struct display_t
|
||||
show_cursor dd ?
|
||||
move_cursor dd ?
|
||||
restore_cursor dd ?
|
||||
disable_mouse dd ?
|
||||
mask_seqno dd ?
|
||||
check_mouse dd ?
|
||||
check_m_pixel dd ?
|
||||
ends
|
||||
|
||||
struct BOOT_DATA
|
||||
|
@ -170,7 +170,8 @@ draw_line dd __sys_draw_line
|
||||
draw_pointer dd __sys_draw_pointer
|
||||
;//mike.dld, 2006-08-02 [
|
||||
;drawbar dd __sys_drawbar
|
||||
drawbar dd __sys_drawbar.forced
|
||||
;drawbar dd __sys_drawbar.forced
|
||||
drawbar dd vesa20_drawbar
|
||||
;//mike.dld, 2006-08-02 ]
|
||||
putpixel dd __sys_putpixel
|
||||
; } mike.dld
|
||||
@ -292,7 +293,8 @@ endofcode:
|
||||
gdte:
|
||||
|
||||
align 16
|
||||
cur_saved_data rb 4096
|
||||
cur_saved_data:
|
||||
rb 4096
|
||||
fpu_data:
|
||||
rb 512
|
||||
|
||||
@ -393,13 +395,8 @@ windowtypechanged rd 1
|
||||
|
||||
hd_entries rd 1 ;unused ? 0xfe10
|
||||
|
||||
;* start code - Mario79
|
||||
|
||||
mouse_active rd 1
|
||||
mouse_pause rd 1
|
||||
MouseTickCounter rd 1
|
||||
|
||||
;* end code - Mario79
|
||||
|
||||
img_background rd 1
|
||||
mem_BACKGROUND rd 1
|
||||
|
@ -33,8 +33,6 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
|
||||
.1:
|
||||
; } \\ Alver \\
|
||||
pushad
|
||||
call [_display.disable_mouse]
|
||||
|
||||
movsx eax, bx ; eax=y
|
||||
sar ebx, 16 ; ebx=x
|
||||
xchg eax, ebx ; eax=x, ebx=y
|
||||
@ -71,6 +69,7 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
|
||||
shr dl, 1
|
||||
jz .pixloop1end
|
||||
jnc .nopix
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
|
||||
call [putpixel]
|
||||
jmp .pixloop1cont
|
||||
.nopix:
|
||||
@ -78,6 +77,7 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
|
||||
jz .pixloop1cont
|
||||
push ecx
|
||||
mov ecx, [esp+4+20h+20h]
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
|
||||
call [putpixel]
|
||||
pop ecx
|
||||
.pixloop1cont:
|
||||
@ -103,6 +103,7 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
|
||||
.pixloop2:
|
||||
shr dl, 1
|
||||
jnc .nopix2
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
|
||||
call [putpixel]
|
||||
jmp .pixloop2cont
|
||||
.nopix2:
|
||||
@ -110,6 +111,7 @@ dtext: ; Text String Output (rw by Johnny_B[john@kolibrios.org])
|
||||
jz .pixloop2cont
|
||||
push ecx
|
||||
mov ecx, [esp+12+20h+20h]
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
|
||||
call [putpixel]
|
||||
pop ecx
|
||||
.pixloop2cont:
|
||||
|
@ -43,10 +43,7 @@ syscall_draw_window: ;///// system function 0 /////////////////////////////////
|
||||
jae .exit
|
||||
|
||||
push eax
|
||||
inc [mouse_pause]
|
||||
call [_display.disable_mouse]
|
||||
call window._.sys_set_window
|
||||
call [_display.disable_mouse]
|
||||
pop eax
|
||||
|
||||
or al, al
|
||||
@ -62,7 +59,6 @@ syscall_draw_window: ;///// system function 0 /////////////////////////////////
|
||||
|
||||
; type II - only reserve area, no draw
|
||||
call sys_window_mouse
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
jmp .exit
|
||||
|
||||
@ -622,7 +618,7 @@ draw_rectangle: ;//////////////////////////////////////////////////////////////
|
||||
|
||||
; set line color
|
||||
mov ecx, esi
|
||||
sub esi, 1 shl 25
|
||||
; sub esi, 1 shl 25
|
||||
; draw top border
|
||||
rol ebx, 16
|
||||
push ebx
|
||||
@ -2054,9 +2050,6 @@ window._.draw_window_caption: ;////////////////////////////////////////////////
|
||||
;------------------------------------------------------------------------------
|
||||
;? <description>
|
||||
;------------------------------------------------------------------------------
|
||||
inc [mouse_pause]
|
||||
call [_display.disable_mouse]
|
||||
|
||||
xor eax, eax
|
||||
mov edx, [TASK_COUNT]
|
||||
movzx edx, word[WIN_POS + edx * 2]
|
||||
@ -2168,7 +2161,6 @@ window._.draw_window_caption: ;////////////////////////////////////////////////
|
||||
call dtext_asciiz_esi
|
||||
|
||||
.exit:
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
ret
|
||||
|
||||
|
@ -22,36 +22,32 @@ $Revision$
|
||||
; FCFF com1/ps2 buffer count starting from FC00
|
||||
|
||||
uglobal
|
||||
;--------------------------------------
|
||||
align 4
|
||||
mousecount dd 0x0
|
||||
mousedata dd 0x0
|
||||
Y_UNDER_subtraction_CUR_hot_y:
|
||||
dd 0
|
||||
X_UNDER_subtraction_CUR_hot_x:
|
||||
dd 0
|
||||
Y_UNDER_sub_CUR_hot_y_add_curh:
|
||||
dd 0
|
||||
X_UNDER_sub_CUR_hot_x_add_curh:
|
||||
dd 0
|
||||
endg
|
||||
|
||||
iglobal
|
||||
;--------------------------------------
|
||||
align 4
|
||||
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
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
draw_mouse_under:
|
||||
; return old picture
|
||||
|
||||
cmp [_display.restore_cursor], 0
|
||||
je @F
|
||||
|
||||
@ -61,11 +57,14 @@ draw_mouse_under:
|
||||
stdcall [_display.restore_cursor], eax, ebx
|
||||
popad
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
pushad
|
||||
xor ecx, ecx
|
||||
xor edx, edx
|
||||
align 4
|
||||
;--------------------------------------
|
||||
align 4
|
||||
mres:
|
||||
movzx eax, word [X_UNDER]
|
||||
movzx ebx, word [Y_UNDER]
|
||||
@ -83,7 +82,8 @@ mres:
|
||||
mov ecx, [eax]
|
||||
pop ebx
|
||||
pop eax
|
||||
mov edi, 1;force
|
||||
mov edi, 1 ; force
|
||||
or ecx, 0x04000000 ; don't save to mouseunder area
|
||||
call [putpixel]
|
||||
pop edx
|
||||
pop ecx
|
||||
@ -96,9 +96,9 @@ mres:
|
||||
jnz mres
|
||||
popad
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
save_draw_mouse:
|
||||
|
||||
cmp [_display.move_cursor], 0
|
||||
je .no_hw_cursor
|
||||
pushad
|
||||
@ -124,17 +124,22 @@ save_draw_mouse:
|
||||
push esi
|
||||
call [_display.select_cursor]
|
||||
mov [current_cursor], esi
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.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
|
||||
|
||||
;--------------------------------------
|
||||
;align 4
|
||||
;.fail:
|
||||
; mov ecx, [def_cursor]
|
||||
; mov [edx+SLOT_BASE+APPDATA.cursor], ecx
|
||||
; stdcall [_display.move_cursor], ecx ; stdcall: [esp]=ebx,eax
|
||||
; popad
|
||||
; ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_hw_cursor:
|
||||
pushad
|
||||
; save & draw
|
||||
@ -144,7 +149,8 @@ save_draw_mouse:
|
||||
push ebx
|
||||
mov ecx, 0
|
||||
mov edx, 0
|
||||
align 4
|
||||
;--------------------------------------
|
||||
align 4
|
||||
drm:
|
||||
push eax
|
||||
push ebx
|
||||
@ -155,6 +161,7 @@ drm:
|
||||
add eax, ecx; save picture under mouse
|
||||
add ebx, edx
|
||||
push ecx
|
||||
or ecx, 0x04000000 ; don't load to mouseunder area
|
||||
call getpixel
|
||||
mov [COLOR_TEMP], ecx
|
||||
pop ecx
|
||||
@ -164,6 +171,7 @@ drm:
|
||||
add eax, ecx
|
||||
add eax, mouseunder
|
||||
mov ebx, [COLOR_TEMP]
|
||||
and ebx, 0xffffff
|
||||
mov [eax], ebx
|
||||
pop ecx
|
||||
mov edi, edx ; y cycle
|
||||
@ -178,6 +186,7 @@ drm:
|
||||
push ecx
|
||||
mov ecx, [COLOR_TEMP]
|
||||
call combine_colors
|
||||
and ecx, 0xffffff
|
||||
mov [MOUSE_COLOR_MEM], ecx
|
||||
pop ecx
|
||||
pop edx
|
||||
@ -188,7 +197,8 @@ drm:
|
||||
add ebx, edx ; and y coord+cycle
|
||||
push ecx
|
||||
mov ecx, [MOUSE_COLOR_MEM]
|
||||
mov edi, 1
|
||||
mov edi, 1 ; force
|
||||
or ecx, 0x04000000 ; don't save to mouseunder area
|
||||
call [putpixel]
|
||||
pop ecx
|
||||
mov ebx, [esp+0] ; pure y coord again
|
||||
@ -203,8 +213,8 @@ drm:
|
||||
add esp, 8
|
||||
popad
|
||||
ret
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
combine_colors:
|
||||
; in
|
||||
; ecx - color ( 00 RR GG BB )
|
||||
@ -272,107 +282,133 @@ combine_colors:
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
check_mouse_area_for_getpixel:
|
||||
; in:
|
||||
; eax = x
|
||||
; ebx = y
|
||||
; out:
|
||||
; ecx = new color
|
||||
push eax ebx
|
||||
; check for Y
|
||||
xor ecx, ecx
|
||||
mov cx, [Y_UNDER] ; [MOUSE_Y]
|
||||
|
||||
|
||||
__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]
|
||||
jb .no_mouse_area
|
||||
add ecx, 23 ; mouse cursor Y size
|
||||
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
|
||||
ja .no_mouse_area
|
||||
; offset Y
|
||||
sub bx, [Y_UNDER] ;[MOUSE_Y]
|
||||
;--------------------------------------
|
||||
; check for X
|
||||
xor ecx, ecx
|
||||
mov cx, [X_UNDER] ;[MOUSE_X]
|
||||
cmp eax, ecx
|
||||
jb .no_mouse_area
|
||||
add ecx, 15 ; mouse cursor X size
|
||||
cmp eax, ecx
|
||||
ja .no_mouse_area
|
||||
; offset X
|
||||
sub ax, [X_UNDER] ;[MOUSE_X]
|
||||
;--------------------------------------
|
||||
; eax = offset x
|
||||
; ebx = offset y
|
||||
shl ebx, 6 ;y
|
||||
shl eax, 2 ;x
|
||||
add eax, ebx
|
||||
add eax, mouseunder
|
||||
mov ecx, [eax]
|
||||
and ecx, 0xffffff
|
||||
or ecx, 0xff000000
|
||||
pop ebx eax
|
||||
ret
|
||||
|
||||
__sys_draw_pointer:
|
||||
cmp [mouse_pause], 0
|
||||
je @f
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_mouse_area:
|
||||
xor ecx, ecx
|
||||
pop ebx eax
|
||||
ret
|
||||
@@:
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
check_mouse_area_for_putpixel:
|
||||
; in:
|
||||
; ecx = x shl 16 + y
|
||||
; eax = color
|
||||
; out:
|
||||
; eax = new color
|
||||
push eax
|
||||
mov eax, [timer_ticks]
|
||||
sub eax, [MouseTickCounter]
|
||||
cmp eax, 1
|
||||
ja @f
|
||||
; check for Y
|
||||
mov ax, [Y_UNDER] ; [MOUSE_Y]
|
||||
cmp cx, ax
|
||||
jb .no_mouse_area
|
||||
add ax, 23 ; mouse cursor Y size
|
||||
cmp cx, ax
|
||||
ja .no_mouse_area
|
||||
; offset Y
|
||||
sub cx, [Y_UNDER] ;[MOUSE_Y]
|
||||
mov ax, cx
|
||||
shl eax, 16
|
||||
;--------------------------------------
|
||||
; check for X
|
||||
mov ax, [X_UNDER] ;[MOUSE_X]
|
||||
shr ecx, 16
|
||||
cmp cx, ax
|
||||
jb .no_mouse_area
|
||||
add ax, 15 ; mouse cursor X size
|
||||
cmp cx, ax
|
||||
ja .no_mouse_area
|
||||
; offset X
|
||||
sub cx, [X_UNDER] ;[MOUSE_X]
|
||||
mov ax, cx
|
||||
;--------------------------------------
|
||||
; eax = (offset y) shl 16 + (offset x)
|
||||
|
||||
pop ecx
|
||||
|
||||
push eax ebx
|
||||
|
||||
mov ebx, eax
|
||||
shr ebx, 16 ;y
|
||||
and eax, 0xffff ;x
|
||||
|
||||
shl ebx, 6
|
||||
shl eax, 2
|
||||
add eax, ebx
|
||||
add eax, mouseunder
|
||||
and ecx, 0xFFFFFF
|
||||
mov [eax], ecx
|
||||
|
||||
pop ebx eax
|
||||
|
||||
push esi edi
|
||||
rol eax, 16
|
||||
movzx edi, ax ; y cycle
|
||||
shl edi, 4 ; *16 bytes per row
|
||||
shr eax, 16
|
||||
add edi, eax ; x cycle
|
||||
lea edi, [edi*3]
|
||||
add edi, [MOUSE_PICTURE] ; we have our str address
|
||||
mov esi, edi
|
||||
add esi, 16*24*3
|
||||
call combine_colors
|
||||
pop edi esi
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.end:
|
||||
mov eax, ecx
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_mouse_area:
|
||||
pop eax
|
||||
ret
|
||||
@@:
|
||||
mov eax, [timer_ticks]
|
||||
mov [MouseTickCounter], eax
|
||||
pop eax
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
__sys_draw_pointer:
|
||||
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]
|
||||
@ -380,18 +416,44 @@ chms00:
|
||||
cmp eax, ecx
|
||||
jne redrawmouse
|
||||
cmp ebx, edx
|
||||
jne redrawmouse
|
||||
jmp nodmp
|
||||
je nodmp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
redrawmouse:
|
||||
pushfd
|
||||
cli
|
||||
call draw_mouse_under
|
||||
call save_draw_mouse
|
||||
|
||||
mov eax, [_display.select_cursor]
|
||||
test eax, eax
|
||||
jz @f
|
||||
|
||||
xor eax, eax
|
||||
mov esi, [current_cursor]
|
||||
|
||||
mov ax, [Y_UNDER]
|
||||
sub eax, [esi+CURSOR.hot_y]
|
||||
mov [Y_UNDER_subtraction_CUR_hot_y], eax
|
||||
add eax, [cur.h]
|
||||
mov [Y_UNDER_sub_CUR_hot_y_add_curh], eax
|
||||
|
||||
mov ax, [X_UNDER]
|
||||
sub eax, [esi+CURSOR.hot_x]
|
||||
mov [X_UNDER_subtraction_CUR_hot_x], eax
|
||||
add eax, [cur.w]
|
||||
mov [X_UNDER_sub_CUR_hot_x_add_curh], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
popfd
|
||||
;--------------------------------------
|
||||
align 4
|
||||
nodmp:
|
||||
popad
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
|
||||
|
||||
mov eax, [BtnState]
|
||||
@ -404,11 +466,14 @@ proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScro
|
||||
jge @@M1
|
||||
mov eax, 0
|
||||
jmp @@M2
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@M1:
|
||||
cmp ax, [Screen_Max_X];ScreenLength
|
||||
jl @@M2
|
||||
mov ax, [Screen_Max_X];ScreenLength-1
|
||||
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@M2:
|
||||
mov [MOUSE_X], ax;[XCoordinate]
|
||||
|
||||
@ -421,11 +486,14 @@ proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScro
|
||||
jge @@M3
|
||||
mov ax, 0
|
||||
jmp @@M4
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@M3:
|
||||
cmp ax, [Screen_Max_Y];ScreenHeigth
|
||||
jl @@M4
|
||||
mov ax, [Screen_Max_Y];ScreenHeigth-1
|
||||
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@M4:
|
||||
mov [MOUSE_Y], ax;[YCoordinate]
|
||||
|
||||
@ -440,7 +508,8 @@ proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScro
|
||||
mov [mouse_timer_ticks], eax
|
||||
ret
|
||||
endp
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
mouse_acceleration:
|
||||
push eax
|
||||
mov eax, [timer_ticks]
|
||||
@ -451,6 +520,8 @@ mouse_acceleration:
|
||||
;push edx
|
||||
imul eax, [mouse_speed_factor]
|
||||
;pop edx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
|
@ -374,7 +374,6 @@ high_code:
|
||||
|
||||
mov [_display.bpp], eax
|
||||
mov [_display.vrefresh], 60
|
||||
mov [_display.disable_mouse], __sys_disable_mouse
|
||||
|
||||
movzx eax, word [BOOT_VAR+0x900A]; X max
|
||||
mov [_display.width], eax
|
||||
@ -671,6 +670,10 @@ end if
|
||||
stdcall read_file, char, FONT_I, 0, 2304
|
||||
stdcall read_file, char2, FONT_II, 0, 2560
|
||||
|
||||
mov [MOUSE_PICTURE], dword mousepointer
|
||||
mov [_display.check_mouse], check_mouse_area_for_putpixel
|
||||
mov [_display.check_m_pixel], check_mouse_area_for_getpixel
|
||||
|
||||
mov esi, boot_fonts
|
||||
call boot_log
|
||||
|
||||
@ -1917,7 +1920,30 @@ detect_devices:
|
||||
ret
|
||||
|
||||
sys_end:
|
||||
;--------------------------------------
|
||||
cmp [_display.select_cursor], 0
|
||||
je @f
|
||||
; restore default cursor before killing
|
||||
pusha
|
||||
mov ecx, [current_slot]
|
||||
mov eax, [def_cursor]
|
||||
mov [ecx+APPDATA.cursor], eax
|
||||
|
||||
movzx eax, word [MOUSE_Y]
|
||||
movzx ebx, word [MOUSE_X]
|
||||
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]
|
||||
push esi
|
||||
call [_display.select_cursor]
|
||||
mov [current_cursor], esi
|
||||
popa
|
||||
@@:
|
||||
;--------------------------------------
|
||||
mov ecx, [current_slot]
|
||||
mov eax, [ecx+APPDATA.tls_base]
|
||||
test eax, eax
|
||||
@ -1996,12 +2022,38 @@ sysfn_terminate: ; 18.2 = TERMINATE
|
||||
cmp ecx, edx
|
||||
ja noprocessterminate
|
||||
mov eax, [TASK_COUNT]
|
||||
push ecx
|
||||
shl ecx, 5
|
||||
mov edx, [ecx+CURRENT_TASK+TASKDATA.pid]
|
||||
add ecx, CURRENT_TASK+TASKDATA.state
|
||||
cmp byte [ecx], 9
|
||||
jz noprocessterminate
|
||||
;--------------------------------------
|
||||
cmp [_display.select_cursor], 0
|
||||
je @f
|
||||
; restore default cursor before killing
|
||||
pusha
|
||||
mov ecx, [esp+32]
|
||||
shl ecx, 8
|
||||
mov eax, [def_cursor]
|
||||
mov [ecx+SLOT_BASE+APPDATA.cursor], eax
|
||||
|
||||
movzx eax, word [MOUSE_Y]
|
||||
movzx ebx, word [MOUSE_X]
|
||||
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]
|
||||
push esi
|
||||
call [_display.select_cursor]
|
||||
mov [current_cursor], esi
|
||||
popa
|
||||
@@:
|
||||
add esp, 4
|
||||
;--------------------------------------
|
||||
;call MEM_Heap_Lock ;guarantee that process isn't working with heap
|
||||
mov [ecx], byte 3; clear possible i40's
|
||||
;call MEM_Heap_UnLock
|
||||
@ -3181,8 +3233,6 @@ markz:
|
||||
|
||||
no_mark_system_shutdown:
|
||||
|
||||
call [_display.disable_mouse]
|
||||
|
||||
dec byte [SYS_SHUTDOWN]
|
||||
je system_shutdown
|
||||
|
||||
@ -3679,37 +3729,23 @@ no_mask_io:
|
||||
; popad ; end disable io map
|
||||
xor eax, eax
|
||||
ret
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
drawbackground:
|
||||
inc [mouse_pause]
|
||||
; cmp [SCR_MODE], word 0x12
|
||||
; je dbrv20
|
||||
; dbrv12:
|
||||
; cmp [SCR_MODE], word 0100000000000000b
|
||||
; jge dbrv20
|
||||
; cmp [SCR_MODE], word 0x13
|
||||
; je dbrv20
|
||||
; call vesa12_drawbackground
|
||||
; dec [mouse_pause]
|
||||
; call [draw_pointer]
|
||||
; ret
|
||||
dbrv20:
|
||||
dbrv20:
|
||||
cmp [BgrDrawMode], dword 1
|
||||
jne bgrstr
|
||||
call vesa20_drawbackground_tiled
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
ret
|
||||
bgrstr:
|
||||
call vesa20_drawbackground_stretch
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
ret
|
||||
|
||||
;--------------------------------------
|
||||
align 4
|
||||
bgrstr:
|
||||
call vesa20_drawbackground_stretch
|
||||
call [draw_pointer]
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
|
||||
syscall_putimage: ; PutImage
|
||||
sys_putimage:
|
||||
test ecx, 0x80008000
|
||||
@ -3718,36 +3754,32 @@ sys_putimage:
|
||||
jz .exit
|
||||
test ecx, 0xFFFF0000
|
||||
jnz @f
|
||||
.exit:
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.exit:
|
||||
ret
|
||||
@@:
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov edi, [current_slot]
|
||||
add dx, word[edi+APPDATA.wnd_clientbox.top]
|
||||
rol edx, 16
|
||||
add dx, word[edi+APPDATA.wnd_clientbox.left]
|
||||
rol edx, 16
|
||||
.forced:
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.forced:
|
||||
push ebp esi 0
|
||||
mov ebp, putimage_get24bpp
|
||||
mov esi, putimage_init24bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
sys_putimage_bpp:
|
||||
; call [disable_mouse] ; this will be done in xxx_putimage
|
||||
; mov eax, vga_putimage
|
||||
; cmp [SCR_MODE], word 0x12
|
||||
; jz @f ;.doit
|
||||
; mov eax, vesa12_putimage
|
||||
; cmp [SCR_MODE], word 0100000000000000b
|
||||
; jae @f
|
||||
; cmp [SCR_MODE], word 0x13
|
||||
; jnz .doit
|
||||
;@@:
|
||||
mov eax, vesa20_putimage
|
||||
.doit:
|
||||
inc [mouse_pause]
|
||||
call eax
|
||||
dec [mouse_pause]
|
||||
call vesa20_putimage
|
||||
pop ebp esi ebp
|
||||
jmp [draw_pointer]
|
||||
ret
|
||||
; jmp [draw_pointer]
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
sys_putimage_palette:
|
||||
; ebx = pointer to image
|
||||
@ -3762,6 +3794,8 @@ sys_putimage_palette:
|
||||
rol edx, 16
|
||||
add dx, word [eax+SLOT_BASE+APPDATA.wnd_clientbox.left]
|
||||
rol edx, 16
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.forced:
|
||||
cmp esi, 1
|
||||
jnz @f
|
||||
@ -3776,6 +3810,8 @@ sys_putimage_palette:
|
||||
add esp, 12
|
||||
pop edi
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 2
|
||||
jnz @f
|
||||
@ -3786,6 +3822,8 @@ sys_putimage_palette:
|
||||
pop eax
|
||||
pop edi
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 4
|
||||
jnz @f
|
||||
@ -3796,6 +3834,8 @@ sys_putimage_palette:
|
||||
pop eax
|
||||
pop edi
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
push ebp esi ebp
|
||||
cmp esi, 8
|
||||
@ -3803,55 +3843,71 @@ sys_putimage_palette:
|
||||
mov ebp, putimage_get8bpp
|
||||
mov esi, putimage_init8bpp
|
||||
jmp sys_putimage_bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 15
|
||||
jnz @f
|
||||
mov ebp, putimage_get15bpp
|
||||
mov esi, putimage_init15bpp
|
||||
jmp sys_putimage_bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 16
|
||||
jnz @f
|
||||
mov ebp, putimage_get16bpp
|
||||
mov esi, putimage_init16bpp
|
||||
jmp sys_putimage_bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 24
|
||||
jnz @f
|
||||
mov ebp, putimage_get24bpp
|
||||
mov esi, putimage_init24bpp
|
||||
jmp sys_putimage_bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp esi, 32
|
||||
jnz @f
|
||||
mov ebp, putimage_get32bpp
|
||||
mov esi, putimage_init32bpp
|
||||
jmp sys_putimage_bpp
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
pop ebp esi ebp
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
put_mono_image:
|
||||
push ebp esi ebp
|
||||
mov ebp, putimage_get1bpp
|
||||
mov esi, putimage_init1bpp
|
||||
jmp sys_putimage_bpp
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
put_2bit_image:
|
||||
push ebp esi ebp
|
||||
mov ebp, putimage_get2bpp
|
||||
mov esi, putimage_init2bpp
|
||||
jmp sys_putimage_bpp
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
put_4bit_image:
|
||||
push ebp esi ebp
|
||||
mov ebp, putimage_get4bpp
|
||||
mov esi, putimage_init4bpp
|
||||
jmp sys_putimage_bpp
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init24bpp:
|
||||
lea eax, [eax*3]
|
||||
putimage_init8bpp:
|
||||
ret
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get24bpp:
|
||||
movzx eax, byte [esi+2]
|
||||
@ -3859,6 +3915,7 @@ putimage_get24bpp:
|
||||
mov ax, [esi]
|
||||
add esi, 3
|
||||
ret 4
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get8bpp:
|
||||
movzx eax, byte [esi]
|
||||
@ -3868,7 +3925,8 @@ putimage_get8bpp:
|
||||
pop edx
|
||||
inc esi
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init1bpp:
|
||||
add eax, ecx
|
||||
push ecx
|
||||
@ -3879,6 +3937,7 @@ putimage_init1bpp:
|
||||
sub eax, ecx
|
||||
pop ecx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get1bpp:
|
||||
push edx
|
||||
@ -3895,7 +3954,8 @@ putimage_get1bpp:
|
||||
add eax, [edx+4]
|
||||
pop edx
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init2bpp:
|
||||
add eax, ecx
|
||||
push ecx
|
||||
@ -3906,6 +3966,7 @@ putimage_init2bpp:
|
||||
sub eax, ecx
|
||||
pop ecx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get2bpp:
|
||||
push edx
|
||||
@ -3927,7 +3988,8 @@ putimage_get2bpp:
|
||||
mov eax, [edx+eax*4]
|
||||
pop edx
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init4bpp:
|
||||
add eax, ecx
|
||||
push ecx
|
||||
@ -3938,6 +4000,7 @@ putimage_init4bpp:
|
||||
sub eax, ecx
|
||||
pop ecx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get4bpp:
|
||||
push edx
|
||||
@ -3959,19 +4022,23 @@ putimage_get4bpp:
|
||||
mov eax, [edx+eax*4]
|
||||
pop edx
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init32bpp:
|
||||
shl eax, 2
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get32bpp:
|
||||
lodsd
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
putimage_init15bpp:
|
||||
putimage_init16bpp:
|
||||
add eax, eax
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get15bpp:
|
||||
; 0RRRRRGGGGGBBBBB -> 00000000RRRRR000GGGGG000BBBBB000
|
||||
@ -3990,7 +4057,7 @@ putimage_get15bpp:
|
||||
or eax, edx
|
||||
pop edx ecx
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 16
|
||||
putimage_get16bpp:
|
||||
; RRRRRGGGGGGBBBBB -> 00000000RRRRR000GGGGGG00BBBBB000
|
||||
@ -4009,41 +4076,27 @@ putimage_get16bpp:
|
||||
or eax, edx
|
||||
pop edx ecx
|
||||
ret 4
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
;align 4
|
||||
; eax x beginning
|
||||
; ebx y beginning
|
||||
; ecx x end
|
||||
; edx y end
|
||||
; edi color
|
||||
|
||||
__sys_drawbar:
|
||||
mov esi, [current_slot]
|
||||
add eax, [esi+APPDATA.wnd_clientbox.left]
|
||||
add ecx, [esi+APPDATA.wnd_clientbox.left]
|
||||
add ebx, [esi+APPDATA.wnd_clientbox.top]
|
||||
add edx, [esi+APPDATA.wnd_clientbox.top]
|
||||
.forced:
|
||||
inc [mouse_pause]
|
||||
; call [disable_mouse]
|
||||
; cmp [SCR_MODE], word 0x12
|
||||
; je dbv20
|
||||
; sdbv20:
|
||||
; cmp [SCR_MODE], word 0100000000000000b
|
||||
; jge dbv20
|
||||
; cmp [SCR_MODE], word 0x13
|
||||
; je dbv20
|
||||
; call vesa12_drawbar
|
||||
; dec [mouse_pause]
|
||||
;__sys_drawbar:
|
||||
; mov esi, [current_slot]
|
||||
; add eax, [esi+APPDATA.wnd_clientbox.left]
|
||||
; add ecx, [esi+APPDATA.wnd_clientbox.left]
|
||||
; add ebx, [esi+APPDATA.wnd_clientbox.top]
|
||||
; add edx, [esi+APPDATA.wnd_clientbox.top]
|
||||
;--------------------------------------
|
||||
;align 4
|
||||
;.forced:
|
||||
; call vesa20_drawbar
|
||||
; call [draw_pointer]
|
||||
; ret
|
||||
; dbv20:
|
||||
call vesa20_drawbar
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
ret
|
||||
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
kb_read:
|
||||
|
||||
push ecx edx
|
||||
@ -4069,8 +4122,8 @@ kb_read:
|
||||
pop edx ecx
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
kb_write:
|
||||
|
||||
push ecx edx
|
||||
@ -4123,8 +4176,8 @@ kb_write:
|
||||
pop edx ecx
|
||||
|
||||
ret
|
||||
|
||||
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
kb_cmd:
|
||||
|
||||
mov ecx, 0x1ffff; last 0xffff, new value in view of fast CPU's
|
||||
@ -4155,7 +4208,7 @@ kb_cmd:
|
||||
setmouse: ; set mousepicture -pointer
|
||||
; ps2 mouse enable
|
||||
|
||||
mov [MOUSE_PICTURE], dword mousepointer
|
||||
; mov [MOUSE_PICTURE], dword mousepointer
|
||||
|
||||
cli
|
||||
|
||||
@ -4460,8 +4513,7 @@ syscall_setpixel: ; SetPixel
|
||||
add eax, [edi+APPDATA.wnd_clientbox.left]
|
||||
add ebx, [edi+APPDATA.wnd_clientbox.top]
|
||||
xor edi, edi ; no force
|
||||
; mov edi, 1
|
||||
call [_display.disable_mouse]
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area
|
||||
jmp [putpixel]
|
||||
|
||||
align 4
|
||||
@ -4601,6 +4653,7 @@ syscall_getpixel: ; GetPixel
|
||||
div ecx
|
||||
mov ebx, edx
|
||||
xchg eax, ebx
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 use mouseunder area
|
||||
call dword [GETPIXEL]; eax - x, ebx - y
|
||||
mov [esp + 32], ecx
|
||||
ret
|
||||
@ -4613,20 +4666,6 @@ syscall_getarea:
|
||||
;ecx = [size x]*65536 + [size y]
|
||||
;edx = [start x]*65536 + [start y]
|
||||
pushad
|
||||
inc [mouse_pause]
|
||||
; Check of use of the hardware cursor.
|
||||
cmp [_display.disable_mouse], __sys_disable_mouse
|
||||
jne @f
|
||||
; Since the test for the coordinates of the mouse should not be used,
|
||||
; then use the call [disable_mouse] is not possible!
|
||||
cmp dword [MOUSE_VISIBLE], dword 0
|
||||
jne @f
|
||||
pushf
|
||||
cli
|
||||
call draw_mouse_under
|
||||
popf
|
||||
mov [MOUSE_VISIBLE], dword 1
|
||||
@@:
|
||||
mov edi, ebx
|
||||
mov eax, edx
|
||||
shr eax, 16
|
||||
@ -4663,6 +4702,7 @@ syscall_getarea:
|
||||
push eax ebx ecx
|
||||
add eax, ecx
|
||||
|
||||
and ecx, 0xFBFFFFFF ;negate 0x04000000 use mouseunder area
|
||||
call dword [GETPIXEL]; eax - x, ebx - y
|
||||
|
||||
mov [ebp], cx
|
||||
@ -4677,12 +4717,6 @@ syscall_getarea:
|
||||
dec ebx
|
||||
dec edx
|
||||
jnz .start_y
|
||||
dec [mouse_pause]
|
||||
; Check of use of the hardware cursor.
|
||||
cmp [_display.disable_mouse], __sys_disable_mouse
|
||||
jne @f
|
||||
call [draw_pointer]
|
||||
@@:
|
||||
popad
|
||||
ret
|
||||
|
||||
|
@ -324,15 +324,19 @@ blit_32:
|
||||
test eax, eax
|
||||
jne .L57
|
||||
|
||||
inc [mouse_pause]
|
||||
call [_display.disable_mouse]
|
||||
|
||||
mov eax, [TASK_BASE]
|
||||
|
||||
mov ebx, [esp+BLITTER.dst_x]
|
||||
mov ebp, [esp+BLITTER.dst_y]
|
||||
add ebx, [eax-twdw + WDATA.box.left]
|
||||
add ebp, [eax-twdw + WDATA.box.top]
|
||||
|
||||
mov ecx, ebx
|
||||
add ecx, [esp+BLITTER.w]
|
||||
shl ecx, 16
|
||||
mov cx, bp
|
||||
add ecx, [esp+BLITTER.h]
|
||||
|
||||
mov edi, ebp
|
||||
|
||||
imul edi, [_display.pitch]
|
||||
@ -346,6 +350,7 @@ blit_32:
|
||||
lea esi, [eax+esi*4]
|
||||
add esi, [esp+BLITTER.bitmap]
|
||||
|
||||
mov eax, ecx
|
||||
mov ecx, [esp+BLITTER.h]
|
||||
mov edx, [esp+BLITTER.w]
|
||||
|
||||
@ -361,7 +366,6 @@ blit_32:
|
||||
lea edi, [edi+ebx*4]
|
||||
|
||||
mov ebx, [CURRENT_TASK]
|
||||
|
||||
align 4
|
||||
.outer32:
|
||||
xor ecx, ecx
|
||||
@ -370,9 +374,26 @@ align 4
|
||||
.inner32:
|
||||
cmp [ebp+ecx], bl
|
||||
jne @F
|
||||
|
||||
;--------------------------------------
|
||||
push eax
|
||||
mov eax, [esi+ecx*4]
|
||||
|
||||
push ecx
|
||||
|
||||
mov ecx, [esp+4]
|
||||
ror ecx, 16
|
||||
sub ecx, edx
|
||||
rol ecx, 16
|
||||
sub ecx, [esp+BLITTER.h + 8]
|
||||
|
||||
; check mouse area for putpixel
|
||||
call [_display.check_mouse]
|
||||
pop ecx
|
||||
; store to real LFB
|
||||
mov [LFB_BASE+edi+ecx*4], eax
|
||||
pop eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
inc ecx
|
||||
dec edx
|
||||
@ -387,7 +408,6 @@ align 4
|
||||
jnz .outer32
|
||||
|
||||
.done:
|
||||
dec [mouse_pause]
|
||||
call [draw_pointer]
|
||||
.L57:
|
||||
add esp, 72
|
||||
@ -411,13 +431,31 @@ align 4
|
||||
.inner24:
|
||||
cmp [ebp+ecx], bl
|
||||
jne @F
|
||||
|
||||
;--------------------------------------
|
||||
push eax
|
||||
mov eax, [esi+ecx*4]
|
||||
|
||||
lea edi, [edi+ecx*2]
|
||||
|
||||
push ecx
|
||||
|
||||
mov ecx, [esp+4]
|
||||
ror ecx, 16
|
||||
sub ecx, edx
|
||||
rol ecx, 16
|
||||
sub ecx, [esp+BLITTER.h + 8]
|
||||
|
||||
; check mouse area for putpixel
|
||||
call [_display.check_mouse]
|
||||
pop ecx
|
||||
|
||||
mov [edi+ecx], ax
|
||||
shr eax, 16
|
||||
mov [edi+ecx+2], al
|
||||
|
||||
pop eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov edi, [esp+64]
|
||||
inc ecx
|
||||
|
@ -26,7 +26,7 @@ struct BITMAPINFOHEADER
|
||||
ClrUsed dd ?
|
||||
ClrImportant dd ?
|
||||
ends
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc init_cursor stdcall, dst:dword, src:dword
|
||||
locals
|
||||
@ -49,7 +49,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
je .img_8
|
||||
cmp [esi+BITMAPINFOHEADER.BitCount], 4
|
||||
je .img_4
|
||||
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.img_2:
|
||||
add eax, [esi]
|
||||
mov [pQuad], eax
|
||||
@ -68,6 +69,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
mov [rBase], edi
|
||||
|
||||
mov esi, [pQuad]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.l21:
|
||||
mov ebx, [pBits]
|
||||
mov ebx, [ebx]
|
||||
@ -76,6 +79,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
mov eax, [eax]
|
||||
bswap eax
|
||||
mov [counter], 32
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
xor edx, edx
|
||||
shl eax, 1
|
||||
@ -103,7 +108,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
sub [height], 1
|
||||
jnz .l21
|
||||
ret
|
||||
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.img_4:
|
||||
add eax, [esi]
|
||||
mov [pQuad], eax
|
||||
@ -123,11 +129,15 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
|
||||
mov esi, [pQuad]
|
||||
mov ebx, [pBits]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.l4:
|
||||
mov eax, [pAnd]
|
||||
mov eax, [eax]
|
||||
bswap eax
|
||||
mov [counter], 16
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
xor edx, edx
|
||||
shl eax, 1
|
||||
@ -168,6 +178,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
sub [height], 1
|
||||
jnz .l4
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.img_8:
|
||||
add eax, [esi]
|
||||
mov [pQuad], eax
|
||||
@ -187,11 +199,15 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
|
||||
mov esi, [pQuad]
|
||||
mov ebx, [pBits]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.l81:
|
||||
mov eax, [pAnd]
|
||||
mov eax, [eax]
|
||||
bswap eax
|
||||
mov [counter], 32
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
xor edx, edx
|
||||
shl eax, 1
|
||||
@ -217,6 +233,8 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
sub [height], 1
|
||||
jnz .l81
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.img_24:
|
||||
add eax, [esi]
|
||||
mov [pQuad], eax
|
||||
@ -234,10 +252,14 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
|
||||
mov esi, [pAnd]
|
||||
mov ebx, [pQuad]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.row_24:
|
||||
mov eax, [esi]
|
||||
bswap eax
|
||||
mov [counter], 32
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
xor edx, edx
|
||||
shl eax, 1
|
||||
@ -263,7 +285,7 @@ proc init_cursor stdcall, dst:dword, src:dword
|
||||
jnz .row_24
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc set_cursor stdcall, hcursor:dword
|
||||
mov eax, [hcursor]
|
||||
@ -274,13 +296,16 @@ proc set_cursor stdcall, hcursor:dword
|
||||
mov ebx, [current_slot]
|
||||
xchg eax, [ebx+APPDATA.cursor]
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail:
|
||||
mov eax, [def_cursor]
|
||||
mov ebx, [current_slot]
|
||||
xchg eax, [ebx+APPDATA.cursor]
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
; param
|
||||
; eax= pid
|
||||
; ebx= src
|
||||
@ -338,6 +363,8 @@ create_cursor:
|
||||
popfd
|
||||
|
||||
mov eax, [.hcursor]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.check_hw:
|
||||
cmp [_display.init_cursor], 0
|
||||
je .fail
|
||||
@ -347,9 +374,13 @@ create_cursor:
|
||||
add esp, 4
|
||||
|
||||
mov eax, [.hcursor]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail:
|
||||
add esp, 12
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.indirect:
|
||||
shr ebx, 16
|
||||
movzx ecx, bh
|
||||
@ -362,7 +393,7 @@ create_cursor:
|
||||
cld
|
||||
rep movsd
|
||||
jmp .check_hw
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc load_cursor stdcall, src:dword, flags:dword
|
||||
locals
|
||||
@ -381,6 +412,8 @@ proc load_cursor stdcall, src:dword, flags:dword
|
||||
test eax, eax
|
||||
jz .fail
|
||||
mov [src], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
push ebx
|
||||
push esi
|
||||
@ -397,16 +430,22 @@ proc load_cursor stdcall, src:dword, flags:dword
|
||||
cmp word [flags], LOAD_FROM_FILE
|
||||
jne .exit
|
||||
stdcall kernel_free, [src]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.exit:
|
||||
pop edi
|
||||
pop esi
|
||||
pop ebx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail:
|
||||
mov eax, [handle]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail2:
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc delete_cursor stdcall, hcursor:dword
|
||||
locals
|
||||
@ -433,17 +472,20 @@ proc delete_cursor stdcall, hcursor:dword
|
||||
jne @F
|
||||
mov eax, [def_cursor]
|
||||
mov [ebx+APPDATA.cursor], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov eax, [hcursor]
|
||||
call [eax+APPOBJ.destroy]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail:
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
; param
|
||||
; eax= cursor
|
||||
|
||||
align 4
|
||||
destroy_cursor:
|
||||
|
||||
push eax
|
||||
@ -460,13 +502,13 @@ destroy_cursor:
|
||||
pop eax
|
||||
call destroy_kernel_object
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
select_cursor:
|
||||
mov eax, [esp+4]
|
||||
mov [_display.cursor], eax
|
||||
ret 4
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc restore_24 stdcall, x:dword, y:dword
|
||||
|
||||
@ -484,6 +526,8 @@ proc restore_24 stdcall, x:dword, y:dword
|
||||
mov ecx, [cur.w]
|
||||
lea ecx, [ecx+ecx*2]
|
||||
push ecx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov edi, ebx
|
||||
add ebx, [BytesPerScanLine]
|
||||
@ -496,11 +540,13 @@ proc restore_24 stdcall, x:dword, y:dword
|
||||
pop ecx
|
||||
pop edi
|
||||
pop esi
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.ret:
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc restore_32 stdcall, x:dword, y:dword
|
||||
|
||||
@ -515,6 +561,8 @@ proc restore_32 stdcall, x:dword, y:dword
|
||||
push edi
|
||||
|
||||
mov esi, cur_saved_data
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov edi, ebx
|
||||
add ebx, [BytesPerScanLine]
|
||||
@ -525,12 +573,14 @@ proc restore_32 stdcall, x:dword, y:dword
|
||||
jnz @B
|
||||
|
||||
pop edi
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.ret:
|
||||
pop esi
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
locals
|
||||
@ -576,10 +626,14 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
cmp ebx, [Screen_Max_X]
|
||||
jbe @F
|
||||
mov ebx, [Screen_Max_X]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp edi, [Screen_Max_Y]
|
||||
jbe @F
|
||||
mov edi, [Screen_Max_Y]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov [cur.right], ebx
|
||||
mov [cur.bottom], edi
|
||||
@ -595,6 +649,8 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
mov eax, edi
|
||||
mov edi, cur_saved_data
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov esi, edx
|
||||
add edx, [BytesPerScanLine]
|
||||
@ -613,12 +669,16 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
mov esi, [hcursor]
|
||||
mov esi, [esi+CURSOR.base]
|
||||
lea edx, [esi+eax*4]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.row:
|
||||
mov ecx, [cur.w]
|
||||
mov esi, edx
|
||||
mov edi, ebx
|
||||
add edx, 32*4
|
||||
add ebx, [BytesPerScanLine]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.pix:
|
||||
lodsd
|
||||
test eax, 0xFF000000
|
||||
@ -626,6 +686,8 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
mov [edi], ax
|
||||
shr eax, 16
|
||||
mov [edi+2], al
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
add edi, 3
|
||||
dec ecx
|
||||
@ -635,8 +697,7 @@ proc move_cursor_24 stdcall, hcursor:dword, x:dword, y:dword
|
||||
jnz .row
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
locals
|
||||
@ -680,10 +741,14 @@ proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
cmp ebx, [Screen_Max_X]
|
||||
jbe @F
|
||||
mov ebx, [Screen_Max_X]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
cmp edi, [Screen_Max_Y]
|
||||
jbe @F
|
||||
mov edi, [Screen_Max_Y]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov [cur.right], ebx
|
||||
mov [cur.bottom], edi
|
||||
@ -699,6 +764,8 @@ proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
|
||||
mov eax, edi
|
||||
mov edi, cur_saved_data
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov esi, edx
|
||||
add edx, [BytesPerScanLine]
|
||||
@ -716,17 +783,23 @@ proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
mov esi, [hcursor]
|
||||
mov esi, [esi+CURSOR.base]
|
||||
lea edx, [esi+eax*4]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.row:
|
||||
mov ecx, [cur.w]
|
||||
mov esi, edx
|
||||
mov edi, ebx
|
||||
add edx, 32*4
|
||||
add ebx, [BytesPerScanLine]
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.pix:
|
||||
lodsd
|
||||
test eax, 0xFF000000
|
||||
jz @F
|
||||
mov [edi], eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
add edi, 4
|
||||
dec ecx
|
||||
@ -736,16 +809,158 @@ proc move_cursor_32 stdcall, hcursor:dword, x:dword, y:dword
|
||||
jnz .row
|
||||
ret
|
||||
endp
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
check_mouse_area_for_getpixel_new:
|
||||
; in:
|
||||
; eax = x
|
||||
; ebx = y
|
||||
; out:
|
||||
; ecx = new color
|
||||
;--------------------------------------
|
||||
; check for Y
|
||||
cmp bx, [Y_UNDER_subtraction_CUR_hot_y]
|
||||
jb .no_mouse_area
|
||||
|
||||
cmp bx, [Y_UNDER_sub_CUR_hot_y_add_curh]
|
||||
jae .no_mouse_area
|
||||
;--------------------------------------
|
||||
; check for X
|
||||
cmp ax, [X_UNDER_subtraction_CUR_hot_x]
|
||||
jb .no_mouse_area
|
||||
|
||||
cmp ax, [X_UNDER_sub_CUR_hot_x_add_curh]
|
||||
jae .no_mouse_area
|
||||
;--------------------------------------
|
||||
push eax ebx
|
||||
; offset X
|
||||
mov ecx, [X_UNDER_subtraction_CUR_hot_x]
|
||||
sub eax, ecx ; x1
|
||||
; offset Y
|
||||
mov ecx, [Y_UNDER_subtraction_CUR_hot_y]
|
||||
sub ebx, ecx ; y1
|
||||
;--------------------------------------
|
||||
; ebx = offset y
|
||||
; eax = offset x
|
||||
imul ebx, [cur.w] ;y
|
||||
add eax, ebx
|
||||
mov ebx, eax
|
||||
shl eax, 2
|
||||
cmp [ScreenBPP], byte 32
|
||||
je @f
|
||||
sub eax, ebx
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
add eax, cur_saved_data
|
||||
mov ecx, [eax]
|
||||
and ecx, 0xffffff
|
||||
add ecx, 0xff000000
|
||||
pop ebx eax
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_mouse_area:
|
||||
xor ecx, ecx
|
||||
ret
|
||||
;-----------------------------------------------------------------------------
|
||||
align 4
|
||||
check_mouse_area_for_putpixel_new:
|
||||
; in:
|
||||
; ecx = x shl 16 + y
|
||||
; eax = color
|
||||
; out:
|
||||
; eax = new color
|
||||
;--------------------------------------
|
||||
; check for Y
|
||||
cmp cx, [Y_UNDER_subtraction_CUR_hot_y]
|
||||
jb .no_mouse_area
|
||||
|
||||
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh]
|
||||
jae .no_mouse_area
|
||||
|
||||
rol ecx, 16
|
||||
;--------------------------------------
|
||||
; check for X
|
||||
cmp cx, [X_UNDER_subtraction_CUR_hot_x]
|
||||
jb .no_mouse_area
|
||||
|
||||
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh]
|
||||
jae .no_mouse_area
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.1:
|
||||
push eax
|
||||
; offset X
|
||||
mov ax, [X_UNDER_subtraction_CUR_hot_x]
|
||||
sub cx, ax ; x1
|
||||
ror ecx, 16
|
||||
; offset Y
|
||||
mov ax, [Y_UNDER_subtraction_CUR_hot_y]
|
||||
sub cx, ax ; y1
|
||||
;--------------------------------------
|
||||
; ecx = (offset x) shl 16 + (offset y)
|
||||
push ebx
|
||||
mov ebx, ecx
|
||||
shr ebx, 16 ; x
|
||||
and ecx, 0xffff ; y
|
||||
; ecx = offset y
|
||||
; ebx = offset x
|
||||
mov eax, [esp + 4]
|
||||
|
||||
push ebx ecx
|
||||
imul ecx, [cur.w] ;y
|
||||
add ecx, ebx
|
||||
mov ebx, ecx
|
||||
shl ecx, 2
|
||||
cmp [ScreenBPP], byte 24
|
||||
je .24
|
||||
and eax, 0xFFFFFF
|
||||
mov [ecx + cur_saved_data], eax ;store new color to
|
||||
jmp @f
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.24:
|
||||
sub ecx, ebx
|
||||
mov [ecx + cur_saved_data], ax ;store new color to
|
||||
shr eax, 16
|
||||
mov [ecx + cur_saved_data + 2], al ;store new color to
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
pop ecx ebx
|
||||
|
||||
shl ecx, 5
|
||||
add ecx, ebx
|
||||
|
||||
mov eax, [current_cursor]
|
||||
mov eax, [eax+CURSOR.base]
|
||||
lea eax, [eax+ecx*4]
|
||||
mov eax, [eax]
|
||||
|
||||
pop ebx
|
||||
|
||||
test eax, 0xFF000000
|
||||
jz @f
|
||||
|
||||
pop ecx
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
pop eax
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.no_mouse_area:
|
||||
ret
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
get_display:
|
||||
mov eax, _display
|
||||
ret
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
init_display:
|
||||
|
||||
xor eax, eax
|
||||
mov edi, _display
|
||||
|
||||
@ -764,6 +979,7 @@ init_display:
|
||||
|
||||
test word [SCR_MODE], 0x4000
|
||||
jz .fail
|
||||
; jmp .fail
|
||||
|
||||
mov ebx, restore_32
|
||||
mov ecx, move_cursor_32
|
||||
@ -775,22 +991,28 @@ init_display:
|
||||
mov ecx, move_cursor_24
|
||||
cmp eax, 24
|
||||
jne .fail
|
||||
;--------------------------------------
|
||||
align 4
|
||||
@@:
|
||||
mov [_display.select_cursor], select_cursor
|
||||
mov [_display.move_cursor], ecx
|
||||
mov [_display.restore_cursor], ebx
|
||||
mov [_display.check_mouse], check_mouse_area_for_putpixel_new
|
||||
mov [_display.check_m_pixel], check_mouse_area_for_getpixel_new
|
||||
|
||||
stdcall load_cursor, def_arrow, dword LOAD_FROM_MEM
|
||||
mov [def_cursor], eax
|
||||
ret
|
||||
;--------------------------------------
|
||||
align 4
|
||||
.fail:
|
||||
xor eax, eax
|
||||
mov [_display.select_cursor], eax
|
||||
mov [_display.move_cursor], eax
|
||||
ret
|
||||
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
align 4
|
||||
def_arrow:
|
||||
file 'arrow.cur'
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user