Subversion Repositories Kolibri OS

Rev

Rev 2726 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2726 mario79 1
;------------------------------------------------------------------------------
2
;   Mad Mouse
3
;---------------------------------------------------------------------
4
; version:	0.2
6331 pathoswith 5
; last update:	03/06/2012
6
; changed by:	Marat Zakiyanov aka Mario79, aka Mario
7
; changes:	Some optimizations.
2726 mario79 8
;---------------------------------------------------------------------
9
;   Автор этого ужасно стремного кода: Sourcerer, 23.04.2010
10
;   popovpa (29.05.2012)
11
;   1. Изменение логики работы программы.
12
;   2. Добавлено "перескакивание" сверху и низу :)
13
;   3. Оптимизация кода.
14
;------------------------------------------------------------------------------
15
	use32		; транслятор, использующий 32-х разрядные команды
6331 pathoswith 16
	org 0x0 	; базовый адрес кода, всегда 0x0
2726 mario79 17
 
6331 pathoswith 18
	db 'MENUET01'	; 1. идентификатор исполняемого файла (8 байт)
19
	dd 0x01 	; 2. версия формата заголовка исполняемого файла
2726 mario79 20
	dd START	; 3. адрес, на который система передаёт управление
21
			; после загрузки приложения в память
22
	dd IM_END	; 4. размер приложения
23
	dd I_END	; 5. объём необходимой приложению памяти
24
			; можно обращаться к памяти в диапазоне от 0x0
25
			; до значения, определённого здесь
26
	dd stack_area	; 6. вершина стека в диапазоне памяти, указанном выше
27
	dd 0x0		; 7. указатель на строку с параметрами.
28
			; если после запуска неравно нулю, приложение было
29
			; запущено с параметрами из командной строки
30
	dd 0x0		; 8. указатель на строку, в которую записан путь,
31
			; откуда запущено приложение
32
;------------------------------------------------------------------------------
6331 pathoswith 33
;---  НАЧАЛО ПРОГРАММЫ	----------------------------------------------
2726 mario79 34
;------------------------------------------------------------------------------
35
START:				;адрес начала программы
36
	mov	eax,40		;установить маску для ожидаемых событий.
37
	mov	ebx,100000b	;нужно только событие мыши
38
	int	0x40
39
;------------------------------------------------------------------------------
40
;---  ЦИКЛ ОБРАБОТКИ СОБЫТИЙ  ----------------------------------------
41
;------------------------------------------------------------------------------
6331 pathoswith 42
align 4
2726 mario79 43
still:
44
	mov	eax,10		;ожидать событий
45
	int	0x40
46
 
47
	mov	eax,14		;функция 14 - получить размер экрана
48
	int	0x40		;вызов ф.14 в цикле потому что может
49
				;поменяться разрешение экрана
50
	mov	ebx,eax
51
	shl	ebx,16
52
	shr	ebx,16
6331 pathoswith 53
	mov	edi,ebx 	;сохраним у
2726 mario79 54
	shr	eax,16		;сдвигаем eax вправо на 16 - получаем x
6331 pathoswith 55
	mov	esi,eax 	;сохраним x
2726 mario79 56
;получаем координаты курсора
57
	mov	eax,37		;функция 37 - работа с мышью
6331 pathoswith 58
	xor	ebx,ebx 	;подфукция 0 - координаты мыши
2726 mario79 59
				;относительно экрана
60
	int	0x40
61
 
6331 pathoswith 62
	mov	ebx,eax 	;запоминаем координаты
2726 mario79 63
	shr	eax,16		;теперь у нас только x. нужен и y
6331 pathoswith 64
	mov	ecx,eax 	;запоминаем x
2726 mario79 65
	shl	ebx,16		;сдвинем влео на 16
66
	shr	ebx,16		;сдвинемв право на 16, у нас есть у
67
;------------------------------------------------------------------------------
68
;в esi и edi координаты размера экрана X и Y соответсвенно
69
;в ecx и ebx координаты курсора X и Y соответвенно
70
;------------------------------------------------------------------------------
71
;сравнение координат x
6331 pathoswith 72
	test	ecx,ecx 	;равна 0?
2726 mario79 73
	jz	left_border	;переход к обработке у левого края
74
 
6331 pathoswith 75
	cmp	ecx,esi 	;равна ширине экрана?
76
	jz	right_border	;переходим к обработке у правого края
2726 mario79 77
;сравнение координат y
6331 pathoswith 78
	test	ebx,ebx 	;равна 0?
2726 mario79 79
	jz	top_border	;если да значит курсор вверху
80
 
6331 pathoswith 81
	cmp	ebx,edi 	;равна высоте экрана?
2726 mario79 82
	jz	bottom_border	;переход к обработке у нижнего края
83
 
84
	jmp	still		;иначе ничего делать не нужно
85
;------------------------------------------------------------------------------
6331 pathoswith 86
align 4
2726 mario79 87
left_border:
6331 pathoswith 88
	mov	edx,esi 	;в edx имеем ширину экрана
2726 mario79 89
	dec	edx		;уменьшим на 1
90
	shl	edx,16		;теперь edx=(x-1)*65536
6331 pathoswith 91
	add	edx,ebx 	;а теперь edx=(x-1)*65536+y
2726 mario79 92
;------------------------------------------------------------------------------
6331 pathoswith 93
align 4
2726 mario79 94
set_mouse_position:
95
	mov	eax,18		;функция 18: установить настройки мыши
96
	mov	ebx,19		;подфункция 19
97
	mov	ecx,4		;подподфункция 4: установить положение
98
				;курсора
99
	int	0x40
100
	jmp	still		;отдыхаем
101
;------------------------------------------------------------------------------
6331 pathoswith 102
align 4
2726 mario79 103
right_border:			;курсор у правого края
104
 
105
	xor	edx,edx
106
	inc	edx		;edx=1
107
	shl	edx,16		;edx = 1*65536
6331 pathoswith 108
	add	edx,ebx 	;edx=1*65536+y
2726 mario79 109
	jmp	set_mouse_position
110
;------------------------------------------------------------------------------
6331 pathoswith 111
align 4
2726 mario79 112
top_border:			;курсор у верхнего края
113
 
6331 pathoswith 114
	mov	edx,ecx 	;Х координата курсора
2726 mario79 115
	shl	edx,16		;теперь edx=(x)*65536
6331 pathoswith 116
	add	edx,edi 	;а теперь edx=(x)*65536+y
2726 mario79 117
	dec	edx		;а теперь edx=(x)*65536+(у-1)
118
	jmp	set_mouse_position
119
;------------------------------------------------------------------------------
6331 pathoswith 120
align 4
2726 mario79 121
bottom_border:			;курсор у нижнего края
6331 pathoswith 122
	mov	edx,ecx 	;edx=ecx x координата курсора
2726 mario79 123
	shl	edx,16		;edx = х*65536
6331 pathoswith 124
	inc	edx		;у координата равна 1
2726 mario79 125
	jmp	set_mouse_position
126
;------------------------------------------------------------------------------
6331 pathoswith 127
IM_END: 			; метка конца кода
2726 mario79 128
;------------------------------------------------------------------------------
129
align 4
130
	rb 1024
131
stack_area:
132
;------------------------------------------------------------------------------
133
I_END:				; метка конца программы
134
;------------------------------------------------------------------------------