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

Высота символов текста (Max Scan Line Register - mslr) (индекс 9)

Регистр MSLR определяет высоту символов в пикселах. Значение регистра на единицу меньше, чем высота символов отображаемых на экране. Регистр MSLR используется только в текстовых режимах работы видеоадаптеров.

D4-D0 Биты задают высоту символа в пикселах (рис. 8.2 и 8.3).

D5 Бит 9 регистра начала импульса гашения вертикальной развертки (SVBR - индекс 15h). Используется только для видеоадаптеров VGA и SVGA.

D6 Бит 9 регистра сравнения линий (LCR индекс 18h). Используется только для видеоадаптеров VGA и SVGA.

D7 Бит управления двойным сканированием. Поддерживается только адаптерами VGA и SVGA. Если бит D7 равен единице, то в режимах, имеющих разрешение по вертикали 200 пикселов используется двойное сканирование. Это увеличивает разрешающую способность по вертикали до 400 пикселов.

Рисунок 4.2 демонстрирует использование регистра высоты символов текста. На левой половине рисунка символы шрифта имеют размер 8х8 пикселов, а регистр высоты символов содержит число семь. На правой половине рисунка, символы шрифта имеют размер 8х14, а значение регистра высоты символов текста равно тринадцати.

PICTURE._FIG_33.PCX;6";4.308";PCX

Рисунок 4.2 Высота символов текста 8 пикселов

Начальная линия курсора (Cursor Start Register - csr) (индекс 0Ah)

Регистр CSR является доступным как для чтения, так и для записи. Регистр определяет линию сканирования символа, в которой начинается курсор. Вместе с регистром конечной линии курсора (CER) регистр CSR определяет размер и форму курсора.

D4-D0 Начальная линия курсора. (Рис. 4.3).

D5 Бит гашения курсора. Реализован только для видеоадаптеров VGA и SVGA. Если бит D5 содержит единицу, тогда текстовый курсор гаснет.

D7-D6 Не используются.

При установке режима работы видеоадаптера, BIOS загружает в регистр CSR следующие значения:

Режим

0,1,2,3

4,5,6,D,E,F,10

7

Содержимое регистра

06

00

0Bh

Конечная линия курсора (Cursor End Register - cer) (индекс 0Bh)

Этот регистр, также как и регистр CSR, является доступным для чтения и для записи. Регистр задает линию сканирования символа, в которой кончается курсор.

D4-D0 Соответствует номеру последней линии курсора для видеоадаптеров VGA и SVGA (рис. 4.3). Для видеоадаптера EGA - номеру следующей линии.

D6-D5 Отклонение курсора. Задает смещение курсора относительно позиции, определенной регистром CLR. 00 - нет отклонения 01 - отклонение вправо на один символ 10 - отклонение вправо на два символа 11 - отклонение вправо на три символа

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

При установке режима работы видеоадаптера BIOS загружает в регистр конечной линии курсора следующие значения:

Режим

0,1,2,3

4,5,6,D,E,F,10

7

Содержимое регистра

07

00

0Ch

Изменяя значение регистров начальной и конечной линии курсора, можно менять его положение и размер (рис. 4.3). На левой части рисунка, приведенного ниже, регистр начальной линии курсора равен 0Ah, регистр конечной линии курсора равен 0Bh. На правой части рисунка значение регистров изменено. Регистр начальной линии равен 4, а регистр конечной линии - 5.

PICTURE._FIG_35.PCX;6";4.308";PCX

Рисунок 4.3 Изменение положения курсора

Следующая программа позволяет прочитать значение регистров начальной и конечной линии курсора:

Листинг 4.4. Файл GETCURS.C

#include <stdio.h> #include <conio.h> #include "sysp.h" // см. листинг 3.2 #include "sysgraph.h" // см. листинг 3.3 // Описания функций void main(void); void WriteReg(unsigned reg, unsigned char data); unsigned char ReadReg(unsigned reg); // Главная функция void main(void) { char top = 0, bottom = 0; unsigned crt_address; BIOS_VAR _far *bios_var_ptr; // Получаем указатель на область переменных BIOS bios_var_ptr = (BIOS_VAR _far *) FP_MAKE(0x0000, 0x0410); // Определяем адрес индексного регистра контроллера ЭЛТ crt_address = bios_var_ptr->wAddrCRT; // Считываем значения регистров начальной и конечной линии // курсора // Выбираем регистр начальной линии курсора WriteReg(crt_address++, 0x0A); // Считываем значение регистра top = (unsigned char) ReadReg(crt_address--); // Выбираем регистр конечной линии курсора WriteReg(crt_address++, 0x0B); // Считываем значение регистра bottom = (unsigned char) ReadReg(crt_address); // Отображаем на экране значение регистров printf("\nРегистр начальной линии курсора содержит: %d\n" "\nРегистр конечной линии курсора содержит: %d\n", top, bottom); getch(); }

Для доступа к регистрам видеоадаптера мы пользуемся функциями WriteReg и ReadReg, определенными в файле DESIGN.C (листинг 4.5).

Листинг 4.5. Файл DESIGN.C

//========================================================= // WriteReg(unsigned reg, unsigned char data) // Функция выводит данные в порт // // Параметры: // reg - номер порта // data - данные, записываемые в порт reg //========================================================= void WriteReg(unsigned reg, unsigned char data) { _asm { mov dx,reg mov al,data out dx,al } } //========================================================= // unsigned char ReadReg(unsigned reg) // Функция читает данные из определенного порта // // Параметры: // reg - номер порта // // Возвращаемое значение: // данные, считанные из порта reg //========================================================= unsigned char ReadReg(unsigned reg) { unsigned char data; _asm { mov dx,reg in al,dx mov data,al } return(data); }