Положение подчеркивания символа (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
Содержание раздела