Использование функций 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(); } }