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