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 выделяем разряды состояния кнопки
После всего сказанного текст примера 6.12 не требует оcобых пояснений. Напомним только, что код состояния формируется в соответствии с табл. 6.2, его значение может изменяться от 0 до 7. Нулевой разряд кода соответствует текущему состоянию кнопки, первый — предыдущему состоянию, а второй разряд указывает перемещение мыши.
Метка eosub, указанная перед командой ret, не имеет отношения к тексту примера. Просто в дальнейшем нам понадобится имя подпрограммы, состоящей из единственной команды ret.
Выбор исполняющей подпрограммы. Вызывающий модуль анализирует полученный код события и выполняет соответствующие действия. В нашем случае вызывающим модулем является управляющий алгоритм.
В управляющем алгоритме выбор подпрограммы, выполняющей нужные действия, осуществляет переключатель (switch). Он применяется во многих языках программирования для выбора одного из нескольких вариантов выполняемых действий. В этом случае код события используется в качестве индекса при выборе одного из адресов, указанных в таблице переходов (transfer table), которая является списком адресов подпрограмм. Преимущество переключателя заключается в том, что количество действий, необходимых для выбора нужного адреса, не зависит от размера списка.
В управляющем алгоритме переключатель используется дважды — сначала для обработки событий, связанных с левой, а затем с правой кнопкой. В обоих случаях код события помещается в регистр bх и удваивается, поскольку списки адресов состоят из слов. После этого команда call вызывает одну из подпрограмм перечисленных в списках choiceL или choiceR. При выполнении этой команды адрес начала списка (значение меток ChoiceL или ChoiceR) суммируется с содержимым регистра bх, в стеке формируется адрес возврата и управление передается нужной подпрограмме.
Обратите внимание на то, что сразу после возвращения из подпрограммы statms код состояния левой кнопки находится в регистре bl. Поэтому при обработке событий левой кнопки нет необходимости копировать его в регистр bl из LBevent. Однако при обработке событий правой кнопки в регистр bl копируется содержимое RBevent.
Списки имен подпрограмм, обрабатывающих события, связанные с левой и правой кнопками, должны быть описаны в разделе данных программы, например, следующим способом:
ChoiceL dw eosub, namel, name2, eosub, motion, паmеЗ, name4, name5
ChoiceR dw eosub, eoprg, патеб, eosub, eosub, name7, nameS, name9
Действия, выполняемые при возникновении каждого из событий, зависят от назначения программы и фантазии программиста. Заведомо очевидны лишь два случая.
Если мышь неподвижна и состояние кнопок не изменилось (коды 0 и 3), то просто ничего не произошло. Этим кодам в обоих списках соответствует имя eosub, которое в примере 6.12 указано перед командой ret.
Если мышь движется и кнопки не нажаты (код 4), то надо просто перемешать курсор. Поэтому на пятом месте в списке choiceL указано имя подпрограммы motion, выполняющей перемещение курсора, ее подробное описание приведено в следующем разделе.
Во втором слове массива choiceR указано имя команды eoprg, начиная с которой выполняются завершающие действия (см. пример 6.11). При нажатии на правую кнопку мыши выполнение задачи прекратится и произойдет возврат в DOS.
Если при подготовке исходного текста программы вы еще не решили, как обрабатывать остальные события, то просто замените имена name1 - name9 именем eosub. Управляющий алгоритм будет игнорировать события, для обработки которых не указаны специальные подпрограммы.