Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 4288 $
  9.  
  10.  
  11. ;   check mouse
  12. ;
  13. ;
  14. ;   FB00  ->   FB0F   mouse memory 00 chunk count - FB0A-B x - FB0C-D y
  15. ;   FB10  ->   FB17   mouse color mem
  16. ;   FB21              x move
  17. ;   FB22              y move
  18. ;   FB30              color temp
  19. ;   FB28              high bits temp
  20. ;   FB4A  ->   FB4D   FB4A-B x-under - FB4C-D y-under
  21. ;   FC00  ->   FCFE   com1/ps2 buffer
  22. ;   FCFF              com1/ps2 buffer count starting from FC00
  23.  
  24. uglobal
  25. ;--------------------------------------
  26. align 4
  27.   mousecount  dd  0x0
  28.   mousedata   dd  0x0
  29. Y_UNDER_sub_CUR_hot_y_add_curh:
  30.         dw 0
  31. Y_UNDER_subtraction_CUR_hot_y:
  32.         dw 0
  33. X_UNDER_sub_CUR_hot_x_add_curh:
  34.         dw 0
  35. X_UNDER_subtraction_CUR_hot_x:
  36.         dw 0
  37. endg
  38.  
  39. iglobal
  40. ;--------------------------------------
  41. align 4
  42. mouse_delay        dd 10
  43. mouse_speed_factor:
  44.                     dd 3
  45. mouse_timer_ticks  dd 0
  46. endg
  47. ;-----------------------------------------------------------------------------
  48. align 4
  49. draw_mouse_under:
  50.         ; return old picture
  51.         cmp     [_display.restore_cursor], 0
  52.         je      @F
  53.  
  54.         pushad
  55.         movzx   eax, word [X_UNDER]
  56.         movzx   ebx, word [Y_UNDER]
  57.         stdcall [_display.restore_cursor], eax, ebx
  58.         popad
  59.         ret
  60. ;--------------------------------------
  61. align 4
  62. @@:
  63.         pushad
  64.         xor     ecx, ecx
  65.         xor     edx, edx
  66. ;--------------------------------------
  67. align 4
  68. mres:
  69.         movzx   eax, word [X_UNDER]
  70.         movzx   ebx, word [Y_UNDER]
  71.         add     eax, ecx
  72.         add     ebx, edx
  73.         push    ecx
  74.         push    edx
  75.         push    eax
  76.         push    ebx
  77.         mov     eax, edx
  78.         shl     eax, 6
  79.         shl     ecx, 2
  80.         add     eax, ecx
  81.         add     eax, mouseunder
  82.         mov     ecx, [eax]
  83.         pop     ebx
  84.         pop     eax
  85.         mov     edi, 1 ; force
  86.         or      ecx, 0x04000000  ; don't save to mouseunder area
  87. ;        call    [putpixel]
  88.         call    __sys_putpixel
  89.         pop     edx
  90.         pop     ecx
  91.         inc     ecx
  92.         cmp     ecx, 16
  93.         jnz     mres
  94.         xor     ecx, ecx
  95.         inc     edx
  96.         cmp     edx, 24
  97.         jnz     mres
  98.         popad
  99.         ret
  100. ;-----------------------------------------------------------------------------
  101. align 4
  102. save_draw_mouse:
  103.         cmp     [_display.move_cursor], 0
  104.         je      .no_hw_cursor
  105.         pushad
  106.  
  107.         mov     [X_UNDER], ax
  108.         mov     [Y_UNDER], bx
  109.         movzx   eax, word [MOUSE_Y]
  110.         movzx   ebx, word [MOUSE_X]
  111.         push    eax
  112.         push    ebx
  113.  
  114.         mov     eax, [d_width_calc_area + eax*4]
  115.  
  116.         add     eax, [_WinMapAddress]
  117.         movzx   edx, byte [ebx+eax]
  118.         shl     edx, 8
  119.         mov     esi, [edx+SLOT_BASE+APPDATA.cursor]
  120.  
  121.         cmp     esi, [current_cursor]
  122.         je      .draw
  123.  
  124.         mov     eax, [TASK_COUNT]
  125.         movzx   eax, word [WIN_POS+eax*2]
  126.         shl     eax, 8
  127.  
  128.         cmp     eax, edx
  129.         je      @F
  130.  
  131.         mov     esi, [def_cursor]
  132.         cmp     esi, [current_cursor]
  133.         je      .draw
  134.  
  135. @@:
  136.         push    esi
  137.         call    [_display.select_cursor]
  138.         mov     [current_cursor], esi
  139. ;--------------------------------------
  140. align 4
  141. .draw:
  142.         stdcall [_display.move_cursor], esi
  143.         popad
  144.         ret
  145. ;--------------------------------------
  146. ;align 4
  147. ;.fail:
  148. ;        mov     ecx, [def_cursor]
  149. ;        mov     [edx+SLOT_BASE+APPDATA.cursor], ecx
  150. ;        stdcall [_display.move_cursor], ecx        ; stdcall: [esp]=ebx,eax
  151. ;        popad
  152. ;        ret
  153. ;--------------------------------------
  154. align 4
  155. .no_hw_cursor:
  156.         pushad
  157.         ; save & draw
  158.         mov     [X_UNDER], ax
  159.         mov     [Y_UNDER], bx
  160.         push    eax
  161.         push    ebx
  162.         mov     ecx, 0
  163.         mov     edx, 0
  164. ;--------------------------------------
  165. align 4
  166. drm:
  167.         push    eax
  168.         push    ebx
  169.         push    ecx
  170.         push    edx
  171.         ; helloworld
  172.         push    ecx
  173.         add     eax, ecx; save picture under mouse
  174.         add     ebx, edx
  175.         push    ecx
  176.         or      ecx, 0x04000000  ; don't load to mouseunder area
  177.         call    getpixel
  178.         mov     [COLOR_TEMP], ecx
  179.         pop     ecx
  180.         mov     eax, edx
  181.         shl     eax, 6
  182.         shl     ecx, 2
  183.         add     eax, ecx
  184.         add     eax, mouseunder
  185.         mov     ebx, [COLOR_TEMP]
  186.         and     ebx, 0xffffff
  187.         mov     [eax], ebx
  188.         pop     ecx
  189.         mov     edi, edx     ; y cycle
  190.         shl     edi, 4     ; *16 bytes per row
  191.         add     edi, ecx     ; x cycle
  192.         mov     esi, edi
  193.         add     edi, esi
  194.         add     edi, esi      ; *3
  195.         add     edi, [MOUSE_PICTURE]    ; we have our str address
  196.         mov     esi, edi
  197.         add     esi, 16*24*3
  198.         push    ecx
  199.         mov     ecx, [COLOR_TEMP]
  200.         call    combine_colors
  201.         and     ecx, 0xffffff
  202.         mov     [MOUSE_COLOR_MEM], ecx
  203.         pop     ecx
  204.         pop     edx
  205.         pop     ecx
  206.         pop     ebx
  207.         pop     eax
  208.         add     eax, ecx     ; we have x coord+cycle
  209.         add     ebx, edx     ; and y coord+cycle
  210.         push    ecx
  211.         mov     ecx, [MOUSE_COLOR_MEM]
  212.         mov     edi, 1 ; force
  213.         or      ecx, 0x04000000  ; don't save to mouseunder area
  214. ;        call    [putpixel]
  215.         call    __sys_putpixel
  216.         pop     ecx
  217.         mov     ebx, [esp+0]    ; pure y coord again
  218.         mov     eax, [esp+4]    ; and x
  219.         inc     ecx         ; +1 cycle
  220.         cmp     ecx, 16     ; if more than 16
  221.         jnz     drm
  222.         xor     ecx, ecx
  223.         inc     edx
  224.         cmp     edx, 24
  225.         jnz     drm
  226.         add     esp, 8
  227.         popad
  228.         ret
  229. ;-----------------------------------------------------------------------------
  230. align 4
  231. combine_colors:
  232.       ; in
  233.       ; ecx - color ( 00 RR GG BB )
  234.       ; edi - ref to new color byte
  235.       ; esi - ref to alpha byte
  236.       ;
  237.       ; out
  238.       ; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
  239.         push    eax
  240.         push    ebx
  241.         push    edx
  242.         push    ecx
  243.         xor     ecx, ecx
  244.          ; byte 2
  245.         mov     eax, 0xff
  246.         sub     al, [esi+0]
  247.         mov     ebx, [esp]
  248.         shr     ebx, 16
  249.         and     ebx, 0xff
  250.         mul     ebx
  251.         shr     eax, 8
  252.         add     ecx, eax
  253.         xor     eax, eax
  254.         xor     ebx, ebx
  255.         mov     al, [edi+0]
  256.         mov     bl, [esi+0]
  257.         mul     ebx
  258.         shr     eax, 8
  259.         add     ecx, eax
  260.         shl     ecx, 8
  261.          ; byte 1
  262.         mov     eax, 0xff
  263.         sub     al, [esi+1]
  264.         mov     ebx, [esp]
  265.         shr     ebx, 8
  266.         and     ebx, 0xff
  267.         mul     ebx
  268.         shr     eax, 8
  269.         add     ecx, eax
  270.         xor     eax, eax
  271.         xor     ebx, ebx
  272.         mov     al, [edi+1]
  273.         mov     bl, [esi+1]
  274.         mul     ebx
  275.         shr     eax, 8
  276.         add     ecx, eax
  277.         shl     ecx, 8
  278.          ; byte 2
  279.         mov     eax, 0xff
  280.         sub     al, [esi+2]
  281.         mov     ebx, [esp]
  282.         and     ebx, 0xff
  283.         mul     ebx
  284.         shr     eax, 8
  285.         add     ecx, eax
  286.         xor     eax, eax
  287.         xor     ebx, ebx
  288.         mov     al, [edi+2]
  289.         mov     bl, [esi+2]
  290.         mul     ebx
  291.         shr     eax, 8
  292.         add     ecx, eax
  293.         pop     eax
  294.         pop     edx
  295.         pop     ebx
  296.         pop     eax
  297.         ret
  298. ;-----------------------------------------------------------------------------
  299. align 4
  300. check_mouse_area_for_getpixel:
  301. ; in:
  302. ; eax = x
  303. ; ebx = y
  304. ; out:
  305. ; ecx = new color
  306.         push    eax ebx
  307. ; check for Y
  308.         xor     ecx, ecx
  309.         mov     cx, [Y_UNDER]  ; [MOUSE_Y]
  310.  
  311.         cmp     ebx, ecx
  312.         jb      .no_mouse_area
  313.         add     ecx, 23  ; mouse cursor Y size
  314.         cmp     ebx, ecx
  315.         ja      .no_mouse_area
  316. ; offset Y
  317.         sub     bx, [Y_UNDER]  ;[MOUSE_Y]
  318. ;--------------------------------------
  319. ; check for X
  320.         xor     ecx, ecx
  321.         mov     cx, [X_UNDER]  ;[MOUSE_X]
  322.         cmp     eax, ecx
  323.         jb      .no_mouse_area
  324.         add     ecx, 15  ; mouse cursor X size
  325.         cmp     eax, ecx
  326.         ja      .no_mouse_area
  327. ; offset X
  328.         sub     ax, [X_UNDER]  ;[MOUSE_X]
  329. ;--------------------------------------
  330. ; eax = offset x
  331. ; ebx = offset y
  332.         shl     ebx, 6  ;y
  333.         shl     eax, 2  ;x
  334.         add     eax, ebx
  335.         add     eax, mouseunder
  336.         mov     ecx, [eax]
  337.         and     ecx, 0xffffff
  338.         or      ecx, 0xff000000
  339.         pop     ebx eax
  340.         ret
  341. ;--------------------------------------
  342. align 4
  343. .no_mouse_area:
  344.         xor     ecx, ecx
  345.         pop     ebx eax
  346.         ret
  347. ;-----------------------------------------------------------------------------
  348. align 4
  349. check_mouse_area_for_putpixel:
  350. ; in:
  351. ; ecx = x shl 16 + y
  352. ; eax = color
  353. ; out:
  354. ; eax = new color
  355.         push    eax
  356. ; check for Y
  357.         mov     ax, [Y_UNDER]  ; [MOUSE_Y]
  358.         cmp     cx, ax
  359.         jb      .no_mouse_area
  360.         add     ax, 23  ; mouse cursor Y size
  361.         cmp     cx, ax
  362.         ja      .no_mouse_area
  363. ; offset Y
  364.         sub     cx, [Y_UNDER]  ;[MOUSE_Y]
  365.         mov     ax, cx
  366.         shl     eax, 16
  367. ;--------------------------------------
  368. ; check for X
  369.         mov     ax, [X_UNDER]  ;[MOUSE_X]
  370.         shr     ecx, 16
  371.         cmp     cx, ax
  372.         jb      .no_mouse_area
  373.         add     ax, 15  ; mouse cursor X size
  374.         cmp     cx, ax
  375.         ja      .no_mouse_area
  376. ; offset X
  377.         sub     cx, [X_UNDER]  ;[MOUSE_X]
  378.         mov     ax, cx
  379. ;--------------------------------------
  380. ; eax = (offset y) shl 16 + (offset x)
  381.  
  382.         pop     ecx
  383.  
  384.         push    eax ebx
  385.  
  386.         mov     ebx, eax
  387.         shr     ebx, 16        ;y
  388.         and     eax, 0xffff    ;x
  389.  
  390.         shl     ebx, 6
  391.         shl     eax, 2
  392.         add     eax, ebx
  393.         add     eax, mouseunder
  394.         and     ecx, 0xFFFFFF
  395.         mov     [eax], ecx
  396.  
  397.         pop     ebx eax
  398.  
  399.         push    esi edi
  400.         rol     eax, 16
  401.         movzx   edi, ax     ; y cycle
  402.         shl     edi, 4     ; *16 bytes per row
  403.         shr     eax, 16
  404.         add     edi, eax     ; x cycle
  405.         lea     edi, [edi*3]
  406.         add     edi, [MOUSE_PICTURE]    ; we have our str address
  407.         mov     esi, edi
  408.         add     esi, 16*24*3
  409.         call    combine_colors
  410.         pop     edi esi
  411. ;--------------------------------------
  412. align 4
  413. .end:
  414.         mov     eax, ecx
  415.         ret
  416. ;--------------------------------------
  417. align 4
  418. .no_mouse_area:
  419.         pop     eax
  420.         ret
  421. ;-----------------------------------------------------------------------------
  422. align 4
  423. __sys_draw_pointer:
  424.         pushad
  425.         movzx   ecx, word [X_UNDER]
  426.         movzx   edx, word [Y_UNDER]
  427.         movzx   ebx, word [MOUSE_Y]
  428.         movzx   eax, word [MOUSE_X]
  429.         cmp     [redrawmouse_unconditional], 0
  430.         je      @f
  431.         mov     [redrawmouse_unconditional], 0
  432.         jmp     redrawmouse
  433. ;--------------------------------------
  434. align 4
  435. @@:
  436.         cmp     eax, ecx
  437.         jne     redrawmouse
  438.         cmp     ebx, edx
  439.         je      nodmp
  440. ;--------------------------------------
  441. align 4
  442. redrawmouse:
  443.         pushfd
  444.         cli
  445.         call    draw_mouse_under
  446.         call    save_draw_mouse
  447.  
  448. ;        mov     eax, [_display.select_cursor]
  449. ;        test    eax, eax
  450. ;        jz      @f
  451.         cmp     [_display.select_cursor], select_cursor
  452.         jne     @f
  453.  
  454.         xor     eax, eax
  455.         mov     esi, [current_cursor]
  456.  
  457.         mov     ax, [Y_UNDER]
  458.         sub     eax, [esi+CURSOR.hot_y]
  459.         mov     [Y_UNDER_subtraction_CUR_hot_y], ax
  460.         add     eax, [cur.h]
  461.         mov     [Y_UNDER_sub_CUR_hot_y_add_curh], ax
  462.  
  463.         mov     ax, [X_UNDER]
  464.         sub     eax, [esi+CURSOR.hot_x]
  465.         mov     [X_UNDER_subtraction_CUR_hot_x], ax
  466.         add     eax, [cur.w]
  467.         mov     [X_UNDER_sub_CUR_hot_x_add_curh], ax
  468. ;--------------------------------------
  469. align 4
  470. @@:
  471.         popfd
  472. ;--------------------------------------
  473. align 4
  474. nodmp:
  475.         popad
  476.         ret
  477. ;-----------------------------------------------------------------------------
  478. align 4
  479. proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
  480.  
  481.         mov     eax, [BtnState]
  482.         mov     [BTN_DOWN], eax
  483.  
  484.         mov     eax, [XMoving]
  485.         call    mouse_acceleration
  486.         add     ax, [MOUSE_X];[XCoordinate]
  487.         cmp     ax, 0
  488.         jge     @@M1
  489.         mov     eax, 0
  490.         jmp     @@M2
  491. ;--------------------------------------
  492. align 4
  493. @@M1:
  494.         cmp     ax, word [_display.width]
  495.         jl      @@M2
  496.         mov     ax, word [_display.width]
  497.         dec     ax
  498. ;--------------------------------------
  499. align 4
  500. @@M2:
  501.         mov     [MOUSE_X], ax;[XCoordinate]
  502.  
  503.         mov     eax, [YMoving]
  504.         neg     eax
  505.         call    mouse_acceleration
  506.  
  507.         add     ax, [MOUSE_Y];[YCoordinate]
  508.         cmp     ax, 0
  509.         jge     @@M3
  510.         mov     ax, 0
  511.         jmp     @@M4
  512. ;--------------------------------------
  513. align 4
  514. @@M3:
  515.         cmp     ax, word [_display.height]
  516.         jl      @@M4
  517.         mov     ax, word [_display.height]
  518.         dec     ax
  519. ;--------------------------------------
  520. align 4
  521. @@M4:
  522.         mov     [MOUSE_Y], ax;[YCoordinate]
  523.  
  524.         mov     eax, [VScroll]
  525.         add     [MOUSE_SCROLL_V], ax
  526.  
  527.         mov     eax, [HScroll]
  528.         add     [MOUSE_SCROLL_H], ax
  529.  
  530.         mov     [mouse_active], 1
  531.         mov     eax, [timer_ticks]
  532.         mov     [mouse_timer_ticks], eax
  533.         call    wakeup_osloop
  534.         ret
  535. endp
  536. ;-----------------------------------------------------------------------------
  537. align 4
  538. mouse_acceleration:
  539.         push    eax
  540.         mov     eax, [timer_ticks]
  541.         sub     eax, [mouse_timer_ticks]
  542.         cmp     eax, [mouse_delay]
  543.         pop     eax
  544.         ja      @f
  545.         ;push  edx
  546.         imul    eax, [mouse_speed_factor]
  547.         ;pop   edx
  548. ;--------------------------------------
  549. align 4
  550. @@:
  551.         ret
  552. ;-----------------------------------------------------------------------------
  553.