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

📄 vga.inc

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