Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование видеоадаптеров EGA, VGA и SVGA.doc
Скачиваний:
138
Добавлен:
01.05.2014
Размер:
4.51 Mб
Скачать

Запись символа в текущей позиции курсора - функция 0Ah

Функция позволяет записать символ в текущей позиции курсора на любой странице видеопамяти. Как и в предыдущей функции, можно производить запись сразу нескольких одинаковых символов. Атрибуты символа не задаются, а используются их старые значения из предыдущих операций записи. После операции записи положение курсора не изменяется. Управляющие символы, такие как возврат каретки и перевод строки, не действуют и записываются в видеопамять, как обычные символы.

На входе:

AH

10h

AL

ASCII-код записываемого символа

BH

Номер страницы видеопамяти или цвет пикселов фона (для графического режима номер 13h)

BL

Цвет пикселов символа (для графического режима)

CX

Количество записываемых символов

На выходе:

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

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

Установка цветовой палитры (режимы 4,5,6) - функция 0Bh

Данная функция позволяет выбрать одну из двух стандартных цветовых палитр (см. таблицу 9.1). Функция используется для обеспечения совместимости с видеоадаптером CGA и предназначена для использования в текстовых режимах и графических режимах с низким разрешением.

Функция 0Bh имеет следующий формат вызова:

На входе:

AH

0Bh

BH

0, тогда

BL

Цвет фона и рамки (для графического режима) или цвет рамки (для текстового режима)

BH

1, тогда

BL

Номер палитры (0 или 1)

На выходе:

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

В следующей таблице описаны стандартные цветовые палитры для режимов 4, 5, 6:

Номер цвета

Палитра 0

Палитра 1

0

Цвет фона

Цвет фона

1

Зеленый

Синий

2

Красный

Фиолетовый

3

Желтый

Белый

Вывод пиксела - функция 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(); } }