Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 546 → Rev 536

/kernel/trunk/video/vesa20.inc
862,24 → 862,20
call [disable_mouse]
pushad
; Helper variables
; calculate 2^32*(BgrDataWidth-1) mod (ScreenWidth-1)
mov eax, [BgrDataWidth]
dec eax
xor edx, edx
div dword [ScreenWidth]
push eax ; high
xor eax, eax
div dword [ScreenWidth]
push eax ; low
; the same for height
mov ecx, [ScreenWidth]
inc ecx
div ecx
push eax ; quo
push edx ; rem
mov eax, [BgrDataHeight]
dec eax
xor edx, edx
div dword [ScreenHeight]
push eax ; high
xor eax, eax
div dword [ScreenHeight]
push eax ; low
mov ecx, [ScreenHeight]
inc ecx
div ecx
push eax
push edx
; 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
901,76 → 897,83
xchg edi, ebp
; Now eax=x, ebx=y, edi->output, ebp=offset in WinMapAddress
push ebx
; 2) Calculate offset in background memory block
push eax
; 2) Calculate offset in background memory block
mov eax, ebx
imul ebx, dword [esp+12]
mul dword [esp+8]
add edx, ebx ; edx:eax = y * 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
mov esi, edx
imul esi, [BgrDataWidth]
mul dword [BgrDataHeight]
mov ecx, [ScreenHeight]
inc ecx
div ecx ; eax := y * BgrDataHeight / ScreenHeight
; edx := (y * BgrDataHeight) mod ScreenHeight
mov esi, eax
pop eax
push edx ; dword [esp] = (y * BgrDataHeight) mod ScreenHeight
; dword [esp+4] = y * BgrDataHeight / ScreenHeight
push eax
mov ecx, [BgrDataWidth]
lea edx, [ecx*3]
imul edx, [BgrDataHeight]
add edx, [img_background]
push edx
push eax
mov eax, [esp+8]
mul dword [esp+28]
push eax
mov eax, [esp+12]
mul dword [esp+28]
add [esp], edx
pop edx ; edx:eax = x * 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
add esi, edx
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]
mov ecx, eax
push eax edx esi
push ecx edx esi
; 3) Loop through redraw rectangle and copy background data
; Registers meaning:
; edx:ecx = x * 2^32 * (BgrDataWidth-1) / (ScreenWidth-1)
; 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
; qword [esp+12] = y * 2^32 * (BgrDataHeight-1) / (ScreenHeight-1)
; dword [esp+12] = BgrDataWidth-1, x-limit for overlapping of points
; dword [esp+16] = end of bgr memory (defines y-limit for overlapping of points)
; dword [esp+20] = x
; dword [esp+24] = y
; dword [esp+24] = (y * BgrDataHeight) mod ScreenHeight (used to fast recalculating of esi)
; dword [esp+28] = y
; precalculated constants:
; qword [esp+28] = 2^32*(BgrDataHeight-1)/(ScreenHeight-1)
; qword [esp+36] = 2^32*(BgrDataWidth-1)/(ScreenWidth-1)
; dword [esp+32] = BgrDataHeight mod ScreenHeight
; dword [esp+36] = BgrDataHeight div ScreenHeight
; dword [esp+40] = BgrDataWidth mod ScreenWidth
; dword [esp+44] = BgrDataWidth div ScreenWidth
sdp3:
add edx, [esp+40]
cmp [ebp+WinMapAddress], byte 1
jnz snbgp
mov al, [esi+2]
shl eax, 16
mov ax, [esi]
test ecx, ecx
jz @f
cmp ecx, [esp+12]
jae @f
cmp edx, [ScreenWidth]
jb @f
mov ebx, [esi+2]
shr ebx, 8
call overlapping_of_points
@@:
cmp dword [esp+12], 0
jz .novert
mov ebx, [esp+24]
add ebx, [esp+32]
cmp ebx, [ScreenHeight]
jbe @f
mov ebx, [BgrDataWidth]
lea ebx, [ebx*3]
add ebx, esi
push eax
mov al, [ebx+2]
shl eax, 16
mov ax, [ebx]
test ecx, ecx
jz .nohorz
mov ebx, [ebx+2]
cmp ebx, [esp+16]
jae @f
mov ebx, [ebx-1]
shr ebx, 8
call overlapping_of_points
.nohorz:
mov ebx, eax
pop eax
push ecx
mov ecx, [esp+4+12]
call overlapping_of_points
pop ecx
.novert:
@@:
mov [edi], ax
shr eax, 16
mov [edi+2], al
983,18 → 986,23
mov [esp+20], eax
cmp eax, [draw_data+32+RECT.right]
ja sdp4
add ecx, [esp+36]
mov eax, edx
adc edx, [esp+40]
sub eax, edx
mov eax, [esp+44]
add ecx, eax
lea eax, [eax*3]
sub esi, eax
add esi, eax
; add edx, [esp+40]
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]
mov ebx, [esp+28]
add ebx, 1
mov [esp+24], ebx
mov [esp+28], ebx
cmp ebx, [draw_data+32+RECT.bottom]
ja sdpdone
; advance edi, ebp to next scan line
1011,23 → 1019,28
@@:
add edi, [BytesPerScanLine]
; restore ecx,edx; advance esi to next background line
mov eax, [esp+28]
mov ebx, [esp+32]
add [esp+12], eax
mov eax, [esp+16]
adc [esp+16], ebx
pop esi edx ecx
push ecx edx
sub eax, [esp+16-4]
lea eax, [eax*3]
imul eax, [BgrDataWidth]
sub esi, eax
xor ebx, ebx
mov eax, [esp+24-4]
add eax, [esp+32-4]
cmp eax, [ScreenHeight]
jbe @f
sub eax, [ScreenHeight]
mov ebx, 1
sub eax, ebx
@@:
mov [esp+24-4], eax
add ebx, [esp+36-4]
lea ebx, [ebx*3]
imul ebx, [BgrDataWidth]
add esi, ebx
push esi
mov eax, [draw_data+32+RECT.left]
mov [esp+20], eax
jmp sdp3
sdpdone:
add esp, 44
add esp, 48
popad
mov [EGA_counter],1
call VGA_drawbackground
1034,32 → 1047,28
ret
 
overlapping_of_points:
push ecx edx
mov edx, eax
push esi
shr ecx, 24
mov esi, ecx
mov ecx, ebx
push ecx edx edi
mov ecx, eax
mov edx, ebx
movzx eax, cl
movzx ebx, dl
movzx eax, cl
sub eax, ebx
add eax, ebx
rcr eax, 1
movzx edi, ax
movzx eax, ch
movzx ebx, dh
imul eax, esi
add dl, ah
add eax, ebx
rcr eax, 1
ror edi, 8
add edi, eax
shr ecx, 8
shr edx, 8
movzx eax, ch
sub eax, ebx
imul eax, esi
add dh, ah
ror ecx, 16
ror edx, 16
movzx eax, cl
movzx ebx, dl
sub eax, ebx
imul eax, esi
pop esi
add dl, ah
mov eax, edx
pop edx
movzx ebx, dh
add eax, ebx
rcr eax, 1
ror edi, 8
add eax, edi
ror eax, 16
pop ecx
pop edi edx ecx
ret