;------------------------------------------------------------------------------ ; Mad Mouse ;--------------------------------------------------------------------- ; version: 0.2 ; last update: 03/06/2012 ; changed by: Marat Zakiyanov aka Mario79, aka Mario ; changes: Some optimizations. ;--------------------------------------------------------------------- ; Автор этого ужасно стремного кода: Sourcerer, 23.04.2010 ; popovpa (29.05.2012) ; 1. Изменение логики работы программы. ; 2. Добавлено "перескакивание" сверху и низу :) ; 3. Оптимизация кода. ;------------------------------------------------------------------------------ use32 ; транслятор, использующий 32-х разрядные команды org 0x0 ; базовый адрес кода, всегда 0x0 db 'MENUET01' ; 1. идентификатор исполняемого файла (8 байт) dd 0x01 ; 2. версия формата заголовка исполняемого файла dd START ; 3. адрес, на который система передаёт управление ; после загрузки приложения в память dd IM_END ; 4. размер приложения dd I_END ; 5. объём необходимой приложению памяти ; можно обращаться к памяти в диапазоне от 0x0 ; до значения, определённого здесь dd stack_area ; 6. вершина стека в диапазоне памяти, указанном выше dd 0x0 ; 7. указатель на строку с параметрами. ; если после запуска неравно нулю, приложение было ; запущено с параметрами из командной строки dd 0x0 ; 8. указатель на строку, в которую записан путь, ; откуда запущено приложение ;------------------------------------------------------------------------------ ; макросы облегчают жизнь программиста include '../../macros.inc' ;------------------------------------------------------------------------------ ;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- ;------------------------------------------------------------------------------ START: ;адрес начала программы mov eax,40 ;установить маску для ожидаемых событий. mov ebx,100000b ;нужно только событие мыши int 0x40 ;------------------------------------------------------------------------------ ;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- ;------------------------------------------------------------------------------ align 4 still: mov eax,10 ;ожидать событий int 0x40 mov eax,14 ;функция 14 - получить размер экрана int 0x40 ;вызов ф.14 в цикле потому что может ;поменяться разрешение экрана mov ebx,eax shl ebx,16 shr ebx,16 mov edi,ebx ;сохраним у shr eax,16 ;сдвигаем eax вправо на 16 - получаем x mov esi,eax ;сохраним x ;получаем координаты курсора mov eax,37 ;функция 37 - работа с мышью xor ebx,ebx ;подфукция 0 - координаты мыши ;относительно экрана int 0x40 mov ebx,eax ;запоминаем координаты shr eax,16 ;теперь у нас только x. нужен и y mov ecx,eax ;запоминаем x shl ebx,16 ;сдвинем влео на 16 shr ebx,16 ;сдвинемв право на 16, у нас есть у ;------------------------------------------------------------------------------ ;в esi и edi координаты размера экрана X и Y соответсвенно ;в ecx и ebx координаты курсора X и Y соответвенно ;------------------------------------------------------------------------------ ;сравнение координат x test ecx,ecx ;равна 0? jz left_border ;переход к обработке у левого края cmp ecx,esi ;равна ширине экрана? jz right_border ;переходим к обработке у правого края ;сравнение координат y test ebx,ebx ;равна 0? jz top_border ;если да значит курсор вверху cmp ebx,edi ;равна высоте экрана? jz bottom_border ;переход к обработке у нижнего края jmp still ;иначе ничего делать не нужно ;------------------------------------------------------------------------------ align 4 left_border: mov edx,esi ;в edx имеем ширину экрана dec edx ;уменьшим на 1 shl edx,16 ;теперь edx=(x-1)*65536 add edx,ebx ;а теперь edx=(x-1)*65536+y ;------------------------------------------------------------------------------ align 4 set_mouse_position: mov eax,18 ;функция 18: установить настройки мыши mov ebx,19 ;подфункция 19 mov ecx,4 ;подподфункция 4: установить положение ;курсора int 0x40 jmp still ;отдыхаем ;------------------------------------------------------------------------------ align 4 right_border: ;курсор у правого края xor edx,edx inc edx ;edx=1 shl edx,16 ;edx = 1*65536 add edx,ebx ;edx=1*65536+y jmp set_mouse_position ;------------------------------------------------------------------------------ align 4 top_border: ;курсор у верхнего края mov edx,ecx ;Х координата курсора shl edx,16 ;теперь edx=(x)*65536 add edx,edi ;а теперь edx=(x)*65536+y dec edx ;а теперь edx=(x)*65536+(у-1) jmp set_mouse_position ;------------------------------------------------------------------------------ align 4 bottom_border: ;курсор у нижнего края mov edx,ecx ;edx=ecx x координата курсора shl edx,16 ;edx = х*65536 ;у координата равна 0 jmp set_mouse_position ;------------------------------------------------------------------------------ IM_END: ; метка конца кода ;------------------------------------------------------------------------------ align 4 rb 1024 stack_area: ;------------------------------------------------------------------------------ I_END: ; метка конца программы ;------------------------------------------------------------------------------