;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; RDOS operating system ; Copyright (C) 1988-2000, Leif Ekblad ; ; This program is free software; you can redistribute it and/or modify ; it under the terms of the GNU General Public License as published by ; the Free Software Foundation; either version 2 of the License, or ; (at your option) any later version. The only exception to this rule ; is for commercial usage in embedded systems. For information on ; usage in commercial embedded systems, contact embedded@rdos.net ; ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ; ; You should have received a copy of the GNU General Public License ; along with this program; if not, write to the Free Software ; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ; ; The author of this program may be contacted at leif@rdos.net ; ; MOUSE.ASM ; Basic mouse support module. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INCLUDE ..\os\protseg.def INCLUDE ..\driver.def INCLUDE ..\user.def INCLUDE ..\os.def INCLUDE ..\user.inc INCLUDE ..\os.inc INCLUDE ..\os\system.inc INCLUDE ..\wait.inc mouse_wait_header STRUC mw_obj wait_obj_header <> mw_counter DD ? mouse_wait_header ENDS mouse_seg STRUC m_cursor_flag DW ? m_cursor_type DW ? m_cursor_mask DW ? m_screen_mask DW ? m_horiz_pos DW ? m_vert_pos DW ? m_horiz_motion DW ? m_vert_motion DW ? m_horiz_mickey DW ? m_vert_mickey DW ? m_horiz_min DW ? m_horiz_max DW ? m_vert_min DW ? m_vert_max DW ? m_horiz_limit DW ? m_vert_limit DW ? m_botton_status DW ? m_horiz_press0 DW ? m_vert_press0 DW ? m_count_press0 DW ? m_horiz_press1 DW ? m_vert_press1 DW ? m_count_press1 DW ? m_horiz_rel0 DW ? m_vert_rel0 DW ? m_count_rel0 DW ? m_horiz_rel1 DW ? m_vert_rel1 DW ? m_count_rel1 DW ? m_notify_thread DW ? m_notify_sel DW ? m_notify_offs DD ? m_marker_x DW ? m_marker_y DW ? m_avail_obj DW ? m_counter DD ? mouse_seg ENDS data SEGMENT byte public 'DATA' md_buttons DW ? md_dx DW ? md_dy DW ? md_x DW ? md_y DW ? md_mouse_thread DW ? md_swap_x DB ? md_swap_y DB ? md_area_x DW ? md_area_y DW ? data ENDS .386p code SEGMENT byte public 'CODE' assume cs:code ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; Name: GetValue ; ; Purpose: Get value from environment ; ; Parameters: ES:DI Name ; ; Returns: NC Found ; AX Value ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GetValue Proc near push ds push bx push cx push si ; LockSysEnv mov ds,bx xor si,si find_val: push di find_val_loop: cmpsb jnz find_val_next ; mov al,es:[di] or al,al jnz find_val_loop mov al,[si] cmp al,'=' je find_val_found find_val_next: pop di find_val_next_bp: lodsb or al,al jnz find_val_next_bp ; mov al,[si] or al,al jne find_val ; xor ax,ax stc jmp find_val_done find_val_found: pop di inc si xor ax,ax find_val_digit: mov bl,[si] inc si sub bl,'0' jc find_val_save ; cmp bl,10 jnc find_val_save ; mov cx,10 mul cx add al,bl adc ah,0 jmp find_val_digit find_val_save: clc find_val_done: pushf UnlockSysEnv popf ; pop si pop cx pop bx pop ds ret GetValue Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RecalcX ; ; DESCRIPTION: Recalc X ; ; PARAMETERS: AX Value (0..32767) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RecalcX Proc near push ecx push edx push esi push edi ; movzx eax,ax cmp ds:md_swap_x,0 je rSwapXOk ; mov edx,eax mov eax,32767 sub eax,edx rSwapXOk: movzx edx,ds:md_area_x or edx,edx jz rDoneX ; push eax movzx eax,dx shl eax,16 xor edx,edx ; mov ecx,100 div ecx mov esi,eax ; pop eax shl eax,16 xor edx,edx div esi mov edi,eax ; mov eax,10000h sub eax,esi shr eax,2 shl eax,16 xor edx,edx div esi ; sub edi,eax mov eax,edi test eax,80000000h jz rPosX ; xor eax,eax rPosX: cmp eax,32767 jb rDoneX ; mov eax,32767 rDoneX: pop edi pop esi pop edx pop ecx ret RecalcX Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: RecalcY ; ; DESCRIPTION: Recalc Y ; ; PARAMETERS: AX Value (0..32767) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; RecalcY Proc near push ecx push edx push esi push edi ; movzx eax,ax cmp ds:md_swap_y,0 je rSwapYOk ; mov edx,eax mov eax,32767 sub eax,edx rSwapYOk: movzx edx,ds:md_area_y or edx,edx jz rDoneY ; push eax movzx eax,dx shl eax,16 xor edx,edx ; mov ecx,100 div ecx mov esi,eax ; pop eax shl eax,16 xor edx,edx div esi mov edi,eax ; mov eax,10000h sub eax,esi shr eax,2 shl eax,16 xor edx,edx div esi ; sub edi,eax mov eax,edi test eax,80000000h jz rPosY ; xor eax,eax rPosY: cmp eax,32767 jb rDoneY ; mov eax,32767 rDoneY: pop edi pop esi pop edx pop ecx ret RecalcY Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: hide_marker ; ; DESCRIPTION: hide marker ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hide_marker PROC near push ds push ax push bx push cx push dx ; mov ax,ds:m_cursor_flag or ax,ax jz hide_marker_done ; test ah,80h jnz hide_marker_done ; mov cx,ds:m_marker_x mov dx,ds:m_marker_y InvertMouse hide_marker_done: pop dx pop cx pop bx pop ax pop ds ret hide_marker ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: show_marker ; ; DESCRIPTION: show marker ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; show_marker PROC near push ds push ax push bx push cx push dx ; mov ax,ds:m_cursor_flag or ax,ax jz show_marker_done ; test ah,80h jnz show_marker_done ; mov ax,ds:m_horiz_pos xor dx,dx div ds:m_horiz_mickey mov cx,ax ; mov ax,ds:m_vert_pos xor dx,dx div ds:m_vert_mickey mov dx,ax ; mov ds:m_marker_x,cx mov ds:m_marker_y,dx InvertMouse show_marker_done: pop dx pop cx pop bx pop ax pop ds ret show_marker ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: SetMouseLimit ; ; DESCRIPTION: Set mouse limits for touch-screens ; ; PARAMETERS: CX MaxX ; DX MaxY ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_mouse_limit_name DB 'Set Mouse Limit',0 set_mouse_limit PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov ds:m_horiz_limit,cx mov ds:m_vert_limit,dx ; pop ax pop ds ret set_mouse_limit ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: update_mouse ; ; DESCRIPTION: update mouse from IRQ ; ; PARAMETERS: AX Buttons ; CX Dx ; DX Dy ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; update_mouse_name DB 'Update Mouse',0 update_mouse PROC far push ds push bx ; mov bx,SEG data mov ds,bx mov ds:md_buttons,ax add ds:md_dx,cx neg dx add ds:md_dy,dx mov bx,ds:md_mouse_thread mov ax,mouse_focus_sel mov ds,ax inc ds:m_counter mov ax,ds:m_notify_thread or ax,ax jz mouse_int_signal ; mov bx,ax mouse_int_signal: Signal ; mov bx,ds:m_avail_obj or bx,bx jz update_mouse_done ; mov es,bx SignalWait mov ds:m_avail_obj,0 update_mouse_done: pop bx pop ds ret update_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: set_mouse ; ; DESCRIPTION: Set mouse from IRQ ; ; PARAMETERS: AX Buttons ; CX AbsX ; DX AbsY ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_mouse_name DB 'Set Mouse',0 set_mouse PROC far push ds push bx ; mov bx,SEG data mov ds,bx mov ds:md_buttons,ax ; mov ax,cx call RecalcX mov ds:md_x,ax ; mov ax,dx call RecalcY mov ds:md_y,ax ; mov bx,ds:md_mouse_thread mov ax,mouse_focus_sel mov ds,ax inc ds:m_counter mov ax,ds:m_notify_thread or ax,ax jz set_mouse_int_signal ; mov bx,ax set_mouse_int_signal: Signal ; mov bx,ds:m_avail_obj or bx,bx jz set_mouse_done ; verr bx jnz set_mouse_done ; mov es,bx SignalWait mov ds:m_avail_obj,0 set_mouse_done: pop bx pop ds ret set_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: check_horiz_position ; ; DESCRIPTION: check horizontal position ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check_horiz_position PROC near push ax mov ax,ds:m_horiz_pos cmp ax,ds:m_horiz_min jge set_horiz_min_ok mov ax,ds:m_horiz_min set_horiz_min_ok: cmp ax,ds:m_horiz_max jle set_horiz_max_ok mov ax,ds:m_horiz_max set_horiz_max_ok: mov ds:m_horiz_pos,ax pop ax ret check_horiz_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: check_vert_position ; ; DESCRIPTION: check vertical position ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; check_vert_position PROC near push ax mov ax,ds:m_vert_pos cmp ax,ds:m_vert_min jge set_vert_min_ok mov ax,ds:m_vert_min set_vert_min_ok: cmp ax,ds:m_vert_max jle set_vert_max_ok mov ax,ds:m_vert_max set_vert_max_ok: mov ds:m_vert_pos,ax pop ax ret check_vert_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: refresh_mouse ; ; DESCRIPTION: refresh mouse parameters ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; refresh_mouse Proc near mov cx,0FFFFh xchg cx,es:md_x cmp cx,0FFFFh je update_abs_horiz_done ; shl cx,1 mov ax,ds:m_horiz_limit mul cx mov ds:m_horiz_pos,dx update_abs_horiz_done: mov cx,0FFFFh xchg cx,es:md_y cmp cx,0FFFFh je update_abs_vert_done ; shl cx,1 mov ax,ds:m_vert_limit mul cx mov ds:m_vert_pos,dx update_abs_vert_done: mov ax,es:md_buttons mov dx,ds:m_botton_status mov dh,al xor dl,al jz mouse_buttons_done ; mov ds:m_botton_status,ax test dl,1 jz mouse_button1_handled ; test dh,1 jz mouse_button1_released mouse_button1_pressed: mov ax,ds:m_horiz_pos mov ds:m_horiz_press0,ax mov ax,ds:m_vert_pos mov ds:m_vert_press0,ax jmp mouse_button1_handled mouse_button1_released: mov ax,ds:m_horiz_pos mov ds:m_horiz_rel0,ax mov ax,ds:m_vert_pos mov ds:m_vert_rel0,ax mouse_button1_handled: test dl,2 jz mouse_buttons_done ; test dh,2 jz mouse_button2_released mouse_button2_pressed: mov ax,ds:m_horiz_pos mov ds:m_horiz_press1,ax mov ax,ds:m_vert_pos mov ds:m_vert_press1,ax jmp mouse_buttons_done mouse_button2_released: mov ax,ds:m_horiz_pos mov ds:m_horiz_rel1,ax mov ax,ds:m_vert_pos mov ds:m_vert_rel1,ax mouse_buttons_done: xor cx,cx xchg cx,es:md_dx or cx,cx jz update_rel_horiz_done ; add ds:m_horiz_motion,cx add ds:m_horiz_pos,cx call check_horiz_position update_rel_horiz_done: xor dx,dx xchg dx,es:md_dy or dx,dx jz update_rel_vert_done ; add ds:m_vert_motion,dx add ds:m_vert_pos,dx call check_vert_position update_rel_vert_done: ret refresh_mouse Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: reset ; ; DESCRIPTION: reset mouse params ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; reset PROC near push ds push ax ; mov ax,mouse_local_sel mov ds,ax xor ax,ax mov ds:m_notify_thread,ax mov ds:m_cursor_flag,ax mov ds:m_horiz_pos,ax mov ds:m_vert_pos,ax mov ds:m_marker_x,ax mov ds:m_marker_y,ax mov ds:m_botton_status,ax mov ds:m_horiz_motion,ax mov ds:m_vert_motion,ax ; mov ds:m_horiz_mickey,8 mov ds:m_vert_mickey,8 ; mov ds:m_horiz_min,ax mov ds:m_horiz_max,639 mov ds:m_horiz_limit,640 mov ds:m_vert_min,ax mov ds:m_vert_max,199 mov ds:m_vert_limit,480 ; mov ds:m_horiz_press0,ax mov ds:m_vert_press0,ax mov ds:m_count_press0,ax ; mov ds:m_horiz_press1,ax mov ds:m_vert_press1,ax mov ds:m_count_press1,ax ; mov ds:m_horiz_rel0,ax mov ds:m_vert_rel0,ax mov ds:m_count_rel0,ax ; mov ds:m_horiz_rel1,ax mov ds:m_vert_rel1,ax mov ds:m_count_rel1,ax ; mov ds:m_cursor_type,ax mov ds:m_screen_mask,0FFFFh mov ds:m_cursor_mask,077FFh ; pop ax pop ds ret reset Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: int33 ; ; DESCRIPTION: int 33 support ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_param PROC far call reset mov ax,0FFFFh mov bx,2 ret init_param ENDP show PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker inc ds:m_cursor_flag call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret show ENDP hide PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker dec ds:m_cursor_flag call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret hide ENDP get_position PROC far mov ax,mouse_local_sel mov ds,ax mov bx,ds:m_botton_status mov cx,ds:m_horiz_pos mov dx,ds:m_vert_pos mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret get_position ENDP set_position PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker mov ds:m_horiz_pos,cx mov ds:m_vert_pos,dx call check_horiz_position call check_vert_position call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret set_position ENDP get_press_info PROC far mov ax,mouse_local_sel mov ds,ax mov ax,ds:m_botton_status or bl,bl jz get_press0 get_press1: mov bx,ds:m_count_press1 mov cx,ds:m_horiz_press1 mov dx,ds:m_vert_press1 mov ds,[bp].pm_ds ret get_press0: mov bx,ds:m_count_press0 mov cx,ds:m_horiz_press0 mov dx,ds:m_vert_press0 mov ds,[bp].pm_ds ret get_press_info ENDP get_rel_info PROC far mov ax,mouse_local_sel mov ds,ax mov ax,ds:m_botton_status or bl,bl jz get_rel0 get_rel1: mov bx,ds:m_count_rel1 mov cx,ds:m_horiz_rel1 mov dx,ds:m_vert_rel1 mov ds,[bp].pm_ds ret get_rel0: mov bx,ds:m_count_rel0 mov cx,ds:m_horiz_rel0 mov dx,ds:m_vert_rel0 mov ds,[bp].pm_ds ret get_rel_info ENDP set_horiz_area PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker cmp dx,cx jge set_horiz_noswap mov ds:m_horiz_min,dx mov ds:m_horiz_max,cx jmp set_horiz_test_pos set_horiz_noswap: mov ds:m_horiz_min,cx mov ds:m_horiz_max,dx set_horiz_test_pos: call check_horiz_position call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret set_horiz_area ENDP set_vert_area PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker cmp dx,cx jge set_vert_noswap mov ds:m_vert_min,dx mov ds:m_vert_max,cx jmp set_vert_test_pos set_vert_noswap: mov ds:m_vert_min,cx mov ds:m_vert_max,dx set_vert_test_pos: call check_vert_position call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret set_vert_area ENDP dummy PROC far ret dummy ENDP set_cursor_type PROC far mov ax,mouse_local_sel mov ds,ax call hide_marker mov ax,[ebp].trap_ebx or ax,ax jnz set_cursor_not_supported mov ds:m_cursor_type,ax mov ds:m_screen_mask,cx mov ds:m_cursor_mask,dx set_cursor_not_supported: call show_marker mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret set_cursor_type ENDP read_motion_counter PROC far mov ax,mouse_local_sel mov ds,ax xor cx,cx xchg cx,ds:m_horiz_motion xor dx,dx xchg dx,ds:m_vert_motion mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret read_motion_counter ENDP set_mickey PROC far mov ax,mouse_local_sel mov ds,ax mov ds:m_horiz_mickey,cx mov ds:m_vert_mickey,dx mov ax,[ebp].trap_eax mov ds,[ebp].trap_pds ret set_mickey ENDP mouse_tab: mo00 DD OFFSET init_param mo01 DD OFFSET show mo02 DD OFFSET hide mo03 DD OFFSET get_position mo04 DD OFFSET set_position mo05 DD OFFSET get_press_info mo06 DD OFFSET get_rel_info mo07 DD OFFSET set_horiz_area mo08 DD OFFSET set_vert_area mo09 DD OFFSET dummy mo0A DD OFFSET set_cursor_type mo0B DD OFFSET read_motion_counter mo0C DD OFFSET dummy mo0D DD OFFSET dummy mo0E DD OFFSET dummy mo0F DD OFFSET set_mickey mo10 DD OFFSET dummy mo11 DD OFFSET dummy mo12 DD OFFSET dummy mo13 DD OFFSET dummy mo14 DD OFFSET dummy mo15 DD OFFSET dummy mo16 DD OFFSET dummy mo17 DD OFFSET dummy mo18 DD OFFSET dummy mo19 DD OFFSET dummy mo1A DD OFFSET dummy mo1B DD OFFSET dummy mo1C DD OFFSET dummy mo1D DD OFFSET dummy mo1E DD OFFSET dummy mo1F DD OFFSET dummy mo20 DD OFFSET dummy int33: SimSti movzx ebx,ax shl ebx,2 cmp ebx,80h jc mouse_call_do mov ebx,80h mouse_call_do: push dword ptr cs:[ebx].mouse_tab mov bx,[ebp].trap_ebx retn ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: show_mouse ; ; DESCRIPTION: show mouse ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; show_mouse_name DB 'Show Mouse',0 show_mouse PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax call hide_marker inc ds:m_cursor_flag call show_marker ; pop ax pop ds ret show_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: hide_mouse ; ; DESCRIPTION: hide mouse ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hide_mouse_name DB 'Hide Mouse',0 hide_mouse PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax call hide_marker dec ds:m_cursor_flag call show_marker ; pop ax pop ds ret hide_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_mouse_position ; ; DESCRIPTION: get position ; ; RETURNS: CX X ; DX Y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_mouse_position_name DB 'Get Mouse Position',0 get_mouse_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov cx,ds:m_horiz_pos mov dx,ds:m_vert_pos ; pop ax pop ds ret get_mouse_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: set_position ; ; DESCRIPTION: set position ; ; PARAMETERS: CX X ; DX Y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_mouse_position_name DB 'Set Mouse Position',0 set_mouse_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax call hide_marker mov ds:m_horiz_pos,cx mov ds:m_vert_pos,dx call check_horiz_position call check_vert_position call show_marker ; pop ax pop ds ret set_mouse_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_left_button ; ; DESCRIPTION: check if left mouse button is pressed ; ; RETURNS: NC pressed ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_left_button_name DB 'Get Left Button',0 get_left_button PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov ax,ds:m_botton_status rcr al,1 cmc ; pop ax pop ds ret get_left_button ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_right_button ; ; DESCRIPTION: check if right mouse button is pressed ; ; RETURNS: NC pressed ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_right_button_name DB 'Get Right Button',0 get_right_button PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov ax,ds:m_botton_status rcr al,2 cmc ; pop ax pop ds ret get_right_button ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_left_button_press_position ; ; DESCRIPTION: get position of last left button press ; ; RETURNS: CX x ; DX y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_left_button_press_position_name DB 'Get Left Button Press Position',0 get_left_button_press_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov cx,ds:m_horiz_press0 mov dx,ds:m_vert_press0 ; pop ax pop ds ret get_left_button_press_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_right_button_press_position ; ; DESCRIPTION: get position of last right button press ; ; RETURNS: CX x ; DX y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_right_button_press_position_name DB 'Get Right Button Press Position',0 get_right_button_press_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov cx,ds:m_horiz_press1 mov dx,ds:m_vert_press1 ; pop ax pop ds ret get_right_button_press_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_left_button_release_position ; ; DESCRIPTION: get position of last left button release ; ; RETURNS: CX x ; DX y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_left_button_release_position_name DB 'Get Left Button Release Position',0 get_left_button_release_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov cx,ds:m_horiz_rel0 mov dx,ds:m_vert_rel0 ; pop ax pop ds ret get_left_button_release_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: get_right_button_release_position ; ; DESCRIPTION: get position of last right button release ; ; RETURNS: CX x ; DX y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; get_right_button_release_position_name DB 'Get Right Button Release Position',0 get_right_button_release_position PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov cx,ds:m_horiz_rel1 mov dx,ds:m_vert_rel1 ; pop ax pop ds ret get_right_button_release_position ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: set_mouse_window ; ; DESCRIPTION: set window of mouse movement ; ; PARAMETERS: AX start x ; BX start y ; CX end x ; DX end y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_mouse_window_name DB 'Set Mouse Window',0 set_mouse_window PROC far push ds ; push mouse_local_sel pop ds call hide_marker mov ds:m_horiz_min,ax mov ds:m_horiz_max,cx mov ds:m_vert_min,bx mov ds:m_vert_max,dx ; call check_horiz_position call check_vert_position call show_marker ; pop ds ret set_mouse_window ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: set_mouse_mickey ; ; DESCRIPTION: set mouse mickeys ; ; PARAMETERS: CX mickeys in x-direction ; DX mickeys in y-direction ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; set_mouse_mickey_name DB 'Set Mouse Mickey',0 set_mouse_mickey PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov ds:m_horiz_mickey,cx mov ds:m_vert_mickey,dx ; pop ax pop ds ret set_mouse_mickey ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StartWaitForMouse ; ; DESCRIPTION: Start a wait for mouse ; ; PARAMETERS: ES Wait object ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start_wait_for_mouse PROC far push ds push ax push bx ; mov ax,mouse_local_sel mov ds,ax mov ds:m_avail_obj,es mov eax,ds:m_counter cmp eax,es:mw_counter je start_wait_for_done ; mov ds:m_avail_obj,0 SignalWait start_wait_for_done: pop bx pop ax pop ds ret start_wait_for_mouse Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: StopWaitForMouse ; ; DESCRIPTION: Stop a wait for mouse ; ; PARAMETERS: ES Wait object ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; stop_wait_for_mouse PROC far push ds push ax ; mov ax,mouse_local_sel mov ds,ax mov ds:m_avail_obj,0 ; pop ax pop ds ret stop_wait_for_mouse Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: ClearMouse ; ; DESCRIPTION: Clear mouse ; ; PARAMETERS: ES Wait object ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clear_mouse PROC far push ds push eax ; mov ax,mouse_local_sel mov ds,ax mov eax,ds:m_counter mov es:mw_counter,eax ; pop eax pop ds ret clear_mouse Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: IsMouseIdle ; ; DESCRIPTION: Check if mouse is idle ; ; PARAMETERS: ES Wait object ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; is_mouse_idle PROC far push ds push ax push bx ; mov ax,mouse_local_sel mov ds,ax mov eax,ds:m_counter cmp eax,es:mw_counter clc je is_idle_done ; stc is_idle_done: pop bx pop ax pop ds ret is_mouse_idle Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: AddWaitForMouse ; ; DESCRIPTION: Add a wait for mouse ; ; PARAMETERS: BX Wait handle ; ECX Signalled ID ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; add_wait_for_mouse_name DB 'Add Wait For Mouse',0 add_wait_tab: aw0 DD OFFSET start_wait_for_mouse, SEG code aw1 DD OFFSET stop_wait_for_mouse, SEG code aw2 DD OFFSET clear_mouse, SEG code aw3 DD OFFSET is_mouse_idle, SEG code add_wait_for_mouse PROC far push ds push es push eax push edi ; mov ax,cs mov es,ax mov ax,SIZE mouse_wait_header - SIZE wait_obj_header mov edi,OFFSET add_wait_tab AddWait jc add_wait_done ; mov ax,mouse_local_sel mov ds,ax mov eax,ds:m_counter mov es:mw_counter,eax add_wait_done: pop edi pop eax pop es pop ds ret add_wait_for_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: Mouse callback thread ; ; DESCRIPTION: Implements the mouse hooks ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hook_thread_name DB 'Mouse Hook',0 hook_thread Proc far mov ax,mouse_local_sel mov ds,ax GetThread mov ds:m_notify_thread,ax hook_thread_loop: mov bx,mouse_local_sel mov ds,bx mov ax,SEG data mov es,ax ; WaitForSignal GetThread cmp ax,ds:m_notify_thread jne hook_thread_end ; call hide_marker call refresh_mouse call show_marker ; mov ax,ds:m_botton_status mov cx,ds:m_horiz_pos mov dx,ds:m_vert_pos push ds:m_notify_offs CallPm32 jmp hook_thread_loop hook_thread_end: ret hook_thread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: HookMouse ; ; DESCRIPTION: Create a mouse callback ; ; PARAMETERS: ES:(E)DI Callback ; AX Mouse buttons ; CX x ; DX y ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; hook_mouse_name DB 'Hook Mouse',0 hook_mouse PROC near push ds push es push ax push bx push si push di ; mov bx,mouse_local_sel mov ds,bx mov ax,ds:m_notify_thread or ax,ax jz hook_mouse_do UnhookMouse hook_mouse_do: mov ds:m_notify_sel,es mov ds:m_notify_offs,edi ; mov ax,cs mov ds,ax mov es,ax mov si,OFFSET hook_thread mov di,OFFSET hook_thread_name mov cx,stack0_size mov ax,4 CreateThread ; pop di pop si pop bx pop ax pop es pop ds ret hook_mouse ENDP hook_mouse16 Proc far push edi movzx edi,di call hook_mouse pop edi ret hook_mouse16 Endp hook_mouse32 Proc far call hook_mouse ret hook_mouse32 Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: UnhookMouse ; ; DESCRIPTION: Delete a mouse callback ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; unhook_mouse_name DB 'Unhook Mouse',0 unhook_mouse PROC far push ds push bx ; mov bx,mouse_local_sel mov ds,bx xor bx,bx xchg bx,ds:m_notify_thread Signal ; pop bx pop ds ret unhook_mouse ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: mouse_thread ; ; DESCRIPTION: Mouse handling thread ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; mouse_thread_name DB 'Mouse' ,0 mouse_thread Proc far mov ax,init_mouse_nr IsValidOsGate jc mouse_init_ok ; InitMouse mouse_init_ok: mov ax,SEG data mov es,ax GetThread mov es:md_mouse_thread,ax mouse_thread_loop: mov bx,mouse_focus_sel mov ds,bx mov ax,SEG data mov es,ax ; WaitForSignal ; call hide_marker call refresh_mouse ; call show_marker jmp mouse_thread_loop ret mouse_thread Endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT_FOCUS ; ; DESCRIPTION: focus init of mouse ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; init_focus PROC far call reset mov ax,mouse_local_sel mov ds,ax mov ds:m_counter,0 mov ds:m_avail_obj,0 ret init_focus ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT_MOUSE_THREAD ; ; DESCRIPTION: focus init of mouse ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; swap_x_name DB 'TOUCH.SWAP.X', 0 swap_y_name DB 'TOUCH.SWAP.Y', 0 area_x_name DB 'TOUCH.AREA.X', 0 area_y_name DB 'TOUCH.AREA.Y', 0 init_mouse_thread PROC far push ds push es pusha ; mov ax,SEG data mov ds,ax mov ds:md_buttons,0 mov ds:md_dx,0 mov ds:md_dy,0 mov ds:md_x,0FFFFh mov ds:md_y,0FFFFh mov ds:md_mouse_thread,0 ; mov ax,SEG code mov es,ax mov di,OFFSET swap_x_name mov ds:md_swap_x,0 call GetValue jc itSwapXOk ; mov ds:md_swap_x,al itSwapXOk: mov di,OFFSET swap_y_name mov ds:md_swap_y,0 call GetValue jc itSwapYOk ; mov ds:md_swap_y,al itSwapYOk: mov di,OFFSET area_x_name mov ds:md_area_x,0 call GetValue jc itAreaXOk ; mov ds:md_area_x,ax itAreaXOk: mov di,OFFSET area_y_name mov ds:md_area_y,0 call GetValue jc itAreaYOk ; mov ds:md_area_y,ax itAreaYOk: mov ax,cs mov ds,ax mov es,ax mov si,OFFSET mouse_thread mov di,OFFSET mouse_thread_name mov ax,3 mov cx,stack0_size CreateThread init_mouse_done: popa pop es pop ds ret init_mouse_thread ENDP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; NAME: INIT ; ; DESCRIPTION: INITIERA driver ; ; PARAMETERS: ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; public init_mouse init_mouse PROC near mov bx,mouse_local_sel mov dx,mouse_focus_sel mov eax,SIZE mouse_seg AllocateFixedFocusMem ; mov ax,cs mov ds,ax mov es,ax ; mov edi,OFFSET init_focus HookEnableFocus ; mov edi,OFFSET init_mouse_thread HookInitTasking ; mov al,33h mov edi,OFFSET int33 HookVMInt ; mov esi,OFFSET add_wait_for_mouse mov edi,OFFSET add_wait_for_mouse_name xor dx,dx mov ax,add_wait_for_mouse_nr RegisterBimodalUserGate ; mov esi,OFFSET set_mouse_limit mov edi,OFFSET set_mouse_limit_name xor cl,cl mov ax,set_mouse_limit_nr RegisterOsGate ; mov esi,OFFSET update_mouse mov edi,OFFSET update_mouse_name xor cl,cl mov ax,update_mouse_nr RegisterOsGate ; mov esi,OFFSET set_mouse mov edi,OFFSET set_mouse_name xor cl,cl mov ax,set_mouse_nr RegisterOsGate ; mov esi,OFFSET show_mouse mov edi,OFFSET show_mouse_name xor dx,dx mov ax,show_mouse_nr RegisterBimodalUserGate ; mov esi,OFFSET hide_mouse mov edi,OFFSET hide_mouse_name xor dx,dx mov ax,hide_mouse_nr RegisterBimodalUserGate ; mov esi,OFFSET get_mouse_position mov edi,OFFSET get_mouse_position_name xor dx,dx mov ax,get_mouse_position_nr RegisterBimodalUserGate ; mov esi,OFFSET set_mouse_position mov edi,OFFSET set_mouse_position_name xor dx,dx mov ax,set_mouse_position_nr RegisterBimodalUserGate ; mov esi,OFFSET set_mouse_window mov edi,OFFSET set_mouse_window_name xor dx,dx mov ax,set_mouse_window_nr RegisterBimodalUserGate ; mov esi,OFFSET set_mouse_mickey mov edi,OFFSET set_mouse_mickey_name xor dx,dx mov ax,set_mouse_mickey_nr RegisterBimodalUserGate ; mov esi,OFFSET get_left_button mov edi,OFFSET get_left_button_name xor dx,dx mov ax,get_left_button_nr RegisterBimodalUserGate ; mov esi,OFFSET get_right_button mov edi,OFFSET get_right_button_name xor dx,dx mov ax,get_right_button_nr RegisterBimodalUserGate ; mov esi,OFFSET get_left_button_press_position mov edi,OFFSET get_left_button_press_position_name xor dx,dx mov ax,get_left_button_press_position_nr RegisterBimodalUserGate ; mov esi,OFFSET get_right_button_press_position mov edi,OFFSET get_right_button_press_position_name xor dx,dx mov ax,get_right_button_press_position_nr RegisterBimodalUserGate ; mov esi,OFFSET get_left_button_release_position mov edi,OFFSET get_left_button_release_position_name xor dx,dx mov ax,get_left_button_release_position_nr RegisterBimodalUserGate ; mov esi,OFFSET get_right_button_release_position mov edi,OFFSET get_right_button_release_position_name xor dx,dx mov ax,get_right_button_release_position_nr RegisterBimodalUserGate ; mov ebx,OFFSET hook_mouse16 mov esi,OFFSET hook_mouse32 mov edi,OFFSET hook_mouse_name xor dx,dx mov ax,hook_mouse_nr RegisterUserGate ; mov esi,OFFSET unhook_mouse mov edi,OFFSET unhook_mouse_name xor dx,dx mov ax,unhook_mouse_nr RegisterBimodalUserGate ret init_mouse ENDP code ENDS END