📄 vga.inc
字号:
jnz dbcblimitlset_vga2
pop ecx
pop eax
push dword 0
jmp dbnewpivga
dbcblimitlset_vga2:
pop ecx ; x+Xwin
pop eax ; B
push dword 1
dbnewpivga:
push eax; B
push ebx ; H
push edi
push esi
push ecx ; x+Xwin
mov ebx,[0x3010]
movzx ebx,byte[ebx+0xe]
cld
dbnpvga:
mov dl,[ds:ebp]
cmp dl,bl
jnz dbimpvgano
mov edx,[esp+5*4] ; check limit?
cmp edx,0
jz dbimpvgayes
call voodoodbcplimit
jnz dbimpvgano
dbimpvgayes:
push eax ; B
push ebx
push ecx ; x+Xwin
mov eax,[esp+12+20+16+4] ; color
mov ebx,eax
mov [esi],bx ; write LFB pixel
shr ebx,16
mov [esi+2],bl
and ecx,0x07 ; modulo 8
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
pop ecx
pop ebx
pop eax
dbimpvgano:
add esi,4 ; ptrLFB+=4
inc ebp ; address buffer
inc ecx ; x posn++
test ecx,0x07 ; test modulo 8
jnz dbvgacont
inc edi ; VGA screen ptr++
dbvgacont:
dec eax ; B-- NB ecx in Vesa20 fn?
jnz dbnpvga
dbnpvgad:
pop ecx
pop esi
pop edi
pop ebx
pop eax
add esi,[0xfe08] ; ptrLFB+=BytesPerScanLine
add edi,640/8 ; ptrScreen+=BytesPerScanLine
add ebp,[0xfe00] ;
sub ebp, eax ; was ecx in vesa20 fn?
inc ebp ; ptrBuffer:=ptrBuffer-B+BytesPerLine+1
dec ebx ; H--
jz nodbnewpivga ; H<>0
jmp dbnewpivga
nodbnewpivga:
add esp,7*4 ; NB includes limit check flag
;pop ebx
;pop eax
;pop edi
;pop esi
pop ebp
;pop edx
;pop ecx
ret
vga_drawbackground_tiled:
push ebp
push eax
push ebx
push ecx
push edx
mov edx,dword [0x400000-8] ; B
add edx,dword [0x400000-8] ; +B
add edx,dword [0x400000-8] ; +B
push edx
mov eax,[draw_data+32+0] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
mov ecx,eax
mov edx,ebx
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
shl ecx,2 ; (x+Xwin)*BytesPerPixel
add ecx,edx ;
mov ebp,ecx ; store copy
add ecx,[0xfe80] ; +AddrLFB
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
add ebp,0xa0000 ; + VGABasePtr
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
call calculate_edi
dp3vga: ; MAIN LOOP
cmp [edi+0x400000],byte 1 ; ptrBuffer^<>byte(1)
je ybgpvga
jmp nbgpvga
ybgpvga:
push eax ; x
push ebx ; y
push ecx ; LFB address
mov ecx,dword [0x400000-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 [0x400000-4] ; ecx:=H
mov eax,[esp+4] ; eax:=Ystart
xor edx,edx ;
div ecx ; Ystart/H
mov eax,edx ; eax:=Rem
xor edx,edx ;
mov ebx,[esp+12] ; ebx:=B*3
mul ebx ;
add esi,eax ;
mov eax,[esi+0x300000] ; color
and eax,0xffffff
mov ecx, [esp] ; LFB address
mov ebx,eax ; copy color
mov [ecx],bx
shr ebx,16
mov [ecx+2],bl
xchg edi, ebp
mov ecx,[esp+8] ; x position
and ecx,0x07 ; x modulo 8
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
xchg ebp, edi
pop ecx
pop ebx
pop eax
nbgpvga:
inc eax ; x++
cmp eax,[draw_data+32+8] ; X > xend?
jg nodp3vga
test eax,0x07 ; x test modulo 8
jnz hook1vga
inc ebp ; VGA address++
hook1vga:
add ecx,4 ; LFB address += 4
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
jmp dp3vga
nodp3vga:
mov eax,[draw_data+32+0] ; x+Xwin
inc ebx ; y position
mov ecx,eax
mov edx,ebx
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
shl ecx,2 ; (x+Xwin)*BytesPerPixel
add ecx,edx ;
mov ebp,ecx ; store copy
add ecx,[0xfe80] ; +AddrLFB
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
add ebp,0xa0000 ; + VGABasePtr
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
call calculate_edi
cmp ebx,[draw_data+32+12] ; Y > yend
jg dp4vga
jmp dp3vga
dp4vga:
add esp,4
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
; ----------
vga_drawbackground_stretch:
push ebp
push eax
push ebx
push ecx
push edx
mov edx,dword [0x400000-8] ; B
add edx,dword [0x400000-8] ; +B
add edx,dword [0x400000-8] ; +B
push edx
mov eax,[draw_data+32+0] ; x start:=(x+Xwin)
mov ebx,[draw_data+32+4] ; y start:=(y+Ywin)
mov ecx,eax
mov edx,ebx
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
shl ecx,2 ; (x+Xwin)*BytesPerPixel
add ecx,edx ;
mov ebp,ecx ; store copy
add ecx,[0xfe80] ; +AddrLFB
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
add ebp,0xa0000 ; + VGABasePtr
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+AddrV
call calculate_edi
sdp3vga: ; MAIN LOOP
cmp [edi+0x400000],byte 1 ; ptrBuffer^<>byte(1)
je sybgpvga
jmp snbgpvga
sybgpvga:
push eax ; x
push ebx ; y
push ecx ; LFB address
mov eax,dword [0x400000-8] ; B
xor edx,edx
mov ebx,[esp+8] ; Xstart
mul ebx ; B*Xstart
xor edx,edx
mov ebx,[0xfe00] ; x screen width
div ebx ; B*Xstart/xwidth
lea esi,[eax+eax*2] ; *3
mov eax,dword [0x400000-4] ; H
xor edx,edx
mov ebx,[esp+4] ; Ystart
mul ebx ; H*Ystart
xor edx,edx
mov ebx,[0xfe04] ; y screen height
div ebx ; H*Ystart/yheight
xor edx,edx
mov ebx,[esp+12] ; B*3
mul ebx ;
add esi,eax
mov eax,[esi+0x300000] ; color
and eax,0xffffff
mov ecx, [esp] ; LFB address
mov ebx,eax ; copy color
mov [ecx],bx
shr ebx,16
mov [ecx+2],bl
xchg edi, ebp
mov ecx,[esp+8] ; x position
and ecx,0x07 ; x modulo 8
call setvgapixel ; eax=color, ecx=x%8, edi=VGA address
xchg ebp, edi ; ebp+=3
pop ecx
pop ebx
pop eax
snbgpvga:
inc eax ; x++
cmp eax,[draw_data+32+8] ; X > xend?
jg snodp3vga
test eax,0x07 ; x test modulo 8
jnz shook1vga
inc ebp ; VGA address++
shook1vga:
add ecx,4 ; LFB address += 4
inc edi ; ptrBuffer++
add esi,3 ; ptrImage+=3
jmp sdp3vga
snodp3vga:
mov eax,[draw_data+32+0] ; x+Xwin
inc ebx ; y position
mov ecx,eax
mov edx,ebx
imul edx, 640*4 ; (y+Ywin)*BytesPerScanLine
shl ecx,2 ; (x+Xwin)*BytesPerPixel
add ecx,edx ;
mov ebp,ecx ; store copy
add ecx,[0xfe80] ; +AddrLFB
;entry point in LFB >> ECX:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+Addr
shr ebp,5 ; change from 4 to 1/8 BytesPerPixel
add ebp,0xa0000 ; + VGABasePtr
;VGA start address >> EBP:=(y+Ywin)*BytesPerScanLine+X*BytesPerPixel+A
call calculate_edi
cmp ebx,[draw_data+32+12] ; Y > yend
jg sdp4vga
jmp sdp3vga
sdp4vga:
add esp,4
pop edx
pop ecx
pop ebx
pop eax
pop ebp
ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -