; <--- description --->
; compiler:     FASM 1.67.23
; name:         Mouse Emulation For KolibriOS
;-----------------------------------------------------------------------------
; version:	1.2
; last update:  01/06/2012
; written by:   Marat Zakiyanov aka Mario79, aka Mario
; changes:      using new functions 66.6 and 66.7
;-----------------------------------------------------------------------------
; version:	1.1
; last update:  26/05/2012
; written by:   Lipatov Kirill aka Leency
; changes:      shows notify with instructions, while opening program
;-----------------------------------------------------------------------------
; version:	1.0
; last update:  04/09/2010
; written by:   Marat Zakiyanov aka Mario79, aka Mario
; changes:      total optimization of code,
;               different events for Up and Down of key Num 5
;               advansed acceleration mode
;-----------------------------------------------------------------------------
; version:      0.8
; last update:  03/10/2007
; written by:   Zlobny_Gluk
; e-mail:       umbrosia@land.ru
;-----------------------------------------------------------------------------
; <--- include all KolibriOS stuff --->
include "lang.inc"
include '../../../macros.inc'

; <--- start of KolibriOS application --->
MEOS_APP_START

; <--- start of code --->
CODE
;-----------------------------------------------------------------------------
start:
	mcall	70,notifyapp

start1:
	xor	ebx,ebx
	mcall	40
@@:
	mcall	23,10

	mcall	66,3
	test	eax,0x80	;NumLock status
	jz	@r

	mov	ebx,4
	call	hotkeys_common

	mcall	40,10b
still:
	mcall	10

	cmp	eax,2		; if event == 2
	jne	still
;-----------------------------------------------------------------------------
key:				   ; key event handler
	call	mouse_acceleration

	mcall	2		   ; get key code

	push	eax
	mcall	66,3
	test	eax,0x80	;NumLock status
	pop	eax
	jnz	@f
	mov	ebx,5
	call	hotkeys_common
	jmp	start1
@@:
	cmp	al,2
	jne	still

	xor	edx,edx

	cmp	ah,80	; Down Num 2
	je	keytwo
	cmp	ah,81	; Down Num 3
	je	keythree
	cmp	ah,75	; Down Num 4
	je	keyfour
	cmp	ah,77	; Down Num 6
	je	keysix
	cmp	ah,71	; Down Num 7
	je	keyseven
	cmp	ah,72	; Down Num 8
	je	keyeight
	cmp	ah,73	; Down Num 9
	je	keynine
	cmp	ah,76	; Down Num 5
	je	keyfive
	cmp	ah,204	; Up Num 5
	je	keyfive_1
	cmp	ah,79	; Down Num 1
	jne	still
;-----------------------------------------------------------------------------
keyone:
	call	down
keyfour:
	call	left
	jmp	mouseread
;-----------------------------------------------------------------------------
keythree:
	call	right
keytwo:
	call	down
	jmp	mouseread
;-----------------------------------------------------------------------------
keyseven:
	call	left
keyeight:
	call	up
	jmp	mouseread
;-----------------------------------------------------------------------------
keynine:
	call	up
keysix:
	call	right
	jmp	mouseread
;-----------------------------------------------------------------------------
keyfive:
	inc	edx
keyfive_1:
	mcall	18,19,5
	jmp	still
;-----------------------------------------------------------------------------
left:
	mov	eax,esi
	shl	eax,16
	sub	edx,eax
	ret
;-----------------------------------------------------------------------------
right:
	mov	eax,esi
	shl	eax,16
	add	edx,eax
	ret
;-----------------------------------------------------------------------------
down:
	add	edx,esi
	ret
;-----------------------------------------------------------------------------
up:
	sub	edx,esi
	ret
;-----------------------------------------------------------------------------
mouseread:
	xor	ebx,ebx
	mcall	37
	add	edx,eax

sravn:
	xor	ebx,ebx
	xor	edi,edi

real:
	mov	ebx,edx
	mov	edi,ebx
	shr	ebx,16 ; get x1
;	shl	edi,16 ; get y1
;	shr	edi,16
	and	edi,0xffff

nullli:
	add	ebx,16
	cmp	ebx,65535
	jg	xmin
	sub	ebx,15

	add	edi,16
	cmp	edi,65535
	jg	ymin
	sub	edi,15

razr:
	mcall	14

	mov	ecx,eax
	shr	eax,16 ; get x2
;	shl	ecx,16 ; get y2
;	shr	ecx,16
	and	ecx,0xffff

rightdownli:
	cmp	eax,ebx
	jl	xmax
	cmp	ecx,edi
	jl	ymax

mousewrite:
	mcall	18,19,4
	mcall	26,9
	mov	[mouse_timer_ticks],eax
	jmp	still
;-----------------------------------------------------------------------------
mouse_acceleration:
	xor	esi,esi
	inc	esi
	mcall	18,19,2
	mov	ecx,eax
	mcall	26,9
	sub	eax,[mouse_timer_ticks]
	cmp	eax,ecx  ; mouse_delay
	ja	@f
	xor	ecx,ecx
	mcall	18,19	; checkspeed
	mov	esi,eax
	shl	esi,2
@@:
	ret
;-----------------------------------------------------------------------------
xmax:
	dec	eax
	dec	ebx
	dec	edi
	shl	eax,16
	add	edi,eax
	mov	edx,edi
	jmp	sravn
;-----------------------------------------------------------------------------
xmin:
	mov	edx,edi
	jmp	sravn
;-----------------------------------------------------------------------------
ymax:
	dec	ecx
	dec	ebx

	shl	ebx,16
	mov	edi,ebx
	add	edi,ecx
	mov	edx,edi
	jmp	sravn
;-----------------------------------------------------------------------------
ymin:
	shl	ebx,16
	mov	edx,ebx
	shr	ebx,16
	jmp	sravn
;-----------------------------------------------------------------------------
hotkeys_common:
	xor	ecx,ecx
	xor	edx,edx
	mov	cl,79	; Down Num 1
	mcall	66

	mov	cl,80	; Down Num 2
	mcall	66

	mov	cl,81	; Down Num 3
	mcall	66

	mov	cl,75	; Down Num 4
	mcall	66

	mov	cl,76	; Down Num 5
	mcall	66

	mov	cl,204 ; Up Num 5
	mcall	66

	mov	cl,77	; Down Num 6
	mcall	66

	mov	cl,71	; Down Num 7
	mcall	66

	mov	cl,72	; Down Num 8
	mcall	66

	mov	cl,73	; Down Num 9
	mcall	66
; disable/enable input, work only hotkeys (f.66.6,66.7)
	add	ebx,2
	mcall	66
	ret
;-----------------------------------------------------------------------------
; <--- initialised data --->
DATA
;-----------------------------------------------------------------------------
; <--- uninitialised data --->
UDATA
mouse_timer_ticks	dd 0
;-----------------------------------------------------------------------------
if lang eq ru
	ud_user_message db 'NumLock ����砥� � �몫�砥� ������ ���. ��ࠢ����� �१ Numpad',0
else if lang eq it
	ud_user_message db 'NumLock - on/off - usa Numpad per muovere il cursore',0
else
	ud_user_message db 'NumLock - on/off mouse emul. Numpad - move cursor',0
end if

notifyapp:
	dd 7
	dd 0
	dd ud_user_message
	dd 0
	dd 0
	db '@notify',0
;-----------------------------------------------------------------------------
MEOS_APP_END
; <--- end of KolibriOS application --->
; ZG