Программирование видеоадаптеров

       

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


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