╔═────────────────────────────────────────────────────────────═╗
│▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ 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)