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 или п ?
Текст примера 6.10 делится на две основные части. Первая из них начинается с команды, имеющей метку General, а вторая — с команды, имеющей метку Preskey. Первая часть алгоритма выполняется до тех пор, пока оператор не нажмет на любую клавишу. В этой части производится опрос состояния клавиатуры и драйвера мыши и обработка событий, связанных с изменением состояния мыши. Мы не будем здесь обсуждать, как это делается, поскольку способы опроса и обработки возможных состояний манипулятора "мышь" подробно обсуждаются в следующем разделе. Пока читатель может поверить на слово, что если оператор ничего не делает с клавиатурой и мышью, то задача только опрашивает состояние клавиатуры и мыши, не выполняя никаких других действий.
Роль клавиатуры зависит от формы диалога оператора с задачей. В тех случаях, когда применяются командные строки и не поддерживается работа с меню, клавиатура является основным органом управления. Если же задача поддерживает работу с меню, то клавиатура имеет вспомогательное значение и используется только в специальных случаях, например, для ввода текста или спецификаций создаваемых файлов. Однако и в этих случаях клавиатура не является основным средством для ввода данных.
Техника работы с клавиатурой обсуждалась в разделе, там же описана функция о прерывания int I6h, выполняющая ожидание ввода и чтение кода символа из буфера клавиатуры. В данном случае нам нужна еще одна функция 01 прерывания int 16, которая не ждет ввода символа, а только проверяет состояние буфера клавиатуры. Если буфер пуст, то при возврате из BIOS установлен Z-разряд регистра флагов (признак нуля), а если в буфере находится код символа, то Z-разряд будет очищен.
В примере 6.10 третья команда (jnz Preskey) выполнит переход на метку Preskey, если буфер клавиатуры содержит код символа. Его копия находится в регистре ах, но прежде чем начинать анализ введенного символа, надо учесть следующее обстоятельство. Функция 01 прерывания int I6h оставляет символ в буфере и при следующем опросе клавиатуры он будет прочитан повторно. Поэтому буфер надо принудительно очистить, что и делают первые две команды, расположенные во второй части примера 6.10 (после метки Preskey).