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: ; метка конца программы |