Непосредственная работа с видеобуфером
Пример 5.15. Перемещение курсора по адресу, указанному в регистре di.
PosCur: call GetAdr; пересчет координат в адрес MovCur: PushReg <ds,ax,bx,dx>; сохранение используемых регистров mov ds, NulSeg; очистка сегментного регистра mov bx, di bx = адрес позиции в байтах shr bx, 01 преобразование байтов в слова mov ah, bh ah = старший байт адреса mov al, OEh al = номер регистра видеоконтроллера mov dx, [0463h] dx = базовый адрес видеоконтроллера out dx, ax запись старшего байта в регистр OEh mov ah, bl ah = младший байт адреса inc al al = номер следующего регистра out dx, ax запись младшего байта в регистр OFh PopReg <dx,bx,ax,ds> восстановление регистров ret возврат из подпрограммы
В примере 5.15 основные действия выполняют команды, первая из которых имеет метку Movcur. Для записи данных в регистры нужен базовый адрес (порт) видеоконтроллера, который хранится в слове 463h области данных BIOS. Для чтения содержимого этого слова в сегментный регистр ds копируется пустое слово Nuiseg, хранящееся в разделе данных задачи.
В регистре di должен находиться адрес байта, он копируется в регистр bx и уменьшается в два раза, в результате получается адрес слова, в котором должен быть расположен рисунок курсора. Этот адрес надо записать в регистры видеоконтроллера, имеющие коды ОЕЬ и OFh (14 и 15).
Для записи адреса в регистры видеокарты выполняются следующие действия. В регистр dx записывается адрес порта видеоконтроллера из слова 463h области данных BIOS. В al помещается код регистра (OEh или OFh), в который надо записать один из байтов адреса, а сам байт помещается в регистр ah. После этого команда out записывает байт в регистр видеокарты. Сначала записывается старший байт адреса в регистр OEh, а затем младший в регистр OFh.
После выполнения описанных действий восстанавливается сохраненное в стеке содержимое регистров и происходит возврат на вызывающий модуль.
Для перемещения курсора в конец выведенного текста после выполнения подпрограмм примеров 5.12 и 5.13 вызывается подпрограмма Movcur. После выполнения указанных подпрограмм регистр di содержит нужный адрес, и дополнительное обращение к подпрограмме GetAdr не требуется.
Установка активной страницы
Если по каким-то причинам вы не можете использовать функцию 05 прерывания int 10h, то в текст программы надо включить собственную подпрограмму аналогичного назначения.
Текст подпрограммы для смены активной страницы приведен в примере 5.16. Перед ее вызовом номер активной страницы указывается в регистре эх. Содержимое этой страницы появится на экране. Для вывода рисунка курсора на новую страницу используйте подпрограмму Poseur.
Пример 5.16. Установка активной страницы, указанной в регистре bх.
SelPag: PushReg <ds, ax, bx, dx> сохранение используемых регистров mov ds, NulSeg очистка регистра ds mov ax, [44Ch] ах = размер страницы в байтах mul Ы умножаем его на номер страницы mov bx, ax сохраняем результат в bx mov al, OCh al = номер регистра видеоконтроллера mov dx, [463h] dx = базовый адрес видеоконтроллера out dx, ax запись старшего байта адреса mov ah, bl ah = младший байт адреса inc al номер второго регистра видеокарты out dx, ax запись младшего байта адреса PopReg <dx,bx, ax,ds> восстановление регистров из стека ret возврат из подпрограммы
Для установки активной страницы надо старший и младший байты адреса ее начала записать в регистры ось и ooh (12 и 13). В примере 5.16 адрес вычисляется так же, как и в примере 5.11. Размер страницы выбирается из слова 44ch области данных BIOS, помещается в регистр ах и умножается на номер страницы, указанный в регистре bx. Полученный результат сохраняется в регистре bх, а его старший и младший байты записываются в регистры 0Ch и 0Dh. Способ записи такой же, как в примере 5.15, поэтому мы не будем повторяться.
Замечание о переносимости
При разработке видеоадаптера VGA IBM стандартизировала как состав регистров видеоконтроллера, так и способы их программирования. Стандарт распространяется на все режимы работы контроллера. Со временем более совершенные графические режимы SVGA потеснили режимы VGA, но текстовые режимы остались без изменений. Все современные видеокарты соответствуют стандартам как VESA, так и VGA IBM (одно не противоречит другому). Поэтому при работе в текстовых режимах задача может самостоятельно манипулировать с регистрами видеокарты без использования функций BIOS и оставаться при этом переносимой с одного компьютера на другой.
В случае частичного или полного отказа от использования функций BIOS вам придется самостоятельно разработать подпрограммы аналогичные тем, которые были описаны в данном разделе. При этом вы получите возможность более гибкого управления процессами ввода и вывода текста. Именно по этой причине текстовые редакторы, предназначенные для выполнения в среде DOS, используют собственные процедуры для работы с текстом.