vga.inc

来自「Menuet 操作系统源代码。 非常难得的东西」· INC 代码 · 共 781 行 · 第 1/2 页

INC
781
字号
   
     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,[0xd000+32+0] ; x start:=(x+Xwin)
     mov ebx,[0xd000+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,[0xd000+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,[0xd000+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,[0xd000+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,[0xd000+32+0] ; x start:=(x+Xwin)
     mov ebx,[0xd000+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,[0xd000+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,[0xd000+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,[0xd000+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 + =
减小字号Ctrl + -
显示快捷键?