Иллюстрированный самоучитель по SVGA

Работа в режиме опроса драйвера мыши. Управляющий алгоритм для режима опроса.

С манипулятором "мышь", как с большинством внешних устройств, задача может работать в режиме опроса его текущего состояния, или в режиме прерываний. Принципиальное различие состоит в том, как задача "узнает" об изменении состояния мыши. В первом случае она определяет это самостоятельно, а во втором драйвер "обращает ее внимание" на изменение состояния мыши. Названные режимы обычно дополняют друг друга.

Режим опроса программируется проще, чем режим прерываний, поскольку выполняемые задачей действия не зависят от внешних факторов. Выполнение любого нового действия задача начинает только после завершения предыдущего, что исключает "параллельное" выполнение нескольких разных действий. Именно по этой причине автор выбрал режим опроса для описания способов программирования работы с мышью. Кроме того, приведенные ниже примеры применимы и при работе в режиме прерываний.

В данном разделе описано все, что необходимо для составления завершенной задачи, способной перемешать изображение курсора по экрану и реагировать на нажатие кнопок мыши. Результат можно использовать как основу или как "испытательный полигон" при разработке более сложных и полезных задач и отладке подпрограмм различного назначения.

Структура задачи

Прежде всего, давайте уточним некоторые общие вопросы. В структуре задачи, составленной для работы в режиме опроса, можно выделить следующие основные компоненты.

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

Управляющий алгоритм.
В зависимости от конкретных действий оператора инициирует выполнение тех или иных подпрограмм, входящих в состав задачи.

Набор подпрограмм, вызываемых управляющим алгоритмом.
Их состав и выполняемые действия зависят от назначения конкретной задачи. Они могут, например, строить рисунки, вводить и выводить текстовые сообщения, перемещать курсор, поддерживать работу с меню и выполнять множество других действий.

Пример управляющего алгоритма

Подготовительные действия и подпрограммы неоднократно обсуждались и еще будут обсуждаться в тексте книги.

Здесь нас интересует управляющий алгоритм, который увязывает разрозненные подпрограммы в единое целое. Он представляет собой бесконечно повторяющийся цикл опроса и анализа текущего состояния клавиатуры и драйвера мыши, и вызова подпрограмм, в зависимости от введенных символов или изменения состояния мыши. Для выхода из цикла предназначена специальная команда, исполнение которой приводит к завершению работы задачи и возврату в DOS. Простейший вариант управляющего алгоритма показан в примере 6.10.

Пример 6.10. Управляющий алгоритм для режима опроса.

General: mov ah, 01 код функции опроса состояния клавиш
int 16h опрос состояния клавиш
jnz Preskey › была нажата одна из клавиш
call Statms опрос текущего состояния мыши
xor bh, bh очистка старшего байта регистра bx
Shi bx, 01 удвоение кода состояния
call ChoiceL[bx] обработка состояний левой кнопки
mov Ы, RBevent Ы = код состояния правой кнопки
xor bh, bh очистка старшего байта регистра bx
shl bx, 01 удвоение кода состояния
call ChoiceRfbx] обработка состояний правой кнопки
jmp short General возврат на начало цикла
Preskey: xor ah, ah код функции чтения символа
int 16h чтение введенного символа
cmp ah, 31h введена буква N или п?
jne Pk_l › нет
lea si, prmptOl si = адрес подсказки оператору
call Outinf вывод подсказки и ввод ответа
jmp short General возврат на начало цикла
Pk 1: cmp ah, 2Dh введена буква X или х?
jne Pk_2 › нет
jmp eoprg переход на завершение задачи
Pk 2: mov bx, 01 bx = 1 (шаг перемещения курсора)
cmp ah, 4Dh символ "стрелка вправо"?
jne Pk__3 › нет
movhor: call mothor перемещение курсора по горизонтали
jmp short General возврат на начало цикла
Pk 3: cmp ah, 50h символ "стрелка вниз"?
jne Pk 4 › нет
mower: call motver перемещение курсора по вертикали
jmp short General возврат на начало цикла
Pk 4: neg bx bx = – 1 (шаг перемещения курсора)
cmp ah, 4Bh символ "стрелка влево"?
je movhor › да
сшр ah, 48h; символ "стрелка вверх"? je mower; › яэ.
; Здесь можно продолжить анализ введенного символа
jmp General;!! возврат на начало цикла
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.