Установка графического режима производится с помощью функции 0 прерывания 10h. Номер графического режима задается в регистре AL. Таким образом, чтобы задать графический режим 13h, характеризующийся тем, что в нем имеется 256 цветов и тем, что в этом режиме размеры экрана 320´200, достаточно выполнить команды:
mov ax,13h ;AH=0, AL=13h
int 10h
В этом режиме пикселы (x, y) имеют координаты 0 £ x £ 320, 0 £ y £ 200. Координаты отсчитываются от левого верхнего угла, имеющего координаты (0, 0). Координаты правого нижнего угла равны (319, 199). Каждой точке экрана соответствует байт в памяти ЭВМ. Экран отображается на область памяти, имеющей адрес A0000h, как это показано на рис. 6.1. Цвет точки экрана, имеющей координаты (x, y), хранится по адресу
A0000h + 320y + x.
Для вывода точки в позицию (x, y) достаточно цвет этой точки записать по адресу A0000h + 320y + x
Перед установкой графического режима следует запомнить текущий режим работы видеоадаптера, с тем, чтобы в конце работы программы его восстановить. Получение информации о текущем режиме производится с помощью команд
mov ah,0Fh ;чтение номера режима
int 10h ;в регистр AL
push ax ;сохранение режима в стек
После того, как графические данные будут выведены на экран, надо подождать, например, нажатия любой клавиши, а затем восстановить режим:
mov ax,0 ;ожидание ввода
int 16h ;символа с клавиатуры
pop ax ;восстановление
mov ah,0 ;режима из AL
int 10h
Пример 1. Вывод круга радиусом 100 в центре экрана. Поскольку точки круга описываются неравенством
,
где (xc, yc) – координаты центра, а R – его радиус, то для вывода круга достаточно пробежать все точки экрана, имеющие координаты 0 £ x £ 320, 0 £ y £ 200 и вывести те, для которых справедливо неравенство:
Получаем программу:
< 1 > title ucircle.com
< 2 > codesg segment
< 3 > assume cs:codesg, ds:codesg, ss:codesg
< 4 > org 100h
< 5 > main proc
< 6 > mov ah,0Fh ;сохранение
< 7 > int 10h ;видеорежима
< 8 > push ax
< 9 > mov ax,0013h ;установка
< 10 > int 10h ;графического режима
< 11 > mov ax,0A000h ;установка es
< 12 > mov es,ax ;на видеопамять
< 13 > sub di,di
< 14 > mov bx,0 ;y
< 15 > mov cx,0 ;x
< 16 > a50:
< 17 > mov dx,0
< 18 > mov ax,cx ;x
< 19 > sub ax,160 ;x-xC
< 20 > mul ax ;(x-xC)^2
< 21 > mov si,ax
< 22 > mov ax,bx ;y
< 23 > sub ax,100
< 24 > mov dx,0
< 25 > mul ax ;(y-yC)^2
< 26 > add ax,si
< 27 > cmp ax,10000 ;ax > R*R ?
< 28 > ja a40 ;если да
< 29 > mov es:[di],byte ptr 15 ;вывод точки
< 30 > a40:
< 31 > inc di
< 32 > inc cx
< 33 > cmp cx,320
< 34 > jne a50
< 35 > mov cx,0
< 36 > inc bx
< 37 > cmp bx,200
< 38 > jl a50
< 39 > mov ax,0
< 40 > int 16h
< 41 > pop ax
< 42 > mov ah,0
< 43 > int 10h
ret
< 1 >
< 2 > main endp
< 3 > codesg ends
< 4 > end main
В графическом режиме 13h предусмотрено 256 цветов точек на экране. Начальные 16 цветов кодируются четырехразрядными числами IRGB, где биты, равные 1, показывают, присутствуют ли данные цвета (R – красный, G – зеленый, B – синий) в смеси цветов, соответствующей этим кодам. Значение I = 0 означает слабую интенсивность цвета, а I = 1 делает цвет ярким. Получаем следующие смеси для цвета, находящегося в диапазоне от 0 до 15.
0. черный 1. синий (голубой) 2. зеленый 3. голубой (бирюзовый) 4. красный 5. вишневый (ярко-красный) 6. коричневый 7. белый (светло-серый) |
8. серый (темно-серый) 9. ярко-синий (светло-голубой) 10. ярко-зеленый (светло-зеленый) 11. ярко-голубой (светло-бирюзовый) 12. ярко-красный (светло-красный) 13. ярко-вишневый (светло-ярко-красный) 14. желтый 15. ярко-белый (белый) |
Во всех графических режимах для вывода точки на экран можно использовать функцию 0Ch прерывания 10h. Входные данные для вывода точки этим способом следующие:
AH = 0Ch,
AL = цвет пиксела,
BH = видеостраница, обычно 0,
CX = координата x,
DX = координата y.
Например, в режиме 12h (640´480) зеленая точка в центре экрана выводится следующим образом:
mov ah,0Ch ;функция
mov al,2 ;цвет
mov x,320 ;координаты
mov dx,240 ;центра экрана
int 10h ;вызов обслуживающей подпрограммы
Отсюда следует, что в приведенном выше примере команду записи цвета по адресу es:[di] можно заменить командами:
mov ah,0Ch
mov al,15 ;цвет белый
mov dx,bx ;y
int 10h
с учетом того, что bh = 0, ибо bx < 200, а в cx уже записана координата x.