Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Программирование видеоадаптеров.

© Александр Фролов, Григорий Фролов
Том 21, М.: Диалог-МИФИ, 1993.

[Назад] [Содеожание] [Дальше]

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

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

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

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

На входе:

AH

0Ch

 

AL

Номер цвета (значение ячейки видеопамяти, соответствующее пикселу)

 

BH

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

 

CX

Координата X пиксела

 

DX

Координата Y пиксела

На выходе:

 

Не используются

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

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

Номер режима

Используемые номера цветов

4, 5

0 - 3

6

0 и 1

0Dh

0 - 15

0Eh

0 - 15

0Fh

0 и 1

10h

0 - 15

 

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

Программа, представленная в листинге 5.2, демонстрирует использование функций выбора цветовой палитры и вывода пиксела.

Листинг 5.2. Файл BIOS_C.C


#include <dos.h>
#include <stdio.h>
#include <conio.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);

			// X-координата точки
			inregs.x.cx = 0x10 + j;
			// Y-координата точки
			inregs.x.dx = 0x10 + j;	

			int86( 0x10, &inregs, &outregs );
		}
		getch();
	}
}
[Назад] [Содеожание] [Дальше]