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 | ;------------------------------------------------------------------------------ |