* Rewritten Vesa2 background code, it is much faster now

* Fixed kernel fault when creating files with unusual names with multiple dots

git-svn-id: svn://kolibrios.org@527 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Evgeny Grechnikov (Diamond) 2007-05-30 13:48:21 +00:00
parent 6c6a00efd0
commit 141e4c2c3d
5 changed files with 316 additions and 372 deletions

View File

@ -1444,14 +1444,19 @@ fat_gen_short_name:
add ebx, edi add ebx, edi
sub ebx, ecx sub ebx, ecx
push ebx push ebx
cmp ebx, ecx
jb @f
pop ebx
push ecx
@@:
cmp edi, ecx cmp edi, ecx
jbe .skip jbe .skip
@@: @@:
dec edi dec edi
mov al, ' ' mov al, [edi]
xchg al, [edi]
dec ebx dec ebx
mov [ebx], al mov [ebx], al
mov byte [edi], ' '
cmp edi, ecx cmp edi, ecx
ja @b ja @b
.skip: .skip:

View File

@ -305,6 +305,9 @@ virtual at (OS_BASE+0x043BF80)
tss TSS tss TSS
end virtual end virtual
BgrDrawMode equ (OS_BASE+0x043EFF4)
BgrDataWidth equ (OS_BASE+0x043EFF8)
BgrDataHeight equ (OS_BASE+0x043EFFC)
WinMapAddress equ (OS_BASE+0x043F000) WinMapAddress equ (OS_BASE+0x043F000)
display_data equ (OS_BASE+0x043F000) display_data equ (OS_BASE+0x043F000)

View File

@ -107,7 +107,7 @@ use16
org 0x0 org 0x0
jmp start_of_code jmp start_of_code
version db 'Kolibri OS version 0.6.5.0 ',13,10,13,10,0 version db 'Kolibri OS version 0.7.0.0 pre ',13,10,13,10,0
include "boot/bootstr.inc" ; language-independent boot messages include "boot/bootstr.inc" ; language-independent boot messages
include "boot/preboot.inc" include "boot/preboot.inc"
@ -521,9 +521,9 @@ high_code:
; set background ; set background
xor eax,eax xor eax,eax
inc eax inc eax
mov [display_data-12],eax mov [BgrDrawMode],eax
mov [display_data-8],eax mov [BgrDataWidth],eax
mov [display_data-4],eax mov [BgrDataHeight],eax
mov [mem_BACKGROUND],4095 mov [mem_BACKGROUND],4095
stdcall kernel_alloc, [mem_BACKGROUND] stdcall kernel_alloc, [mem_BACKGROUND]
mov [img_background], eax mov [img_background], eax
@ -1119,7 +1119,6 @@ set_variables:
pop eax pop eax
mov byte [SB16_Status],0 ; Minazzi Paolo mov byte [SB16_Status],0 ; Minazzi Paolo
mov [display_data-12],dword 1 ; tiled background
mov [BTN_ADDR],dword BUTTON_INFO ; address of button list mov [BTN_ADDR],dword BUTTON_INFO ; address of button list
;!! IP 04.02.2005: ;!! IP 04.02.2005:
@ -2287,7 +2286,7 @@ endg
iglobal iglobal
version_inf: version_inf:
db 0,6,5,0 ; version 0.6.5.0 db 0,7,0,0 ; version 0.7.0.0
db UID_KOLIBRI db UID_KOLIBRI
db 'Kolibri',0 db 'Kolibri',0
version_end: version_end:
@ -2356,8 +2355,8 @@ sys_background:
je sbgrr je sbgrr
cmp ecx,0 cmp ecx,0
je sbgrr je sbgrr
mov [display_data-8],ebx mov [BgrDataWidth],ebx
mov [display_data-4],ecx mov [BgrDataHeight],ecx
; mov [bgrchanged],1 ; mov [bgrchanged],1
pushad pushad
@ -2366,18 +2365,17 @@ sys_background:
; calculate RAW size ; calculate RAW size
xor eax,eax xor eax,eax
inc eax inc eax
cmp [display_data-8],eax cmp [BgrDataWidth],eax
jae @f jae @f
mov [display_data-8],eax mov [BgrDataWidth],eax
@@: @@:
cmp [display_data-4],eax cmp [BgrDataHeight],eax
jae @f jae @f
mov [display_data-4],eax mov [BgrDataHeight],eax
@@: @@:
mov eax,[display_data-8] mov eax,[BgrDataWidth]
imul eax,[display_data-4] imul eax,[BgrDataHeight]
inc eax lea eax,[eax*3]
imul eax,3
mov [mem_BACKGROUND],eax mov [mem_BACKGROUND],eax
; get memory for new background ; get memory for new background
stdcall kernel_alloc, [mem_BACKGROUND] stdcall kernel_alloc, [mem_BACKGROUND]
@ -2425,9 +2423,9 @@ draw_background_temp:
cmp eax,4 ; TILED / STRETCHED cmp eax,4 ; TILED / STRETCHED
jnz nosb4 jnz nosb4
cmp ebx,[display_data-12] cmp ebx,[BgrDrawMode]
je nosb41 je nosb41
mov [display_data-12],ebx mov [BgrDrawMode],ebx
; mov [bgrchanged],1 ; mov [bgrchanged],1
nosb41: nosb41:
ret ret
@ -2436,11 +2434,8 @@ draw_background_temp:
cmp eax,5 ; BLOCK MOVE TO BGR cmp eax,5 ; BLOCK MOVE TO BGR
jnz nosb5 jnz nosb5
; bughere ; bughere
mov edi, [TASK_BASE]
add ebx, [edi+TASKDATA.mem_start]
mov eax, ebx mov eax, ebx
mov ebx, ecx mov ebx, ecx
add ecx, edx
add ebx, [img_background] ;IMG_BACKGROUND add ebx, [img_background] ;IMG_BACKGROUND
mov ecx, edx mov ecx, edx
call memmove call memmove
@ -2457,9 +2452,9 @@ sys_getbackground:
cmp eax,1 ; SIZE cmp eax,1 ; SIZE
jnz nogb1 jnz nogb1
mov eax,[display_data-8] mov eax,[BgrDataWidth]
shl eax,16 shl eax,16
mov ax,[display_data-4] mov ax,[BgrDataWidth]
mov [esp+36],eax mov [esp+36],eax
ret ret
nogb1: nogb1:
@ -2480,7 +2475,7 @@ sys_getbackground:
cmp eax,4 ; TILED / STRETCHED cmp eax,4 ; TILED / STRETCHED
jnz nogb4 jnz nogb4
mov eax,[display_data-12] mov eax,[BgrDrawMode]
nogb4: nogb4:
mov [esp+36],eax mov [esp+36],eax
ret ret
@ -4098,7 +4093,7 @@ drawbackground:
call [draw_pointer] call [draw_pointer]
ret ret
dbrv20: dbrv20:
cmp [display_data-12],dword 1 cmp [BgrDrawMode],dword 1
jne bgrstr jne bgrstr
call vesa20_drawbackground_tiled call vesa20_drawbackground_tiled
dec [mouse_pause] dec [mouse_pause]

View File

@ -206,8 +206,8 @@ vesa12_drawbackground:
push edx push edx
xor edx,edx xor edx,edx
mov eax,dword[WinMapAddress-8] mov eax,dword[BgrDataWidth]
mov ebx,dword[WinMapAddress-4] mov ebx,dword[BgrDataHeight]
mul ebx mul ebx
mov ebx,3 mov ebx,3
mul ebx mul ebx
@ -220,23 +220,19 @@ vesa12_drawbackground:
push eax push eax
push ebx push ebx
mov esi,[img_background] ;IMG_BACKGROUND
cmp [WinMapAddress-12],dword 1 ; tiled background cmp [BgrDrawMode],dword 1 ; tiled background
jne no_vesa12_tiled_bgr jne no_vesa12_tiled_bgr
push edx push edx
xor edx,edx xor edx,edx
mov ecx,[WinMapAddress-8] div dword [BgrDataWidth]
div ecx
mov eax,edx
push eax push edx
mov eax,ebx mov eax,ebx
xor edx,edx xor edx,edx
mov ecx,[WinMapAddress-4] div dword [BgrDataHeight]
div ecx
mov ebx,edx mov ebx,edx
pop eax pop eax
@ -244,21 +240,19 @@ vesa12_drawbackground:
no_vesa12_tiled_bgr: no_vesa12_tiled_bgr:
cmp [WinMapAddress-12],dword 2 ; stretched background cmp [BgrDrawMode],dword 2 ; stretched background
jne no_vesa12_stretched_bgr jne no_vesa12_stretched_bgr
push edx push edx
imul eax,dword [WinMapAddress-8] mul dword [BgrDataWidth]
xor edx,edx
mov ecx,[ScreenWidth] mov ecx,[ScreenWidth]
inc ecx inc ecx
div ecx div ecx
push eax push eax
mov eax,ebx mov eax,ebx
imul eax,dword [WinMapAddress-4] mul dword [BgrDataHeight]
xor edx,edx
mov ecx,[ScreenHeight] mov ecx,[ScreenHeight]
inc ecx inc ecx
div ecx div ecx
@ -270,34 +264,26 @@ vesa12_drawbackground:
no_vesa12_stretched_bgr: no_vesa12_stretched_bgr:
push eax mov esi,ebx
mov eax,ebx imul esi, dword [BgrDataWidth]
xor edx,edx
mov ebx,[WinMapAddress-8]
add ebx,[WinMapAddress-8]
add ebx,[WinMapAddress-8]
mul ebx
mov esi,eax
pop eax
add esi,eax
add esi,eax
add esi,eax add esi,eax
lea esi,[esi*3]
add esi,[img_background] ;IMG_BACKGROUND add esi,[img_background] ;IMG_BACKGROUND
pop ebx pop ebx
pop eax pop eax
v12di4: v12di4:
mov ecx,[esi] mov cl,[esi+2]
shl ecx,16
mov cx,[esi]
pusha pusha
mov esi,eax mov esi,eax
mov edi,ebx mov edi,ebx
mov eax,[ScreenWidth] mov eax,[ScreenWidth]
add eax,1 add eax,1
mul ebx mul ebx
add eax,esi cmp [eax+esi+WinMapAddress],byte 1
add eax,WinMapAddress
cmp [eax],byte 1
jnz v12nbgp jnz v12nbgp
mov eax,[BytesPerScanLine] mov eax,[BytesPerScanLine]
mov ebx,edi mov ebx,edi

View File

@ -769,107 +769,88 @@ align 4
; ret ; ret
;--------------vbe voodoo ------------------------------------------------
vesa20_drawbackground_tiled: vesa20_drawbackground_tiled:
call [disable_mouse] call [disable_mouse]
push ebp pushad
push eax ; External loop for all y from start to end
push ebx mov ebx, [draw_data+32+RECT.top] ; y start
push ecx dp2:
push edx mov ebp, [draw_data+32+RECT.left] ; x start
mov edx,dword [WinMapAddress-8] ; B ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
add edx,dword [WinMapAddress-8] ; +B ; and LFB data (output for our function) [edi]
add edx,dword [WinMapAddress-8] ; +B
push edx
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
mov eax, [BytesPerScanLine] mov eax, [BytesPerScanLine]
mul ebx mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y) xchg ebp, eax
add ebp, eax ; +X add ebp, eax
add ebp, eax ; +X add ebp, eax
add ebp, eax ; +X add ebp, eax
cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size
jz @f jz @f
add ebp,eax ; +X add ebp, eax
@@: @@:
add ebp,[LFBAddress] ; +LFB add ebp, [LFBAddress]
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
dp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
jne nbgp
push eax
push ebx
mov ecx,dword [WinMapAddress-8] ; B
xor edx,edx ; edx:=0
div ecx ; Xstart/B
; eax=Int(qn) edx:=Rem
lea esi,[edx+edx*2] ; esi:=edx*3
mov ecx,dword [WinMapAddress-4] ; ecx:=H
mov eax,[esp+0] ; eax:=Ystart
xor edx,edx ;
div ecx ; Ystart/H
mov eax,edx ; eax:=Rem
xor edx,edx ;
mov ebx,[esp+8] ; ebx:=B*3
mul ebx ;
add esi,eax ;
; mov eax,[esi+IMG_BACKGROUND]
mov eax,[img_background]
mov eax,[esi+eax]
and eax,0xffffff
xchg edi, ebp xchg edi, ebp
stosw ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
shr eax,16 ; 2) Calculate offset in background memory block
stosb push eax
xchg ebp, edi ; ebp+=3 xor edx, edx
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size mov eax, ebx
jz @f mov ecx, [BgrDataHeight]
inc ebp ; +1 div ecx ; edx := y mod BgrDataHeight
@@: sub ecx, edx ; ecx := BgrDataHeight - (y mod BgrDataHeight)
pop ebx
pop eax pop eax
jmp hook1 push eax
mov esi, edx
imul esi, [BgrDataWidth] ; esi := (y mod BgrDataHeight) * BgrDataWidth
xor edx, edx
div dword [BgrDataWidth] ; edx := x mod BgrDataWidth
add esi, edx ; esi := (y mod BgrDataHeight)*BgrDataWidth + (x mod BgrDataWidth)
pop eax
lea esi, [esi*3]
add esi, [img_background]
xor edx, edx
inc edx
; 3) Loop through redraw rectangle and copy background data
; Registers meaning:
; eax = x, ebx = y (screen coordinates)
; ecx = deltax - number of pixels left in current tile block
; edx = 1
; esi -> bgr memory, edi -> output
; ebp = offset in WinMapAddress
dp3:
cmp [ebp+WinMapAddress], dl
jnz nbgp
movsb
movsb
movsb
jmp @f
nbgp: nbgp:
add ebp,3 ; +3 add esi, 3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size add edi, 3
jz @f
inc ebp ; +1
@@: @@:
hook1: cmp [ScreenBPP], byte 25 ; 24 or 32 bpp?
inc edi ; ptrBuffer++ sbb edi, -1 ; +1 for 32 bpp
add esi,3 ; ptrImage+=3 ; I do not use 'inc eax' because this is slightly slower then 'add eax,1'
inc eax add ebp, edx
cmp eax,[draw_data+32+RECT.right] ; X > xend? add eax, edx
jle dp3 cmp eax, [draw_data+32+RECT.right]
mov ebp,[draw_data+32+RECT.left] ja dp4
sub ecx, edx
jnz dp3
; next tile block on x-axis
mov ecx, [BgrDataWidth]
sub esi, ecx
sub esi, ecx
sub esi, ecx
jmp dp3
dp4:
; next scan line
inc ebx inc ebx
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X=X*2
add ebp, eax ; +X=X*3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X=X*4
@@:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
cmp ebx, [draw_data+32+RECT.bottom] cmp ebx, [draw_data+32+RECT.bottom]
jle dp3 jbe dp2
add esp,4 popad
pop edx
pop ecx
pop ebx
pop eax
pop ebp
mov [EGA_counter], 1 mov [EGA_counter], 1
call VGA_drawbackground call VGA_drawbackground
ret ret
@ -879,220 +860,194 @@ hook1:
vesa20_drawbackground_stretch: vesa20_drawbackground_stretch:
call [disable_mouse] call [disable_mouse]
push ebp pushad
; Helper variables
mov eax, [BgrDataWidth]
xor edx, edx
mov ecx, [ScreenWidth]
inc ecx
div ecx
push eax ; quo
push edx ; rem
mov eax, [BgrDataHeight]
xor edx, edx
mov ecx, [ScreenHeight]
inc ecx
div ecx
push eax push eax
push ebx
push ecx
push edx push edx
mov edx,dword [WinMapAddress-8] ; B ; External loop for all y from start to end
add edx,dword [WinMapAddress-8] ; +B mov ebx, [draw_data+32+RECT.top] ; y start
add edx,dword [WinMapAddress-8] ; +B mov ebp, [draw_data+32+RECT.left] ; x start
push edx ; 1) Calculate pointers in WinMapAddress (does pixel belong to OS thread?) [ebp]
mov ebp,[draw_data+32+RECT.left] ; x start:=(x+Xwin) ; and LFB data (output for our function) [edi]
mov ebx,[draw_data+32+RECT.top] ; y start:=(y+Ywin)
mov eax, [BytesPerScanLine] mov eax, [BytesPerScanLine]
mul ebx mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y) xchg ebp, eax
add ebp, eax ; +X add ebp, eax
add ebp, eax ; +X add ebp, eax
add ebp, eax ; +X add ebp, eax
cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size cmp [ScreenBPP], byte 24 ; 24 or 32 bpp ? - x size
jz @f jz @f
add ebp,eax ; +X add ebp, eax
@@: @@:
add ebp,[LFBAddress] ; +LFB add ebp, [LFBAddress]
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB ; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi call calculate_edi
sdp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
jne snbgp
push eax
push ebx
mov eax,dword [WinMapAddress-8]
imul eax, [esp+4] ;4
xor edx,edx
mov ebx,[ScreenWidth]
div ebx
mov cx,dx
lea esi,[eax+eax*2]
mov eax,dword [WinMapAddress-4]
imul eax, [esp+0] ;0
xor edx,edx
mov ebx,[ScreenHeight]
div ebx
shl ecx,16
mov cx,dx
imul eax, [esp+8] ;8
add esi,eax
; mov eax,[esi+IMG_BACKGROUND]
mov eax,[img_background]
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
sub eax,3
cmp eax,esi
pop eax
jbe @f
mov eax,[esi+eax]
@@:
push eax
ror ecx,16
xor eax,eax
mov ax,cx
shl eax,1 ; óìíîæåíèå íà 2
lea eax,[eax+eax*4] ; óìíîæåíèå íà 5
xor edx,edx
mov ebx,[ScreenWidth]
div ebx
cmp eax,5
pop eax
jb @f
; mov ebx,[esi+IMG_BACKGROUND+3]
mov ebx,[img_background]
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
sub eax,3
cmp eax,esi
pop eax
jbe @f
mov ebx,[esi+ebx+3]
call overlapping_of_points
@@:
push eax
ror ecx,16
xor eax,eax
mov ax,cx
shl eax,1 ; óìíîæåíèå íà 2
lea eax,[eax+eax*4] ; óìíîæåíèå íà
xor edx,edx
mov ebx,[ScreenHeight]
div ebx
cmp eax,5
pop eax
jb @f
mov ebx,[display_data-8]
shl ebx,1
add ebx,[display_data-8]
add ebx,[img_background] ;IMG_BACKGROUND
push eax
mov eax,[display_data-4]
imul eax,[display_data-8]
imul eax,3
cmp eax,esi
pop eax
jbe @f
add ebx,esi
mov ebx,[ebx]
call overlapping_of_points
@@:
and eax,0xffffff
xchg edi, ebp xchg edi, ebp
stosw ; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
shr eax,16 push ebx
stosb ; 2) Calculate offset in background memory block
xchg ebp, edi ; ebp+=3 push eax
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size mov eax, ebx
jz @f mul dword [BgrDataHeight]
inc ebp ; +1 mov ecx, [ScreenHeight]
@@: inc ecx
pop ebx div ecx ; eax := y * BgrDataHeight / ScreenHeight
; edx := (y * BgrDataHeight) mod ScreenHeight
mov esi, eax
pop eax pop eax
jmp shook1 push edx ; dword [esp] = (y * BgrDataHeight) mod ScreenHeight
; dword [esp+4] = y * BgrDataHeight / ScreenHeight
push eax
mov ecx, [BgrDataWidth]
mul ecx
imul esi, ecx
dec ecx
push ecx
mov ecx, [ScreenWidth]
inc ecx
div ecx ; eax := x * BgrDataWidth / ScreenWidth
; edx := (x * BgrDataWidth) mod ScreenWidth
add esi, eax
lea esi, [esi*3]
add esi, [img_background]
push ecx edx esi
; 3) Loop through redraw rectangle and copy background data
; Registers meaning:
; ecx = (x * BgrDataWidth) / ScreenWidth
; edx = (x * BgrDataWidth) mod ScreenWidth (used to fast recalculating of ecx,esi)
; esi -> bgr memory, edi -> output
; ebp = offset in WinMapAddress
; dword [esp] = saved esi
; dword [esp+4] = saved edx
; dword [esp+8] = saved ecx
; dword [esp+12] = limit for overlapping of points
; dword [esp+16] = x
; dword [esp+20] = (y * BgrDataHeight) mod ScreenHeight (used to fast recalculating of esi)
; dword [esp+24] = y
; precalculated constants:
; dword [esp+28] = BgrDataHeight mod ScreenHeight
; dword [esp+32] = BgrDataHeight div ScreenHeight
; dword [esp+36] = BgrDataWidth mod ScreenWidth
; dword [esp+40] = BgrDataWidth div ScreenWidth
sdp3:
cmp [ebp+WinMapAddress], byte 1
jnz snbgp
mov al, [esi+2]
shl eax, 16
mov ax, [esi]
cmp ecx, [esp+12]
jae @f
mov ebx, [esi+2]
shr ebx, 8
call overlapping_of_points
@@:
mov [edi], ax
shr eax, 16
mov [edi+2], al
snbgp:
cmp [ScreenBPP], byte 25
sbb edi, -4
add ebp, 1
mov eax, [esp+16]
add eax, 1
mov [esp+16], eax
cmp eax, [draw_data+32+RECT.right]
ja sdp4
mov eax, [esp+40]
add ecx, eax
lea eax, [eax*3]
add esi, eax
add edx, [esp+36]
cmp edx, [ScreenWidth]
jbe sdp3
sub edx, [ScreenWidth]
add ecx, 1
add esi, 3
sub edx, 1
jmp sdp3
sdp4:
; next y
mov ebx, [esp+24]
add ebx, 1
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, [ScreenWidth]
add ebp, 1
sub edi, eax
sub edi, eax
sub edi, eax
cmp [ScreenBPP], byte 24
jz @f
sub edi, eax
@@:
add edi, [BytesPerScanLine]
; restore ecx,edx; advance esi to next background line
pop esi edx ecx
push ecx edx
xor ebx, ebx
mov eax, [esp+20-4]
add eax, [esp+28-4]
cmp eax, [ScreenHeight]
jbe @f
sub eax, [ScreenHeight]
mov ebx, 1
sub eax, ebx
@@:
mov [esp+20-4], eax
add ebx, [esp+32-4]
lea ebx, [ebx*3]
imul ebx, [BgrDataWidth]
add esi, ebx
push esi
mov eax, [draw_data+32+RECT.left]
mov [esp+16], eax
jmp sdp3
sdpdone:
add esp, 44
popad
mov [EGA_counter],1
call VGA_drawbackground
ret
overlapping_of_points: overlapping_of_points:
push ecx edi push ecx edx edi
mov ecx, eax mov ecx, eax
mov edx, ebx mov edx, ebx
xor eax,eax movzx eax, cl
mov al,cl movzx ebx, dl
xor ebx,ebx
mov bl,dl
add eax, ebx add eax, ebx
rcr eax, 1 rcr eax, 1
xor edi,edi movzx edi, ax
mov di,ax movzx eax, ch
xor eax,eax movzx ebx, dh
mov al,ch
xor ebx,ebx
mov bl,dh
add eax, ebx add eax, ebx
rcr eax, 1 rcr eax, 1
ror edi, 8 ror edi, 8
add edi, eax add edi, eax
ror ecx,8 shr ecx, 8
ror edx,8 shr edx, 8
xor eax,eax movzx eax, ch
mov al,ch movzx ebx, dh
xor ebx,ebx
mov bl,dh
add eax, ebx add eax, ebx
rcr eax, 1 rcr eax, 1
ror edi, 8 ror edi, 8
add eax, edi add eax, edi
ror eax, 16 ror eax, 16
pop edi ecx pop edi edx ecx
ret
snbgp:
add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
inc ebp ; +1
@@:
shook1:
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
inc eax
cmp eax,[draw_data+32+RECT.right] ; X > xend?
jle sdp3
; jbe sdp3
mov ebp,[draw_data+32+RECT.left]
inc ebx
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X=X*2
add ebp, eax ; +X=X*3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz @f
add ebp,eax ; +X=X*4
@@:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
; cmp ebx,[ScreenHeight]
; ja @f
cmp ebx,[draw_data+32+RECT.bottom]
jle sdp3
; jbe sdp3
@@:
add esp,4
pop edx
pop ecx
pop ebx
pop eax
pop ebp
mov [EGA_counter],1
call VGA_drawbackground
ret ret