Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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