home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload
/
ShartewareOverload.cdr
/
windows
/
baswind8.zip
/
MOUSE.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-09-14
|
23KB
|
714 lines
;
;TITLE: MOUSE.ASM SEPT 1, 1990
Mouse EQU 33H
Cursor_on EQU 0001
Cursor_off EQU 0002
False EQU 0
True EQU NOT False
Pressed EQU True
Not_pressed EQU False
Basic_setup MACRO
PUSH BP
MOV BP,SP
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
ENDM
Basic_cleanup MACRO
CLD
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
POP BP
ENDM
;
;CODE SEGMENT BYTE PUBLIC 'CODE'
; ASSUME CS:CODE
Dosseg ;requires masm 5.0 or higher
.Model Medium
; Define all publicly accessible routines.
PUBLIC Mmcheck
PUBLIC Mmcursoron
PUBLIC Mmcursoroff
PUBLIC Mmclick
PUBLIC Mmbuttonpress
PUBLIC Mmbuttonrelease
PUBLIC Mmbutton
PUBLIC Mmgetloc
PUBLIC Mmgetlocinfo
PUBLIC Mmsetloc
PUBLIC Mmsetrange
.Code
;
;
;******************************************************************************
;* THIS CALL MUST BE MADE BEFORE ANY OTHER MOUSE CALLS WILL FUNCTION *
;******************************************************************************
;
; BASIC: CALL MMCHECK(MOUSE%)
;
; FUNCTION=0
;
; CHECK FOR AN INSTALLED MOUSE, RESET THE MOUSE, INITIALIZE ALL MOTION
; COUNTERS AND SET MOUSE TO CENTER POSITION.
;
; ENTRY PARAMETERS:
; AH=0 (INITIALIZE/RESET MOUSE)
;
; EXIT PARAMETERS :
;
; AX = 0 IF NO MOUSE INSTALLED
; BX = NUMBER OF BUTTONS ON THE MOUSE
;
;
Mmcheck PROC FAR
Basic_setup
XOR AX,AX ;point to memory segment 0
MOV ES,AX
XOR BX,BX
MOV SI,Mouse*4H ;calculate mouse interrupt offset
CMP AX,ES:[SI+2] ;has a mouse handler been installed
JNZ _mouse_initialize
CMP AX,ES:[SI]
JZ _mouse_not_found ;segment:offset was all zeros (no mouse driver)
_MOUSE_INITIALIZE:
INT Mouse
OR AX,AX ;was a mouse found?
JNZ _mouse_found ;yes!
_MOUSE_NOT_FOUND:
MOV BX,0 ;indicate mouse not found
_MOUSE_FOUND:
MOV SI,[BP+6] ;return the number of mouse buttons
MOV [SI],BX
MOV CS:_mouse,BX ;save the number of mouse buttons found
Basic_cleanup
MMCHECK_EXIT:
RET 2D
Mmcheck ENDP
;
;
;
; BASIC: CALL MMCURSORON
;
; FUNCTION=1
;
; IF THE CURSOR IS OFF,THE CURSOR WILL STILL FOLLOW THE MOUSES
; MOVEMENTS, BUT THE CURSOR WILL NOT BE SEEN UNTIL TURNED ON.
;
; ENTRY PARAMETERS:
;
; AH=1 (TURN MOUSE CURSOR ON)
;
; EXIT PARAMETERS :
;
;
Mmcursoron PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmcursoron_exit ;no
Basic_setup
MOV AX,Cursor_on
MOV AX,0001H
INT Mouse
Basic_cleanup
MMCURSORON_EXIT:
RET
Mmcursoron ENDP
;
;
; BASIC: CALL MMCURSOROFF
;
; FUNCTION=2
;
; HIDE THE DISPLAY CURSOR. THE CURSOR WILL STILL FOLLOW THE MOUSES
; MOVEMENTS, BUT THE CURSOR WILL NOT BE SEEN.
;
; ENTRY PARAMETERS:
;
; AH=2 (TURN MOUSE CURSOR OFF)
;
; EXIT PARAMETERS :
;
;
;
Mmcursoroff PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmcursoroff_exit ;no
Basic_setup
MOV AX,Cursor_off
MOV AX,0002H
INT Mouse
Basic_cleanup
MMCURSOROFF_EXIT:
RET
Mmcursoroff ENDP
;
;
; BASIC: CALL MMGETLOC(COL%,ROW%)
;
; FUNCTION=3
;
; ENTRY PARAMETERS:
;
; AH=3 (GET CURRENT MOUSE CURSOR LOCATION)
;
; EXIT PARAMETERS :
;
; BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; CX = X COORDINATE
; DX = Y COORDINATE
;
;
; NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
; 'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
; THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
; VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
; IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
; BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THEN ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
Mmgetloc PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmgetloc_exit ;no
Basic_setup
MOV AX,0003H
INT Mouse
MOV SI,[BP+8] ;return the 'x' co-ordinate (column)
MOV [SI],CX
MOV SI,[BP+6] ;return the 'y' coordinate (row)
MOV [SI],DX
Basic_cleanup
MMGETLOC_EXIT:
RET 4D
Mmgetloc ENDP
;
;
; BASIC: CALL MMGETLOCINFO(BUTTONS%,COL%,ROW%)
;
; FUNCTION=3
;
; ENTRY PARAMETERS:
;
; AH=3 (GET CURRENT MOUSE CURSOR LOCATION)
;
; EXIT PARAMETERS :
;
; BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; CX = X COORDINATE
; DX = Y COORDINATE
;
;
; NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
; 'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
; THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
; VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
; IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
; BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THEN ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
;
Mmgetlocinfo PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmgetlocinfo_exit ;no
Basic_setup
MOV AX,0003H
INT Mouse
MOV SI,[BP+0AH] ;return the buttons pressed status
MOV [SI],BX
MOV SI,[BP+08H] ;return the 'x' co-ordinate (column)
MOV [SI],CX
MOV SI,[BP+6H] ;return the 'y' coordinate (row)
MOV [SI],DX
Basic_cleanup
MMGETLOCINFO_EXIT:
RET 6D
Mmgetlocinfo ENDP
;
;
;
; BASIC: CALL MMSETLOC(COL%,ROW%)
;
; FUNCTION=4
;
; ENTRY PARAMETERS:
;
; AH=4 (SET CURRENT MOUSE CURSOR LOCATION)
; CX = X COORDINATE
; DX = Y COORDINATE
;
; EXIT PARAMETERS :
;
; BX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; CX = X COORDINATE
; DX = Y COORDINATE
;
;
; NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
; 'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
; THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
; VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
; IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
; BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THEN ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
Mmsetloc PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmsetloc_exit ;no
Basic_setup
MOV SI,[BP+8] ;get the 'x' co-ordinate (column) to set
MOV CX,[SI]
MOV SI,[BP+6] ;get the 'y' co-ordinate (row) to set
MOV DX,[SI]
MOV AX,0004H
INT Mouse
Basic_cleanup
MMSETLOC_EXIT:
RET 4D
Mmsetloc ENDP
;
;
; BASIC: CALL MMCLICK(LEFT.BUTTON%,RIGHT.BUTTON%)
;
; FUNCTION=5
;
; ENTRY PARAMETERS:
;
; AH=5 (GET BUTTON PRESS INFO)
; AL=O-? (BUTTON NUMBER TO GET INFO FOR)
;
; EXIT PARAMETERS :
;
; AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; BX = NUMBER OF PRESSES FOR THIS BUTTON SINCE LAST CALL
; (0=32768)
; CX = X COORDINATE AT LAST PRESS TIME
; DX = Y COORDINATE AT LAST PRESS TIME
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE PRESS/RELEASE STATUS FOR ALL
; BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THENS ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
; FUNCTION 5 DOES NOT DOESN'T DETECT OVERFLOW.
;
; THE PRESS COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
;
; THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
; IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
; REPRESENT THE CURSOR POSITION WHEN YOU LAST PRESSED THE BUTTON,
; NOT THE CURSOR/S CURRENT POSITION.
;
Mmclick PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmclick_exit ;no
Basic_setup
MOV BX,0000H ;get release info for button 1 (left)
MOV AX,0005H
INT Mouse
MOV SI,[BP+8] ;pass back number of releases for this button
MOV [SI],BX
MOV BX,0001H ;get release info for button 2 (right)
MOV AX,0005H
INT Mouse
MOV SI,[BP+6] ;pass back number of releases for this button
MOV [SI],BX
Basic_cleanup
MMCLICK_EXIT:
RET 4D
Mmclick ENDP
;
;
; FUNCTION=5
;
; BASIC: CALL MMButtonPress(MMButton%,_
; MMButton.status%,_
; MMButton.presses%,_
; MMPress.xord%,_
; MMPress.yord%)
; ENTRY PARAMETERS:
;
; AH=5 (GET BUTTON PRESS INFO)
; AL=O-? (BUTTON NUMBER TO GET INFO FOR)
;
; EXIT PARAMETERS :
;
; AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; BX = NUMBER OF PRESSES FOR THIS BUTTON SINCE LAST
; CALL (0-65535)
; CX = X COORDINATE AT LAST PRESS TIME
; DX = Y COORDINATE AT LAST PRESS TIME
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE CURRENT PRESSED/RELEASED
; STATUS FOR ALL BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO
; ONE BUTTON: (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THENS ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
; FUNCTION 5 DOES NOT DOESN'T DETECT OVERFLOW.
;
; THE PRESS COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
;
; THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
; IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
; REPRESENT THE CURSOR POSITION WHEN YOU LAST PRESSED THE BUTTON,
; NOT THE CURSOR'S CURRENT POSITION.
;
Mmbuttonpress PROC FAR
Basic_setup
XOR AX,AX ;setup in case mouse not installed
XOR BX,BX
XOR CX,CX
XOR DX,DX
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmbuttonpress_exit ;no
MOV SI,[BP+0EH] ;get the mouse button that you want checked
MOV BX,[SI]
MOV AX,0005H
INT Mouse
MMBUTTONPRESS_EXIT:
MOV SI,[BP+0CH] ;button status for all buttons
MOV [SI],AX
MOV SI,[BP+0AH] ;number of releases for this button
MOV [SI],BX
MOV SI,[BP+08H] ;x coordinate at last press time
MOV [SI],CX
MOV SI,[BP+06H] ;y coordinate at last press time
MOV [SI],DX
Basic_cleanup
RET 10D
Mmbuttonpress ENDP
;
;
; FUNCTION=6
;
; BASIC: CALL MMButtonRelease(MMButton%,_
; MMButton.status%,_
; MMButton.releases%,_
; MMPress.xord%,_
; MMPress.yord%)
; ENTRY PARAMETERS:
;
; AH=6 (GET BUTTON RELEASE INFO)
; AL=O-? (BUTTON NUMBER TO GET INFO FOR)
;
; EXIT PARAMETERS :
;
; AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; BX = NUMBER OF RELEASES FOR THIS BUTTON SINCE LAST
; CALL (0-65535)
; CX = X COORDINATE AT LAST RELEASE TIME
; DX = Y COORDINATE AT LAST RELEASE TIME
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE CURRENT PRESS/RELEASE STATUS
; FOR ALL BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THENS ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
; FUNCTION 6 DOES NOT DOESN'T DETECT OVERFLOW.
;
; THE RELEASE COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
;
; THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
; IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
; REPRESENT THE CURSOR POSITION WHEN YOU LAST RELEASED THE BUTTON,
; NOT THE CURSOR'S CURRENT POSITION.
;
Mmbuttonrelease PROC FAR
Basic_setup
XOR AX,AX ;setup in case mouse not installed
XOR BX,BX
XOR CX,CX
XOR DX,DX
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmbuttonrelease_exit ;no
MOV SI,[BP+0EH] ;get the mouse button that you want checked
MOV BX,[SI]
MOV AX,0006H
INT Mouse
MMBUTTONRELEASE_EXIT:
MOV SI,[BP+0CH] ;button status for all buttons
MOV [SI],AX
MOV SI,[BP+0AH] ;number of releases for this button
MOV [SI],BX
MOV SI,[BP+08H] ;x coordinate at last release time
MOV [SI],CX
MOV SI,[BP+06H] ;y coordinate at last release time
MOV [SI],DX
Basic_cleanup
RET 10D
Mmbuttonrelease ENDP
;
;
;
; BASIC: CALL MMBUTTON(LEFT.BUTTON%,RIGHT.BUTTON%)
;
; FUNCTION=6
;
; ENTRY PARAMETERS:
;
; AH=6 (GET BUTTON RELEASE INFO)
; AL=O-? (BUTTON NUMBER TO GET INFO FOR)
;
; EXIT PARAMETERS :
;
; AX = BUTTON STATUS FOR ALL BUTTONS (BIT SET=PRESSED)
; BX = NUMBER OF RELEASE FOR THIS BUTTON
; (0=32768)
; CX = X COORDINATE AT LAST RELEASE TIME
; DX = Y COORDINATE AT LAST RELEASE TIME
;
; NOTE: THE BUTTON STATUS WORD RETURNS THE PRESSED STATUS FOR ALL
; BUTTONS. EACH BIT IN THE WORD CORRESPONDS TO ONE BUTTON:
; (BIT 0=1ST BUTTON, BIT 1=SECOND BUTTON..ETC).
; IF A BIT IS SET (1) THENS ITS ASSOCIATED BUTTON IS CURRENTLY
; PRESSED DOWN.
;
; FUNCTION 6 DOES NOT DOESN'T DETECT OVERFLOW.
;
; THE RELEASE COUNT IS RESET TO ZERO(0) AFTER EACH CALL.
;
; THE VALUES OF THE HORIZONTAL AND VERTICAL COORDINATES ARE IN
; IN THE RANGES DEFINED BY THE VIRTUAL SCREEN. THESE VALUES
; REPRESENT THE CURSOR POSITION WHEN YOU LAST RELEASED THE BUTTON,
; NOT THE CURSOR'S CURRENT POSITION.
;
Mmbutton PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmbutton_exit ;no
Basic_setup
XOR BX,BX ;
MOV AX,0006 ;check which buttons have been released
INT Mouse
MOV BX,Not_pressed ;assume "false" (not pressed) for button 1
SHR AX,1 ;button 1 (left pressed) ?
JNB Mmbutton_1 ;no,
MOV BX,Pressed ;"true" (pressed)
MMBUTTON_1:
MOV SI,[BP+8] ;return button 1 (left) pressed/released state
MOV [SI],BX
MOV BX,Not_pressed ;assume "false" (not pressed) for button 2
SHR AX,1 ;button 2 (right) pressed?
JNB Mmbutton_2 ;no
MOV BX,Pressed ;"true" (pressed)
MMBUTTON_2:
MOV SI,[BP+6] ;return button 2 (right) pressed/released state
MOV [SI],BX
Basic_cleanup
MMBUTTON_EXIT:
RET 4D
Mmbutton ENDP
;
;
; BASIC: CALL MMSETRANGE(LFTCOL%,TOPROW%,RGTCOL%,BOTROW%)
;
; FUNCTION=7 & 8
;
; SET THE MINIMUM AND MAXIMUM VALUES FOR THE MOUSE'S 'X' AND 'Y'
; AXIS AND ALSO SET THE GAIN VALUE FOR THE MOUSE.
;
; ENTRY PARAMETERS:
;
; AH=7 (SET THE MOUSES X AND Y AXIS)
; CX = MINIMUM 'X' COORDINATE (UPPER LEFT COLUMN)
; DX = MINIMUM 'Y' COORDINATE (UPPER LEFT ROW)
;
; AH=8 (SET THE MOUSES X AND Y AXIS)
; CX = MAXIMUM 'X' COORDINATE (LOWER RIGHT COLUMN)
; DX = MAXIMUM 'Y' COORDINATE (LOWER RIGHT ROW)
;
; BX = MOUSE GAIN VALUE (0-255)
;
; EXIT PARAMETERS :
;
;
;
; NOTE: THE 'X' CO-ORDINATE IS A VALUE FROM 0-639 (COLUMN) AND THE
; 'Y' CO-ORDINATE (ROW) IS A VALUE FROM 0-199. TO 'NORMALIZE'
; THE CO-ORDINATE VALUES FOR A 80X25 TEXT SCREEN, DIVIDE EACH
; VALUE BY 8. IF YOU ARE IN LOW RES GRAPHICS , DIVIDE BY 2.
; IF YOU ARE IN HIGH RES GRAPHICS , THE VALUES ARE FINE.
;
;
; NOTE: IF A LARGE GAIN VALUE IS USED, VERY LITTLE MOVEMENT OF THE
; MOUSE CAUSES A LARGE 'X' OR 'Y' CHANGE.
;
Mmsetrange PROC FAR
CMP CS:_mouse,0 ;is a mouse installed and initialized
JZ Mmsetrange_exit ;no
Basic_setup
;SET HORIZONTAL (X)
MOV SI,[BP+0CH] ;get upper left column co-ordinate - "x"
MOV CX,[SI]
MOV SI,[BP+08H] ;get bottom right column co-ordinate - "x"
MOV DX,[SI]
MOV AX,0007H ;set horizonmtal (x)
INT Mouse
;SET VERTICLE (Y)
MOV SI,[BP+0AH] ;get upper left row co-ordinate - "y"
MOV CX,[SI]
MOV SI,[BP+06H] ;get bottom right row co-ordinate - "y"
MOV DX,[SI]
MOV AX,0008H ;set verticle (y)
INT Mouse
;SET THE GAIN VALUE
; MOV SI,[BP+0EH] ;GET THE GAIN VALUE
; MOV BX,[SI]
; MOV AX,000FH ;SET THE GAIN VALUE
; INT MOUSE
Basic_cleanup
MMSETRANGE_EXIT:
; RET 10d ;IF MOUSE GAIN IMPLEMENTED
RET 8D
Mmsetrange ENDP
_mouse DW 0
;CODE ENDS
END