Subversion Repositories Kolibri OS

Rev

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

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