╔═────────────────────────────────────────────────────────────═╗ │▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ Mouse driver ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒│ ╚═────────────────────────────────────────────────────────────═╝ (c) Alexander Nikiforov MDM 271-15-83 Hi world! Решил я тут немного рассказать о драйвере поддержки kempston mouse. Эта идея возникла у меня после просмотра газеты BODY, в которой SATSOFT никак не может (или не хочет ?) сделать нормально работающий драйвер мышки. Kempston mouse подключается к порту #DF: #FADF - состояние кнопок мышки: bit 0 - левая кнопка, bit 1 - правая кнопка, bit 2 - средняя кнопка. #FBDF - X-координата мышки #FFDF - Y-координата мышки Состояние портов #FBDF и #FFDF само меняется при движении мы- ши. Старшие пять битов порта #FADF не используются и установлены в еденицу, а три младших бита показывают состояние кнопок: 0 - кнопка не нажата, 1 - нажата. Но с кнопками не все так просто. Дело в том, что в мышках, которые продает в Минске Stinger, не используется третья кнопка. Поэтому, если Вы собираетесь исполь- зовать в программе третью кнопку, то продублируйте ее нажатием двух крайних кнопок одновременно (т.е. одновременное нажатие ле- вой и правой кнопки должно вызывать то же действие, что и третья кнопка). Так же не существует единого мнения какой бит (0 или 1) должен отвечать за левую кнопку, а какой за правую. У меня нуле- вой бит - это левая кнопка (поддерживает FUT и ZX-WORD), а у кого-то возможно это правая кнопка (поддерживает НЛО 2, ЧЕРНЫЙ ВОРОН (демо), MINESWEEPER). Поэтому рекомендуется делать драйвер с автоопределением кнопки fire, т.е. первая нажатая кнопка ста- новится выстрелом (так сделано в ZX-FORMAT, ZxNews и в этом но- мере LPRINT'а). Или делайте обе кнопки выстрелом (MOVE, ENERGY, старые номера LPRINT /с моим viewer'ом/). Ну а теперь собственно драйвер с небольшими комментариями. Программа проверки наличия kempston mouse. Если мышки у Вас нет то из всех трех портов должно считываться одинаковое число (обычно 0 или 255). Если же мыша у Вас есть, то вероятность сов- падения всех трех чисел практически равна нулю (единственный ва- риант когда она высока - это если Вы включили комп в сеть и еще ни разу не касались мышки, в этом случае из всех трех портов бу- дет считываться число 255). Правда возможен такой вариант, что у Вашей машины нестабильная шина данных и тогда со всех трех пор- тов считаются разные числа. Для этого случая я проверяю старшие пять битов порта кнопок #FADF и если они не равны еденице, зна- чит мыша отсутствует. Также в Питерских программах перед провер- кой наличия мышки в порты #5F и #7F заносится байт #90. Зачем это нужно я не знаю, но на всякий случай советую выполнять эту процедуру. Но в любом случае рекомендуется предусмотреть ручное отключение/включение kempston mouse. ; Проверка наличия kempston mouse INIT LD A,#90 ; ??? OUT (#7F),A ; ??? OUT (#5F),A ; ??? LD BC,#FADF IN A,(C) ; Считываем в A состояние порта #FADF PUSH AF ; и сохраняем его на стеке AND #F8 ; Проверка старших пяти битов на 1 CP #F8 CALL NZ,NOTMOUS ; Вызов подпрограммы отключения мышки INC B IN L,(C) ; Считываем в L состояние порта #FBDF LD B,#FF IN H,(C) ; Считываем в H состояние порта #FFDF POP AF ; Восстанавливаем регистр A CP L ; Проверка на совпадение значений JR NZ,$+6 ; Если байты разные, то на YESMOUSE CP H ; Если одинаковые, то проверям дальше CALL Z,NOTMOUS ; Если опять сопали, то на откл. мышки YESMOUS ... ; Kempston mouse present Для того чтобы после старта программы курсор появлялся в нуж- ном месте экрана, а не черт знает где, вызывайте это подпрограм- му (так же вызывайте ее после ручного включения мышки, чтобы курсор не прыгал в неизвестном направлении): ; Восстановление координат MXY LD A,#FB ; Прочитать состоянии X-координаты IN A,(#DF) ; мышки и LD (MOUSE_X+1),A ; занести его в метку MOUSE_X LD A,#FF ; Прочитать состоянии Y-координаты IN A,(#DF) ; мышки и LD (MOUSE_Y+1),A ; занести его в метку MOUSE_Y RET Эта программа служит для опроса кнопок мыши. Тут думаю все и так понятно, но комментарии все таки поставлю. ; Проверка состояния кнопок мышки FIRE LD A,#FA ; Чтение байта состояния кнопок IN A,(#DF) RRA ; Проверка нажатия левой кнопки JP NC,L_BUT ; Если нажата, то прейти на метку L_BUT RRA ; Проверка нажатия правой кнопки JP NC,R_BUT ; Если нажата, то прейти на метку R_BUT ... ; Кнопки не были нажаты (третья кнопка ; не используется) Ну и программка опроса движения мышки. Я использую эту прог- рамму так: сначала стираю курсор с экрана, вызываю программу MO- VE, которая изменяет координаты X и Y, и печатаю курсор (Все это происходит естественно в прерывании). В своих программах я увеличиваю смещение мышки в два раза, чтобы курсор перемещался быстрее. Если Вам это не надо, то уберите команды ADD A,A. ; Движение мышки. X=0-255, Y=0-191 MOVE LD A,#FB IN A,(#DF) ; Читаем состояние X-координаты мышки MOUSE_X LD E,0 ; В регистре E предыдущая X-координата LD (MOUSE_X+1),A ; Сохраняем новую координату SUB E ; Проверяем изменилась ли X-координата CALL NZ,MOVE_X ; Если да, то вызываем подпрог. MOVE_X LD A,#FF IN A,(#DF) ; Читаем состояние Y-координаты мышки MOUSE_Y LD E,0 ; В регистре E предыдущая Y-координата LD (MOUSE_Y+1),A ; Сохраняем новую координату SUB E ; Проверяем изменилась ли Y-координата CALL NZ,MOVE_Y ; Если да, то вызываем подпрог. MOVE_Y ... MOVE_Y JP M,MOUSE_D ; Если флаг S = 1, значит мышку дви- ; гали вниз, иначе вверх MOUSE_U ADD A,A ; Увеличиваем смешение в два раза LD D,A ; Сохраняем его в рег. D LD A,(Y_COORD) ; Берем текущую Y-координату курсора SUB D ; Уменьшаем ее JR NC,$+3 ; Если результат оказался меньше 0, XOR A ; то обнулить Y-координату LD (Y_COORD),A ; Заносим новую Y-координату курсора RET MOUSE_D NEG ; Приводим смешение в нормальный вид ADD A,A ; Увеличиваем смешение в два раза LD D,A ; Сохраняем его в рег. D LD A,(Y_COORD) ; Берем текущую Y-координату курсора ADD A,D ; Увеличиваем ее JR C,MM_2 ; Если результат оказался больше 255, CP 192 ; или больше 191, то JR C,$+4 MM_2 LD A,191 ; меняем его на 191 LD (Y_COORD),A ; Заносим новую Y-координату курсора RET MOUSE_L NEG ; Приводим смешение в нормальный вид ADD A,A ; Увеличиваем смешение в два раза LD D,A ; Сохраняем его в рег. D LD A,(X_COORD) ; Берем текущую X-координату курсора SUB D ; Уменьшаем ее JR NC,$+3 ; Если результат оказался меньше 0, XOR A ; то обнулить X-координату LD (X_COORD),A ; Заносим новую X-координату курсора RET MOVE_X JP M,MOUSE_L ; Если флаг S = 1, значит мышку дви- ; гали влево, иначе вправо MOUSE_R ADD A,A ; Увеличиваем смешение в два раза LD D,A ; Сохраняем его в рег. D LD A,(X_COORD) ; Берем текущую X-координату курсора ADD A,D ; Увеличиваем ее JR NC,$+4 ; Если результат оказался больше 255, LD A,255 ; то меняем его на 255 LD (X_COORD),A ; Заносим новую X-координату курсора RET Ну вот и все. Не знаю много ли Вы поняли из всего этого опу- са, но надеюсь, что хотя бы большую часть. P.S. Special message for SATSOFT: Только попробуй теперь вы- пустить BODY с глючным драйвером мышки. :-> P.P.S. Данный драйвер будет находится всю неделю на моем сер- вере - FASA BBS, под именем mouse.H (в формате ALASM3.8)