┌──────────────────────────────────────┐ │ Тонкости опроса кемпстон-крыс ;) │ └──────────────────────────────────────┘ (c)VTS'98 mouse включен - хорошо, а не включен - плохо. (c)В.Маяковский, Demon, VTS. WELCOME TO THE HELL, DEAR USER without KeMpStOnE-mouse. (c)Demon(ZX-Element#1), VTS. Хочу вам поведать об одном печальном факте - у меня нет kempstone-joystick'а. -Ну и что, а у меня нет kempstone-mouse, -отвечу я (VTS)... Примерно так началась поучительная стат- ья в ZX-Elemement #1 о том, как опраши- вать кемпстон-джойстик. Видимо, мыши встречаются намного чаще джойстиков и должны быть у каждого, т.к. именно из-за отсутствия мыши (на любой тачке, где k.joys. дешифрован по #FD) журнал немно- го (мягко говоря) глючил. Только, plzzz, не принимайте это за на- езд! Просто мне очень хотелось почитать журнал (каково, вам, например ехать за 20км в город до друга, чтобы читать его половину 'мельком', а вторую с нажатыми на джойстике 'влево' и 'вправо' [позже, правда, при помощи паяльника ;-) ]). Я также уверен, что этот глюк уже пойман и пишу этот бред для устранения дальней- ших недоразумений. Справедливости ради, надо сказать, что этим грешили не только вы. Итак, перейдем к делу. На машинах с 'фирменной' неполной дешиф- рацией по #DF, а не #1F при отсутствии мыши (ее порты имеют в младшем байте ад- реса #DF) вместо 'мышиной' инфы будет прочитан джойстик. Ну, если при чтении координат глюков не происходит (sorry, из-за отсутствия ентого девайса не зна- ком с его подробным опросом, да разговор не об этом вовсе), то при чтении кнопок начинается самое интересное. А именно: у мыши кнопки пассивны в 1, а активны в 0; у джойстика же все наобо- рот!!! Посему при валяющемся под столом джойстике прога слежения за несуществую- щей крысой ловит идиотское намерение юзера найти 'any key' методом пианиста, то бишь нажатием всего нажимающегося :-) В результате получаем навечно нажатые 'огонь' и 'отмену' (благо, средняя кноп- ка не используется для 'смертельных' ;-) функций). Эффект, конечно, занима- тельный, однако я журнал взял, а не дему какую-ньдь. После того, как до меня дошло все это, я сразу понял метод лечения: нажать кнопки 'влево' и 'вправо' на джойстике (благо, он у меня не рычажковый ;) ); после чего я довесил пару перемычек и пересмотрел все глючные проги ;). Невъехавшим об'яс- няю: влево и вправо - биты 0,1 джойстика - соответствуют левой и правой кнопкам мыши (вниз - бит 2 - средней). Только не забудьте потом убрать эти пе- ремычки :-). Железячный метод решения - добавить пару элементов ЛЛ1 либо диодов для дешифрации по #1F - не рекомендую, т.к. таких про- гов не так уж и много, да и вообще, это проблема кодеров, а не юзеров. Кстати сказать, эта проблема проявляется на KAY'е и Scorp'е. Посему основная мас- са мышиных прогов - из Питера - работает корректно. Ну а теперь перейдем к десерту - тому, ради чего вы и читали весь этот калам- бур, то бишь _КАК_правильно_избавиться_ _от_этого_принеприятнейшего_известия_. Возьмем какой-ньдь питерский мышининый прог и запустим его (напр., ZX-Format). Теперь обратим внимание на вроде бы бес- полезный прибамбас - тест джойстика и мыши. Хотя давно следовало спросить се- бя: а где же тесты ОЗУ, турб и тормозов, псевдо-ПЗУ и теневых мониторов ;-). Со- поставим этот факт с наличием кемпстон-теста, например, и в MMD. ВСЕ! Теперь можете кричать "эврика!" Если же вы не Архимед, читайте дальше. Короче, НУЖНО ТЕСТИРОВАТЬ наличие мыши ! И если мыши нет, то ОТКЛЮЧАТЬ ее опрос. А сделать это не просто, а очень просто. Может быть два варианта: простой и неп- равильный. Для начала разберем неправильный. LD A,#FA ;читаем IN A,(#DF) ; кнопки. AND %00000111 ;маскируем их. INC A ; #FF+1=0 JP NZ,mouse_off; ... mouse_on ... Принцип: если это мышь, то ее порт кно- пок будет содержать 1 в разрядах 3...7; после установки младших битов в 1 (AND %00000111) в акк. получим #FF, а после INC A - 0 и установленный флаг Z. Если джойстик, то биты 3...7 сброшены ! Почему неправильный ? а).Есть мышь, нестабильная шина данных и в результате где-ньдь в битах 3...7 на- поремся хотя бы на один 0. Результат - мышь отдыхает. б).Нет мыши, кемпстон (джойстик) непра- вильный (установлены биты 5...7), юзер давит на все (или хотя б 'огонь' и 'вверх') кнопки джойстика (назло...:*) ) Результат - наличие мыши (+глюки...). Во втором способе надо прочитать 3 мыши- ных байта и если все они равны, то с ве- роятностью 99.(9)% мыши нет: а).Читали все 3 байта из джойстика. б).Читали нестабильную шину. в).Читали стабильную шину. Остальная (мизерная) вероятность непра- вильного определения: а).Нестабильная шина успела измениться между чтениями. б).Шустрый юзер успел изменить состояние джойстика между чтениями :-О. в).Юзер умудрился :*)) поставить мышу так, что x=y=keys !!!... Ну а вот и асм: LD BC,#FADF IN A,(C) INC B ;B=#FA+1=#FB IN D,(C) LD B,#FF IN E,(C) ;прочитали все 3 байта. CP D JP NZ,mouse_on CP E JP NZ,mouse_on mouse_off ... Ну вот и все :-). P.S.: Хотя не помешает добавить ручную коррекцию теста - как в том же ZF. 12.08.98 22:19msk is-dos