?? vesa20.inc
字號(hào):
add edi,ecx ; +(x+Xwin)
add edi,ecx ; +(x+Xwin)
add edi,ecx ; +(x+Xwin)
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x start
jz dbpi24
add edi,ecx ; +(x+Xwin)
dbpi24:
add edi,[LFBAddress] ; +AddrLFB
; edi:=(y+Ywin)*Screen_Y_multiplier+X*BytesPerPixel
; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer
; x size
mov eax,[esp+4] ; B [esp+4]
mov ecx,eax ; B
add ecx,eax ; +B
add ecx,eax ; +B
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz dbpi243
add ecx,eax ; +B if 32bpp
; ecx:=B*BytesPerPixel, eax:=B
dbpi243:
mov ebx,[esp+0] ; H
; check limits ?
push eax
push ecx
mov eax,[0x3010]
mov ecx,[eax+draw_data-0x3000+0]
cmp ecx,0
jnz dbcblimitlset
mov ecx,[eax+draw_data-0x3000+4]
cmp ecx,0
jnz dbcblimitlset
mov ecx,[eax+draw_data-0x3000+8]
cmp ecx,[ScreenWidth]
jnz dbcblimitlset
mov ecx,[eax+draw_data-0x3000+12]
cmp ecx,[ScreenHeight]
jnz dbcblimitlset
pop ecx
pop eax
push dword 0
jmp dbcblimitlno
dbcblimitlset:
pop ecx ; B*BytesPerPixel
pop eax ; B
push dword 1
dbcblimitlno:
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ?
jz dbpi24bit
jmp dbpi32bit
; DRAWBAR 24 BBP
dbpi24bit:
mov ecx,eax ; B
cld
dbnewpi:
push ebx
push edi
push ecx ; B
mov ebx,[0x3010]
movzx ebx,byte[ebx+0xe]
cld
dbnp24:
mov dl,[ds:ebp]
push eax
push ecx
cmp dl,bl
jnz dbimp24no
mov eax,[esp+8+3*4+16+4] ; NoCurrentWin|NoCurrentWin
mov ecx,[esp+5*4]
cmp ecx,0
jz dbimp24yes
call voodoodbcplimit
jnz dbimp24no
dbimp24yes:
mov [edi],ax
shr eax,16
mov [edi+2],al
dbimp24no:
pop ecx
pop eax
add edi,3 ; ptrScreen+=3
inc ebp
dec ecx
jnz dbnp24 ; while ecx > 0
;
mov eax,[esp+3*4+16+4] ; color glide
test eax,0x80000000
jz nodbgl24
cmp al,0
jz nodbgl24
dec eax
mov [esp+3*4+16+4],eax
nodbgl24:
pop ecx ; ecx:=B
pop edi
pop ebx
add edi,[BytesPerScanLine] ; ptrScreen+=BytesPerScanLine
add ebp,[ScreenWidth] ;
sub ebp, ecx ;
inc ebp ; ptrBuffer:=ptrBuffer-B+BytesPerPixel+1
dec ebx ; H--
jz dbnonewpi ; H <> 0
jmp dbnewpi
dbnonewpi:
add esp,7*4
pop ebp
ret
; DRAWBAR 32 BBP
dbpi32bit:
cld
shr ecx,2
dbnewpi32:
push ebx
push edi
push ecx
mov ebx,[0x3010]
movzx ebx,byte[ebx+0xe]
cld
dbnp32:
mov dl,[ds:ebp]
push eax
push ecx
cmp dl,bl
jnz dbimp32no
mov eax,[esp+8+3*4+16+4]
mov ecx,[esp+5*4]
cmp ecx,0
jz dbimp32yes
call voodoodbcplimit
jnz dbimp32no
dbimp32yes:
mov [edi],ax
shr eax,16
mov [edi+2],al
dbimp32no:
pop ecx
pop eax
add edi,4 ; ptrScreen+=4
inc ebp
dec ecx
jnz dbnp32
dbnp32d:
mov eax,[esp+12+16+4] ; color glide
test eax,0x80000000
jz nodbgl32
cmp al,0
jz nodbgl32
dec eax
mov [esp+12+16+4],eax
nodbgl32:
pop ecx
pop edi
pop ebx
add edi,[BytesPerScanLine] ; ptrScreen+=BytesPerScanLine
add ebp,[ScreenWidth] ;
sub ebp, ecx ;
inc ebp ; ptrBuffer:=ptrBuffer-B+BytesPerPixel+1
dec ebx ; H--
jz nodbnewpi32 ; H<>0
jmp dbnewpi32
nodbnewpi32:
add esp,7*4
pop ebp
ret
voodoodbcplimit:
; ebp:=(y+Ywin)*(ScreenXSize+1)+(x+Xwin)+AddrBuffer
pusha
xor edx,edx
mov eax,ebp
mov ebx,[ScreenWidth] ; Screen_X_size
add ebx,1 ; +1
sub eax,WinMapAddress ; -AddrBuffer
div ebx ;
mov ebx,eax ; ebx:=Y
mov eax,edx ; eax:=X
call cplimit
cmp ecx,0
jne dbcpl12
popa
clc
ret
dbcpl12:
popa
stc
ret
dbcplimit:
pusha
xor edx,edx
mov ebx,[ScreenWidth]
add ebx,1
sub eax,WinMapAddress
div ebx
mov ebx,eax
mov eax,edx
call cplimit
cmp ecx,0
jne dbcpl1
popa
clc
ret
dbcpl1:
popa
stc
ret
;--------------vbe voodoo ------------------------------------------------
vesa20_drawbackground_tiled:
call disable_mouse
push ebp
push eax
push ebx
push ecx
push edx
mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B
push edx
mov ebp,[draw_data+32+0] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X
add ebp, eax ; +X
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz bgl243
add ebp,eax ; +X
bgl243:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
dp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
je ybgp
jmp nbgp
ybgp:
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+0x300000]
and eax,0xffffff
xchg edi, ebp
stosw
shr eax,16
stosb
xchg ebp, edi ; ebp+=3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz bgl24312
inc ebp ; +1
bgl24312:
pop ebx
pop eax
jmp hook1
nbgp:
add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz bgl243121
inc ebp ; +1
bgl243121:
hook1:
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
inc eax
cmp eax,[draw_data+32+8] ; X > xend?
jg nodp3
jmp dp3
nodp3:
mov ebp,[draw_data+32+0]
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 bgl2431
add ebp,eax ; +X=X*4
bgl2431:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
cmp ebx,[draw_data+32+12]
jg dp4
jmp dp3
dp4:
add esp,4
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
; ----------
vesa20_drawbackground_stretch:
call disable_mouse
push ebp
push eax
push ebx
push ecx
push edx
mov edx,dword [WinMapAddress-8] ; B
add edx,dword [WinMapAddress-8] ; +B
add edx,dword [WinMapAddress-8] ; +B
push edx
mov ebp,[draw_data+32+0] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
mov eax,[BytesPerScanLine]
mul ebx
xchg ebp, eax ; BytesPerScanLine*(Ywin+y)
add ebp, eax ; +X
add ebp, eax ; +X
add ebp, eax ; +X
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz sbgl243
add ebp,eax ; +X
sbgl243:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
sdp3: ; MAIN LOOP
cmp [edi+WinMapAddress],byte 1 ; ptrBuffer^<>byte(1)
je sybgp
jmp snbgp
sybgp:
push eax
push ebx
mov eax,dword [WinMapAddress-8]
xor edx,edx
mov ebx,[esp+4]
mul ebx
xor edx,edx
mov ebx,[ScreenWidth]
div ebx
lea esi,[eax+eax*2]
mov eax,dword [WinMapAddress-4]
xor edx,edx
mov ebx,[esp+0]
mul ebx
xor edx,edx
mov ebx,[ScreenHeight]
div ebx
xor edx,edx
mov ebx,[esp+8]
mul ebx
add esi,eax
mov eax,[esi+0x300000]
and eax,0xffffff
xchg edi, ebp
stosw
shr eax,16
stosb
xchg ebp, edi ; ebp+=3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz sbgl24312
inc ebp ; +1
sbgl24312:
pop ebx
pop eax
jmp shook1
snbgp:
add ebp,3 ; +3
cmp [ScreenBPP],byte 24 ; 24 or 32 bpp ? - x size
jz sbgl243121
inc ebp ; +1
sbgl243121:
shook1:
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
inc eax
cmp eax,[draw_data+32+8] ; X > xend?
jg snodp3
jmp sdp3
snodp3:
mov ebp,[draw_data+32+0]
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 sbgl2431
add ebp,eax ; +X=X*4
sbgl2431:
add ebp,[LFBAddress] ; +LFB
; ebp:=Y*BytesPerScanLine+X*BytesPerPixel+AddrLFB
call calculate_edi
cmp ebx,[draw_data+32+12]
jg sdp4
jmp sdp3
sdp4:
add esp,4
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -