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

       

Вывод пиксела - функция 0Ch


Использование функций BIOS для создания изображений, в частности для отображения отдельных пикселов, хотя и медленнее, чем прямая запись в видеопамять и программирование регистров, но более надежно с точки зрения совместимости для различных режимов и видеоадаптеров.

Функция используется в графических режимах для записи пиксела заданного цвета в любую страницу видеопамяти. Необходимо отметить, что у видеоадаптера CGA в графических режимах определена только одна страница видеопамяти. Значения цветов, которые можно использовать в различных режимах, перечилены в таблице 9.2:



Номер режима Используемые номера цветов
4,5 0 - 3
6 0 и 1
0Dh 0 - 15
0Eh 0 - 15
0Fh 0 и 1
10h 0 - 15

Цвета, соответствующие номерам цветов в таблице можно посмотреь в главе "Режимы работы видеоадаптеров".

Таблица 9.2 Возможные значения номеров цветов для различных режимов.

Формат вызова функции 0Ch представлен ниже:

На входе: AH = 0Ch - запись пиксела;

AL = номер цвета;

BH = номер страницы (для CGA не используется);

CX = координата X;

DX = координата Y.

На выходе: Не используются.

Если бит D7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции ИСКЛЮЧАЮЩЕЕ ИЛИ.

Заметим, что начало системы координат находится в левом верхнем углу экрана, а оси координат направлены следующим образом: ось X - вправо, ось Y - вниз. Далее, если особо не оговарено, мы всегда будем использовать эту систему координат.

// Демонстрация функций - выбора цветовой палитры и вывода // пиксела.

#include <dos.h> #include <stdio.h>

void main(void);

void main(void) {

union REGS inregs, outregs; unsigned char i, j;

// устанавливаем режим 4 видеоадаптера // (графический - 320х200, 4 цвета) inregs.h.ah = 0x0; inregs.h.al = 0x4;

int86( 0x10, &inregs, &outregs );

// устанавливаем цвет фона

inregs.h.ah = 0x0B; inregs.h.bh = 0x0; //устанавливаем цвет фона inregs.h.bl = 0x6; //номер устанавливаемого цвета фона

int86( 0x10, &inregs, &outregs );

for(i = 0; i < 2; i++) {

// устанавливаем цветовую палитру

inregs.h.ah = 0x0B; inregs.h.bh = 0x1; // установка палитры inregs.h.bl = i; // номер палитры

int86( 0x10, &inregs, &outregs );

// выводим массив точек

for(j = 0; j < 64; j++) {

// выводим на экран дисплея точку

inregs.h.ah = 0x0C; inregs.h.al = (unsigned char)(j / 16);// номер цвета inregs.x.cx = 0x10 + j; // x-координата точки inregs.x.dx = 0x10 + j; // y-координата точки

int86( 0x10, &inregs, &outregs ); } getch(); } }



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