Á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