Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2008. All rights reserved. ;;
  4. ;; Distributed under terms of the GNU General Public License    ;;
  5. ;;                                                              ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 1316 $
  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.   mousecount  dd  0x0
  26.   mousedata   dd  0x0
  27. endg
  28.  
  29. iglobal
  30. mouse_delay        dd 10
  31. mouse_speed_factor: dd 3
  32. mouse_timer_ticks  dd 0
  33. endg
  34.  
  35. ;include 'm_com.inc'
  36.  
  37.  
  38. ;test_mario79:
  39. ;        push   esi
  40. ;        push   eax
  41. ;        mov    [write_error_to],process_test_m79+43
  42. ;        movzx  eax,al  ;[DevErrorCode]
  43. ;        call   writehex
  44. ;        mov    esi,process_test_m79
  45. ;        call   sys_msg_board_str
  46. ;        pop    eax
  47. ;        pop    esi
  48. ;        ret
  49. ;process_test_m79 db 'K : Process - test Mario79 error    00000000',13,10,0
  50.  
  51. draw_mouse_under:
  52.         ; return old picture
  53.  
  54.     cmp [_display.restore_cursor], 0
  55.     je @F
  56.  
  57.         pushad
  58.         movzx  eax,word [X_UNDER]
  59.         movzx  ebx,word [Y_UNDER]
  60.     stdcall [_display.restore_cursor], eax, ebx
  61.         popad
  62.         ret
  63. @@:
  64.         pushad
  65.         xor    ecx,ecx
  66.         xor    edx,edx
  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.         call   [putpixel]
  87.         pop    edx
  88.         pop    ecx
  89.         inc    ecx
  90.         cmp    ecx, 16
  91.         jnz    mres
  92.         xor    ecx, ecx
  93.         inc    edx
  94.         cmp    edx, 24
  95.         jnz    mres
  96.         popad
  97.         ret
  98.  
  99. save_draw_mouse:
  100.  
  101.     cmp [_display.move_cursor], 0
  102.         je .no_hw_cursor
  103.         pushad
  104.  
  105.         mov    [X_UNDER],ax
  106.         mov    [Y_UNDER],bx
  107.         movzx  eax,word [MOUSE_Y]
  108.         movzx  ebx,word [MOUSE_X]
  109.         push eax
  110.         push ebx
  111.  
  112.         mov ecx, [Screen_Max_X]
  113.         inc ecx
  114.         mul ecx
  115.     add eax, [_WinMapAddress]
  116.     movzx edx, byte [ebx+eax]
  117.         shl edx, 8
  118.         mov esi, [edx+SLOT_BASE+APPDATA.cursor]
  119.  
  120.         cmp esi, [current_cursor]
  121.         je .draw
  122.  
  123.         push esi
  124.     call [_display.select_cursor]
  125.         mov [current_cursor], esi
  126. .draw:
  127.     stdcall [_display.move_cursor], esi
  128.         popad
  129.         ret
  130. .fail:
  131.         mov ecx, [def_cursor]
  132.         mov [edx+SLOT_BASE+APPDATA.cursor], ecx
  133.     stdcall [_display.move_cursor], ecx            ; stdcall: [esp]=ebx,eax
  134.         popad
  135.         ret
  136.  
  137. .no_hw_cursor:
  138.         pushad
  139.         ; save & draw
  140.         mov    [X_UNDER],ax
  141.         mov    [Y_UNDER],bx
  142.         push   eax
  143.         push   ebx
  144.         mov    ecx,0
  145.         mov    edx,0
  146.         align  4
  147. drm:
  148.         push   eax
  149.         push   ebx
  150.         push   ecx
  151.         push   edx
  152.         ; helloworld
  153.         push  ecx
  154.         add    eax,ecx  ; save picture under mouse
  155.         add    ebx,edx
  156.         push   ecx
  157.         call   getpixel
  158.         mov    [COLOR_TEMP],ecx
  159.         pop    ecx
  160.         mov    eax,edx
  161.         shl    eax,6
  162.         shl    ecx,2
  163.         add    eax,ecx
  164.         add    eax,mouseunder
  165.         mov    ebx,[COLOR_TEMP]
  166.         mov    [eax],ebx
  167.         pop  ecx
  168.         mov    edi,edx       ; y cycle
  169.         shl    edi,4       ; *16 bytes per row
  170.         add    edi,ecx       ; x cycle
  171.         mov    esi, edi
  172.         add    edi, esi
  173.         add    edi, esi       ; *3
  174.         add    edi,[MOUSE_PICTURE]      ; we have our str address
  175.         mov    esi, edi
  176.         add    esi, 16*24*3
  177.         push   ecx
  178.         mov    ecx, [COLOR_TEMP]
  179.         call   combine_colors
  180.         mov    [MOUSE_COLOR_MEM], ecx
  181.         pop    ecx
  182.         pop    edx
  183.         pop    ecx
  184.         pop    ebx
  185.         pop    eax
  186.         add    eax,ecx       ; we have x coord+cycle
  187.         add    ebx,edx       ; and y coord+cycle
  188.         push   ecx
  189.         mov    ecx, [MOUSE_COLOR_MEM]
  190.         mov    edi, 1
  191.         call   [putpixel]
  192.         pop    ecx
  193.         mov    ebx,[esp+0]      ; pure y coord again
  194.         mov    eax,[esp+4]      ; and x
  195.         inc    ecx          ; +1 cycle
  196.         cmp    ecx,16       ; if more than 16
  197.         jnz    drm
  198.         xor    ecx, ecx
  199.         inc    edx
  200.         cmp    edx,24
  201.         jnz    drm
  202.         add   esp,8
  203.         popad
  204.         ret
  205.  
  206.  
  207. combine_colors:
  208.       ; in
  209.       ; ecx - color ( 00 RR GG BB )
  210.       ; edi - ref to new color byte
  211.       ; esi - ref to alpha byte
  212.       ;
  213.       ; out
  214.       ; ecx - new color ( roughly (ecx*[esi]>>8)+([edi]*[esi]>>8) )
  215.       push eax
  216.       push ebx
  217.       push edx
  218.       push ecx
  219.       xor ecx, ecx
  220.          ; byte 2
  221.       mov eax, 0xff
  222.       sub al, [esi+0]
  223.       mov ebx, [esp]
  224.       shr ebx, 16
  225.       and ebx, 0xff
  226.       mul ebx
  227.       shr eax, 8
  228.       add ecx, eax
  229.       xor eax, eax
  230.       xor ebx, ebx
  231.       mov al, [edi+0]
  232.       mov bl, [esi+0]
  233.       mul ebx
  234.       shr eax, 8
  235.       add ecx, eax
  236.       shl ecx, 8
  237.          ; byte 1
  238.       mov eax, 0xff
  239.       sub al, [esi+1]
  240.       mov ebx, [esp]
  241.       shr ebx, 8
  242.       and ebx, 0xff
  243.       mul ebx
  244.       shr eax, 8
  245.       add ecx, eax
  246.       xor eax, eax
  247.       xor ebx, ebx
  248.       mov al, [edi+1]
  249.       mov bl, [esi+1]
  250.       mul ebx
  251.       shr eax, 8
  252.       add ecx, eax
  253.       shl ecx, 8
  254.          ; byte 2
  255.       mov eax, 0xff
  256.       sub al, [esi+2]
  257.       mov ebx, [esp]
  258.       and ebx, 0xff
  259.       mul ebx
  260.       shr eax, 8
  261.       add ecx, eax
  262.       xor eax, eax
  263.       xor ebx, ebx
  264.       mov al, [edi+2]
  265.       mov bl, [esi+2]
  266.       mul ebx
  267.       shr eax, 8
  268.       add ecx, eax
  269.       pop eax
  270.       pop edx
  271.       pop ebx
  272.       pop eax
  273.       ret
  274.  
  275.  
  276. __sys_disable_mouse:
  277.       cmp  dword [MOUSE_VISIBLE],dword 0
  278.       je    @f
  279.       ret
  280. @@:
  281.       pushad
  282.       cmp  [CURRENT_TASK],dword 1
  283.       je   disable_m
  284.       mov  edx,[CURRENT_TASK]
  285.       shl  edx,5
  286.       add  edx,window_data
  287.       movzx  eax, word [MOUSE_X]
  288.       movzx  ebx, word [MOUSE_Y]
  289.       mov  ecx,[Screen_Max_X]
  290.       inc  ecx
  291.       imul  ecx,ebx
  292.       add  ecx,eax
  293.       add  ecx, [_WinMapAddress]
  294.       mov   eax, [CURRENT_TASK]
  295.       movzx ebx, byte [ecx]
  296.       cmp   eax,ebx
  297.       je    yes_mouse_disable
  298.       movzx ebx, byte [ecx+16]
  299.       cmp   eax,ebx
  300.       je    yes_mouse_disable
  301.       mov   ebx,[Screen_Max_X]
  302.       inc   ebx
  303.       imul  ebx,10
  304.       add   ecx,ebx
  305.       movzx ebx, byte [ecx]
  306.       cmp   eax,ebx
  307.       je    yes_mouse_disable
  308.       movzx ebx, byte [ecx+16]
  309.       cmp   eax,ebx
  310.       je    yes_mouse_disable
  311.       jmp   no_mouse_disable
  312. yes_mouse_disable:
  313.       mov  edx,[CURRENT_TASK]
  314.       shl  edx,5
  315.       add  edx,window_data
  316.       movzx  eax, word [MOUSE_X]
  317.       movzx  ebx, word [MOUSE_Y]
  318.       mov  ecx,[edx+0]   ; mouse inside the area ?
  319.       add  eax,10
  320.       cmp  eax,ecx
  321.       jb   no_mouse_disable
  322.       sub  eax,10
  323.       add  ecx,[edx+8]
  324.       cmp  eax,ecx
  325.       jg   no_mouse_disable
  326.       mov  ecx,[edx+4]
  327.       add  ebx,14
  328.       cmp  ebx,ecx
  329.       jb   no_mouse_disable
  330.       sub  ebx,14
  331.       add  ecx,[edx+12]
  332.       cmp  ebx,ecx
  333.       jg   no_mouse_disable
  334. disable_m:
  335.       cmp  dword [MOUSE_VISIBLE],dword 0
  336.       jne  no_mouse_disable
  337.       pushf
  338.       cli
  339.       call draw_mouse_under
  340.       popf
  341.       mov  [MOUSE_VISIBLE],dword 1
  342. no_mouse_disable:
  343.       popad
  344.       ret
  345.  
  346. __sys_draw_pointer:
  347.         cmp   [mouse_pause],0
  348.         je    @f
  349.         ret
  350. @@:
  351.         push   eax
  352.         mov     eax,[timer_ticks]
  353.         sub     eax,[MouseTickCounter]
  354.         cmp     eax,1
  355.         ja      @f
  356.         pop    eax
  357.         ret
  358. @@:
  359.         mov     eax,[timer_ticks]
  360.         mov     [MouseTickCounter],eax
  361.         pop     eax
  362.         pushad
  363.         cmp    dword [MOUSE_VISIBLE],dword 0  ; mouse visible ?
  364.         je     chms00
  365.         mov     [MOUSE_VISIBLE], dword 0
  366.         movzx  ebx,word [MOUSE_Y]
  367.         movzx  eax,word [MOUSE_X]
  368.         pushfd
  369.         cli
  370.         call   save_draw_mouse
  371.         popfd
  372. nodmu2:
  373.         popad
  374.         ret
  375. chms00:
  376.         movzx  ecx,word [X_UNDER]
  377.         movzx  edx,word [Y_UNDER]
  378.         movzx  ebx,word [MOUSE_Y]
  379.         movzx  eax,word [MOUSE_X]
  380.         cmp    eax,ecx
  381.         jne    redrawmouse
  382.         cmp    ebx,edx
  383.         jne    redrawmouse
  384.         jmp    nodmp
  385. redrawmouse:
  386.         pushfd
  387.         cli
  388.         call   draw_mouse_under
  389.         call   save_draw_mouse
  390.         popfd
  391. nodmp:
  392.         popad
  393.         ret
  394.  
  395. proc set_mouse_data stdcall, BtnState:dword, XMoving:dword, YMoving:dword, VScroll:dword, HScroll:dword
  396.  
  397.     mov  eax,[BtnState]
  398.     mov  [BTN_DOWN],eax
  399.  
  400.     mov  eax,[XMoving]
  401.     call mouse_acceleration
  402.     add  ax,[MOUSE_X]    ;[XCoordinate]
  403.     cmp  ax,0
  404.     jge  @@M1
  405.     mov  eax,0
  406.     jmp  @@M2
  407. @@M1:
  408.     cmp  ax,[Screen_Max_X]   ;ScreenLength
  409.     jl   @@M2
  410.     mov  ax,[Screen_Max_X]   ;ScreenLength-1
  411.  
  412. @@M2:
  413.     mov  [MOUSE_X],ax     ;[XCoordinate]
  414.  
  415.     mov  eax,[YMoving]
  416.     neg  eax
  417.     call mouse_acceleration
  418.  
  419.     add  ax,[MOUSE_Y]   ;[YCoordinate]
  420.     cmp  ax,0
  421.     jge  @@M3
  422.     mov  ax,0
  423.     jmp  @@M4
  424. @@M3:
  425.     cmp  ax,[Screen_Max_Y]  ;ScreenHeigth
  426.     jl   @@M4
  427.     mov  ax,[Screen_Max_Y] ;ScreenHeigth-1
  428.  
  429. @@M4:
  430.     mov  [MOUSE_Y],ax     ;[YCoordinate]
  431.  
  432.     mov  eax,[VScroll]
  433.     add  [MOUSE_SCROLL_V],ax
  434.  
  435.     mov  eax,[HScroll]
  436.     add  [MOUSE_SCROLL_H],ax
  437.  
  438.     mov  [mouse_active],1
  439.     mov  eax,[timer_ticks]
  440.     mov  [mouse_timer_ticks],eax
  441.     ret
  442. endp
  443.  
  444. mouse_acceleration:
  445.         push  eax
  446.         mov   eax,[timer_ticks]
  447.         sub   eax,[mouse_timer_ticks]
  448.         cmp   eax,[mouse_delay]
  449.         pop   eax
  450.         ja    @f
  451.         ;push  edx
  452.         imul  eax,[mouse_speed_factor]
  453.         ;pop   edx
  454. @@:
  455.         ret
  456.  
  457.