Программирование видеоадаптеров CGA,EGA и VGA

         

Положение подчеркивания символа (ULR) (индекс14h)


Регистр ULR используется только в текстовых режимах. Он определяет положение подчеркивания символа. Подчеркивание предстовляет собой одну из линий в матрице символа. Подчеркивание отображается, если установлен атрибут подчеркивания. Отображение подчеркивания можно запретить, записав в регистр ULR величину большую, чем высота символов.
  • D4-D0 Определяют положение подчеркивания символа (0-13).
  • D5 Для VGA установка этого бита означает, что для каждого знакоместа счетчик адреса регенерации будет увеличиваться на 4 вместо 1.
  • D6 Установка для VGA этого бита выбирает адресацию видеопамяти по двойным словам.
  • D7 Не используется.

Программа, приведенная ниже, использует регистры контроллера ЭЛТ для перевода видеоадаптеров EGA и VGA в нестандартный текстовый режим, имеющий разрешение по вертикали 43 строки. Данная программа переводит видеоадаптер в текстовый режим с разрешением по вертикали 43 символа и затем отображает на экране диспля 43 строки текста. #include <graph.h> void Set43Line(void); void main(void) { int i; // устанавливаем текстовый режим, принятый по умолчанию; // функция _setvideomode определена в графической библиотеке // трансляторов Microsoft Quick C 2.5 и C 6.0 _setvideomode(_DEFAULTMODE); // перепрограммируем видеоадаптер для отображения 43 строк Set43Line(); // выводим на экран дисплея 43 строки текста


for(i = 0; i < 43; i++) printf("text line number %d\n", i); getch(); // восстанавливаем режим с 25 текстовыми строками _setvideomode(_DEFAULTMODE); } /** *.Name Set43Line * *.Title Установка текстового режима, использующего 43 строки. * *.Descr Переводит адаптеры EGA и VGA в режим отображения 43 * строк текста. * *.Proto void Set43Line(void) * *.Params Отсутствуют. * * *.Return Не используется. * *.Sample 43line.c **/ void Set43Line(void) { #define CHAR_SIZE 8 // новая высота символов _asm { ; устанавливаем регистр es на начало оперативной памяти xor ax,ax mov es,ax ; получаем адрес порта индексного регистра контроллера ЭЛТ ; (3B4h/3D4h), ; в монохромных режимах для адресации к индексному регистру ; используется порт с адресом 3B4h, а в цветных - порт 3D4h mov dx,es:[463h] ; выбираем для обмена регистр максимальной линии сканирования ; этот регистр задает высоту символов на экране дисплея mov al,9 out dx,al ; вычисляем адрес порта регистра данных контроллера ЭЛТ, ; в монохромных режимах для адресации к регистру данных ; используется порт с адресом 3B5h, а в цветных - порт 3D5h inc dx ; биты D4-D0, регистра максимальной линии сканирования содержат ; число, меньшее на единицу, чем высота символов в пикселах mov al,CHAR_SIZE-1 out dx,al ; вычисляем адрес порта индексного регистра контроллера ЭЛТ dec dx ; выбираем для обмена регистр положения подчеркивания mov al,14h out dx,al ; вычисляем адрес порта регистра данных контроллера ЭЛТ inc dx ; определяем положение подчеркивания символов mov al,CHAR_SIZE out dx,al ; вычисляем адрес порта индексного регистра контроллера ЭЛТ dec dx ; выбираем для обмена регистр завершения отображения ; вертикальной развертки ; регистр завершения отображения вертикальной развертки ; содержит восемь младших бит, определяющих число отображаемых ; горизонтальных линий растра минус один mov al,12h out dx,al ; вычисляем адрес порта регистра данных контроллера ЭЛТ inc dx ; для отображения 43 текстовых символов, при высоте символов ; 8 пикселов, необходимо иметь 43 * 8 = 344 горизонтальных ; линий растра ; помещаем в регистр завершения отображения вертикальной ; развертки младшие 8 бит числа 344 mov al,(43 * CHAR_SIZE - 1 - 256) out dx,al ; устанавливаем новые значения переменных BIOS ; число символов в строке равно восьмидесяти mov WORD PTR es:[44Ah],80 ; число строк текста минус один mov BYTE PTR es:[484h],(350/CHAR_SIZE)-1 ; высота символов в пикселах mov WORD PTR es:[485h],CHAR_SIZE ; загружаем нулевую таблицу знакогенератора, расположенную во втором ; цветовом слое, набором символов (размера 8х8 пикселов) из ПЗУ BIOS ; процесс загрузки шрифтов более подробно описан в разделе "Загрузка ; таблиц знакогенератора" из главы "Дополнительные средства BIOS для ; управлния EGA и VGA" mov ax,1112h xor bl,bl int 10h } }



Содержание раздела