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

         

Группа подпрограмм для перемещения курсора



Пример 6.13. Группа подпрограмм для перемещения курсора

Mothor: add Xpointer, bx изменение значения Xpointer
jmp short setpos обход следующей команды
Motver: add Ypointer, bx изменение значения Ypointer
setpos: mov ex, Xpointer сх = Xpointer
mov dx, Ypointer dx = Ypointer
Mouse 4 установка новых значений счетчиков
; Перемещение изображения j сказателя мыши на экране
Motion: call Hidepnt гасим курсор
mov ax, horsize помещаем в ах ширину экрана
mul Ypointer умножаем ах на номер строки
add ax, Xpointer прибавляем номер столбца
adc dx, 00 учитываем возможность переполнения
; В режимах direct color pезультат надо умножить на размер кода точки
mov Offspnt, ax сохраняем смещение в Offspnt
mov ax, GrUnit помещаем в ах значение GrUnit


mul dl вычисляем номер окна
add ax, Base win ! ! учитываем значение базового окна
mov Winpnt, ax сохраняем в Winpnt
call Showpnt рисуем изображение курсора
ret возврат из подпрограммы

Подпрограммы примера 6.13 рассчитаны на выполнение в режимах PPG. Если вы будете использовать их в режимах direct color, то результат полученный после выполнения команды adc dx, oo надо умножить на размер кода точки. В тексте примера об э.том напоминает комментарий.

В видеорежимах Hi-Color код точки занимает 2 байта. Для умножения на 2 после команды adc dx, oo надо вставить следующие команды:

shld dx, ax, 1 ; сдвиг dx с добавлением старшего разряда ах
shl ах, 1 ; сдвиг содержимого ах на разряд влево

Первая команда сдвигает содержимое регистров dx:ax как одно двойное слово, но изменяет только содержимое dx, в который записывается старшая часть результата.

Поэтому для сдвига содержимого регистра ах нужна дополнительная команда.

В видеорежимах True color код точки занимает 4 байта. Для умножения на 4 в командах сдвига надо заменить 1 на 2.

shld dx, ax, 2 ; сдвиг dx с добавлением старших разрядов ах
shl ax, 2 ; сдвиг содержимого ах на два разряда влево

Если код точки занимает три разряда (см. раздел), то вместо сдвигов придется использовать умножение на 3.

Можно составить такой вариант программы, который учитывает размер кода точки при выполнении сдвига. Этот размер формируется в процессе выполнения подготовительных действий и хранится в специально выделенной переменной wrdppnt (см. раздел). Подпрограмма перемещения может работать либо с этой переменной, либо с дополнительным параметром, содержащим величину сдвига.

Важно
Команда add ax, Base_win нужна, только если задача поддерживает работу со страницами видеопамяти (см. раздел), в остальных случаях ее надо исключить из текста примера.



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