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