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

Положение подчеркивания символа (Underline Location Register - ulr) (индекс 14h)

Регистр ULR используется только в текстовых режимах. Он определяет положение подчеркивания символа. Подчеркивание представляет собой одну из линий в матрице символа. Подчеркивание отображается, если установлен атрибут подчеркивания. Подчеркивание можно запретить, записав в регистр ULR величину большую, чем высота символов.

D4-D0 Определяют положение подчеркивания символа.

D5 Для видеоадаптеров VGA и SVGA установка этого бита означает, что для каждого знакоместа счетчик адреса регенерации будет увеличиваться на 4 вместо 1.

D6 Установка для видеоадаптеров VGA и SVGA этого бита выбирает адресацию видеопамяти по двойным словам.

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

Программа, приведенная ниже, использует регистры контроллера ЭЛТ для перевода видеоадаптеров EGA и VGA в нестандартный текстовый режим, имеющий разрешение по вертикали 43 строки. Данная программа переводит видеоадаптер в текстовый режим с разрешением по вертикали 43 символа и затем отображает на экране монитора 43 строки текста.

Листинг 4.7. Файл MORESTR.ASM

#include <conio.h> // Описания функций void main(void); // Функция Set43Line опреелена в файле SET43.ASM // (листинг 4.8) void __pascal _far Set43Line(void); // Главная функция void main(void) { int i; // Увеличиваем количество отображаемых строк текста Set43Line(); // Отображаем на экране монитора несколько текстовых строк for(i = 0; i < 50; i++) printf("Text line number %d\n", i); getch(); return; }

Основная функция программы MORESTR - функция Set43Line определена в файле SET43.ASM. Исходный текст файла помещен в листинге 4.8.

Листинг 4.8. Файл SET43.ASM

TITLE SET43.ASM NAME SET43 PAGE 55,132 P286 IDEAL NOWARN BRK SEGMENT LINE_TEXT WORD PUBLIC 'CODE' ASSUME cs:LINE_TEXT ;============================================================ ; void Set43Line(void) ; Переводит адаптеры EGA и VGA в режим отображения 43 ; строк текста. ;============================================================ CHAR_SIZE EQU 8 PUBLIC SET43LINE PROC SET43LINE FAR enter 0, 0 ; Устанавливаем регистр 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 mov ax,1112h xor bl,bl int 10h leave ret ENDP SET43LINE ENDS LINE_TEXT END