Рисуем пиксел в графическом режиме

Графические режимы могут быть разбиты на шесть групп в зависимости от количества бит, отводимых каждому пикселу:

1 бит/пиксел, 2 цвета, одна битовая плоскость:

CGA mode 6 разрешение 640*200

2 бит/пиксел, 4 цвета, одна битовая плоскость:

CGA mode 4 разрешение 320*200

4 бит/пиксел, 16 цветов, четыре битовых плоскости:

EGA mode 0Dh разрешение 320*200

EGA mode 0Eh разрешение 640*200

EGA mode 10h разрешение 640*350

VGA mode 12h разрешение 640*480

VESA mode 102h разрешение 800*600

VESA mode 104h разрешение 1024*768

VESA mode 106h разрешение 1280*1024

8 бит/пиксел, 256 цветов, одна битовая плоскость:

VGA mode 13h разрешение 320*200

VESA mode 100h разрешение 640*400

VESA mode 101h разрешение 640*480

VESA mode 103h разрешение 800*600

VESA mode 105h разрешение 1024*768

16 бит/пиксел, 65536 цветов, одна битовая плоскость(существуют также 32768-цветные режимы):

VESA mode 111h разрешение 640*480

VESA mode 114h разрешение 800*600

24 бит/пиксел, 16777216 цветов, одна битовая плоскость:

VESA mode 112h разрешение 640*480

Исключая 4-битные режимы пикселы в памяти располагаются на одной плоскости (plane), т.е., если координаты пиксела (x,y), то адрес, по которому располагается этот пиксел в памяти может быть вычислен как
Address = LineLength*y + Bits*x/8
где LineLength - количество байтов, занимаемых каждой строкой пикселов, а Bits - количество бит, занимаемым пикселом.

Исключениями являются режимы CGA номер 4 и 6, у которых четные и нечетные линии расположены в различных сегментах памяти.

В шестнадцатицветных режимах экранная память разделяется на 4 битовые плоскости. Каждый бит значения цвета пиксела расположен на своей плоскости. Адрес байта, хранящего пиксел с координатами x,y можно вычислить как
Address = LineLength*y + x/8
где LineLength - число байтов, занимаемых одной строкой.

Рисование пиксела с координатами x,y в 16-цветных режимах подразумевает установку бита во всех четырех плоскостях. Активная в данный момент плоскость выбирается записью в соответствующие порты видеокарты.

Режимы CGA, EGA и VGA поддерживаются всеми стандартными BIOS. Переключение в эти режимы обычно осуществляется простым вызовом функций BIOS.

Pixel$

Во всех режимах VGA следующая процедура Pixel$ может нарисовать пиксел. Нужно отметить, что процедура достаточно медленная, т.к. используются вызовы функций BIOS.

Pixel$ proc

;Рисует пиксел во всех режимах VGA.

;Входные данные: x в AX, y в BX, цвет в CX

;Выходные данные: регистры не сохраняются

mov DX,BX ;строка y

xchg AX,CX ;CX - колонка x, AL - цвет

sub BH,BH ;0 страница

mov AH,0Ch ;выводим пиксел

int 10h

ret

Pixel$ endp

Самый интересный режим VGA - это режим 13h с возможностью отображения 256 цветов и разрешением 320*200. Номер цвета 0...255 соответствуют значениям в палитре, где все цвета представлены в виде определенных сочетаний красной, зеленой и синей компонент. Далее процедура VGApxl$ рисует пиксел в этом режиме. Она работает достаточно быстро, однако существуют еще более быстрые варианты.

;данные:

VGA_seg dw 0A000h ;сегмент памяти экрана VGA

 

VGApxl$ proc

;Рисует пиксел в режиме VGA 13h.

;Входные данные: x в AX, y в BX, цвет в CX

;Выходные данные: регистры AX и BX не сохраняются

xchg BH,BL ;умножаем y на 256, BL=0

add AX,BX ;AX = x+256y

shr BX,1 ;делим 256y на два

shr BX,1 ;BX = 256y/4 = 64y

add BX,AX ;BX = x+320y

mov AX,ES ;сохраняем значение ES

mov ES,VGA_seg ;сегмент памяти экрана VGA

mov ES:[BX],CL ;выводим байт на экран

mov ES,AX ;восстанавливаем значение регистра ES

ret

VGApxl$ endp