Скачиваний:
34
Добавлен:
15.09.2014
Размер:
240.09 Кб
Скачать

Функция 09h (Запись символа с атрибутами в текущей позиции курсора)

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

На входе:

o AH = 09h - запись символа с атрибутом; o AL = ASCII-код записываемого символа; o BH = номер страницы видеопамяти;

oBL = атрибут (для текстового режима) или цвет (для графического режима);

o CX = число записываемых символов.

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

Если запись символа происходит на видеоадаптере EGA в графическом режиме, и бит 7 регистра BL содержит единицу, то новый символ накладывается на текущее содержимое экрана по логике булевой операции

XOR.

Пример: _AH = 0x09;

_AL = ch; / Записываемый символ

_BH = 0;

_BL = 8; / Атрибуты записываемого символа _CX = 1; / Количество записываемых символов geninterrupt(0x10);

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

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

На входе:

o AH = 10h - запись символа без атрибута; o AL = ASCII-код записываемого символа; o BH = номер страницы видеопамяти;

o BL = цвет (для графического режима); o CX = число записываемых символов;

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

Если запись символа происходит на видеоадаптере EGA в графическом режиме, и бит 7 регистра BL содержит единицу, то новый символ накладывается на текущее содержимое экрана по логике булевой операции

XOR.

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

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

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

Номер режима

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

4,5

0

– 3

6

0

и 1

0Dh

0

- 15

0Eh

0

- 15

0Fh

0

и 1

10h

0

- 15

Формат вызова функции 0Ch: На входе:

o AH = 0Ch - запись пиксела; o AL = номер цвета;

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

o DX = координата Y;

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

Если бит 7 регистра AL содержит единицу, то новый пиксел накладывается на текущее содержимое экрана по логике булевой операции XOR. Если он содержит 0, то переданное значение кода цвета переопределяет текущий код цвета пиксела на экране.

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

Пример: _AH = 0x0C; _AL = color; _CX = x; _DX = y;

geninterrupt(0x10);

Функция 0Dh (Чтение пиксела)

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

На входе:

o AH = 0Dh - определение цвета пиксела;

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

o DX = координата Y;

На выходе:

o AL = номер цвета пиксела.

Функция 0Fh (Определение текущего режима работы видеоадаптера)

Функция позволяет определить номер текущего режима работы видеоадаптера, номер активной страницы и количество символов в строке экрана. Список различных режимов приведен в Таблице 1. Формат вызова функции имеет следующий вид:

На входе:

o AH = 0Fh - определение текущего режима видеоадаптера;

На выходе:

o AH = число символов в строке; o AL = номер текущего режима;

o BH = номер активной страницы видеопамяти;

Запись напрямую в видеопамять

Альтернативным способом вывода информации на экран может быть использование видеобуфера. Таким образом, мы можем записать символ напрямую в видео память. Довольно просто доступ осуществляется при работе в 4,5,6 или 13 режиме (это уже отмечалось ранее). При работе в данных режимах прямо из программы можно обратится к видеопамяти. Начальный адрес видеопамяти для режимов 4,5,6 – b800:0000h, для режима 13h – a000:0000h, и все эти режимы поддерживают одну страницу видеопамяти.

Для примера осуществим вывод пиксела на экран для режима 13h. Пример:

……

offset = 320*y + x; _ES = 0xA000; *offset = color; …..

Переопределение таблицы знакогенератора.

Для вывода на экран любого изображения в графическом режиме работы видеоадаптера необходимо заставить светиться группу пикселов, которые будут составлять контур изображения на экране. Такой же метод необходимо применять и при выводе символов на экран. Обычно контур символа представлен матрицей m x n, где m и n – соответственно количество строк и столбцов, отводимых под формирование одного символа. Как уже упоминалось выше для вывода символа на экран можно воспользоваться функцией AH = 09h прерывания 10h.

Число строк и столбцов текстовой информации для каждого из графических режимов различно. При выводе текстовой информации в графическом режиме необходимо помнить о некоторых особенностях:

1.При работе с графическими режимами младше 13h при выводе символа функцией AH = 09h дополнительно учитывается значение бита 7 кода цвета. Если он равен 0 то пикселы, которые образуют контур символа, будут иметь код цвета заданный битами 0-6 BL. Остальные пикселы в пределах знакоместа (пикселы фона) будут иметь код цвета 0 (цвет фона). Если он равен 1 то цвет пикселов символа определяется операцией XOR текущего кода цвета пиксела с кодом цвета в битах 0 – 6 BL.

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

Первоначально рассмотрим принципы построения элементов таблицы знакогенератора, которые для всех графических режимов практически одинаковы. В качестве примера возьмем матрицу 8 х 8:

Карта

Номер

 

Байт

пикселов

телевизионной

таблицы

знакоместа

 

строки

знакогенератора

7 бит 0

 

 

 

00011000

1

0х18

 

00011000

2

0х18

 

00011000

3

0х18

 

11111111

4

0хFF

 

11111111

5

0xFF

 

00011000

6

0х18

 

00011000

7

0х18

 

00011000

8

0х18

 

Таким образом, был задан контур символа «+». Используя данный принцип построения, можно составить таблицу пользовательских символов.

Рассмотрим особенности вывода пользовательских символов в различных графических режимах BIOS.

При работе CGA режимах используется таблица знакогенератора, которая состоит из двух независимых частей. Символы, чьи ASCII коды меньше чем 128, рисуются при помощи таблицы хранящийся в ПЗУ. Символы с кодами от 128 до 255 выводятся при помощи таблицы на начало которой указывает вектор прерывания 1Fh (адрес - 0:7Сh). Если загрузить пользовательскую таблицу в память и записать адрес начала данной таблицы знакогенератора в таблицу векторов на место вектора прерывания 1Fh, то можно будет выводить сформированные символы в графическом режиме при помощи BIOS.

Если мы поместим байты из приведенного примера по смещению 0 от начала таблицы знакогенератора, то при выводе символа с кодом 128 в текущей позиции курсора будет изображено соответствующее очертание. Если байты поместить по смещению 8, сформированный символ будет иметь ASCII код

129.

Приведем пример:

#include <dos.h> #include <bios.h>

#include <conio.h>

struct address //структура для переопределения адреса таблицы знакогенератора

{

char far *p; };

struct address far * int_1f = (struct address far *)0x0000007cL; //установление указателя на адрес

//таблицы знакогенератора в

таблице векторов прерывания

char far * old_1f;

char *pic = "\x80"; // ASCII код 128 – т.е. элемент по смещению 0

char table[] = {

0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18 }; // переопределенный символ

void set_mode (int mode) //установление заданного режима

{

_AH = 0x00; _AL = mode;

geninterrupt(0x10);

}

void goto_xy(int x, int y) // переход на место с координатами х и у

{

_AH = 0x02; _DH = y; _DL = x;

geninterrupt(0x10);

}

void print_symvol(char *str, char atr) // вывод символа с заданными атрибутами

{

_AH = 0x09; _AL = *str; _CX = 1; _BL = atr;

geninterrupt(0x10);

}

main()

{

char *ptr;

set_mode(5); // установление 5 режима disable();

old_1f = int_1f -> p; // сохранение старого указателя на таблицу знакогенератора

int_1f -> p = (char far *)table; // установка указателя в таблице векторов //прерывания на пользовательскую таблицу

enable();

goto_xy(10,10); // переход на заданную позицию ptr = pic; // инициализация символа print_symvol(ptr, 3); // вывод символа

int_1f -> p = old_1f; // восстановление старого значения указателя getch();

return 0;

}

При работе со знакогенератором в EGA и VGA режимах используется функция 11h прерывания 10h BIOS. Для этой функции имеется ряд подфункций, значения которых необходимо устанавливать в регистр AL.

Так же как и при работе в CGA режиме, в EGA и VGA режимах контур символа задается матрицей 8х8, 8х14, 8х16 – в зависимости от заданного видеорежима. Единственное отличие при работе в EGA и VGA режимах состоит в том, что соответствующий вектор прерывания указывает на полную таблицу символов (256 символов ASCII), а не на старшие 128 знаков – как было при работе в CGA – режимах.

При работе в графических режимах 0Dh – 13h на адрес таблицы знакогенератора ссылается вектор 43h в таблице векторов прерывания.

В качестве примера покажем работу знакогенератора для режима 13h (маска 8х8; 256 цветов; формат текстового режима 40х25 строк)

#include <dos.h> #include <bios.h> #include <conio.h>

struct address

{

char far *p; };

struct address far * int_43h = (struct address far *)0x00000010cL; char far * tmp;

char *str1 = "\x80";

char table[] = { 0x18, 0x18, 0x18, 0xFF, 0xFF, 0x18, 0x18, 0x18, // Первый символ

0xFF, 0xC3, 0xA5, 0x99, 0x99, 0xA5, 0xC3, 0xFF // Второй

символ

};

void set_mode (int mode)

{

_AH = 0x00; _AL = mode;

geninterrupt(0x10);

}

void goto_xy(int x, int y)

{

_AH = 0x02; _DH = y; _DL = x;

geninterrupt(0x10);

}

void print_symvol(char *str, char atr)

{

_AH = 0x09; _AL = *str; _CX = 1; _BL = atr;

geninterrupt(0x10);

}

main()

{

char *ptr;

set_mode(19); disable();

tmp = int_43h -> p;

int_43h -> p = (char far *)(table - 1024); enable();

goto_xy(10,10); ptr = str1;

print_symvol(ptr, 3);

int_43h -> p = tmp; getch();

return 0;

}

Задание на лабораторную работу № 1.

Написать программу – заставку «Enter the Matrix». Работа должна производиться в текстовом режиме работы видеоадаптера. Символы выводятся сверху – вниз, цвет символа должен изменятся. Работа организуется или при помощи функций 10 прерывания или напрямую работаем с памятью. Набор символов используемых для реализации задания выдается преподавателем.

Задание на лабораторную работу № 2.

Необходимо вывести на экран 3-d объект (куб, пирамида и т.п.) и вращать его вокруг одной из осей. Тип объекта задается преподавателем. При работе должен использоваться графический режим работы видеоадаптера. Для прорисовки объекта на экране должны использоваться функции 10 прерывания. Направление вращения объекта задается при помощи стрелок курсора.

Соседние файлы в папке Видеоадаптер
  • #
    15.09.2014240.09 Кб34Lab1_2.pdf
  • #
    15.09.201485.45 Кб25Лабораторные работы.mht