Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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