Графические устройства

         

Вычисление адреса на указанной странице



Пример 5.11. Вычисление адреса на указанной странице

GetAdr: Push =!.ед <ds, bx> сохранение регистров
mov ds , NulSeg очистка регистра ds
shl bx , 01 удвоение номера страницы
mov bx , [bx + 450h] Ы = столбец, bh = строка
mov ax , [44Ah] количество символов в строке
mul bh ах = размер строки номер строки
xor bh , bh очистка байта bh
add ax , bx прибавляем к ах номер столбца
shl ax , 01 удваиваем полученный результат
mov di , ax и сохраняем его в dx
mov ax , [44Ch] ах = размер страницы
pop bx восстанавливаем номер страницы
mul bl ах = смещение страницы в буфере
add di , ax вычисляем полный адрес
pop ds восстановление ds
ret возврат из подпрограммы

Напоминаем, что команды lodsb и stosw корректируют содержимое индексного регистра.

Поясним способ доступа к области данных BIOS. Она расположена в нулевом сегменте оперативной памяти. Для доступа к нулевому сегменту надо очистить один из сегментных регистров, лучше, если это регистр ds. В разделе данных задачи надо зарезервировать пустое слово с именем Nuiseg и при выполнении подпрограммы копировать его в ds.

Перед вызовом подпрограммы GetAdr значения координат должны быть указаны в слове BIOS, соответствующем нужной странице. Если задача не работает со страницами, точнее работает только с нулевой страницей, то координаты курсора хранятся в слове 450h. При этом из текста примера 5.11 надо исключить вычисление адреса слова и смещения страницы от начала сегмента видеопамяти.

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

Замечание 1
Замечание 1

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

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



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