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

         

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



Пример 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 ; ! ! возврат на начало цикла

Текст примера 6.10 делится на две основные части. Первая из них начинается с команды, имеющей метку General, а вторая — с команды, имеющей метку Preskey. Первая часть алгоритма выполняется до тех пор, пока оператор не нажмет на любую клавишу. В этой части производится опрос состояния клавиатуры и драйвера мыши и обработка событий, связанных с изменением состояния мыши. Мы не будем здесь обсуждать, как это делается, поскольку способы опроса и обработки возможных состояний манипулятора "мышь" подробно обсуждаются в следующем разделе. Пока читатель может поверить на слово, что если оператор ничего не делает с клавиатурой и мышью, то задача только опрашивает состояние клавиатуры и мыши, не выполняя никаких других действий.

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

Техника работы с клавиатурой обсуждалась в разделе, там же описана функция о прерывания int I6h, выполняющая ожидание ввода и чтение кода символа из буфера клавиатуры. В данном случае нам нужна еще одна функция 01 прерывания int 16, которая не ждет ввода символа, а только проверяет состояние буфера клавиатуры. Если буфер пуст, то при возврате из BIOS установлен Z-разряд регистра флагов (признак нуля), а если в буфере находится код символа, то Z-разряд будет очищен.

В примере 6.10 третья команда (jnz Preskey) выполнит переход на метку Preskey, если буфер клавиатуры содержит код символа. Его копия находится в регистре ах, но прежде чем начинать анализ введенного символа, надо учесть следующее обстоятельство. Функция 01 прерывания int I6h оставляет символ в буфере и при следующем опросе клавиатуры он будет прочитан повторно. Поэтому буфер надо принудительно очистить, что и делают первые две команды, расположенные во второй части примера 6.10 (после метки Preskey).



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