diff --git a/programs/other/madmouse.asm b/programs/other/madmouse.asm new file mode 100644 index 0000000000..780590ea2f --- /dev/null +++ b/programs/other/madmouse.asm @@ -0,0 +1,140 @@ +; +; Mad Mouse +; Автор этого ужасно стремного кода: 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 I_END ; 4. размер приложения + dd 0x100000 ; 5. объём необходимой приложению памяти + ; можно обращаться к памяти в диапазоне от 0x0 + ; до значения, определённого здесь + dd 0x100000 ; 6. вершина стека в диапазоне памяти, указанном выше + dd 0x0 ; 7. указатель на строку с параметрами. + ; если после запуска неравно нулю, приложение было + ; запущено с параметрами из командной строки + dd 0x0 ; 8. указатель на строку, в которую записан путь, + ; откуда запущено приложение + + +;--------------------------------------------------------------------- +;--- НАЧАЛО ПРОГРАММЫ ---------------------------------------------- +;--------------------------------------------------------------------- + +START: ;адрес начала программы + + mov eax,14 ;функция 14 - получить размер экрана + int 0x40 + + mov ebx,eax + shl ebx,16 + shr ebx,16 + mov edi,ebx ;сохраним у + shr eax,16 ;сдвигаем eax вправо на 16 - получаем x + mov esi,eax ;сохраним x + +;--------------------------------------------------------------------- +;--- ЦИКЛ ОБРАБОТКИ СОБЫТИЙ ---------------------------------------- +;--------------------------------------------------------------------- + +still: +;организуем паузу в 100 мс + mov eax,5 ;функция 5 - пауза, в ebx время в мс + mov ebx,1 ;задержка 100 мс + int 0x40 +;получаем координаты курсора + 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 ;иначе ничего делать не нужно + +left_border: + mov edx,esi ;в edx имеем ширину экрана + dec edx ;уменьшим на 1 + shl edx,16 ;теперь edx=(x-1)*65536 + add edx,ebx ;а теперь edx=(x-1)*65536+y + + mov eax,18 ;функция 18: установить настройки мыши + mov ebx,19 ;подфункция 19 + mov ecx,4 ;подподфункция 4: установить положение + ;курсора + int 0x40 +jmp still ;отдыхаем + +right_border: ;курсор у правого края + + xor edx,edx + inc edx ;edx=1 + shl edx,16 ;edx = 1*65536 + add edx,ebx ;edx=1*65536+y + + mov eax,18 ;функция 18: установить настройки мыши + mov ebx,19 ;подфункция 19 + mov ecx,4 ;подподфункция 4: установить положение + ;курсора + int 0x40 +jmp still ;отдыхаем + +top_border: ;курсор у верхнего края + + mov edx,ecx ;Х координата курсора + shl edx,16 ;теперь edx=(x)*65536 + add edx,edi ;а теперь edx=(x)*65536+y + dec edx ;а теперь edx=(x)*65536+(у-1) + + mov eax,18 ;функция 18: установить настройки мыши + mov ebx,19 ;подфункция 19 + mov ecx,4 ;подподфункция 4: установить положение + ;курсора + int 0x40 +jmp still ;и отдыхаем + +bottom_border: ;курсор у нижнего края + + mov edx,ecx ;edx=ecx x координата курсора + shl edx,16 ;edx = х*65536 + ;у координата равна 0 + mov eax,18 ;функция 18: установить настройки мыши + mov ebx,19 ;подфункция 19 + mov ecx,4 ;подподфункция 4: установить положение + ;курсора + int 0x40 +jmp still ;и отдыхаем + + +I_END: ; метка конца программы \ No newline at end of file