6.1. Графический режим

Установка графического режима производится с помощью функции 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.