Lprint #08
28 июня 1997

Mouse Driver - О драйвере поддержки Kemston Mouse.

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



Другие статьи номера:

Mouse Driver - О драйвере поддержки Kemston Mouse.

Вступление - Новая оболочка оказалась чрезвычайно неудобной.

Давайте познакомимся - Пользователь Паша с рассказом о себе.

Дискуссия - IBM is the BEST???

Компьютерные пираты - Митник: преступник или жертва.

Новости недили - Скоро выйдет bbsTOP #5.

Реклама мессаги - Реклама с юмором.

Таланты - Темы для сочинений.

Улыбнитесь - Оздоровительный дом отдыха в Новинках.


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Реклама - Реклама и обьявления.
Содержание
Разборка - Описание игры THE GOONIES.

В этот день...   24 ноября