Some Basic Graphics
Switching Screen Modes
The interrupt used for switching between screen modes, and for all graphics work is interrupt 10h. Subfunction 0 of this interrupt sets the screen mode, depending upon the value of the number in the AL register. A list of the basic graphics modes are given below.
text |
graphics |
||||||||
text |
graphics |
||||||||
text |
graphics |
||||||||
text |
graphics |
||||||||
graphics |
graphics |
||||||||
graphics |
graphics |
||||||||
graphics |
graphics |
When writing programs which use graphics, one should remember to return the display to text mode just before the program finishes. Mode 3 is a standard mode, which is appropriate for most programs to switch to before ending. The following is a stub of code which switches the display to graphics modes (640 x 480 x 16) and then back to text mode again before ending.
;========================================= ; Basic program to change graphics modes ;========================================= mov ah,00 ;subfunction 0 mov al,18 ;select mode 18 (or 12h if prefer) int 10h ;call graphics interrupt ;==== Graphics code here ==== mov ah,00 ;again subfunc 0 mov al,03 ;text mode 3 int 10h ;call int mov ah,04ch mov al,00 ;end program normally int 21h |
Displaying and Reading Back Pixels – Simply
The displaying and reading back of pixels on the screen is again simply done using interrupts. The interrupt in question is again int 10h, this time subfunctions 0Ch and 0Dh or decimal 12 and 13. The first of these displays a pixel on the screen at any resolution (provided a graphics mode) at the co-ordinates specified by the values in the cx and dx registers. The colour value is specified in the al register. The second function reads the value of the pixel in memory again given by cx and dx, except this time it returns the colour in al. Below is a sample program which will display a square in blue in the middle of the screen.
jmp start ;========================================= ; Basic program to draw a rectangle ;========================================= mode db 18 ;640 x 480 x_start dw 100 y_start dw 100 x_end dw 540 y_end dw 380 colour db 1 ;1=blue ;========================================= start: mov ah,00 ;subfunction 0 mov al,mode ;select mode 18 (or 12h if prefer) int 10h ;call graphics interrupt ;========================== mov al,colour ;colour goes in al mov ah,0ch mov cx, x_start ;start drawing lines along x drawhoriz: mov dx, y_end ;put point at bottom int 10h mov dx, y_start ;put point on top int 10h inc cx ;move to next point cmp cx, x_end ;but check to see if its end jnz drawhoriz drawvert: ;(y value is already y_start) mov cx, x_start ;plot on left side int 10h mov cx, x_end ;plot on right side int 10h inc dx ;move down to next point cmp dx, y_end ;check for end jnz drawvert ;========================== readkey: mov ah,00 int 16h ;wait for keypress ;========================== end: mov ah,00 ;again subfunc 0 mov al,03 ;text mode 3 int 10h ;call int mov ah,04ch mov al,00 ;end program normally |