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

         

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



Пример 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 не требуется.



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