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

Непосредственная работа с видеобуфером

Запись текста в видеопамять

Мы приведем пример подпрограммы, которая записывает-в видеопамять коды символов строки вместе с атрибутом, общим для всех символов, а затем покажем, как ее надо изменить для записи только кодов символов или только кодов атрибутов.

Замечание
Напомним, что регистр es должен содержать код видеосегмента, который в текстовых режимах равен B800h
.

Текст подпрограммы показан в примере 5.12. Перед обращением к ней надо вычислить адрес видеопамяти и поместить его в регистр di, например, с помощью подпрограммы Примера 5.11. Адрес начала выводимого текста указывается в регистрах ds:si, количество выводимых символов помещается в регистр сх, а код общего для всех символов атрибута – в регистр bl.

Пример 5.12. Запись символов строки с одинаковым.

OutLine: push ax сохраняем содержимое ах mov ah, Ы помещаем атрибут в ah
wrt: lodsb читаем в al очередной символ
stosw пишем ах в видеобуфер
loop wrt управление повторами цикла
pop ax восстанавливаем содержимое ах
ret возврат из подпрограммы

При выполнении примера 5.12 указанный в ы атрибут копируется в регистр ah. Далее в цикле wrt каждый символ строки копируется в регистр ai и содержимое регистра ах записывается в видеопамять.

В примерах 5.13 и 5.14 показано, как изменится подпрограмма outLine, если в видеопамять записываются только коды символов или атрибуты.

Пример 5.13. Запись символов строки без атрибутов.

OutSym: movsb; копирование символа в четный байт
inc di; пропуск нечетного байта
loop outsym; управление повторами цикла
ret; возврат из подпрограммы

Пример 5.14. Раскрашивание символов, находящихся в видеопамяти.

OutAtr: push ax сохраняем содержимое ах
mov ai, Ы помещаем атрибут в al
wrtatr: inc di пропускаем четный байт
stosb записываем код атрибута
loop wrtatr управление повторами цикла
pop ax восстанавливаем содержимое ах
ret возврат из подпрограммы

При обращении к подпрограмме OutAt r в регистре di указывается адрес видеопамяти, в регистре bl– атрибут, а в сх – сколько раз его надо записать в видеопамять (количество раскрашиваемых символов).

Перемещение курсора

Если задача использует текстовый курсор, то для его перемещения можно использовать функцию 02 прерывания int ion, или составить свою подпрограмму. Такая подпрограмма полезна, например, в тех случаях, когда недопустимо использование поддержки BIOS.

В примере 5.15 приведена подпрограмма перемещения курсора, к которой можно обратиться по двум именам. При обращении по имени Poseur происходит обращение к описанной в Примере 5.11 подпрограмме GetAdr, которая пересчитывает координаты в адрес и помещает его в регистр di. В этом случае номер страницы указывается в регистре bх, а значения координат выбираются из области данных BIOS. При обращении по имени MovCur адрес байта должен находиться в регистре di.

Замечание
Не забывайте, что курсор будет виден только в том случае, когда его рисунок расположен на активной странице
.

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