Вывод текста с использованием поддержки 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 соответствует белым символам и синему фону). Исходные координаты курсора не изменяются.