Mousm: mov ах, data ax = значение сегмента данных
mov ds , ах установка сегмента данных
mov es, Vbuff установка сегмента видеобуфера
inc curmp ! ! счетчик перемещений курсора
mov Xpointer, ex сохранение нового значения
mov Ypointer, dx сохранение нового значения
mov ax, dx ах = номер строки
mui horsize dx:ax = Ypointer*horsize
add ax, ex прибавляем к ах номер столбца
adc dx, 00 учитываем возможность переполнения
xchg ax, dx переставляем содержимое ах и dx
mov byte ptr GrUnit ах = al*GrUnit
add ax, Base win ! ! учитываем значение базового окна
test pntstat, 01 проверка состояния курсора
je msmx -> курсор удален с экрана
Выполнение подпрограммы начинается с восстановления содержимого сегментных регистров ds и es, поскольку оно было изменено драйвером. Далее расположена команда, увеличивающая значение переменной curmp на 1. Она нужна для того, чтобы задача могла определить, перемещайся курсор или нет. Если при выполнении вашей задачи такая информация не нужна, то просто исключите команду из текста подпрограммы.
Затем новые значения координат присваиваются переменным xpointer н Ypointer и пересчитываются в адрес видеопамяти. В отличие от примера 6.13 вычисленные величины сразу не присваиваются переменным offspnt и winpnt, а сохраняются в регистрах dx и ах. Это делается потому, что значения указанных переменных можно изменять только после выполнения подпрограммы Hidepnt.
Перед вызовом Hidepnt проверяется состояние младшего разряда переменной pntstat. Если он установлен, то изображение курсора находится на экране, его можно удалять и перемещать. В противном случае содержимое регистров dx и ах сохраняется в переменных offspnt и winpnt и команда retf выполняет возврат в драйвер.
Таким образом, подпрограмма Mousm в любом случае изменяет значения переменных, указывающих координаты и адрес видеопамяти для изображения курсора, а само изображение перемещается только в том случае, когда установлен младший разряд переменной pntstat — признак нахождения курсора на экране.