Программирование видеоадаптеров 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 } }


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