Непосредственная работа с видеобуфером
Запись текста в видеопамять
Мы приведем пример подпрограммы, которая записывает-в видеопамять коды символов строки вместе с атрибутом, общим для всех символов, а затем покажем, как ее надо изменить для записи только кодов символов или только кодов атрибутов.
Замечание
Напомним, что регистр 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.
Замечание
Не забывайте, что курсор будет виден только в том случае, когда его рисунок расположен на активной странице.