Формирование кодов событий
Вопрос о том, состояние каких кнопок надо анализировать в задаче, решает программист. На практике основной является левая кнопка, с ней ассоциируется большинство выполняемых действий. Правая используется реже и имеет вспомогательное значение. Одновременное нажатие обеих кнопок обычно не применяется. Средней кнопки у мыши может просто не быть, поэтому она не используется в большинстве программ.
Подпрограмма Statms опрашивает состояние мыши с помощью функции Mouse 3 и формирует коды событий в соответствии с табл. 6.2.
В качестве параметров подпрограмма, приведенная в примере 6.12, использует переменные, описанные в примере 6.8. Значения входных параметров содержат переменные xpointer, YPointer и Mstatus. Выходные параметры помещаются в те же переменные, кроме того, код события для правой кнопки возвращается в переменной RBevent, а для левой – в LBevent.
Пример 6.12. Формирование кодов событий для двух кнопок.
Statms: Mouse 3 опрос текущего состояния мыши xor al, al признак отсутствия движения стар XPointer, ex координата X изменилась? jne SM 1 › да cmp YPointer, dx координата Y изменилась? je SM_2 › нет, мышь не перемещалась ^44 / /рограммирование SVUA-графики для IbM SM 1: or al, 04 признак перемещения мыши mov XPointer, ex сохраняем новое значение X mov Ypointer, dx сохраняем новое значение Y SM 2: mov bh, Ы bh = новое состояние кнопок xchg Mstatus, bh переставляем байты Ы и Mstatus push bx сохраняем регистр bx ; Формирование кода события для правой кнопки and bx, 0202h выделяем разряды состояния кнопки shr Ы, 01 изменяем код нового состояния or Ы, bh двумя командами or формируем or bl, al в Ы код события для правой кнопки mov RBevent, Ы сохраняем код события в RBevent ; Формирование кода события для левой кнопки pop bx восстанавливаем регистр bx and bx, 0101 выделяем разряды состояния кнопки shl bh, 01 изменяем код старого состояния or bl, bh и двумя командами or формируем or bl, al в Ы код события для левой кнопки mov LBevent, bl сохраняем код события в LBevent eosub: ret возврат из подпрограммы
После всего сказанного текст примера 6.12 не требует особых пояснений. Напомним только, что код состояния формируется в соответствии с табл. 6.2, его значение может изменяться от 0 до 7. Нулевой разряд кода соответствует текущему состоянию кнопки, первый – предыдущему состоянию, а второй разряд указывает перемещение мыши.
Метка eosub, указанная перед командой ret, не имеет отношения к тексту примера. Просто в дальнейшем нам понадобится имя подпрограммы, состоящей из единственной команды ret.
Выбор исполняющей подпрограммы
Вызывающий модуль анализирует полученный код события и выполняет соответствующие действия. В нашем случае вызывающим модулем является управляющий алгоритм.
В управляющем алгоритме выбор подпрограммы, выполняющей нужные действия, осуществляет переключатель (switch). Он применяется во многих языках программирования для выбора одного из нескольких вариантов выполняемых действий. В этом случае код события используется в качестве индекса при выборе одного из адресов, указанных в таблице переходов (transfer table), которая является списком адресов подпрограмм. Преимущество переключателя заключается в том, что количество действий, необходимых для выбора нужного адреса, не зависит от размера списка.