From b39e0fcab7681d563f2d3befb6d58281bed6751f Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Wed, 7 Mar 2012 15:50:41 +0000 Subject: [PATCH] VESA - new algorithm for showing mouse pointer without a blink git-svn-id: svn://kolibrios.org@2430 a494cfbc-eb01-0410-851d-a64ba20cac60 --- kernel/trunk/const.inc | 5 +- kernel/trunk/data32.inc | 11 +- kernel/trunk/gui/font.inc | 6 +- kernel/trunk/gui/window.inc | 10 +- kernel/trunk/hid/mousedrv.inc | 335 +++++++++++-------- kernel/trunk/kernel.asm | 252 ++++++++------ kernel/trunk/video/blitter.inc | 52 ++- kernel/trunk/video/cursors.inc | 262 +++++++++++++-- kernel/trunk/video/vesa20.inc | 588 ++++++++++++++++++++++++++++----- 9 files changed, 1152 insertions(+), 369 deletions(-) diff --git a/kernel/trunk/const.inc b/kernel/trunk/const.inc index dd0ef8b025..f54aa9e44c 100644 --- a/kernel/trunk/const.inc +++ b/kernel/trunk/const.inc @@ -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 diff --git a/kernel/trunk/data32.inc b/kernel/trunk/data32.inc index 0d8e7da3be..fe4e0fab3f 100644 --- a/kernel/trunk/data32.inc +++ b/kernel/trunk/data32.inc @@ -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 diff --git a/kernel/trunk/gui/font.inc b/kernel/trunk/gui/font.inc index 216e2060e0..da7e5d5167 100644 --- a/kernel/trunk/gui/font.inc +++ b/kernel/trunk/gui/font.inc @@ -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: diff --git a/kernel/trunk/gui/window.inc b/kernel/trunk/gui/window.inc index 759b400d34..630376824a 100644 --- a/kernel/trunk/gui/window.inc +++ b/kernel/trunk/gui/window.inc @@ -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: ;//////////////////////////////////////////////// ;------------------------------------------------------------------------------ ;? ;------------------------------------------------------------------------------ - 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 diff --git a/kernel/trunk/hid/mousedrv.inc b/kernel/trunk/hid/mousedrv.inc index f2e70ab241..a00e3d5a21 100644 --- a/kernel/trunk/hid/mousedrv.inc +++ b/kernel/trunk/hid/mousedrv.inc @@ -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 - +;----------------------------------------------------------------------------- diff --git a/kernel/trunk/kernel.asm b/kernel/trunk/kernel.asm index 3c6e18b460..14667c34f8 100644 --- a/kernel/trunk/kernel.asm +++ b/kernel/trunk/kernel.asm @@ -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 diff --git a/kernel/trunk/video/blitter.inc b/kernel/trunk/video/blitter.inc index 460cb7ba1e..859cae2422 100644 --- a/kernel/trunk/video/blitter.inc +++ b/kernel/trunk/video/blitter.inc @@ -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 diff --git a/kernel/trunk/video/cursors.inc b/kernel/trunk/video/cursors.inc index fb674bb71f..b1b0fe385f 100644 --- a/kernel/trunk/video/cursors.inc +++ b/kernel/trunk/video/cursors.inc @@ -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' +;------------------------------------------------------------------------------ diff --git a/kernel/trunk/video/vesa20.inc b/kernel/trunk/video/vesa20.inc index 6b46f2a578..06ac387579 100644 --- a/kernel/trunk/video/vesa20.inc +++ b/kernel/trunk/video/vesa20.inc @@ -31,7 +31,7 @@ $Revision$ -;************************************************* +;----------------------------------------------------------------------------- ; getpixel ; ; in: @@ -40,32 +40,57 @@ $Revision$ ; ; ret: ; ecx = 00 RR GG BB - +;----------------------------------------------------------------------------- +align 4 getpixel: push eax ebx edx edi call dword [GETPIXEL] pop edi edx ebx eax ret - +;----------------------------------------------------------------------------- +align 4 Vesa20_getpixel24: ; eax = x ; ebx = y +;-------------------------------------- +; check mouse area for putpixel + test ecx, 0x04000000 ; don't load to mouseunder area + jnz .no_mouseunder + call [_display.check_m_pixel] + test ecx, ecx ;0xff000000 + jnz @f +.no_mouseunder: +;-------------------------------------- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier lea edi, [eax+eax*2]; edi = x*3 add edi, ebx ; edi = x*3+(y*y multiplier) mov ecx, [LFB_BASE+edi] +;-------------------------------------- +align 4 +@@: and ecx, 0xffffff ret - +;----------------------------------------------------------------------------- +align 4 Vesa20_getpixel32: +;-------------------------------------- +; check mouse area for putpixel + test ecx, 0x04000000 ; don't load to mouseunder area + jnz .no_mouseunder + call [_display.check_m_pixel] + test ecx, ecx ;0xff000000 + jnz @f +.no_mouseunder: +;-------------------------------------- imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) mov ecx, [LFB_BASE+edi] +;-------------------------------------- +align 4 +@@: and ecx, 0xffffff ret - -;************************************************* - +;----------------------------------------------------------------------------- virtual at esp putimg: .real_sx dd ? @@ -80,7 +105,9 @@ virtual at esp .line_increment dd ? .winmap_newline dd ? .screen_newline dd ? - .stack_data = 4*12 + .real_sx_and_abs_cx dd ? + .real_sy_and_abs_cy dd ? + .stack_data = 4*14 .edi dd ? .esi dd ? .ebp dd ? @@ -92,7 +119,7 @@ virtual at esp .ret_addr dd ? .arg_0 dd ? end virtual - +;----------------------------------------------------------------------------- align 16 ; ebx = pointer ; ecx = size [x|y] @@ -100,10 +127,8 @@ align 16 ; ebp = pointer to 'get' function ; esi = pointer to 'init' function ; edi = parameter for 'get' function - vesa20_putimage: pushad - call [_display.disable_mouse] sub esp, putimg.stack_data ; save pointer to image mov [putimg.pti], ebx @@ -138,10 +163,14 @@ vesa20_putimage: add esp, putimg.stack_data popad ret +;-------------------------------------- +align 4 @@: cmp ebx, [putimg.image_sx] jbe .end_x mov ebx, [putimg.image_sx] +;-------------------------------------- +align 4 .end_x: mov [putimg.real_sx], ebx ; init real_sy @@ -154,10 +183,14 @@ vesa20_putimage: add esp, putimg.stack_data popad ret +;-------------------------------------- +align 4 @@: cmp ebx, [putimg.image_sy] jbe .end_y mov ebx, [putimg.image_sy] +;-------------------------------------- +align 4 .end_y: mov [putimg.real_sy], ebx ; line increment @@ -198,27 +231,51 @@ vesa20_putimage: add eax, [putimg.abs_cx] add eax, [_WinMapAddress] xchg eax, ebp +;-------------------------------------- + mov ecx, [putimg.real_sx] + add ecx, [putimg.abs_cx] + mov [putimg.real_sx_and_abs_cx], ecx + mov ecx, [putimg.real_sy] + add ecx, [putimg.abs_cy] + mov [putimg.real_sy_and_abs_cy], ecx +;-------------------------------------- ; get process number mov ebx, [CURRENT_TASK] cmp byte [ScreenBPP], 32 je put_image_end_32 ;put_image_end_24: mov edi, [putimg.real_sy] -align 4 +;-------------------------------------- +align 4 .new_line: mov ecx, [putimg.real_sx] ; push ebp edx -align 4 +;-------------------------------------- +align 4 .new_x: push [putimg.edi] mov eax, [putimg.ebp+4] call eax cmp [ebp], bl jne .skip -; mov eax, [esi] ; eax = RRBBGGRR +;-------------------------------------- + push ecx + + neg ecx + add ecx, [putimg.real_sx_and_abs_cx + 4] + shl ecx, 16 + add ecx, [putimg.real_sy_and_abs_cy + 4] + sub ecx, edi + +; check mouse area for putpixel + call [_display.check_mouse] + pop ecx +; store to real LFB mov [LFB_BASE+edx], ax shr eax, 16 mov [LFB_BASE+edx+2], al +;-------------------------------------- +align 4 .skip: ; add esi, 3 ;[putimg.source_bpp] add edx, 3 @@ -236,32 +293,55 @@ align 4 jz .correct cmp [putimg.ebp], putimage_get4bpp jnz @f +;-------------------------------------- +align 4 .correct: mov eax, [putimg.edi] mov byte [eax], 80h +;-------------------------------------- +align 4 @@: dec edi jnz .new_line +;-------------------------------------- +align 4 .finish: add esp, putimg.stack_data popad ret - +;------------------------------------------------------------------------------ +align 4 put_image_end_32: mov edi, [putimg.real_sy] -align 4 +;-------------------------------------- +align 4 .new_line: mov ecx, [putimg.real_sx] ; push ebp edx -align 4 +;-------------------------------------- +align 4 .new_x: push [putimg.edi] mov eax, [putimg.ebp+4] call eax cmp [ebp], bl jne .skip -; mov eax, [esi] ; ecx = RRBBGGRR +;-------------------------------------- + push ecx + + neg ecx + add ecx, [putimg.real_sx_and_abs_cx + 4] + shl ecx, 16 + add ecx, [putimg.real_sy_and_abs_cy + 4] + sub ecx, edi + +; check mouse area for putpixel + call [_display.check_mouse] + pop ecx +; store to real LFB mov [LFB_BASE+edx], eax +;-------------------------------------- +align 4 .skip: ; add esi, [putimg.source_bpp] add edx, 4 @@ -279,21 +359,25 @@ align 4 jz .correct cmp [putimg.ebp], putimage_get4bpp jnz @f +;-------------------------------------- +align 4 .correct: mov eax, [putimg.edi] mov byte [eax], 80h +;-------------------------------------- +align 4 @@: dec edi jnz .new_line +;-------------------------------------- +align 4 .finish: add esp, putimg.stack_data popad call VGA__putimage mov [EGA_counter], 1 ret - - -;************************************************* +;------------------------------------------------------------------------------ align 4 __sys_putpixel: @@ -323,63 +407,94 @@ __sys_putpixel: cmp edx, [CURRENT_TASK] pop eax jne .exit - +;-------------------------------------- +align 4 .forced: ; check if negation test ecx, 0x01000000 jz .noneg + call getpixel not ecx + + rol ecx, 8 + mov cl, [esp+32-8+3] + ror ecx, 8 mov [esp+32-8], ecx +;-------------------------------------- +align 4 .noneg: ; OK to set pixel call dword [PUTPIXEL]; call the real put_pixel function +;-------------------------------------- +align 4 .exit: popad ret - +;----------------------------------------------------------------------------- align 4 Vesa20_putpixel24: ; eax = x ; ebx = y + mov ecx, eax + shl ecx, 16 + mov cx, bx + imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier lea edi, [eax+eax*2]; edi = x*3 mov eax, [esp+32-8+4] +;-------------------------------------- +; check mouse area for putpixel + test eax, 0x04000000 + jnz @f + call [_display.check_mouse] +;-------------------------------------- +align 4 +@@: +; store to real LFB mov [LFB_BASE+ebx+edi], ax shr eax, 16 mov [LFB_BASE+ebx+edi+2], al +;-------------------------------------- ret - - +;----------------------------------------------------------------------------- align 4 Vesa20_putpixel32: ; eax = x ; ebx = y + mov ecx, eax + shl ecx, 16 + mov cx, bx + imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier lea edi, [ebx+eax*4]; edi = x*4+(y*y multiplier) mov eax, [esp+32-8+4]; eax = color +;-------------------------------------- +; check mouse area for putpixel + test eax, 0x04000000 + jnz @f + call [_display.check_mouse] +;-------------------------------------- +align 4 +@@: + and eax, 0xffffff +; store to real LFB mov [LFB_BASE+edi], eax +;-------------------------------------- ret - -;************************************************* - -;align 4 +;----------------------------------------------------------------------------- +align 4 calculate_edi: mov edi, ebx imul edi, [Screen_Max_X] add edi, ebx add edi, eax ret - -;************************************************* - +;----------------------------------------------------------------------------- ; DRAWLINE - +;----------------------------------------------------------------------------- align 4 __sys_draw_line: -; inc [mouse_pause] - call [_display.disable_mouse] - ; draw a line ; eax = HIWORD = x1 ; LOWORD = x2 @@ -416,8 +531,12 @@ dl_dy equ esp+0 call vline push edx ; necessary to rightly restore stack frame at .exit jmp .exit +;-------------------------------------- +align 4 .x2lx1: neg esi ; get esi absolute value +;-------------------------------------- +align 4 .no_vline: ; checking y-axis... sub ebp, ebx ; ebp = y2-y1 @@ -427,9 +546,12 @@ dl_dy equ esp+0 mov edx, [dl_x2]; else (if y1=y2) call hline jmp .exit - +;-------------------------------------- +align 4 .y2ly1: neg ebp ; get ebp absolute value +;-------------------------------------- +align 4 .no_hline: cmp ebp, esi jle .x_rules ; |y2-y1| < |x2-x1| ? @@ -442,6 +564,8 @@ dl_dy equ esp+0 mov edx, [dl_y2] mov [dl_y2], ebx mov [dl_y1], edx +;-------------------------------------- +align 4 .no_reverse1: mov eax, [dl_dx] cdq ; extend eax sing to edx @@ -453,13 +577,16 @@ dl_dy equ esp+0 cmp ebp, edx jb @f inc eax +;-------------------------------------- +align 4 @@: ;-------------------------------------- mov edx, ebp ; edx = counter (number of pixels to draw) mov ebp, 1 *65536; <<16 ; ebp = dy = 1.0 mov esi, eax ; esi = dx jmp .y_rules - +;-------------------------------------- +align 4 .x_rules: cmp [dl_x2], eax ; make sure x1 is at the begining jge .no_reverse2 @@ -470,6 +597,8 @@ dl_dy equ esp+0 mov edx, [dl_y2] mov [dl_y2], ebx mov [dl_y1], edx +;-------------------------------------- +align 4 .no_reverse2: xor edx, edx mov eax, [dl_dy] @@ -482,11 +611,15 @@ dl_dy equ esp+0 cmp esi, edx jb @f inc eax +;-------------------------------------- +align 4 @@: ;-------------------------------------- mov edx, esi ; edx = counter (number of pixels to draw) mov esi, 1 *65536;<< 16 ; esi = dx = 1.0 mov ebp, eax ; ebp = dy +;-------------------------------------- +align 4 .y_rules: mov eax, [dl_x1] mov ebx, [dl_y1] @@ -501,6 +634,8 @@ align 4 test ah, 0x80 jz @f add eax, 1 shl 16 +;-------------------------------------- +align 4 @@: ;-------------------------------------- shr eax, 16 @@ -509,9 +644,12 @@ align 4 test bh, 0x80 jz @f add ebx, 1 shl 16 +;-------------------------------------- +align 4 @@: ;-------------------------------------- shr ebx, 16 + and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area call [putpixel] pop ebx eax add ebx, ebp ; y = y+dy @@ -521,15 +659,17 @@ align 4 ; force last drawn pixel to be at (x2,y2) mov eax, [dl_x2] mov ebx, [dl_y2] + and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area call [putpixel] +;-------------------------------------- +align 4 .exit: add esp, 6*4 popa -; dec [mouse_pause] - call [draw_pointer] +; call [draw_pointer] ret - - +;------------------------------------------------------------------------------ +align 4 hline: ; draw an horizontal line ; eax = x1 @@ -541,16 +681,18 @@ hline: cmp edx, eax ; make sure x2 is above x1 jge @f xchg eax, edx -align 4 +;-------------------------------------- +align 4 @@: + and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area call [putpixel] inc eax cmp eax, edx jle @b pop edx eax ret - - +;------------------------------------------------------------------------------ +align 4 vline: ; draw a vertical line ; eax = x @@ -562,19 +704,18 @@ vline: cmp edx, ebx ; make sure y2 is above y1 jge @f xchg ebx, edx -align 4 +;-------------------------------------- +align 4 @@: + and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area call [putpixel] inc ebx cmp ebx, edx jle @b pop edx ebx ret - - -;************************************************* - - +;------------------------------------------------------------------------------ +align 4 virtual at esp drbar: .bar_sx dd ? @@ -588,9 +729,11 @@ drbar: .color dd ? .line_inc_scr dd ? .line_inc_map dd ? - .stack_data = 4*11 + .real_sx_and_abs_cx dd ? + .real_sy_and_abs_cy dd ? + .stack_data = 4*13 end virtual - +;-------------------------------------- align 4 ; eax cx ; ebx cy @@ -599,7 +742,6 @@ align 4 ; edi color vesa20_drawbar: pushad - call [_display.disable_mouse] sub esp, drbar.stack_data mov [drbar.color], edi sub edx, ebx @@ -623,16 +765,22 @@ vesa20_drawbar: ; \end{diamond}[20.08.2006] sub ebx, [drbar.bar_cx] ja @f +;-------------------------------------- +align 4 .exit: ;// mike.dld, 2005-01-29 add esp, drbar.stack_data popad xor eax, eax inc eax ret +;-------------------------------------- +align 4 @@: cmp ebx, [drbar.bar_sx] jbe .end_x mov ebx, [drbar.bar_sx] +;-------------------------------------- +align 4 .end_x: mov [drbar.real_sx], ebx ; real_sy = MIN(wnd_sy-bar_cy, bar_sy); @@ -647,10 +795,14 @@ vesa20_drawbar: xor eax, eax inc eax ret +;-------------------------------------- +align 4 @@: cmp ebx, [drbar.bar_sy] jbe .end_y mov ebx, [drbar.bar_sy] +;-------------------------------------- +align 4 .end_y: mov [drbar.real_sy], ebx ; line_inc_map @@ -681,10 +833,22 @@ vesa20_drawbar: add eax, [drbar.abs_cx] add eax, [_WinMapAddress] xchg eax, ebp +;-------------------------------------- + mov ebx, [drbar.real_sx] + add ebx, [drbar.abs_cx] + mov [drbar.real_sx_and_abs_cx], ebx + mov ebx, [drbar.real_sy] + add ebx, [drbar.abs_cy] + mov [drbar.real_sy_and_abs_cy], ebx + + add edx, LFB_BASE +;-------------------------------------- ; get process number mov ebx, [CURRENT_TASK] cmp byte [ScreenBPP], 24 jne draw_bar_end_32 +;-------------------------------------- +align 4 draw_bar_end_24: mov eax, [drbar.color] ;; BBGGRR00 mov bh, al ;; bh = BB @@ -697,16 +861,37 @@ draw_bar_end_24: ; esi - counter ; edi - counter mov esi, [drbar.real_sy] -align 4 + cmp [_display.select_cursor], 0 + jne draw_bar_end_24_new +;-------------------------------------- +align 4 .new_y: mov edi, [drbar.real_sx] -align 4 +;-------------------------------------- +align 4 .new_x: cmp byte [ebp], bl jne .skip +;-------------------------------------- + push eax - mov [LFB_BASE+edx], bh - mov [LFB_BASE+edx + 1], ax + mov ecx, [drbar.real_sx_and_abs_cx + 4] + sub ecx, edi + shl ecx, 16 + add ecx, [drbar.real_sy_and_abs_cy + 4] + sub ecx, esi + + shl eax, 8 + mov al, bh +; check mouse area for putpixel + call check_mouse_area_for_putpixel +; store to real LFB + mov [edx], ax + shr eax, 16 + mov [edx + 2], al + pop eax +;-------------------------------------- +align 4 .skip: ; add pixel add edx, 3 @@ -722,27 +907,128 @@ align 4 test bh, bh jz @f dec bh +;-------------------------------------- +align 4 @@: ; dec esi jnz .new_y +;-------------------------------------- +align 4 +.end: add esp, drbar.stack_data popad xor eax, eax ret - -draw_bar_end_32: - mov eax, [drbar.color] ;; BBGGRR00 - mov esi, [drbar.real_sy] -align 4 +;-------------------------------------- +align 4 +draw_bar_end_24_new: +;-------------------------------------- +align 4 .new_y: mov edi, [drbar.real_sx] -align 4 +;-------------------------------------- +align 4 .new_x: cmp byte [ebp], bl jne .skip +;-------------------------------------- + mov ecx, [drbar.real_sy_and_abs_cy] + sub ecx, esi +;-------------------------------------- +; check for Y + cmp cx, [Y_UNDER_subtraction_CUR_hot_y] + jb .no_mouse_area - mov [LFB_BASE+edx], eax + cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] + jae .no_mouse_area + + rol ecx, 16 + add ecx, [drbar.real_sx_and_abs_cx] + sub ecx, edi +;-------------------------------------- +; 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 +;-------------------------------------- +; check mouse area for putpixel + push eax + + shl eax, 8 + mov al, bh + + call check_mouse_area_for_putpixel_new.1 +; store to real LFB + mov [edx], ax + shr eax, 16 + mov [edx + 2], al + pop eax + jmp .skip +; store to real LFB +;-------------------------------------- +align 4 +.no_mouse_area: + mov [edx], bh + mov [edx + 1], ax +;-------------------------------------- +align 4 +.skip: +; add pixel + add edx, 3 + inc ebp + dec edi + jnz .new_x +; add line + add edx, [drbar.line_inc_scr] + add ebp, [drbar.line_inc_map] +; drawing gradient bars + test eax, 0x00800000 + jz @f + test bh, bh + jz @f + dec bh +;-------------------------------------- +align 4 +@@: +; + dec esi + jnz .new_y + jmp draw_bar_end_24.end +;-------------------------------------- +align 4 +draw_bar_end_32: + mov eax, [drbar.color] ;; BBGGRR00 + mov esi, [drbar.real_sy] + cmp [_display.select_cursor], 0 + jne draw_bar_end_32_new +;-------------------------------------- +align 4 +.new_y: + mov edi, [drbar.real_sx] +;-------------------------------------- +align 4 +.new_x: + cmp byte [ebp], bl + jne .skip +;-------------------------------------- + push eax + + mov ecx, [drbar.real_sx_and_abs_cx + 4] + sub ecx, edi + shl ecx, 16 + add ecx, [drbar.real_sy_and_abs_cy + 4] + sub ecx, esi + +; check mouse area for putpixel + call check_mouse_area_for_putpixel +; store to real LFB + mov [edx], eax + pop eax +;-------------------------------------- +align 4 .skip: ; add pixel add edx, 4 @@ -758,23 +1044,98 @@ align 4 test al, al jz @f dec al +;-------------------------------------- +align 4 @@: ; dec esi jnz .new_y +;-------------------------------------- +align 4 +.end: add esp, drbar.stack_data popad call VGA_draw_bar xor eax, eax mov [EGA_counter], 1 ret +;-------------------------------------- +align 4 +draw_bar_end_32_new: +;-------------------------------------- +align 4 +.new_y: + mov edi, [drbar.real_sx] +;-------------------------------------- +align 4 +.new_x: + cmp byte [ebp], bl + jne .skip +;-------------------------------------- + mov ecx, [drbar.real_sy_and_abs_cy] + sub ecx, esi +;-------------------------------------- +; 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 + add ecx, [drbar.real_sx_and_abs_cx] + sub ecx, edi +;-------------------------------------- +; 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 +;-------------------------------------- +; check mouse area for putpixel + push eax + call check_mouse_area_for_putpixel_new.1 + mov [edx], eax + pop eax + jmp .skip +; store to real LFB +;-------------------------------------- +align 4 +.no_mouse_area: + mov [edx], eax +;-------------------------------------- +align 4 +.skip: +; add pixel + add edx, 4 + inc ebp + dec edi + jnz .new_x +; add line + add edx, [drbar.line_inc_scr] + add ebp, [drbar.line_inc_map] +; drawing gradient bars + test eax, 0x80000000 + jz @f + test al, al + jz @f + dec al +;-------------------------------------- +align 4 +@@: +; + dec esi + jnz .new_y + jmp draw_bar_end_32.end +;------------------------------------------------------------------------------ align 4 vesa20_drawbackground_tiled: - call [_display.disable_mouse] pushad ; External loop for all y from start to end mov ebx, [draw_data+32+RECT.top] ; y start +;-------------------------------------- +align 4 dp2: mov ebp, [draw_data+32+RECT.left] ; x start ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp] @@ -788,6 +1149,8 @@ dp2: cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size jz @f add ebp, eax +;-------------------------------------- +align 4 @@: add ebp, LFB_BASE ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB @@ -821,16 +1184,35 @@ dp2: ; edx = 1 ; esi -> bgr memory, edi -> output ; ebp = offset in WinMapAddress +;-------------------------------------- +align 4 dp3: cmp [ebp], dl jnz nbgp - movsb - movsb - movsb - jmp @f +;-------------------------------------- + push eax ecx + + mov ecx, eax + shl ecx, 16 + add ecx, ebx + + mov eax, [esi] + and eax, 0xffffff +; check mouse area for putpixel + call [_display.check_mouse] +; store to real LFB + mov [edi], ax + shr eax, 16 + mov [edi+2], al + + pop ecx eax +;-------------------------------------- +align 4 nbgp: add esi, 3 add edi, 3 +;-------------------------------------- +align 4 @@: cmp [ScreenBPP], byte 25 ; 24 or 32 bpp? sbb edi, -1 ; +1 for 32 bpp @@ -847,6 +1229,8 @@ nbgp: sub esi, ecx sub esi, ecx jmp dp3 +;-------------------------------------- +align 4 dp4: ; next scan line inc ebx @@ -856,12 +1240,9 @@ dp4: mov [EGA_counter], 1 call VGA_drawbackground ret - -; ---------- - - +;------------------------------------------------------------------------------ +align 4 vesa20_drawbackground_stretch: - call [_display.disable_mouse] pushad ; Helper variables ; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1) @@ -896,6 +1277,8 @@ vesa20_drawbackground_stretch: cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size jz @f add ebp, eax +;-------------------------------------- +align 4 @@: ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB call calculate_edi @@ -926,6 +1309,8 @@ vesa20_drawbackground_stretch: push edx push esi ; 3) Smooth horizontal +;-------------------------------------- +align 4 bgr_resmooth0: mov ecx, [esp+8] mov edx, [esp+4] @@ -933,6 +1318,8 @@ bgr_resmooth0: push edi mov edi, bgr_cur_line call smooth_line +;-------------------------------------- +align 4 bgr_resmooth1: mov eax, [esp+16+4] inc eax @@ -946,8 +1333,12 @@ bgr_resmooth1: add esi, [BgrDataWidth] mov edi, bgr_next_line call smooth_line +;-------------------------------------- +align 4 bgr.no2nd: pop edi +;-------------------------------------- +align 4 sdp3: xor esi, esi mov ecx, [esp+12] @@ -963,6 +1354,8 @@ sdp3: ; precalculated constants: ; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1) ; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1) +;-------------------------------------- +align 4 sdp3a: mov eax, [_WinMapAddress] cmp [ebp+eax], byte 1 @@ -972,12 +1365,22 @@ sdp3a: jz .novert mov ebx, [bgr_next_line+esi] call [overlapping_of_points_ptr] +;-------------------------------------- +align 4 .novert: - + push ecx + mov ecx, [esp+20+4] ;x + shl ecx, 16 + add ecx, [esp+24+4] ;y +; check mouse area for putpixel + call [_display.check_mouse] +; store to real LFB mov [LFB_BASE+edi], ax shr eax, 16 - mov [LFB_BASE+edi+2], al + pop ecx +;-------------------------------------- +align 4 snbgp: cmp [ScreenBPP], byte 25 sbb edi, -4 @@ -988,6 +1391,8 @@ snbgp: add esi, 4 cmp eax, [draw_data+32+RECT.right] jbe sdp3a +;-------------------------------------- +align 4 sdp4: ; next y mov ebx, [esp+24] @@ -1006,6 +1411,8 @@ sdp4: cmp [ScreenBPP], byte 24 jz @f sub edi, eax +;-------------------------------------- +align 4 @@: add edi, [BytesPerScanLine] ; restore ecx,edx; advance esi to next background line @@ -1032,6 +1439,8 @@ sdp4: inc ecx rep movsd jmp bgr_resmooth1 +;-------------------------------------- +align 4 sdpdone: add esp, 44 popad @@ -1040,11 +1449,14 @@ sdpdone: ret uglobal +;-------------------------------------- align 4 bgr_cur_line rd 1920 ; maximum width of screen bgr_next_line rd 1920 +;-------------------------------------- endg - +;-------------------------------------- +align 4 smooth_line: mov al, [esi+2] shl eax, 16 @@ -1054,6 +1466,8 @@ smooth_line: mov ebx, [esi+2] shr ebx, 8 call [overlapping_of_points_ptr] +;-------------------------------------- +align 4 @@: stosd mov eax, [esp+20+8] @@ -1068,11 +1482,13 @@ smooth_line: lea eax, [eax*3] sub esi, eax jmp smooth_line +;-------------------------------------- +align 4 @@: mov eax, [draw_data+32+RECT.left] mov [esp+20+8], eax ret - +;------------------------------------------------------------------------------ align 16 overlapping_of_points: if 0 @@ -1137,18 +1553,25 @@ else end if iglobal +;-------------------------------------- align 4 overlapping_of_points_ptr dd overlapping_of_points +;-------------------------------------- endg - +;------------------------------------------------------------------------------ +align 4 init_background: mov edi, BgrAuxTable xor edx, edx +;-------------------------------------- +align 4 .loop2: mov eax, edx shl eax, 8 neg eax mov ecx, 0x200 +;-------------------------------------- +align 4 .loop1: mov byte [edi], ah inc edi @@ -1159,9 +1582,11 @@ init_background: test byte [cpu_caps+(CAPS_MMX/8)], 1 shl (CAPS_MMX mod 8) jz @f mov [overlapping_of_points_ptr], overlapping_of_points_mmx +;-------------------------------------- +align 4 @@: ret - +;------------------------------------------------------------------------------ align 16 overlapping_of_points_mmx: movd mm0, eax @@ -1181,3 +1606,4 @@ overlapping_of_points_mmx: paddb mm4, mm1 movd eax, mm4 ret +;------------------------------------------------------------------------------