Mouse driver
(C) Alexander Nikiforov MDM 271-15-83
Hi world! I decided then to tell a little about the driver
support kempston mouse. This idea came to me after seeing the
newspaper BODY, in which SATSOFT can not (or will not?) Do
normal working mouse driver.
Kempston mouse connects to port # DF:
# FADF - state of the mouse buttons:
bit 0 - the left button,
bit 1 - right button
bit 2 - the middle button.
# FBDF - X-coordinate of the mouse
# FFDF - Y-coordinate of the mouse
Port status and # FBDF # FFDF itself changes when the mouse
moves. The senior five bits port # FADF not used and installed
One unit in, and the three least significant bits indicate the
status of the buttons: 0 - button is not pressed, 1 - is
pressed. But the buttons are not so simple. The fact that in
mice, which are sold in Minsk Stinger, not used the third
button. Therefore, if you intend to use the program the third
button, then duplicate it by pressing two extreme buttons
simultaneously (ie, simultaneously pressing the left and right
mouse button should cause the same effect as the third button).
Likewise there is no consensus which bit (0 or 1) should be
responsible for the left button, but some of the right. I have
zero bits - the left button (supports FUT and ZX-WORD), while
the someone maybe it's the right button (support UFO 2, BLACK
Raven (demo), MINESWEEPER). It is therefore recommended to make
the driver auto-sensing buttons fire, ie the first click gets a
shot (as done in the ZX-FORMAT, ZxNews in this room LPRINT'a).
Or do both fire button (MOVE, ENERGY, old numbers LPRINT / my
Viewer /).
And now the actual driver with a small comment.
Program check kempston mouse. If you have a mouse
not that of the three ports should be read by the same number of
(Usually 0 or 255). If you have a Bat, the probability of
matching all three numbers is virtually zero (the only option
when it is high - it is when you turn the complex into a
network and still never touched a mouse, in this case of all
three ports will be read number 255). The truth is possible
that option, that Your machine unstable data bus and then from
all three ports are different numbers. For this case, I check
out the older five bits port buttons # FADF and if they are not
equal One unit, so there is no Bat. Also in Petersburg's
programs before checking the availability of a mouse in the
ports and # 5F # 7F entered byte # 90. Why need it, I do not
know, but just in case the Board to perform this procedure. But
in any case, it is recommended that manual enable / disable
kempston mouse.
; Check kempston mouse
INIT LD A, # 90;??
OUT (# 7F), A;???
OUT (# 5F), A;???
LD BC, # FADF
IN A, (C); reads the A state of the port # FADF
PUSH AF; and save it on the stack
AND # F8; Checking senior five bits to 1
CP # F8
CALL NZ, NOTMOUS; Call Subroutine disable mouse
INC B
IN L, (C); reads the L state of the port # FBDF
LD B, # FF
IN H, (C); reads the state of the port H # FFDF
POP AF; Restore A register
CP L; check for coincidence of
JR NZ, $ +6; If the bytes are different, then YESMOUSE
CP H; If you are the same, checking on
CALL Z, NOTMOUS; If Sopa again, then off. mouse
YESMOUS ... ; Kempston mouse present
To start the program after the cursor appears in the right
place at the screen rather than the devil knows where, call
this subroutine (just call her after the manual switching the
mouse to cursor jumping to an unknown destination):
; Restoration coordinates
MXY LD A, # FB; Read the state of X-coordinates
IN A, (# DF); mouse and
LD (MOUSE_X +1), A; bring it to a label MOUSE_X
LD A, # FF; Read the state of Y-coordinate
IN A, (# DF); mouse and
LD (MOUSE_Y +1), A; bring it to a label MOUSE_Y
RET
This program is used to poll the mouse buttons. Then I think
everything so it is understandable, but the comments all the
same bet.
; Check the status of mouse buttons
FIRE LD A, # FA; Reading the status byte keys
IN A, (# DF)
RRA; Test pressing the left button
JP NC, L_BUT; If pressed, the label preyti L_BUT
RRA; Test pressing the right buttons
JP NC, R_BUT; If pressed, the label preyti R_BUT
... ; Buttons are pressed (the third button
; Not used)
Well, the survey programm mouse movements. I use this
program as follows: first wash your cursor on the screen, the
caller MOVE, which changes the X and Y, and the typing cursor
(All it occurs naturally in the termination). In its programs, I
increment the displacement of the mouse twice, so that the
cursor moved faster. If you do not need it, then remove the
command ADD A, A.
; Mouse movements. X = 0-255, Y = 0-191
MOVE LD A, # FB
IN A, (# DF); Read the state of X-coordinates of the mouse
MOUSE_X LD E, 0; In case E the previous X-coordinate
LD (MOUSE_X +1), A; Save the new coordinate
SUB E; Check whether the changed X-coordinate
CALL NZ, MOVE_X; If so, call podprog. MOVE_X
LD A, # FF
IN A, (# DF); Read the state of Y-coordinates of the mouse
MOUSE_Y LD E, 0; In case E the previous Y-coordinate
LD (MOUSE_Y +1), A; Save the new coordinate
SUB E; Check whether the changed Y-coordinate
CALL NZ, MOVE_Y; If so, call podprog. MOVE_Y
...
MOVE_Y JP M, MOUSE_D; If the flag S = 1, then moving the mouse;
Ghali down, or up MOUSE_U ADD A, A; Increase mixing twice
LD D, A; save it in reg. D
LD A, (Y_COORD); Take the current Y-coordinate of the cursor
SUB D; reduces its
JR NC, $ +3; If the result was less than 0
XOR A; then reset the Y-coordinate
LD (Y_COORD), A; Writes a new Y-coordinate of the cursor
RET
MOUSE_D NEG; Here is a mixture of normal appearance
ADD A, A; Increase mixing twice
LD D, A; save it in reg. D
LD A, (Y_COORD); Take the current Y-coordinate of the cursor
ADD A, D; increases its
JR C, MM_2; If the result was more than 255,
CP 192; or greater than 191, then
JR C, $ +4
MM_2 LD A, 191; change it to 191
LD (Y_COORD), A; Writes a new Y-coordinate of the cursor
RET
MOUSE_L NEG; Here is a mixture of normal appearance
ADD A, A; Increase mixing twice
LD D, A; save it in reg. D
LD A, (X_COORD); We take the current X-coordinate of the
cursor SUB D; reduces its
JR NC, $ +3; If the result was less than 0
XOR A; then reset the X-coordinate
LD (X_COORD), A; Writes a new X-coordinate of the cursor
RET
MOVE_X JP M, MOUSE_L; If the flag S = 1, then moving the mouse;
Ghali left, or right MOUSE_R ADD A, A; Increase mixing twice
LD D, A; save it in reg. D
LD A, (X_COORD); We take the current X-coordinate of the
cursor ADD A, D; increases its
JR NC, $ +4; If the result was more than 255,
LD A, 255, then change it to 255
LD (X_COORD), A; Writes a new X-coordinate of the cursor
RET
Well that's all. I do not know how many of you have
understood all of this opus, but I hope that at least most.
P.S. Special message for SATSOFT: Just try now to release a
buggy driver BODY mouse. : ->
P.P.S. This driver will stay all week on my server - FASA
BBS, named mouse.H (format ALASM3.8)