home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_02_05
/
2n05046a
< prev
next >
Wrap
Text File
|
1991-04-04
|
20KB
|
804 lines
TITLE MicroSoft Mouse Library Module
PAGE 60,132
COMMENT !
TITLE: MicroSoft Mouse Library Module;
FILENAME: MOUSELIB.ASM;
AUTHOR: Michael Kelly
254 Gold Street
Boston, MA 02127;
COPYRIGHT: May be distributed freely if not modified;
ASSEMBLER: Tasm V.2.0;
ASSEMBLY NOTES:
Utilizes Turbo Assembler-specific directives
( TASM V.2.0 ) to enable assembly for Turbo Pascal or
Turbo C/C++
For Turbo Pascal Module:
( All routines are "far" calls )
tasm mouselib
For C/C++ Module:
( Memory Model dependencies auto-adjusted )
tasm /dCPROG /d__MODEL__ /ml mouselib
where __MODEL__ is one of:
__TINY__
__SMALL__
__MEDIUM__
__COMPACT__
__LARGE__
__HUGE__
if not specified, __MODEL__ defaults to __SMALL__
Note: Leading and trailing underlines consist
of two underscore characters each.
You will notice that many procedures have conditional-
assembly directives determining which ARG directive
and block of code to use. The IFE FAR_PTRS block will
be assembled if FAR_PTRS is defined as 0, otherwise
the ELSE block will be assembled.
This accomodates the size of pointer arguments passed
to the procedure. Also the "ret" instruction at the
close of each procedure does not specify the number
of bytes to discard from the stack on return. Turbo
Assembler uses the ARG directive to determine the
number of bytes to discard if the Pascal calling
convention is used, and assembles the proper "ret n"
instruction. Underbars are automatically prepended
to the public and extrn declarations if the C calling
convention is in effect. Using these features, one
source file can produce an object module for either
Turbo Pascal or Turbo C/C++.
!
;****************************************
; Set up calling convention and memory
; model for Turbo Pascal or Turbo C/C++.
;****************************************
IFNDEF CPROG
.MODEL TPASCAL
FAR_PTRS EQU 1
ENDIF
IFDEF CPROG
IFDEF __TINY__
.MODEL TINY,C
FAR_PTRS EQU 0
ELSEIFDEF __MEDIUM__
.MODEL MEDIUM,C
FAR_PTRS EQU 0
ELSEIFDEF __COMPACT__
.MODEL COMPACT,C
FAR_PTRS EQU 1
ELSEIFDEF __LARGE__
.MODEL LARGE,C
FAR_PTRS EQU 1
ELSEIFDEF __HUGE__
.MODEL HUGE,C
FAR_PTRS EQU 1
ELSE
.MODEL SMALL,C
FAR_PTRS EQU 0
ENDIF
ENDIF
;****************************************
; Make procedures visible to the linker.
;****************************************
public mouse_reset
public mouse_show
public mouse_hide
public mouse_get_pos
public mouse_set_pos
public mouse_button_press
public mouse_button_rel
public mouse_limit_x
public mouse_limit_y
public mouse_set_graphcursor
public mouse_set_textcursor
public mouse_get_movement
public mouse_set_eventhandler
public mouse_start_pen_emul
public mouse_stop_pen_emul
public mouse_set_movement_ratio
public mouse_conditional_off
public mouse_set_speed
public mouse_swap_vector
public mouse_get_bufsize
public mouse_save_state
public mouse_restore_state
public mouse_set_alt_handler
public mouse_get_alt_handler
public mouse_set_sens
public mouse_get_sens
public mouse_set_crt_page
public mouse_get_crt_page
public mouse_disable_drvr
public mouse_enable_drvr
public mouse_soft_reset
LOCALS ;enable local procedure labels
.CODE
;****************************************
; mouse_reset PROC:
; Description: initialize the mouse driver
; int mouse_reset(int *num_buttons);
; Function mouse_reset(Var num_buttons : Integer) : Integer;
;****************************************
mouse_reset PROC
xor ax,ax
int 33h
ret
mouse_reset ENDP
;****************************************
; mouse_show PROC:
; Description: display the mouse cursor
; void mouse_show(void);
; Procedure mouse_show;
;****************************************
mouse_show PROC
mov ax,1
int 33h
ret
mouse_show ENDP
;****************************************
; mouse_hide PROC:
; Description: hide the mouse cursor
; void mouse_hide(void);
; Procedure mouse_hide;
;****************************************
mouse_hide PROC
mov ax,2
int 33h
ret
mouse_hide ENDP
;****************************************
; mouse_get_pos PROC:
; Description: get the mouse cursor position
; int mouse_get_pos(int *x, int *y);
; Function mouse_get_pos(Var x, y : Integer) : Integer;
;****************************************
mouse_get_pos PROC USES ES ;preserve ES segment register
IFE FAR_PTRS
ARG x:NEAR PTR, y:NEAR PTR
ELSE
ARG x:FAR PTR, y:FAR PTR
ENDIF
mov ax,3
int 33h
mov ax,bx
IFE FAR_PTRS
mov bx,x
mov [bx],cx
mov bx,y
mov [bx],dx
ELSE
les bx,x
mov word ptr es:[bx],cx
les bx,y
mov word ptr es:[bx],dx
ENDIF
ret
mouse_get_pos ENDP
;****************************************
; mouse_set_pos PROC:
; Description: set the mouse cursor position;
; void mouse_set_pos(int x, int y);
; Procedure mouse_set_pos(x, y : Integer);
;****************************************
mouse_set_pos PROC
ARG x, y
mov ax,4
mov cx,x
mov dx,y
int 33h
ret
mouse_set_pos ENDP
;****************************************
; mouse_button_press PROC:
; Description: get mouse button press information
; int mouse_button_press(int *x, int *y, int *count, int button);
; Function mouse_button_press
; (Var x, y, count : Integer; button : Integer) : Integer;
;****************************************
mouse_button_press PROC USES ES
IFE FAR_PTRS
ARG x:NEAR PTR, y:NEAR PTR, count:NEAR PTR, button
ELSE
ARG x:FAR PTR, y:FAR PTR, count:FAR PTR, button
ENDIF
mov ax,5
mov bx,button
int 33h
push bx
IFE FAR_PTRS
mov bx,count
pop [bx]
mov bx,y
mov [bx],dx
mov bx,x
mov [bx],cx
ELSE
les bx,count
pop word ptr es:[bx]
les bx,y
mov word ptr es:[bx],dx
les bx,x
mov word ptr es:[bx],cx
ENDIF
ret
mouse_button_press ENDP
;****************************************
; mouse_button_rel PROC:
; Description: get mouse button release information
;
; int mouse_button_rel(int *x, int *y, int *count, int button);
; Function mouse_button_rel
; (Var x, y, count : Integer; button : Integer) : Integer;
;****************************************
mouse_button_rel PROC USES ES
IFE FAR_PTRS
ARG x:NEAR PTR, y:NEAR PTR, count:NEAR PTR, button
ELSE
ARG x:FAR PTR, y:FAR PTR, count:FAR PTR, button
ENDIF
mov ax,6
mov bx,button
int 33h
push bx
IFE FAR_PTRS
mov bx,count
pop [bx]
mov bx,y
mov [bx],dx
mov bx,x
mov [bx],cx
ELSE
les bx,count
pop word ptr es:[bx]
les bx,y
mov word ptr es:[bx],dx
les bx,x
mov word ptr es:[bx],cx
ENDIF
ret
mouse_button_rel ENDP
;****************************************
; mouse_limit_x PROC:
; Description: limit mouse cursor movement on
; the x axis (column)
; void mouse_limit_x(int min_x, int max_x);
; Procedure mouse_limit_x(min_x, max_x : Integer);
;****************************************
mouse_limit_x PROC
ARG min_x, max_x
mov ax,7
mov cx,min_x
mov dx,max_x
int 33h
ret
mouse_limit_x ENDP
;****************************************
; mouse_limit_y PROC:
; Description: limit mouse cursor movement on
; the y axis (row)
; void mouse_limit_y(int min_y, int max_y);
; Procedure mouse_limit_y(min_y, max_y : Integer);
;****************************************
mouse_limit_y PROC
ARG min_y, max_y
mov ax,8
mov cx,min_y
mov dx,max_y
int 33h
ret
mouse_limit_y ENDP
;****************************************
; mouse_set_graphcursor PROC USES ES:
; Description: set mouse graphics cursor shape
; void mouse_set_graphcursor(int xspot,int yspot,void far *masks);
; Procedure mouse_set_graphcursor(xspot, yspot : Integer;
; masks : pointer);
;****************************************
mouse_set_graphcursor PROC USES ES
ARG xspot, yspot, masks:FAR PTR
mov ax,9
mov bx,xspot
mov cx,yspot
les dx,masks
int 33h
ret
mouse_set_graphcursor ENDP
;****************************************
; mouse_set_textcursor PROC:
; Description: set mouse text cursor shape
; void mouse_set_textcursor(int cursor_type,int scr_mask,
; int curs_mask);
; Procedure mouse_set_textcursor(cursor_type, scr_mask,
; curs_mask : Integer);
;****************************************
mouse_set_textcursor PROC
ARG cursor_type, scr_mask, curs_mask
mov ax,0Ah
mov bx,cursor_type
mov cx,scr_mask
mov dx,curs_mask
int 33h
ret
mouse_set_textcursor ENDP
;****************************************
; mouse_get_movement PROC:
; Description: get mouse cursor movement information
; void mouse_get_movement(int *x,int *y);
; Procedure mouse_get_movement(Var x, y : Integer);
;****************************************
mouse_get_movement PROC USES ES
IFE FAR_PTRS
ARG x:NEAR PTR, y:NEAR PTR
ELSE
ARG x:FAR PTR, y:FAR PTR
ENDIF
mov ax,0Bh
int 33h
IFE FAR_PTRS
mov bx,x
mov [bx],cx
mov bx,y
mov [bx],dx
ELSE
les bx,x
mov word ptr es:[bx],cx
les bx,y
mov word ptr es:[bx],dx
ENDIF
ret
mouse_get_movement ENDP
;****************************************
; mouse_set_eventhandler PROC:
; Description: set up a mouse event handler to be called by
; by the mouse driver.
; void mouse_set_eventhandler(int event_mask,
; void far (*mhandler)());
; Procedure mouse_set_eventhandler(event_mask : Integer;
; mhandler : pointer);
;****************************************
mouse_set_eventhandler PROC USES ES
ARG event_mask, mhandler:FAR PTR
mov ax,0Ch
mov cx,event_mask
les dx,mhandler
int 33h
ret
mouse_set_eventhandler ENDP
;****************************************
; mouse_start_pen_emul PROC:
; Description: start mouse light-pen emulation
; void mouse_start_pen_emul(void);
; Procedure mouse_start_pen_emul;
;****************************************
mouse_start_pen_emul PROC
mov ax,0Dh
int 33h
ret
mouse_start_pen_emul ENDP
;****************************************
; mouse_stop_pen_emul PROC:
; Description: stop mouse light-pen emulation
; void mouse_stop_pen_emul(void);
; Procedure mouse_stop_pen_emul;
;****************************************
mouse_stop_pen_emul PROC
mov ax,0Eh
int 33h
ret
mouse_stop_pen_emul ENDP
;****************************************
; mouse_set_movement_ratio PROC:
; Description: set mouse cursor movement ratio
; void mouse_set_movement_ratio(int x_ratio,int y_ratio);
; Procedure mouse_set_movement_ratio(x_ratio, y_ratio : Integer);
;****************************************
mouse_set_movement_ratio PROC
ARG x_ratio, y_ratio
mov ax,0Fh
mov cx,x_ratio
mov dx,y_ratio
int 33h
ret
mouse_set_movement_ratio ENDP
;****************************************
; mouse_conditional_off PROC:
; Description: conditionally turn the mouse cursor off
; void mouse_conditional_off(int left,int top,int right,int bottom);
; Procedure mouse_conditional_off(left, top, right,
; bottom : Integer);
;****************************************
mouse_conditional_off PROC USES SI DI
ARG left, top, right, bottom
mov ax,10h
mov cx,left
mov dx,top
mov si,right
mov di,bottom
int 33h
ret
mouse_conditional_off ENDP
;****************************************
; mouse_set_speed PROC:
; Description: set mouse cursor speed
; void mouse_set_speed(int threshold);
; Procedure mouse_set_speed(threshold : Integer);
;****************************************
mouse_set_speed PROC
ARG threshold
mov ax,13h
mov bx,threshold
int 33h
ret
mouse_set_speed ENDP
;****************************************
; mouse_swap_vector PROC:
; Description: swap mouse interrupt vectors
; void far *mouse_swap_vector(int new_mask,int *old_mask,
; void far *new_vector);
; Function mouse_swap_vector
; (new_mask : Integer; Var old_mask : Integer;
; new_vector : pointer) : pointer;
;****************************************
mouse_swap_vector PROC USES ES
IFE FAR_PTRS
ARG new_mask, old_mask:NEAR PTR, new_vector:FAR PTR
ELSE
ARG new_mask, old_mask:FAR PTR, new_vector:FAR PTR
ENDIF
mov ax,14h
mov cx,new_mask
IFE FAR_PTRS
mov bx,old_mask
mov [bx],cx
ELSE
les bx,old_mask
mov word ptr es:[bx],cx
ENDIF
les dx,new_vector
int 33h
mov ax,es
xchg ax,dx
ret
mouse_swap_vector ENDP
;****************************************
; mouse_get_bufsize PROC:
; Description: get buffer size needed to store mouse state info
; int mouse_get_bufsize(void);
; Function mouse_get_bufsize : Integer;
;****************************************
mouse_get_bufsize PROC
mov ax,15h
int 33h
mov ax,bx
ret
mouse_get_bufsize ENDP
;****************************************
; mouse_save_state PROC:
; Description: save the "state" of the mouse driver
; void mouse_save_state(void far *state_buf);
; Procedure mouse_save_state(state_buf : pointer);
;****************************************
mouse_save_state PROC USES ES
ARG state_buf:FAR PTR
mov ax,16h
les dx,state_buf
int 33h
ret
mouse_save_state ENDP
;****************************************
; mouse_restore_state PROC:
; Description: restore the mouse driver "state"
; void mouse_restore_state(void far *state_buf);
; Procedure mouse_restore_state(state_buf : pointer);
;****************************************
mouse_restore_state PROC USES ES
ARG state_buf:FAR PTR
mov ax,17h
les dx,state_buf
int 33h
ret
mouse_restore_state ENDP
;****************************************
; mouse_set_alt_handler PROC:
; Description: set an alternate mouse event handler
; void mouse_set_alt_handler(int alt_mask,void far (*func)());
; Procedure mouse_set_alt_handler(alt_mask : Integer;
; func : pointer);
;****************************************
mouse_set_alt_handler PROC USES ES
ARG alt_mask, func:FAR PTR
mov ax,18h
mov cx,alt_mask
les dx,func
int 33h
ret
mouse_set_alt_handler ENDP
;****************************************
; mouse_get_alt_handler PROC:
; Description: get address of alternate mouse event handler
; int mouse_get_alt_handler(int alt_mask,void far *handler);
; Function mouse_get_alt_handler
; (alt_mask : Integer; handler : pointer) : pointer;
;****************************************
mouse_get_alt_handler PROC USES ES DI
ARG alt_mask, handler:FAR PTR
mov ax,19h
mov cx,alt_mask
int 33h
les di,handler
mov word ptr es:[di],dx
mov word ptr es:[di+2],bx
mov ax,cx
ret
mouse_get_alt_handler ENDP
;****************************************
; mouse_set_sens PROC:
; Description: set mouse sensitivity
; void mouse_set_sens(int x_ratio,int y_ratio,int threshold);
; Procedure mouse_set_sens(x_ratio, y_ratio,
; threshold : Integer);
;****************************************
mouse_set_sens PROC
ARG x_ratio, y_ratio, threshold
mov ax,1Ah
mov bx,x_ratio
mov cx,y_ratio
mov dx,threshold
int 33h
ret
mouse_set_sens ENDP
;****************************************
; mouse_get_sens PROC:
; Description: get mouse sensitivity
; void mouse_get_sens(int *x_ratio,int *y_ratio,
; int *threshold);
; Procedure mouse_get_sens(Var x_ratio, y_ratio,
; threshold : Integer);
;****************************************
mouse_get_sens PROC USES ES
IFE FAR_PTRS
ARG x_ratio:NEAR PTR, y_ratio:NEAR PTR, threshold:NEAR PTR
ELSE
ARG x_ratio:FAR PTR, y_ratio:FAR PTR, threshold:FAR PTR
ENDIF
mov ax,1Bh
int 33h
push bx
IFE FAR_PTRS
mov bx,x_ratio
pop [bx]
mov bx,y_ratio
mov [bx],cx
mov bx,threshold
mov [bx],dx
ELSE
les bx,x_ratio
pop word ptr es:[bx]
les bx,y_ratio
mov word ptr es:[bx],cx
les bx,threshold
mov word ptr es:[bx],dx
ENDIF
ret
mouse_get_sens ENDP
;****************************************
; mouse_set_crt_page PROC:
; Description: set mouse crt page (video page)
; void mouse_set_crt_page(int crt_page);
; Procedure mouse_set_crt_page(crt_page : Integer);
;****************************************
mouse_set_crt_page PROC
ARG crt_page
mov ax,1Dh
mov bx,crt_page
int 33h
ret
mouse_set_crt_page ENDP
;****************************************
; mouse_get_crt_page PROC:
; Description: get mouse crt page (video page)
; int mouse_get_crt_page(void);
; Function mouse_get_crt_page : Integer;
;****************************************
mouse_get_crt_page PROC
mov ax,1Eh
int 33h
mov ax,bx
ret
mouse_get_crt_page ENDP
;****************************************
; mouse_disable_drvr PROC:
; Description: disable mouse driver
; int mouse_disable_drvr(void far *vector_33h);
; Function mouse_disable_drvr(vector_33h : pointer) : Integer;
;****************************************
mouse_disable_drvr PROC USES ES
ARG vector_33h:FAR PTR
mov ax,1Fh
int 33h
cmp ax,-1
je @@exit
mov dx,es
mov cx,bx
les bx,vector_33h
mov word ptr es:[bx],cx
mov word ptr es:[bx+2],dx
@@exit:
ret
mouse_disable_drvr ENDP
;****************************************
; mouse_enable_drvr PROC:
; Description: enable mouse driver
; void mouse_enable_drvr(void);
; Procedure mouse_enable_drvr;
;****************************************
mouse_enable_drvr PROC
mov ax,20h
int 33h
ret
mouse_enable_drvr endp
;****************************************
; mouse_soft_reset PROC:
; Description: mouse software reset
; int mouse_soft_reset(int *nbuttons);
; Function mouse_soft_reset(Var nbuttons : Integer):Integer;
;****************************************
mouse_soft_reset PROC USES ES
IFE FAR_PTRS
ARG nbuttons:NEAR PTR
ELSE
ARG nbuttons:FAR PTR
ENDIF
mov ax,21h
int 33h
cmp ax,-1
jne @@exit
push bx
IFE FAR_PTRS
mov bx,nbuttons
pop [bx]
ELSE
les bx,nbuttons
pop word ptr es:[bx]
ENDIF
@@exit:
ret
mouse_soft_reset ENDP
END