1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; ;; |
;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;; |
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;; |
;; Distributed under terms of the GNU General Public License ;; |
;; ;; |
;; VESA20.INC ;; |
19,70 → 19,41 |
|
$Revision$ |
|
uglobal |
align 4 |
bgr_cur_line rd 1920 ; maximum width of screen |
bgr_next_line rd 1920 |
endg |
|
iglobal |
align 4 |
overlapping_of_points_ptr dd overlapping_of_points |
endg |
; If you're planning to write your own video driver I suggest |
; you replace the VESA12.INC file and see those instructions. |
|
|
;----------------------------------------------------------------------------- |
; eax = x |
; ebx = y |
|
; getpixel |
; |
; in: |
; eax = x coordinate |
; ebx = y coordinate |
; |
; ret: |
; ecx = 00 RR GG BB |
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_getpixel16: |
|
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
je @f |
cmp [_display.select_cursor], 0 |
jne .no_mouseunder |
@@: |
|
; 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 |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [eax*2] ; edi = x*2 |
add edi, ebx ; edi = x*2+(y*y multiplier) |
|
movzx ecx, word[LFB_BASE+edi] |
shl ecx, 3 |
ror ecx, 8 |
shl cx, 2 |
ror ecx, 8 |
shl cl, 3 |
rol ecx, 16 |
@@: |
and ecx, 0x00ffffff |
getpixel: |
push eax ebx edx edi |
call dword [GETPIXEL] |
pop edi edx ebx eax |
ret |
|
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_getpixel24: |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_getpixel24: |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
je @f |
cmp [_display.select_cursor], 0 |
jne .no_mouseunder |
;-------------------------------------- |
align 4 |
@@: |
|
; check mouse area for putpixel |
test ecx, 0x04000000 ; don't load to mouseunder area |
jnz .no_mouseunder |
89,32 → 60,32 |
call [_display.check_m_pixel] |
test ecx, ecx ; 0xff000000 |
jnz @f |
|
;-------------------------------------- |
align 4 |
.no_mouseunder: |
;-------------------------------------- |
; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
mov ebx, [BPSLine_calc_area+ebx*4] |
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, 0x00ffffff |
and ecx, 0xffffff |
ret |
|
;----------------------------------------------------------------------------- |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_getpixel32: |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
je @f |
cmp [_display.select_cursor], 0 |
jne .no_mouseunder |
;-------------------------------------- |
align 4 |
@@: |
|
; check mouse area for putpixel |
test ecx, 0x04000000 ; don't load to mouseunder area |
jnz .no_mouseunder |
121,28 → 92,20 |
call [_display.check_m_pixel] |
test ecx, ecx ; 0xff000000 |
jnz @f |
|
;-------------------------------------- |
align 4 |
.no_mouseunder: |
;-------------------------------------- |
; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) |
|
mov ecx, [LFB_BASE+edi] |
;-------------------------------------- |
align 4 |
@@: |
and ecx, 0x00ffffff |
and ecx, 0xffffff |
ret |
|
;----------------------------------------------------------------------------- |
; ebx = pointer |
; ecx = size [x|y] |
; edx = coordinates [x|y] |
; ebp = pointer to 'get' function |
; esi = pointer to 'init' function |
; edi = parameter for 'get' function |
|
align 16 |
vesa20_putimage: |
|
virtual at esp |
putimg: |
.real_sx dd ? |
171,7 → 134,15 |
.ret_addr dd ? |
.arg_0 dd ? |
end virtual |
|
;----------------------------------------------------------------------------- |
align 16 |
; ebx = pointer |
; ecx = size [x|y] |
; edx = coordinates [x|y] |
; ebp = pointer to 'get' function |
; esi = pointer to 'init' function |
; edi = parameter for 'get' function |
vesa20_putimage: |
pushad |
sub esp, putimg.stack_data |
; save pointer to image |
198,32 → 169,43 |
mov [putimg.abs_cy], ebx |
; real_sx = MIN(wnd_sx-image_cx, image_sx); |
mov ebx, [eax-twdw + WDATA.box.width] ; ebx = wnd_sx |
inc ebx ; WDATA.box.width is one pixel less than real window x-size |
; \begin{diamond}[20.08.2006] |
; note that WDATA.box.width is one pixel less than real window x-size |
inc ebx |
; \end{diamond}[20.08.2006] |
sub ebx, [putimg.image_cx] |
ja @f |
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 |
mov ebx, [eax-twdw + WDATA.box.height] ; ebx = wnd_sy |
; \begin{diamond}[20.08.2006] |
inc ebx |
; \end{diamond}[20.08.2006] |
sub ebx, [putimg.image_cy] |
ja @f |
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 |
236,13 → 218,13 |
add eax, [putimg.arg_0] |
mov [putimg.line_increment], eax |
; winmap new line increment |
mov eax, [Screen_Max_X] |
inc eax |
mov eax, [_display.width] |
sub eax, [putimg.real_sx] |
mov [putimg.winmap_newline], eax |
; screen new line increment |
mov eax, [_display.pitch] |
mov ebx, [_display.bytes_per_pixel] |
mov ebx, [_display.bpp] |
shr ebx, 3 |
imul ecx, ebx |
sub eax, ecx |
mov [putimg.screen_newline], eax |
253,18 → 235,18 |
; imul edx, [BytesPerScanLine] |
mov edx, [BPSLine_calc_area+edx*4] |
mov eax, [putimg.abs_cx] |
; movzx ebx, byte [ScreenBPP] |
; shr ebx, 3 |
imul eax, ebx |
add edx, eax |
; pointer to pixel map |
mov eax, [putimg.abs_cy] |
; imul eax, [Screen_Max_X] |
; add eax, [putimg.abs_cy] |
mov eax, [d_width_calc_area + eax*4] |
|
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 |
271,221 → 253,15 |
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 [_display.bits_per_pixel], 16 |
je put_image_end_16 |
cmp byte [_display.bits_per_pixel], 24 |
je put_image_end_24 |
cmp byte [_display.bits_per_pixel], 32 |
cmp byte [_display.bpp], 32 |
je put_image_end_32 |
|
;------------------------------------------------------------------------------ |
|
put_image_end_16: |
|
mov edi, [putimg.real_sy] |
|
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
je put_image_end_16_new |
cmp ecx, 0 |
je put_image_end_16_old |
.new_line: |
mov ecx, [putimg.real_sx] |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
call eax |
cmp [ebp], bl |
jne .skip |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [LFB_BASE+edx], ax |
.skip: |
add edx, 2 |
inc ebp |
dec ecx |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
jz .correct |
cmp [putimg.ebp], putimage_get4bpp |
jnz @f |
.correct: |
mov eax, [putimg.edi] |
mov byte [eax], 80h |
@@: |
dec edi |
jnz .new_line |
.finish: |
add esp, putimg.stack_data |
popad |
ret |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_16_old: |
|
.new_line: |
mov ecx, [putimg.real_sx] |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
call eax |
cmp [ebp], bl |
jne .skip |
|
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 check_mouse_area_for_putpixel |
pop ecx |
|
; convert to 16 bpp and store to LFB |
;; and eax, 00000000111110001111110011111000b |
;; shr ah, 2 |
;; shr ax, 3 |
;; ror eax, 8 |
;; add al, ah |
;; rol eax, 8 |
mov [LFB_BASE+edx], ax |
.skip: |
inc edx |
inc edx |
inc ebp |
dec ecx |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
jz .correct |
cmp [putimg.ebp], putimage_get4bpp |
jnz @f |
.correct: |
mov eax, [putimg.edi] |
mov byte [eax], 80h |
@@: |
dec edi |
jnz .new_line |
jmp put_image_end_16.finish |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_16_new: |
|
.new_line: |
mov ecx, [putimg.real_sx] |
|
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
call eax |
|
cmp [ebp], bl |
jne .skip |
|
push ecx |
.sh: |
neg ecx |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
|
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
|
shl ecx, 16 |
add ecx, [putimg.real_sy_and_abs_cy + 4] |
sub ecx, edi |
|
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
|
; check mouse area for putpixel |
call check_mouse_area_for_putpixel_new.1 |
cmp ecx, -1 ; SHIT HAPPENS? |
jne .no_mouse_area |
|
mov ecx, [esp] |
jmp .sh |
|
.no_mouse_area: |
pop ecx |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [LFB_BASE+edx], ax |
|
.skip: |
add edx, 2 |
inc ebp |
dec ecx |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
cmp [putimg.ebp], putimage_get2bpp |
jz .correct |
cmp [putimg.ebp], putimage_get4bpp |
jnz @f |
|
.correct: |
mov eax, [putimg.edi] |
mov byte [eax], 80h |
|
@@: |
dec edi |
jnz .new_line |
jmp put_image_end_16.finish |
|
;------------------------------------------------------------------------------ |
|
align 4 |
;-------------------------------------- |
put_image_end_24: |
|
mov edi, [putimg.real_sy] |
|
;-------------------------------------- |
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
492,8 → 268,12 |
je put_image_end_24_new |
cmp ecx, 0 |
je put_image_end_24_old |
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
500,12 → 280,13 |
call eax |
cmp [ebp], bl |
jne .skip |
|
; store to LFB |
;-------------------------------------- |
; store to real LFB |
mov [LFB_BASE+edx], ax |
shr eax, 16 |
mov [LFB_BASE+edx+2], al |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 3 |
inc ebp |
513,8 → 294,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
522,22 → 303,27 |
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_24_old: |
|
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
;-------------------------------------- |
548,8 → 334,9 |
call eax |
cmp [ebp], bl |
jne .skip |
;-------------------------------------- |
push ecx |
|
push ecx |
neg ecx |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
shl ecx, 16 |
559,11 → 346,12 |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel |
pop ecx |
; store to LFB |
; store to real LFB |
mov [LFB_BASE+edx], ax |
shr eax, 16 |
mov [LFB_BASE+edx+2], al |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 3 |
inc ebp |
571,8 → 359,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
580,24 → 368,26 |
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 |
jmp put_image_end_24.finish |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_24_new: |
|
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
|
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
604,12 → 394,14 |
call eax |
cmp [ebp], bl |
jne .skip |
|
;-------------------------------------- |
push ecx |
;-------------------------------------- |
align 4 |
.sh: |
neg ecx |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
621,7 → 413,7 |
|
add ecx, [putimg.real_sy_and_abs_cy + 4] |
sub ecx, edi |
|
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
628,7 → 420,7 |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
|
;-------------------------------------- |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel_new.1 |
cmp ecx, -1 ; SHIT HAPPENS? |
636,15 → 428,16 |
|
mov ecx, [esp] |
jmp .sh |
|
;-------------------------------------- |
align 4 |
.no_mouse_area: |
pop ecx |
|
; store to LFB |
; store to real LFB |
mov [LFB_BASE+edx], ax |
shr eax, 16 |
mov [LFB_BASE+edx+2], al |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 3 |
inc ebp |
652,8 → 445,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
661,23 → 454,22 |
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 |
jmp put_image_end_24.finish |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_32: |
|
mov edi, [putimg.real_sy] |
|
;-------------------------------------- |
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
684,10 → 476,12 |
je put_image_end_32_new |
cmp ecx, 0 |
je put_image_end_32_old |
|
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
|
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
694,10 → 488,11 |
call eax |
cmp [ebp], bl |
jne .skip |
|
; store to LFB |
;-------------------------------------- |
; store to real LFB |
mov [LFB_BASE+edx], eax |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 4 |
inc ebp |
705,8 → 500,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
714,15 → 509,18 |
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 |
729,17 → 527,20 |
cmp [SCR_MODE], 0x12 |
jne @f |
call VGA__putimage |
;-------------------------------------- |
align 4 |
@@: |
mov [EGA_counter], 1 |
ret |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_32_old: |
|
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
746,8 → 547,9 |
call eax |
cmp [ebp], bl |
jne .skip |
;-------------------------------------- |
push ecx |
|
push ecx |
neg ecx |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
shl ecx, 16 |
757,9 → 559,10 |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel |
pop ecx |
; store to LFB |
; store to real LFB |
mov [LFB_BASE+edx], eax |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 4 |
inc ebp |
767,8 → 570,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
776,24 → 579,26 |
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 |
jmp put_image_end_32.finish |
|
;------------------------------------------------------------------------------ |
|
align 4 |
put_image_end_32_new: |
|
;-------------------------------------- |
align 4 |
.new_line: |
mov ecx, [putimg.real_sx] |
|
;-------------------------------------- |
align 4 |
.new_x: |
push [putimg.edi] |
mov eax, [putimg.ebp+4] |
800,29 → 605,33 |
call eax |
cmp [ebp], bl |
jne .skip |
|
;-------------------------------------- |
push ecx |
|
;-------------------------------------- |
align 4 |
.sh: |
neg ecx |
add ecx, [putimg.real_sx_and_abs_cx + 4] |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
|
shl ecx, 16 |
|
add ecx, [putimg.real_sy_and_abs_cy + 4] |
sub ecx, edi |
|
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
|
;-------------------------------------- |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel_new.1 |
cmp ecx, -1 ; SHIT HAPPENS? |
830,13 → 639,14 |
|
mov ecx, [esp] |
jmp .sh |
|
;-------------------------------------- |
align 4 |
.no_mouse_area: |
pop ecx |
|
; store to LFB |
; store to real LFB |
mov [LFB_BASE+edx], eax |
|
;-------------------------------------- |
align 4 |
.skip: |
add edx, 4 |
inc ebp |
844,8 → 654,8 |
jnz .new_x |
|
add esi, [putimg.line_increment] |
add edx, [putimg.screen_newline] |
add ebp, [putimg.winmap_newline] |
add edx, [putimg.screen_newline];[BytesPerScanLine] |
add ebp, [putimg.winmap_newline];[Screen_Max_X] |
|
cmp [putimg.ebp], putimage_get1bpp |
jz .correct |
853,105 → 663,71 |
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 |
jmp put_image_end_32.finish |
;------------------------------------------------------------------------------ |
align 4 |
__sys_putpixel: |
|
;------------------------------------------------------------------------------ |
; eax = x coordinate |
; ebx = y coordinate |
; ecx = xx RR GG BB |
; xx flags: |
; 0x01000000 color inversion |
; 0x02000000 used for draw_rectangle without top line (for drawwindow_III and drawwindow_IV) |
; ecx = ?? RR GG BB ; 0x01000000 negation |
; 0x02000000 used for draw_rectangle without top line |
; for example drawwindow_III and drawwindow_IV |
; edi = 0x00000001 force |
|
align 4 |
__sys_putpixel: |
|
pushad |
cmp [Screen_Max_X], eax |
jb .exit |
cmp [Screen_Max_Y], ebx |
jb .exit |
cmp eax, [_display.width] |
jae .exit |
cmp ebx, [_display.height] |
jae .exit |
test edi, 1 ; force ? |
jnz .forced |
|
; not forced |
; not forced: |
mov edx, [d_width_calc_area + ebx*4] |
add edx, [_WinMapAddress] |
movzx edx, byte [eax+edx] |
cmp edx, [CURRENT_TASK] |
jne .exit |
|
;-------------------------------------- |
align 4 |
.forced: |
; check for color inversion |
; check if negation |
test ecx, 0x01000000 |
jz .no_inv |
jz .noneg |
|
push eax ebx edx edi |
call [GETPIXEL] |
pop edi edx ebx eax |
call getpixel |
not ecx |
|
not ecx |
rol ecx, 8 |
mov cl, [esp+32-8+3] |
ror ecx, 8 |
mov [esp+32-8], ecx |
.no_inv: |
call [PUTPIXEL] ; call the real put_pixel function |
;-------------------------------------- |
align 4 |
.noneg: |
; OK to set pixel |
call dword [PUTPIXEL]; call the real put_pixel function |
;-------------------------------------- |
align 4 |
.exit: |
popad |
ret |
|
;----------------------------------------------------------------------------- |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_putpixel16: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
|
; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [eax*2]; edi = x*2 |
mov eax, [esp+32-8+4] |
|
; check for hardware cursor |
cmp [_display.select_cursor], 0 |
jne @f |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
call check_mouse_area_for_putpixel |
@@: |
; store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
|
mov [LFB_BASE+ebx+edi], ax |
ret |
|
;----------------------------------------------------------------------------- |
Vesa20_putpixel24: |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_putpixel16_new: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
958,59 → 734,9 |
|
; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [eax*2]; edi = x*2 |
mov eax, [esp+32-8+4] |
|
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
jne @f |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
|
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae @f |
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb @f |
rol ecx, 16 |
|
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae @f |
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb @f |
ror ecx, 16 |
|
call check_mouse_area_for_putpixel_new.1 |
@@: |
; store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
|
mov [LFB_BASE+ebx+edi], ax |
ret |
|
;----------------------------------------------------------------------------- |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_putpixel24: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
|
; imul ebx, [BytesPerScanLine] ; ebx = y * y multiplier |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [eax+eax*2]; edi = x*3 |
mov eax, [esp+32-8+4] |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], 0 |
jne @f |
1018,21 → 744,19 |
test eax, 0x04000000 |
jnz @f |
call check_mouse_area_for_putpixel |
;-------------------------------------- |
align 4 |
@@: |
|
; store to LFB |
; store to real LFB |
mov [LFB_BASE+ebx+edi], ax |
shr eax, 16 |
mov [LFB_BASE+ebx+edi+2], al |
ret |
|
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_putpixel24_new: |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_putpixel24_new: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
1041,7 → 765,7 |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [eax+eax*2]; edi = x*3 |
mov eax, [esp+32-8+4] |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
jne @f |
1048,36 → 772,39 |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
|
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae @f |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb @f |
|
rol ecx, 16 |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae @f |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb @f |
|
ror ecx, 16 |
|
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
@@: |
; store to LFB |
; 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 |
|
align 4 |
Vesa20_putpixel32: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
1086,7 → 813,7 |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) |
mov eax, [esp+32-8+4] ; eax = color |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], 0 |
jne @f |
1094,19 → 821,18 |
test eax, 0x04000000 |
jnz @f |
call check_mouse_area_for_putpixel |
;-------------------------------------- |
align 4 |
@@: |
and eax, 0xffffff |
; store to LFB |
; store to real LFB |
mov [LFB_BASE+edi], eax |
ret |
|
;----------------------------------------------------------------------------- |
align 4 |
Vesa20_putpixel32_new: |
; eax = x |
; ebx = y |
|
align 4 |
Vesa20_putpixel32_new: |
|
mov ecx, eax |
shl ecx, 16 |
mov cx, bx |
1115,7 → 841,7 |
mov ebx, [BPSLine_calc_area+ebx*4] |
lea edi, [ebx+eax*4] ; edi = x*4+(y*y multiplier) |
mov eax, [esp+32-8+4] ; eax = color |
|
;-------------------------------------- |
; check for hardware cursor |
cmp [_display.select_cursor], select_cursor |
jne @f |
1122,51 → 848,53 |
; check mouse area for putpixel |
test eax, 0x04000000 |
jnz @f |
|
;-------------------------------------- |
; check for Y |
cmp cx, [Y_UNDER_sub_CUR_hot_y_add_curh] |
jae @f |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb @f |
|
rol ecx, 16 |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae @f |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb @f |
|
ror ecx, 16 |
|
call check_mouse_area_for_putpixel_new.1 |
;-------------------------------------- |
align 4 |
@@: |
and eax, 0x00ffffff |
; store to LFB |
and eax, 0xffffff |
; store to real LFB |
mov [LFB_BASE+edi], eax |
ret |
|
;----------------------------------------------------------------------------- |
|
align 4 |
calculate_edi: |
; mov edi, ebx |
; imul edi, [Screen_Max_X] |
; add edi, ebx |
mov edi, [d_width_calc_area + ebx*4] |
add edi, eax |
ret |
|
|
;----------------------------------------------------------------------------- |
; DRAWLINE |
;----------------------------------------------------------------------------- |
; eax = x1 shl 16 + x2 |
; ebx = y1 shl 16 + y2 |
align 4 |
__sys_draw_line: |
; draw a line |
; eax = HIWORD = x1 |
; LOWORD = x2 |
; ebx = HIWORD = y1 |
; LOWORD = y2 |
; ecx = color |
; edi = force ? |
pusha |
|
align 4 |
__sys_draw_line: |
|
dl_x1 equ esp+20 |
dl_y1 equ esp+16 |
dl_x2 equ esp+12 |
1174,8 → 902,6 |
dl_dx equ esp+4 |
dl_dy equ esp+0 |
|
pusha |
|
xor edx, edx ; clear edx |
xor esi, esi ; unpack arguments |
xor ebp, ebp |
1196,10 → 922,12 |
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 |
1209,10 → 937,12 |
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| ? |
1225,23 → 955,29 |
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 |
shl eax, 16 ; using 16bit fix-point maths |
idiv ebp ; eax = ((x2-x1)*65536)/(y2-y1) |
|
;-------------------------------------- |
; correction for the remainder of the division |
shl edx, 1 |
cmp ebp, edx |
jb @f |
inc eax |
;-------------------------------------- |
align 4 |
@@: |
;-------------------------------------- |
mov edx, ebp ; edx = counter (number of pixels to draw) |
mov ebp, 1 shl 16 ; ebp = dy = 1.0 |
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 |
1252,6 → 988,8 |
mov edx, [dl_y2] |
mov [dl_y2], ebx |
mov [dl_y1], edx |
;-------------------------------------- |
align 4 |
.no_reverse2: |
xor edx, edx |
mov eax, [dl_dy] |
1258,16 → 996,21 |
cdq ; extend eax sing to edx |
shl eax, 16 ; using 16bit fix-point maths |
idiv esi ; eax = ((y2-y1)*65536)/(x2-x1) |
;-------------------------------------- |
; correction for the remainder of the division |
shl edx, 1 |
cmp esi, edx |
jb @f |
inc eax |
;-------------------------------------- |
align 4 |
@@: |
;-------------------------------------- |
mov edx, esi ; edx = counter (number of pixels to draw) |
mov esi, 1 shl 16 ; esi = dx = 1.0 |
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] |
1275,20 → 1018,29 |
shl ebx, 16 |
|
and ecx, 0xFBFFFFFF ; negate 0x04000000 save to mouseunder area |
;----------------------------------------------------------------------------- |
align 4 |
.draw: |
push eax ebx |
|
;-------------------------------------- |
; correction for the remainder of the division |
test ah, 0x80 |
jz @f |
add eax, 1 shl 16 |
;-------------------------------------- |
align 4 |
@@: |
;-------------------------------------- |
shr eax, 16 |
;-------------------------------------- |
; correction for the remainder of the division |
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] |
1304,14 → 1056,16 |
; and ecx, 0xFBFFFFFF ;n egate 0x04000000 save to mouseunder area |
; call [putpixel] |
call __sys_putpixel |
|
;-------------------------------------- |
align 4 |
.exit: |
add esp, 6*4 |
popa |
; call [draw_pointer] |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
hline: |
; draw an horizontal line |
; eax = x1 |
; edx = x2 |
1318,16 → 1072,16 |
; ebx = y |
; ecx = color |
; edi = force ? |
|
align 4 |
hline: |
|
push eax edx |
cmp edx, eax ; make sure x2 is above x1 |
jge @f |
xchg eax, edx |
;-------------------------------------- |
align 4 |
@@: |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
;-------------------------------------- |
align 4 |
@@: |
; call [putpixel] |
call __sys_putpixel |
1336,8 → 1090,9 |
jle @b |
pop edx eax |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
vline: |
; draw a vertical line |
; eax = x |
; ebx = y1 |
1344,16 → 1099,16 |
; edx = y2 |
; ecx = color |
; edi = force ? |
|
align 4 |
vline: |
|
push ebx edx |
cmp edx, ebx ; make sure y2 is above y1 |
jge @f |
xchg ebx, edx |
;-------------------------------------- |
align 4 |
@@: |
and ecx, 0xFBFFFFFF ;negate 0x04000000 save to mouseunder area |
;-------------------------------------- |
align 4 |
@@: |
; call [putpixel] |
call __sys_putpixel |
1362,17 → 1117,8 |
jle @b |
pop edx ebx |
ret |
|
;------------------------------------------------------------------------------ |
; eax cx |
; ebx cy |
; ecx xe |
; edx ye |
; edi color |
|
align 4 |
vesa20_drawbar: |
|
virtual at esp |
drbar: |
.bar_sx dd ? |
1390,14 → 1136,21 |
.real_sy_and_abs_cy dd ? |
.stack_data = 4*13 |
end virtual |
|
;-------------------------------------- |
align 4 |
; eax cx |
; ebx cy |
; ecx xe |
; edx ye |
; edi color |
vesa20_drawbar: |
pushad |
sub esp, drbar.stack_data |
mov [drbar.color], edi |
sub edx, ebx |
jle .exit |
jle .exit ;// mike.dld, 2005-01-29 |
sub ecx, eax |
jle .exit |
jle .exit ;// mike.dld, 2005-01-29 |
mov [drbar.bar_sy], edx |
mov [drbar.bar_sx], ecx |
mov [drbar.bar_cx], eax |
1409,24 → 1162,35 |
mov [drbar.abs_cy], ebx |
; real_sx = MIN(wnd_sx-bar_cx, bar_sx); |
mov ebx, [edi-twdw + WDATA.box.width] ; ebx = wnd_sx |
inc ebx ; WDATA.box.width is one pixel less than real window x-size |
; \begin{diamond}[20.08.2006] |
; note that WDATA.box.width is one pixel less than real window x-size |
inc ebx |
; \end{diamond}[20.08.2006] |
sub ebx, [drbar.bar_cx] |
ja @f |
.exit: |
;-------------------------------------- |
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); |
mov ebx, [edi-twdw + WDATA.box.height] ; ebx = wnd_sy |
; \begin{diamond}[20.08.2006] |
inc ebx |
; \end{diamond} |
sub ebx, [drbar.bar_cy] |
ja @f |
add esp, drbar.stack_data |
1434,20 → 1198,24 |
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 |
mov eax, [Screen_Max_X] |
mov eax, [_display.width] |
sub eax, [drbar.real_sx] |
inc eax |
mov [drbar.line_inc_map], eax |
; line_inc_scr |
mov eax, [drbar.real_sx] |
mov ebx, [_display.bytes_per_pixel] |
mov ebx, [_display.bpp] |
shr ebx, 3 |
imul eax, ebx |
neg eax |
add eax, [_display.pitch] |
1461,14 → 1229,12 |
add edx, eax |
; pointer to pixel map |
mov eax, [drbar.abs_cy] |
; imul eax, [Screen_Max_X] |
; add eax, [drbar.abs_cy] |
mov eax, [d_width_calc_area + eax*4] |
|
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 |
1477,7 → 1243,7 |
mov [drbar.real_sy_and_abs_cy], ebx |
|
add edx, LFB_BASE |
|
;-------------------------------------- |
; get process number |
mov ebx, [CURRENT_TASK] ; bl - process num |
mov esi, [drbar.real_sy] |
1485,15 → 1251,11 |
rol eax, 8 |
mov bh, al ; 0x80 drawing gradient bars |
ror eax, 8 |
|
cmp byte [_display.bits_per_pixel], 16 |
je draw_bar_end_16 |
cmp byte [_display.bits_per_pixel], 24 |
je draw_bar_end_24 |
cmp byte [_display.bits_per_pixel], 32 |
je draw_bar_end_32 |
|
cmp byte [_display.bpp], 24 |
jne draw_bar_end_32 |
;-------------------------------------- |
align 4 |
draw_bar_end_24: |
; eax - color high RRGGBB |
; bl - process num |
; ecx - temp |
1500,10 → 1262,7 |
; edx - pointer to screen |
; esi - counter |
; edi - counter |
|
align 4 |
draw_bar_end_24: |
|
;-------------------------------------- |
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
1510,16 → 1269,22 |
je draw_bar_end_24_new |
cmp ecx, 0 |
je draw_bar_end_24_old |
;-------------------------------------- |
align 4 |
.new_y: |
mov edi, [drbar.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
|
; store to LFB |
;-------------------------------------- |
; store to real LFB |
mov [edx], ax |
shr eax, 16 |
mov [edx + 2], al |
;-------------------------------------- |
align 4 |
.skip: |
; add pixel |
add edx, 3 |
1535,26 → 1300,31 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
;-------------------------------------- |
align 4 |
.end: |
add esp, drbar.stack_data |
popad |
xor eax, eax |
ret |
|
;------------------------------------------------------------------------------ |
|
align 4 |
draw_bar_end_24_old: |
|
;-------------------------------------- |
align 4 |
.new_y: |
mov edi, [drbar.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
|
;-------------------------------------- |
mov ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
shl ecx, 16 |
1562,11 → 1332,13 |
sub ecx, esi |
; check mouse area for putpixel |
call check_mouse_area_for_putpixel |
; store to LFB |
; store to real LFB |
mov [edx], ax |
shr eax, 16 |
mov [edx + 2], al |
mov eax, [drbar.color] |
;-------------------------------------- |
align 4 |
.skip: |
; add pixel |
add edx, 3 |
1582,41 → 1354,48 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_24.end |
|
;------------------------------------------------------------------------------ |
|
align 4 |
draw_bar_end_24_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_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
|
rol ecx, 16 |
add ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
|
ror ecx, 16 |
|
;-------------------------------------- |
; check mouse area for putpixel |
push eax |
call check_mouse_area_for_putpixel_new.1 |
1625,25 → 1404,25 |
mov [edx + 2], al |
pop eax |
jmp .skip |
|
; store to real LFB |
;-------------------------------------- |
align 4 |
.no_mouse_area: |
; store to LFB |
mov [edx], ax |
ror eax, 16 |
mov [edx + 2], al |
rol eax, 16 |
;-------------------------------------- |
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 bh, 0x80 |
jz @f |
1650,12 → 1429,15 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_24.end |
|
;------------------------------------------------------------------------------ |
align 4 |
draw_bar_end_32: |
; eax - color high RRGGBB |
; bl - process num |
; ecx - temp |
1662,9 → 1444,7 |
; edx - pointer to screen |
; esi - counter |
; edi - counter |
|
draw_bar_end_32: |
|
;-------------------------------------- |
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
1671,28 → 1451,30 |
je draw_bar_end_32_new |
cmp ecx, 0 |
je draw_bar_end_32_old |
|
;-------------------------------------- |
align 4 |
.new_y: |
mov edi, [drbar.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
|
; store to LFB |
;-------------------------------------- |
; store to real LFB |
mov [edx], eax |
mov eax, [drbar.color] |
;-------------------------------------- |
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 bh, 0x80 |
jz @f |
1699,9 → 1481,13 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
;-------------------------------------- |
align 4 |
.end: |
add esp, drbar.stack_data |
popad |
1708,19 → 1494,25 |
cmp [SCR_MODE], 0x12 |
jne @f |
call VGA_draw_bar |
;-------------------------------------- |
align 4 |
@@: |
xor eax, eax |
mov [EGA_counter], 1 |
ret |
|
;------------------------------------------------------------------------------ |
align 4 |
draw_bar_end_32_old: |
|
;-------------------------------------- |
align 4 |
.new_y: |
mov edi, [drbar.real_sx] |
;-------------------------------------- |
align 4 |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
|
;-------------------------------------- |
mov ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
shl ecx, 16 |
1729,9 → 1521,11 |
|
; check mouse area for putpixel |
call check_mouse_area_for_putpixel |
; store to LFB |
; store to real LFB |
mov [edx], eax |
mov eax, [drbar.color] |
;-------------------------------------- |
align 4 |
.skip: |
; add pixel |
add edx, 4 |
1747,41 → 1541,48 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_32.end |
|
;------------------------------------------------------------------------------ |
|
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_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
|
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
|
rol ecx, 16 |
add ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
|
;-------------------------------------- |
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
|
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
|
ror ecx, 16 |
|
;-------------------------------------- |
; check mouse area for putpixel |
push eax |
call check_mouse_area_for_putpixel_new.1 |
1788,22 → 1589,22 |
mov [edx], eax |
pop eax |
jmp .skip |
; store to real LFB |
;-------------------------------------- |
align 4 |
.no_mouse_area: |
|
; store to LFB |
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 bh, 0x80 |
jz @f |
1810,210 → 1611,20 |
test al, al |
jz @f |
dec al |
;-------------------------------------- |
align 4 |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_32.end |
|
;------------------------------------------------------------------------------ |
; eax - color high RRGGBB |
; bl - process num |
; ecx - temp |
; edx - pointer to screen |
; esi - counter |
; edi - counter |
|
align 4 |
draw_bar_end_16: |
|
; check for hardware cursor |
mov ecx, [_display.select_cursor] |
cmp ecx, select_cursor |
je draw_bar_end_16_new |
cmp ecx, 0 |
je draw_bar_end_16_old |
.new_y: |
mov edi, [drbar.real_sx] |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [edx], ax |
mov eax, [drbar.color] |
.skip: |
|
; add pixel |
add edx, 2 |
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 bh, 0x80 |
jz @f |
test al, al |
jz @f |
dec al |
@@: |
dec esi |
jnz .new_y |
.end: |
add esp, drbar.stack_data |
popad |
cmp [SCR_MODE], 0x12 |
jne @f |
call VGA_draw_bar |
@@: |
xor eax, eax |
mov [EGA_counter], 1 |
ret |
|
;------------------------------------------------------------------------------ |
|
align 4 |
draw_bar_end_16_old: |
|
.new_y: |
mov edi, [drbar.real_sx] |
.new_x: |
cmp byte [ebp], bl |
jne .skip |
|
mov ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
shl ecx, 16 |
add ecx, [drbar.real_sy_and_abs_cy] |
sub ecx, esi |
|
; check mouse area for putpixel |
call check_mouse_area_for_putpixel |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [edx], ax |
mov eax, [drbar.color] |
.skip: |
|
; add pixel |
add edx, 2 |
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 bh, 0x80 |
jz @f |
test al, al |
jz @f |
dec al |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_16.end |
|
;------------------------------------------------------------------------------ |
|
align 4 |
draw_bar_end_16_new: |
|
.new_y: |
mov edi, [drbar.real_sx] |
.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_sub_CUR_hot_y_add_curh] |
jae .no_mouse_area |
sub cx, [Y_UNDER_subtraction_CUR_hot_y] |
jb .no_mouse_area |
rol ecx, 16 |
add ecx, [drbar.real_sx_and_abs_cx] |
sub ecx, edi |
|
; check for X |
cmp cx, [X_UNDER_sub_CUR_hot_x_add_curh] |
jae .no_mouse_area |
sub cx, [X_UNDER_subtraction_CUR_hot_x] |
jb .no_mouse_area |
ror ecx, 16 |
|
; check mouse area for putpixel |
push eax |
call check_mouse_area_for_putpixel_new.1 |
push eax |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [edx], ax |
pop eax |
pop eax |
jmp .skip |
|
.no_mouse_area: |
; convert to 16 bpp and store to LFB |
push eax |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [edx], ax |
pop eax |
.skip: |
|
; add pixel |
add edx, 2 |
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 bh, 0x80 |
jz @f |
test al, al |
jz @f |
dec al |
@@: |
dec esi |
jnz .new_y |
jmp draw_bar_end_16.end |
|
;------------------------------------------------------------------------------ |
|
align 4 |
vesa20_drawbackground_tiled: |
|
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] |
2024,13 → 1635,12 |
xchg ebp, eax |
add ebp, eax |
add ebp, eax |
cmp byte [_display.bytes_per_pixel], 2 |
je @f |
add ebp, eax |
cmp byte [_display.bytes_per_pixel], 3 |
je @f |
cmp byte [_display.bpp], 24 ; 24 or 32 bpp ? - x size |
jz @f |
add ebp, eax |
|
;-------------------------------------- |
align 4 |
@@: |
add ebp, LFB_BASE |
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB |
2064,11 → 1674,14 |
; edx = 1 |
; esi -> bgr memory, edi -> output |
; ebp = offset in WinMapAddress |
;-------------------------------------- |
align 4 |
dp3: |
cmp [ebp], dl |
jnz .next_pix |
jnz nbgp |
;-------------------------------------- |
push eax ecx |
|
push eax ecx |
mov ecx, eax |
shl ecx, 16 |
add ecx, ebx |
2080,37 → 1693,32 |
je @f |
cmp [_display.select_cursor], 0 |
jne .no_mouseunder |
;-------------------------------------- |
align 4 |
@@: |
and eax, 0xffffff |
; check mouse area for putpixel |
call [_display.check_mouse] |
;-------------------------------------- |
align 4 |
.no_mouseunder: |
|
cmp byte [_display.bits_per_pixel], 16 |
je .16bpp |
; store to LFB |
; store to real LFB |
mov [edi], ax |
shr eax, 16 |
mov [edi+2], al |
pop ecx eax |
jmp .next_pix |
|
.16bpp: |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
mov [edi], ax |
pop ecx eax |
|
; Advance to next pixel |
.next_pix: |
;-------------------------------------- |
align 4 |
nbgp: |
add esi, 3 |
add edi, [_display.bytes_per_pixel] |
|
add edi, 3 |
;-------------------------------------- |
align 4 |
@@: |
cmp byte [_display.bpp], 25 ; 24 or 32 bpp? |
sbb edi, -1 ; +1 for 32 bpp |
; I do not use 'inc eax' because this is slightly slower then 'add eax,1' |
add ebp, edx |
add eax, edx |
cmp eax, [draw_data+32+RECT.right] |
2117,7 → 1725,6 |
ja dp4 |
sub ecx, edx |
jnz dp3 |
|
; next tile block on x-axis |
mov ecx, [BgrDataWidth] |
sub esi, ecx |
2124,7 → 1731,8 |
sub esi, ecx |
sub esi, ecx |
jmp dp3 |
|
;-------------------------------------- |
align 4 |
dp4: |
; next scan line |
inc ebx |
2135,36 → 1743,31 |
cmp [SCR_MODE], 0x12 |
jne @f |
call VGA_drawbackground |
;-------------------------------------- |
align 4 |
@@: |
ret |
|
;------------------------------------------------------------------------------ |
|
align 4 |
vesa20_drawbackground_stretch: |
|
pushad |
; Helper variables |
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1) |
; calculate 2^32*(BgrDataWidth) mod (ScreenWidth) |
mov eax, [BgrDataWidth] |
dec eax |
xor edx, edx |
div dword [Screen_Max_X] |
div dword [_display.width] |
push eax ; high |
xor eax, eax |
div dword [Screen_Max_X] |
div dword [_display.width] |
push eax ; low |
|
; the same for height |
mov eax, [BgrDataHeight] |
dec eax |
xor edx, edx |
div dword [Screen_Max_Y] |
div dword [_display.height] |
push eax ; high |
xor eax, eax |
div dword [Screen_Max_Y] |
div dword [_display.height] |
push eax ; low |
|
; External loop for all y from start to end |
mov ebx, [draw_data+32+RECT.top] ; y start |
mov ebp, [draw_data+32+RECT.left] ; x start |
2176,18 → 1779,16 |
xchg ebp, eax |
add ebp, eax |
add ebp, eax |
cmp byte [_display.bytes_per_pixel], 2 |
jz @f |
add ebp, eax |
cmp byte [_display.bytes_per_pixel], 3 |
cmp byte [_display.bpp], 24 ; 24 or 32 bpp ? - x size |
jz @f |
add ebp, eax |
;-------------------------------------- |
align 4 |
@@: |
|
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB |
call calculate_edi |
xchg edi, ebp |
|
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress |
push ebx |
push eax |
2213,8 → 1814,9 |
push eax |
push edx |
push esi |
|
; 3) Smooth horizontal |
;-------------------------------------- |
align 4 |
bgr_resmooth0: |
mov ecx, [esp+8] |
mov edx, [esp+4] |
2222,7 → 1824,8 |
push edi |
mov edi, bgr_cur_line |
call smooth_line |
|
;-------------------------------------- |
align 4 |
bgr_resmooth1: |
mov eax, [esp+16+4] |
inc eax |
2236,14 → 1839,15 |
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] |
|
; 4) Loop through redraw rectangle and copy background data |
; Registers meaning: |
; esi = offset in current line, edi -> output |
2256,7 → 1860,8 |
; 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 |
2266,7 → 1871,8 |
jz .novert |
mov ebx, [bgr_next_line+esi] |
call [overlapping_of_points_ptr] |
|
;-------------------------------------- |
align 4 |
.novert: |
push ecx |
; check for hardware cursor |
2274,6 → 1880,8 |
je @f |
cmp [_display.select_cursor], 0 |
jne .no_mouseunder |
;-------------------------------------- |
align 4 |
@@: |
mov ecx, [esp+20+4] ;x |
shl ecx, 16 |
2280,30 → 1888,19 |
add ecx, [esp+24+4] ;y |
; check mouse area for putpixel |
call [_display.check_mouse] |
;-------------------------------------- |
align 4 |
.no_mouseunder: |
|
cmp [_display.bits_per_pixel], 16 |
jne .not_16bpp |
; convert to 16 bpp and store to LFB |
and eax, 00000000111110001111110011111000b |
shr ah, 2 |
shr ax, 3 |
ror eax, 8 |
add al, ah |
rol eax, 8 |
; store to real LFB |
mov [LFB_BASE+edi], ax |
pop ecx |
jmp snbgp |
.not_16bpp: |
|
; store to LFB |
mov [LFB_BASE+edi], ax |
shr eax, 16 |
mov [LFB_BASE+edi+2], al |
pop ecx |
|
;-------------------------------------- |
align 4 |
snbgp: |
add edi, [_display.bytes_per_pixel] |
cmp byte [_display.bpp], 25 |
sbb edi, -4 |
add ebp, 1 |
mov eax, [esp+20] |
add eax, 1 |
2311,7 → 1908,8 |
add esi, 4 |
cmp eax, [draw_data+32+RECT.right] |
jbe sdp3a |
|
;-------------------------------------- |
align 4 |
sdp4: |
; next y |
mov ebx, [esp+24] |
2319,21 → 1917,18 |
mov [esp+24], ebx |
cmp ebx, [draw_data+32+RECT.bottom] |
ja sdpdone |
|
; advance edi, ebp to next scan line |
sub eax, [draw_data+32+RECT.left] |
sub ebp, eax |
add ebp, [Screen_Max_X] |
add ebp, 1 |
add ebp, [_display.width] |
sub edi, eax |
sub edi, eax |
cmp byte [_display.bytes_per_pixel], 2 |
jz @f |
sub edi, eax |
cmp byte [_display.bytes_per_pixel], 3 |
cmp byte [_display.bpp], 24 |
jz @f |
sub edi, eax |
|
;-------------------------------------- |
align 4 |
@@: |
add edi, [_display.pitch] |
; restore ecx,edx; advance esi to next background line |
2356,11 → 1951,11 |
push edi |
mov esi, bgr_next_line |
mov edi, bgr_cur_line |
mov ecx, [Screen_Max_X] |
inc ecx |
mov ecx, [_display.width] |
rep movsd |
jmp bgr_resmooth1 |
|
;-------------------------------------- |
align 4 |
sdpdone: |
add esp, 44 |
popad |
2368,12 → 1963,20 |
cmp [SCR_MODE], 0x12 |
jne @f |
call VGA_drawbackground |
;-------------------------------------- |
align 4 |
@@: |
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 |
2383,6 → 1986,8 |
mov ebx, [esi+2] |
shr ebx, 8 |
call [overlapping_of_points_ptr] |
;-------------------------------------- |
align 4 |
@@: |
stosd |
mov eax, [esp+20+8] |
2397,13 → 2002,13 |
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 |
2467,21 → 2072,26 |
ret |
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 |
2492,14 → 2102,13 |
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 |
movd mm4, eax |
movd mm1, ebx |
2516,7 → 2125,5 |
packuswb mm1, mm2 |
paddb mm4, mm1 |
movd eax, mm4 |
|
ret |
|
;------------------------------------------------------------------------------ |