Предварительные действия
Выполнение настройки
Способ выполнения всех описанных действий иллюстрирует пример 6.9. Приведенный в нем фрагмент программы должен выполняться в процессе подготовительных действий, но только после установки видеорежима и получения его характеристик.
Пример 6.9. Настройка драйвера, задачи и первый вывод курсора.
mouse 0 инициализация драйвера ;!! здесь желательно проверить содержимое регистров АХ и ВХ!! хоr сх, сх СХ = Xmin = Ymin = 0 rnov ax, horsize DX = Xmax = horsize mouse 7 установка границ по горизонтали mov dx, versize DX = Ymax = versize mouse 8 установка границ по вертикали mov сх, horsize СХ = horsize shr ex, 01 центр экрана по горизонтали shr dx, 01 центр экрана по вертикали mouse 4 установка значений счетчика драйвера mov Xpointer, сх Xpointer = 0.5 * horsize mov Ypointer, dx Ypointer = 0.5 * versize mov ax, versize AX = versize inc ax AX = versize + i mul ex DX:AX = (versize + 1) * horsize / 2 ; В режимах direct color результат надо умножить на размер кода точки mov Offspnt, ax сохраняем смещение рисунка курсора mov ax, GrUnit AX = единица измерения размера окна mul dl AX = DL * GrUnit (номер видеоокна) add ax, Base_Win!! учитываем значение базового окна mov Winpnt, ax сохраняем значение окна видеопамяти call Showpnt первое построение рисунка курсора
При вычислении адреса видеопамяти по номеру строки и столбца надо учитывать размер кода точки. Пример 6.9 предназначен для выполнения в режимах PPG, когда код точки занимает 1 байт. Если ваша задача работает с режимами direct color, то результат, вычисленный командой mul, надо дополнительно умножить на размер кода точки. Подробнее об этом будет сказано при описании примера 6.13.
Важно
Команда add ax, Base_win нужна только в том случае, если задача поддерживает работу со страницами видеопамяти, в остальных случаях ее надо исключить из текста примера.
В зависимости от способа построения изображения курсора в последней команде примера 6.9 должна вызываться подпрограмма showpnt (см. пример 6.5) или Tgipntr (см. пример 6.4).
Чувствительность курсора и мыши
При установке драйвера по умолчанию выбирается режим работы, при котором перемещение мыши на 1 дюйм по горизонтали или вертикали вызывает перемещение курсора на 640 столбцов. или на 320 строк. Рассмотрим, как драйвер увязывает перемещения мыши и курсора.
Во внутреннем буфере драйвера имеются четыре счетчика, содержащих количество перемещений по вертикали и горизонтали. Два из них связаны с курсором, а два с мышью. Условимся обозначать их как СПК (счетчик перемещений курсора) и СПМ (счетчик перемещений мыши). Прикладные задачи могут изменять значения СПК с помощью команды Mouse 4, но значения СПМ они могут только считывать.
Драйвер пересчитывает значения СПМ в значения СПК, используя для этого специальные коэффициенты. При установке драйвера по умолчанию выбираются такие значения коэффициентов, которые вызывают изменение содержимого СПМ и СПК на 1 при каждом перемещении мыши в горизонтальном направлении, и изменение значений СПМ на 1, а СПК – на 2 при каждом перемещении мыши в вертикальном направлении. Прикладная задача или операционная система могут изменить значения коэффициентов.
Функция Mouse 1A устанавливает, a Mouse 1B считывает значение коэффициента, задающего чувствительность СПМ к перемещениям мыши.
Значения коэффициентов указываются или возвращаются драйвером в регистрах bх (горизонтальное направление) и сх (вертикальное направление). Содержимое bх и сх может изменяться от 0 до 100 и интерпретируется как проценты. При задании больших значений они принудительно уменьшаются до 100 (64П).
За единицу принято 50% (код 32h), при котором содержимое СПМ изменяется на 1 при каждом перемещении мыши. Значение 100% вызывает изменение содержимого СПМ на 2 при каждом перемещении мыши. А при коэффициенте 25% оно будет изменяться на 1 при двух перемещениях мыши.
Перемещение мыши принято измерять в mickey. Перевод этого термина автору не известен, но, по сути, это величина обратная количеству точек на дюйм (Dot Per inch или DPI). У современных манипуляторов DPI = 400, соответственно 1 mickey = 1/400 дюйма или примерно 0.06 миллиметра.
Функция Mouse OF устанавливает чувствительность СПК к изменениям СПМ. Перед обращением к драйверу в регистрах сх и dx указываются значения коэффициентов для горизонтального (сх) и вертикального (dx) направлений. Эти коэффициенты указывают, на сколько единиц должно измениться значение СПМ для того, чтобы значение СПК изменилось на 8 единиц. При установке драйвера (по умолчанию) коэффициенты равны 8 для горизонтального и 16 для вертикального направлений. В результате при движении по горизонтали СПМ и СПК изменяются синхронно, а при движении по вертикали СПК изменяется в два раза медленнее, чем СПМ.