⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vesa20.inc

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 INC
📖 第 1 页 / 共 2 页
字号:
   
   
     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
   
   
   
   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -