Программирование видеоадаптеров CGA, EGA и VGA

       

В этом режиме отображается графическая


В этом режиме отображается графическая информация. Экран дисплея имеет разрешающую способность 640 пикселов по горизонтали и 200 пикселов по вертикали. Поддерживаются только два цвета. Для видеоадаптера CGA данный режим является режимом с максимальным разрешением.

В качестве дисплея могут использоваться цветной дисплей (CD), улучшенный цветной дисплей (ECD), дисплей VGA, а также некоторые многчастотные дисплеи.

Как и в предыдущих режимах, определена только одна страница экрана, имеющая начальный адрес B800:0000.

Если видеоадаптер VGA работает в режиме 6, то он использует двойное сканирование.



Режим 6 (640х200) является режимом наибольшего разрешения для видеоадаптера CGA.

На рисунке 5.2 отображено соответствие видеопамяти и пикселов экрана.

Как и в режимах 4 и 5, первая половина видеопамяти содержит данные относительно всех нечетных линий экрана, а вторая половина - относительно всех четных линий.

В данном режиме на один пиксел отводится один бит видеопамяти. Таким образом каждый байт видеопамяти управляет восьмью пикселами. Если значение бита видеопамяти, отвечающего за данный пиксел, равно нулю, то пиксел имеет черный цвет, если единице - белый. За верхний левый пиксел экрана отвечает бит D7 в нулевом байте видеопамяти, то есть самый старший его бит.



Рисунок 5.2 Структура видеопамяти в режиме 6.

При непосредственном доступе к видеопамяти вы можете воспользоваться следующими формулами:

Если y четное число, то смещение байта = 50h*(y/2)+(x/8) Если y нечетное число, то смещение байта = 2000h+50h*((y-1)/2)+(x/8)

Номер бита = 7-mod(x/8)

Эти формулы позволяют определить для пиксела, имеющего координаты (x,y), смещение от начала станицы видеопамяти байта и номер бита в нем, управляющего данным пикселом.



Теперь мы приведем программу, отображающую пикселы на экране через непосредственный доступ к видеопамяти. Стержнем этой программы является функция Pixel_Offs_6. Первые два ее параметра определяют координаты пиксела. Третий параметр - это указатель на смещение байта, определяющего пиксел в видеопамяти. Четвертый параметр определяет номер младшего из битов, который отвечает за данный пиксел. Заметим, что так как каждый байт в этом режиме определяет восемь пикселов, то при изменении одного пиксела надо позаботится о сохранении остальных семи пикселов.

#include "sysp.h"

void Pixel_Offs_6(unsigned x, unsigned y, unsigned *offset, unsigned char *shift) {

unsigned char bit_shift; unsigned byte_offset;

_asm {

; записываем в bx x-координату пиксела

mov bx,x

; запоминаем в регистре cl младший байт переменной x

mov cl,bl

; записываем в ax y-координату пиксела



Режим 6 (640х200) является режимом наибольшего разрешения для видеоадаптера CGA. Видеоадаптеры EGA и VGA используют для хранения информаци только нулевой цветовой слой.

На рисунке 6.9 отображено соответствие видеопамяти и пикселов экрана.

Как и в режимах 4 и 5, первая половина видеопамяти содержит данные относительно всех нечетных линий экрана, а вторая половина - относительно всех четных линий.

В данном режиме на один пиксел отводится один бит видеопамяти. Таким образом каждый байти видеопамяти управляет восьмью пикселами. Если значение бита видеопамяти, отвечающего за данный пиксел, равно нулю, то пиксел имеет черный цвет, если единице - белый. За верхний левый пиксел экрана отвечает бит D7 в нулевом байте видеопамяти, то есть самый старший его бит.



Рисунок 6.9 Структура видеопамяти в режиме 6.

При непосредственном доступе к видеопамяти вы можете воспользоваться следующими формулами:

Если y четное число, то смещение байта = 50h*(y/2)+(x/8) Если y нечетное число, то смещение байта = 2000h+50h*((y-1)/2)+(x/8)

Номер бита = 7-mod(x/8)

Данные формулы позволяют определить для пиксела, имеющего координаты (x,y), смещение от начала станицы видеопамяти байта и номер бита в нем, управляющего данным пикселом.


Содержание раздела