;THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
;SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
;END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
;ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
;IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
;SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
;FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
;CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
;AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
;COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
;
; $Source: f:/miner/source/bios/rcs/mouse.asm $
; $Revision: 1.5 $
; $Author: john $
; $Date: 1994/04/29 12:14:12 $
;
; Contains routines for a mouse interface.
;
; $Log: mouse.asm $
; Revision 1.5  1994/04/29  12:14:12  john
; Locked all memory used during interrupts so that program
; won't hang when using virtual memory.
; 
; Revision 1.4  1993/07/26  10:47:03  john
; added sub mouse_set_pos
; 
; Revision 1.3  1993/07/22  13:57:13  john
; aligned push/pops in mouse_set_limits
; 
; Revision 1.2  1993/07/22  13:14:43  john
; added mouse set limts sub
; 
; Revision 1.1  1993/07/10  13:10:43  matt
; Initial revision
;
;
;

;***************************************************************************
;***************************************************************************
;*****                                                                 *****
;*****                      M O U S E . A S M                          *****
;*****                                                                 *****
;***** Contains routines for a mouse interface.                        *****
;*****                                                                 *****
;*****                                                                 *****
;***** PROCEDURES                                                      *****
;*****                                                                 *****
;***** VARIABLES                                                       *****
;*****                                                                 *****
;*****                                                                 *****
;***** CONSTANTS                                                       *****
;*****                                                                 *****
;*****                                                                 *****
;***************************************************************************
;***************************************************************************

.386

;************************************************************************
;**************** FLAT MODEL DATA SEGMENT STUFF *************************
;************************************************************************

_DATA   SEGMENT BYTE PUBLIC USE32 'DATA'

rcsid   db  "$Id: mouse.asm 1.5 1994/04/29 12:14:12 john Exp $"

		MOUSE_EVENT STRUCT 2
			MouseDX         dw  ?
			MouseDY         dw  ?
			MouseButtons    dw  ?
			MouseFlags      dw  ?
		MOUSE_EVENT ENDS

		NumberOfButtons dw ?

		MyEvent             MOUSE_EVENT < >
		MyEventHandler      dd  0



_DATA   ENDS

DGROUP  GROUP _DATA


;************************************************************************
;**************** FLAT MODEL CODE SEGMENT STUFF *************************
;************************************************************************

_TEXT   SEGMENT BYTE PUBLIC USE32 'CODE'

		ASSUME  ds:_DATA
		ASSUME  cs:_TEXT

PUBLIC  mouse_init_

mouse_init_:

		push    bx
		xor     ax, ax      ; Reset mouse
		int     33h
		mov     NumberOfButtons, bx
		pop     bx
		or      ax, ax
		jnz     present
		jmp     absent


present:
		mov     ax, 0020h   ; Enable driver
		int     33h

		mov     ax, 1
		ret

absent:
		mov     ax, 0
		ret



PUBLIC  mouse_get_pos_

mouse_get_pos_:

		push    eax
		push    ebx
		push    ecx
		push    edx

		push    eax

		mov     ax, 03h     ; Get Mouse Position and Button Status
		int     33h
		; bx = buttons, cx = x, dx = y

		pop     eax
		mov     [eax], cx
		pop     eax
		mov     [eax], dx
		mov     edx, eax

		pop     ecx
		pop     ebx
		pop     eax

		ret

PUBLIC  mouse_get_delta_

mouse_get_delta_:

		push    eax
		push    ebx
		push    ecx
		push    edx


		push    eax

		mov     eax, 0bh    ; Read Mouse Motion Counters
		int     33h

		pop     eax
		mov     [eax], cx
		pop     eax
		mov     [eax], dx
		mov     edx, eax

		pop     ecx
		pop     ebx
		pop     eax
		ret


PUBLIC  mouse_get_btns_

mouse_get_btns_:

		push    ebx
		push    ecx
		push    edx

		mov     ax, 03h     ; Get Mouse Position and Button Status
		int     33h
		; bx = buttons, cx = x, dx = y

		movzx   eax, bx

		pop     edx
		pop     ecx
		pop     ebx

		ret


PUBLIC  mouse_close_

mouse_close_:

		push    eax
		push    ebx
		push    es

		mov     ax, 01fh    ; Disable mouse driver
		int     33h

		pop     es
		pop     ebx
		pop     eax

		ret

MyHandler:

		pushad
		push    ds

		push    ax
		mov     ax, DGROUP
		mov     ds, ax
		pop     ax

		mov     MyEvent.MouseDX, cx
		mov     MyEvent.MouseDY, dx
		mov     MyEvent.MouseButtons, bx
		mov     MyEvent.MouseFlags, ax

		mov     eax, offset MyEvent

		call    MyEventHandler

		pop     ds
		popad

		retf

PUBLIC  mouse_set_handler_

mouse_set_handler_:

		push    eax
		push    ebx
		push    ecx
		push    edx
		push    es

		mov     MyEventHandler, edx

		mov     ecx, eax    ; Event flags
		mov     edx, MyHandler
		mov     ax, cs
		mov     es, ax
		mov     ax, 0Ch     ; Set User-defined Mouse Event Handler
		int     33h

		pop     es
		pop     edx
		pop     ecx
		pop     edx
		pop     eax

		ret

PUBLIC  mouse_clear_handler_

mouse_clear_handler_:

		push    eax
		push    ebx
		push    ecx
		push    edx
		push    es

		mov     MyEventHandler, 0

		mov     ecx, 0    ; Event flags
		mov     edx, MyHandler
		mov     ax, cs
		mov     es, ax
		mov     ax, 0Ch     ; Set User-defined Mouse Event Handler
		int     33h

		pop     es
		pop     edx
		pop     ecx
		pop     edx
		pop     eax

		ret


PUBLIC  mouse_set_limits_

mouse_set_limits_:

		; EAX = minx
		; EDX = miny
		; EBX = maxx
		; ECX = maxy

		push    edx     ; Save Vertical stuff
		push    ecx

		mov     cx, ax
		mov     dx, bx
		mov     ax, 7
		int     33h

		pop     edx
		pop     ecx
		mov     ax, 8
		int     33h

		ret


;extern void mouse_set_pos( short x, short y);


PUBLIC  mouse_set_pos_

mouse_set_pos_:

		; EAX = x
		; EDX = y

		push    ecx

		mov     ecx, eax
		mov     eax, 04h
		int     33h
		pop     ecx


		ret



_TEXT   ENDS


		END
