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

Формирование кодов событий

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

Подпрограмма 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), которая является списком адресов подпрограмм. Преимущество переключателя заключается в том, что количество действий, необходимых для выбора нужного адреса, не зависит от размера списка.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.