Иллюстрированный самоучитель по SVGA

Вывод текста с использованием поддержки DOS и BIOS

Вывод повторяющихся символов

Функции 09 и 0Ah хорошо подходят для вывода повторяющихся символов. В примере 5.5 приведен фрагмент программы, рисующий горизонтальную линию, в которой 132 раза повторяется один из символов псевдографики, имеющий код oc4h (или 196).

Пример 5.5. Построение горизонтальной линии с помощью функции 0Ah.

mov ah, OAh; код запрашиваемой функции BIOS
mov al, OC4h; код ASCII символа "-"
mov ex, 132; число повторений символа
int lOh; обращение к группе "Video Services"

При выполнении функции OAh записываются только коды символов в четные байты видеопамяти, поэтому цвет линии и фона, на котором она нарисована, зависит от значений ранее записанных атрибутов.

Если вам надо вывести символы вместе с атрибутами, то измените в примере 5.5 код функции на 09 и добавьте команду, записывающую в регистр bl нужный код атрибута. Например, для того чтобы на голубом фоне нарисовать белую линию, атрибут должен иметь код iFh.

Функции 09 и OAh не изменяют позицию курсора, поэтому их неудобно использовать при выводе строки текста. В этом случае вам придется хранить в области данных номера строки и столбца, соответствующие текущим координатам курсора, корректировать их после вывода каждого символа, а перед выводом символа обращаться к BIOS для перемещения курсора в позицию, соответствующую этим координатам.

Вывод строки текста

Для вывода последовательности символов лучше использовать функцию ОЕЬ, которая после записи кода символа в четный байт видеопамяти перемещает курсор вперед на следующую позицию на экране и корректирует сохраняемые в области данных BIOS текущие координаты курсора на используемой странице (см. пример 5.3).

Перед вызовом функции OEh в регистры записываются следующие величины:

  • в ah – код функции (ОЕЬ);
  • в ai – код выводимого символа (ASCII);
  • bh – не используется,
  • bl – атрибут (только для графических режимов).

Для вывода строки организуется цикл обращений к функции OEh. Управлять его повторами можно с помощью счетчика или повторять процесс вывода до обнаружения в строке специального признака, например символа $, или пустого байта (строка формата ASCIIZ).

В примере 5.6 цикл организован с использованием счетчика, в который перед входом в цикл помещается размер строки commun.

Пример 5.6. Вывод строки с использованием функции BIOS OEh.

lea si, commun; указываем адрес начала строки
mov ex, 48; задаем количество символов в строке
lp: lodsb; читаем в al очередной символ строки
mov ah, OEh; код запрашиваемой функции
int 10h; вывод очередного символа
loop lp; управление циклом

Раскрашивание текста

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

При однократном обращении к функции 09 можно очистить и окрасить выбранным вами цветом все рабочее пространство экрана монитора. Для этого надо переместить курсор в начало активной страницы и заполнить ее отображаемую часть кодами символа "пробел" и атрибута, соответствующего цвету символов и фона. Как это можно сделать, показано в примере 5.7, рассчитанном на выполнение при установленном режиме VESA I09h.

Пример 5.7. "Заливка" экрана синим цветом.

mov ах, 920h; ah = код функции, al = код символа "пробел"
mov bx, IFh; bh = О, Ы = код атрибута
mov сх, 132*25; сх = количество символов 132*25 = 3300
int 10h; обращение к BIOS

При выполнении примера 5.7 в нулевую страницу видеопамяти, начиная с позиции, соответствующей текущим координатам курсора, будет записано 3300 слов, каждое из которых содержит код iF20h. Если нулевая страница видеопамяти является активной, а курсор находится в ее левом верхнем углу, то все рабочее пространство экрана будет очищено от находившихся там символов и окрашено в синий цвет. После этого символы, выводимые на экран с помощью функции ОЕЬ, будут окрашены в белый цвет (напомним, что код атрибута iFh соответствует белым символам и синему фону). Исходные координаты курсора не изменяются.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.