From 5b05341aaeb2c944917c0b9109cdd09a1a9c5e2e Mon Sep 17 00:00:00 2001 From: "Marat Zakiyanov (Mario79)" Date: Sun, 3 Jun 2012 13:55:55 +0000 Subject: [PATCH] MADMOUSE v0.2 - some optimizations. git-svn-id: svn://kolibrios.org@2726 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/other/madmouse.asm | 140 --------------------------- programs/other/madmouse/build.bat | 3 + programs/other/madmouse/build.sh | 11 +++ programs/other/madmouse/madmouse.asm | 137 ++++++++++++++++++++++++++ 4 files changed, 151 insertions(+), 140 deletions(-) delete mode 100644 programs/other/madmouse.asm create mode 100644 programs/other/madmouse/build.bat create mode 100644 programs/other/madmouse/build.sh create mode 100644 programs/other/madmouse/madmouse.asm diff --git a/programs/other/madmouse.asm b/programs/other/madmouse.asm deleted file mode 100644 index 780590ea2f..0000000000 --- a/programs/other/madmouse.asm +++ /dev/null @@ -1,140 +0,0 @@ -; -; 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 diff --git a/programs/other/madmouse/build.bat b/programs/other/madmouse/build.bat new file mode 100644 index 0000000000..30ae946a4c --- /dev/null +++ b/programs/other/madmouse/build.bat @@ -0,0 +1,3 @@ +@fasm -m 16384 madmouse.asm madmouse +@kpack madmouse +@pause \ No newline at end of file diff --git a/programs/other/madmouse/build.sh b/programs/other/madmouse/build.sh new file mode 100644 index 0000000000..ec7f8ff17d --- /dev/null +++ b/programs/other/madmouse/build.sh @@ -0,0 +1,11 @@ +#!/bin/bash +# This script does for linux the same as build.bat for DOS, +# it compiles the KoOS program, hopefully ;-) + + fasm -m 16384 madmouse.asm madmouse + kpack madmouse + exit 0 + + + + diff --git a/programs/other/madmouse/madmouse.asm b/programs/other/madmouse/madmouse.asm new file mode 100644 index 0000000000..c1c976234f --- /dev/null +++ b/programs/other/madmouse/madmouse.asm @@ -0,0 +1,137 @@ +;------------------------------------------------------------------------------ +; 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: ; метка конца программы +;------------------------------------------------------------------------------ \ No newline at end of file