Предварительные действия
В данном разделе описана настройка драйвера и задачи на совместную работу. Выполняемые при этом действия не зависят от того, как задача взаимодействует с драйвером, – периодически обращаясь к нему, или в режиме прерываний. Они заключаются в инициализации драйвера, установке границ рабочего поля и исходной позиции курсора. Дополнительно может быть выбрана чувствительность драйвера и курсора к перемещениям мыши. Настройка выполняется после установки видеорежима и получения его характеристик.
Новое макроопределение
В Примере 2.12 главы 2 были описаны макроопределения PushReg и PopReg, которые неоднократно использовались в примерах подпрограмм. Добавим к ним новое макроопределение, формирующее команды запроса функций драйвера мыши. Оно почти не сокращает текст программы, но делает его более наглядным и понятным. Описание макроопределения приведено в примере 6.7, оно должно располагаться перед основным текстом программы.
Пример 6.7. Макроопределение для обращений к драйверу мыши.
Mouse macro fun; номер функции задает параметр fun mov ax, fun&h; номер функции помещается в ах int 33h; обращение к драйверу endm; конец макроопределения.
Макровызов этого определения имеет вид Mouse fun, где вместо fun указывается шестнадцатеричный номер вызываемой функции без буквы ь в конце. Обнаружив вызов, Макроассемблер находит одноименное определение, обрабатывает его и включает в задачу две команды. Первая из них пересылает в регистр ах указанный в макровызове код fun, к которому добавляется буква b. Вторая команда int ззь выполняет обращение в драйверу мыши. Например, на месте макровызова Mouse 21 в тексте задачи окажутся две следующие команды:
mov ax, 21h; запись в ах кода 21h int 33h; обращение к драйверу мыши
Замечание
Обратите внимание на то, что макровызов Mouse 2lh ассемблер воспримет как ошибку. Поэтому если вы предпочитаете указывать букву h после кода, то во второй строке примера 6.7 после слова fun надо убрать символы &h, которые вызывают добавление буквы h к коду функции.
Инициализация драйвера нужна для того, чтобы ликвидировать те изменения значений его внутренних переменных, которые могли оставить после себя другие задачи. Если по каким-то причинам эти изменения надо сохранить, то перед инициализацией производится сохранение буфера состояния драйвера, о чем говорилось в конце предыдущего раздела.
Функция Mouse 0 выполняет инициализацию драйвера и возвращает дополнительные данные в регистрах ах и bх.
Если драйвер мыши отсутствует в оперативной памяти, то регистр ах очищен. Это может означать либо отсутствие соответствующего файла в autoexec.bat или в config.sys либо отсутствие или неисправность мыши.
В процессе установки драйвер анализирует наличие и тип мыши, и если работа с ней невозможна, то установка не выполняется.
Если 15 регистре ах находится код OFFFFS-I, то инициализация выполнена успешно. В таком случае в регистре bх указано количество имеющихся у мыши кнопок.
После исполнения запроса Mouse 0 желательно проверить содержимое регистров ах и bх. Если драйвер отсутствует, то дальнейшее выполнение программы невозможно или для управления задачей должна использоваться клавиатура. Аналогично, если задача рассчитана на работу с тремя кнопками, а у мыши их только две, то придется либо прервать выполнение задачи, либо настроить ее на работу только с двумя кнопками.
Функция Mouse 21 аналогична функции Mouse 0, но при ее исполнении не производится аппаратный сброс мыши и не изменяются значения переменных, зависящих от ее технических характеристик. В большинстве случаев это различие не принципиально.