Skip navigation

Grafikus megjelenítés 16 bites módban

Áttekintés

A kódrészletek előre definiált konstansokat tartalmaznak, melyeket nem másoltunk ide. A teljes template programért lást Irvine lib, ch16, Mode13.asm. Egyéb kiegészítő információért lsd Kip Irvine Assembly for x86 7th edition, 16. fejezet, továbbá google
BIOS VESA módok. A VGA direct memory access azon alapul, hogy megfelelő portokra küldünk adatokat. Ahhoz, hogy hozzáférjünk a VGA memóriájához, először be kell állítani a VGA módot.


SetVideoMode PROC

    ; Saves the current video mode, switches to a
    ; new mode, and points ES to the video segment.
    
    mov ah,GET_VIDEO_MODE
    int 10h
    mov saveMode,al ; save it
    mov ah,SET_VIDEO_MODE
    mov al,MODE_13 ; to mode 13h
    int 10h
    push VIDE0_SEGMENT ; video segment address
    pop es ; ES points to video segment
    
    ret
    
SetVideoMode ENDP

Ekkor a megjelenítés át fog váltani 320x200-as pixel vezérelt 256 színű módra. Ez után lehetőségünk van a háttér beállítására. Vagy a pixelek egyesével történő állítgatására. Először ki kell választani a megfelelő portot (DX) aztán a palettát (AL), aztán a választást out-tal kiküldeni. Ez után kiválaszthatjuk a pixelek színét, aztán a helyét. A paletta és a szín marad amíg mást nem választunk.


SetScreenBackground PROC

    mov dx,VIDEO_PALLETE_PORT
    mov al,PALLETE_INDEX_BACKGROUND
    out dx,al
    
    ; Set the screen background color to dark blue.
    mov dx,COLOR_SELECTION_PORT
    mov al,0 ; red
    out dx,al
    mov al,0 ; green
    out dx,al
    mov al,35 ; blue (intensity 35/63)
    out dx,al
    
    ret
    
SetScreenBackground endp

A vga bufferbe egyesével kell kitenni a pixeleket. A helyét az ES:[DI] értéke mondja meg. A vga buffer egy 320x200 hosszú egydimenziós tömbként kezelendő, 0-tól indexelve 320x200-1-ig. A pixel színét a következő kóddal lehet beállítani.


    mov dx,COLOR_SELECTION_PORT
    mov al,63 ; red
    out dx,al
    mov al,63 ; green
    out dx,al
    mov al,63 ; blue
    out dx,al
    ; Calculate the video buffer offset of the first pixel.
    ; Method is specific to mode 13h, which is 320 X 200.

A helyét pedig:


    mov BYTE PTR es:[di],COLOR_INDEX

A DI regiszterben kell beállítani a 320x200-as tömb offsetjét, pl a következő módon:


    mov yVal,100
    mov ax,320 ; 320 for video mode 13h
    mul yVal ; y-coordinate
    add ax,xVAl ; x-coordinate

Itt hozzávetőleg a képernyő közepére fogja tenni a pixelt. Ezek után áttehetjük az AX-ből a DI-be az offsetet.


    ; DI is an offset from the segment address in DS.

Majd a program végén vissza kell állítani a videó módot az eredetire.


RestoreVideoMode PROC
    ; Waits for a key to be pressed and restores
    ; the video mode to its original value.

    mov ah,WAIT_FOR_KEYSTROKE
    int 16h
    mov ah,SET_VIDEO_MODE ; reset video mode
    mov al,saveMode ; to saved mode
    int 10h
    
    ret
    
RestoreVideoMode ENDP