Subversion Repositories Kolibri OS

Rev

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

  1.  
  2. align 4
  3. init_events:
  4.            stdcall kernel_alloc, 512*EVENT_SIZE
  5.            mov [events], eax
  6.            xor eax, eax
  7.            mov [event_uid], eax
  8.            not eax
  9.            mov edi, event_map
  10.            mov [event_start], edi
  11.            mov ecx, 64/4
  12.            cld
  13.            rep stosd
  14.            mov [event_end], edi
  15.            ret
  16.  
  17. align 4
  18. proc alloc_event
  19.  
  20.            pushfd
  21.            cli
  22.            mov ebx, [event_start]
  23.            mov ecx, [event_end]
  24. .l1:
  25.            bsf eax,[ebx]
  26.            jnz .found
  27.            add ebx,4
  28.            cmp ebx, ecx
  29.            jb .l1
  30.            popfd
  31.            xor eax,eax
  32.            ret
  33. .found:
  34.            btr [ebx], eax
  35.            mov [event_start],ebx
  36.            inc [event_uid]
  37.  
  38.            sub ebx, event_map
  39.            lea eax,[eax+ebx*8]
  40.  
  41.            lea ebx, [eax+eax*4]
  42.            shl eax,5
  43.            lea eax,[eax+ebx*4]   ;eax*=52 (EVENT_SIZE)
  44.            add eax, [events]
  45.            mov ebx, [event_uid]
  46.            popfd
  47.            ret
  48. endp
  49.  
  50. align 4
  51. free_event:
  52.            sub eax, [events]
  53.            mov ecx, EVENT_SIZE
  54.            mov ebx, event_map
  55.            cdq
  56.            div ecx
  57.  
  58.            pushfd
  59.            cli
  60.            bts [ebx], eax
  61.            shr eax, 3
  62.            and eax, not 3
  63.            add eax, ebx
  64.            cmp [event_start], eax
  65.            ja @f
  66.            popfd
  67.            ret
  68. @@:
  69.            mov [event_start], eax
  70.            popfd
  71.            ret
  72.  
  73. EVENT_WATCHED    equ 0x10000000
  74. EVENT_SIGNALED   equ 0x20000000
  75. MANUAL_RESET     equ 0x40000000
  76. MANUAL_DESTROY   equ 0x80000000
  77.  
  78.  
  79. ; param
  80. ;  eax= event data
  81. ;  ebx= flags
  82. ;
  83. ; retval
  84. ;  eax= event
  85. ;  edx= id
  86.  
  87. create_event:
  88.            .flags  equ  esp+4
  89.            .data   equ  esp
  90.  
  91.            push ebx
  92.            push eax
  93.  
  94.            call alloc_event
  95.            test eax, eax
  96.            jz .fail
  97.  
  98.            mov [eax+APPOBJ.magic], 'EVNT'
  99.            mov [eax+APPOBJ.destroy], destroy_event.internal
  100.            mov [eax+EVENT.id], ebx
  101.  
  102.            mov ebx, [CURRENT_TASK]
  103.            shl ebx, 5
  104.            mov ebx, [CURRENT_TASK+ebx+4]
  105.            mov [eax+APPOBJ.pid], ebx
  106.            mov edx, [.flags]
  107.            mov [eax+EVENT.state], edx
  108.  
  109.            mov esi, [.data]
  110.            test esi, esi
  111.            jz @F
  112.            lea edi, [eax+EVENT.code]
  113.            mov ecx, 6
  114.            cld
  115.            rep movsd
  116. @@:
  117.            mov ecx, [CURRENT_TASK]
  118.            shl ecx,8
  119.            add ecx, PROC_BASE+APP_OBJ_OFFSET
  120.  
  121.            pushfd
  122.            cli
  123.            mov edx, [ecx+APPOBJ.fd]
  124.            mov [eax+APPOBJ.fd], edx
  125.            mov [eax+APPOBJ.bk], ecx
  126.            mov [ecx+APPOBJ.fd], eax
  127.            mov [edx+APPOBJ.bk], eax
  128.            popfd
  129.            mov edx, [eax+EVENT.id]
  130. .fail:
  131.            add esp, 8
  132.            ret
  133.  
  134. restore .flags
  135. restore .data
  136.  
  137. ; param
  138. ;  eax= event
  139. ;  ebx= id
  140.  
  141. destroy_event:
  142.  
  143.            cmp [eax+APPOBJ.magic], 'EVNT'
  144.            jne .fail
  145.            cmp [eax+EVENT.id], ebx
  146.            jne .fail
  147. .internal:
  148.            mov ebx, [eax+APPOBJ.fd]
  149.            mov ecx, [eax+APPOBJ.bk]
  150.            mov [ebx+APPOBJ.bk], ecx
  151.            mov [ecx+APPOBJ.fd], ebx
  152. .force:
  153.            xor edx, edx             ;clear common header
  154.            mov [eax], edx
  155.            mov [eax+4], edx
  156.            mov [eax+8], edx
  157.            mov [eax+12], edx
  158.            mov [eax+16], edx
  159.  
  160.            call free_event          ;release object memory
  161. .fail:
  162.            ret
  163.  
  164. align 4
  165. proc send_event stdcall pid:dword, event:dword
  166.            locals
  167.              slot     dd ?
  168.            endl
  169.  
  170.            mov eax, [pid]
  171.            call pid_to_slot
  172.            test eax, eax
  173.            jz .fail
  174.  
  175.            shl eax, 8
  176.            cmp [PROC_BASE+eax+APPDATA.ev_count], 32
  177.            ja .fail
  178.  
  179.            mov [slot], eax
  180.  
  181.            call alloc_event
  182.            test eax, eax
  183.            jz .fail
  184.  
  185.            lea edi, [eax+EVENT.code]
  186.            mov ecx, 6
  187.            mov esi, [event]
  188.            cld
  189.            rep movsd
  190.  
  191.            mov ecx, [slot]
  192.            add ecx, PROC_BASE+APP_EV_OFFSET
  193.  
  194.            mov [eax+APPOBJ.magic], 'EVNT'
  195.            mov [eax+APPOBJ.destroy], destroy_event
  196.            mov ebx, [pid]
  197.            mov [eax+APPOBJ.pid], ebx
  198.            mov [eax+EVENT.state], EVENT_SIGNALED
  199.  
  200.            pushfd
  201.            cli                         ;insert event into
  202.            mov edx, [ecx+APPOBJ.fd]    ;events list
  203.            mov [eax+APPOBJ.fd], edx    ;and set events flag
  204.            mov [eax+APPOBJ.bk], ecx
  205.            mov [ecx+APPOBJ.fd], eax
  206.            mov [edx+APPOBJ.bk], eax
  207.            inc [ecx+APPDATA.ev_count-APP_EV_OFFSET]
  208.            or  [ecx+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
  209.            popfd
  210. .fail:
  211.            ret
  212. endp
  213.  
  214. ; timeout ignored
  215.  
  216. align 4
  217. proc get_event_ex stdcall, p_ev:dword, timeout:dword
  218.  
  219. .wait:
  220.            mov edx,[CURRENT_TASK]
  221.            shl edx,8
  222. ;           cmp [PROC_BASE+edx+APPDATA.ev_count], 0
  223. ;           je .switch
  224.  
  225.            add edx, PROC_BASE+APP_EV_OFFSET
  226.  
  227.            mov eax, [edx+APPOBJ.fd]
  228.            cmp eax, edx
  229.            je .switch
  230.  
  231.            lea esi, [eax+EVENT.code]
  232.            mov edi, [p_ev]                ;copy event data
  233.            mov ecx, 6
  234.            cld
  235.            rep movsd
  236.  
  237.            and dword [edi-24], 0xFF00FFFF ;clear priority field
  238.                                          ;
  239.            test [eax+EVENT.state], MANUAL_RESET
  240.            jnz .done
  241.  
  242.            pushfd
  243.            cli                         ;remove event from events
  244.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  245.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  246.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  247.            mov [ecx+APPOBJ.fd], ebx
  248.  
  249.            and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  250.  
  251.            dec [edx+APPDATA.ev_count-APP_EV_OFFSET]
  252.            jnz @F
  253.            and [edx+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
  254. @@:
  255.            popfd
  256.  
  257.            test [eax+EVENT.state], MANUAL_DESTROY
  258.            jz .destroy
  259.  
  260.            add edx, (APP_OBJ_OFFSET-APP_EV_OFFSET)
  261.  
  262.            pushfd
  263.            cli
  264.            mov ebx, [edx+APPOBJ.fd]  ;insert event into
  265.            mov [eax+APPOBJ.fd], ebx  ;objects list
  266.            mov [eax+APPOBJ.bk], edx
  267.            mov [edx+APPOBJ.fd], eax
  268.            mov [ebx+APPOBJ.bk], eax
  269.            popfd
  270. .done:
  271.            ret
  272.  
  273. .destroy:
  274.            call destroy_event.force
  275.            ret
  276. .switch:
  277.            mov eax, [TASK_BASE]
  278.            mov [eax+TASKDATA.state], byte 5
  279.            call change_task
  280.            jmp .wait
  281. endp
  282.  
  283. ; param
  284. ;  eax= event
  285. ;  ebx= id
  286.  
  287. align 4
  288. wait_event:
  289.            .event equ esp
  290.            push eax
  291. .wait:
  292.            cmp [eax+APPOBJ.magic], 'EVNT'
  293.            jne .done
  294.            cmp [eax+EVENT.id], ebx
  295.            jne .done
  296.  
  297.            test [eax+EVENT.state], EVENT_SIGNALED
  298.            jz .switch
  299.  
  300.            test [eax+EVENT.state], MANUAL_RESET
  301.            jnz .done
  302.  
  303.            mov edx,[CURRENT_TASK]
  304.            shl edx,8
  305.            add edx, PROC_BASE
  306.  
  307.            pushfd
  308.            cli                         ;remove event from events
  309.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  310.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  311.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  312.            mov [ecx+APPOBJ.fd], ebx
  313.            dec [edx+APPDATA.ev_count]
  314.            jnz @F
  315.            and [edx+APPDATA.event_mask], not EVENT_EXTENDED
  316. @@:
  317.            and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  318.            popfd
  319.  
  320.            test [eax+EVENT.state], MANUAL_DESTROY
  321.            jz .destroy
  322.  
  323.            add edx, APP_OBJ_OFFSET
  324.  
  325.            pushfd
  326.            cli
  327.            mov ecx, [edx+APPOBJ.fd]  ;insert event into
  328.            mov [eax+APPOBJ.fd], ecx  ;objects list
  329.            mov [eax+APPOBJ.bk], edx
  330.            mov [edx+APPOBJ.fd], eax
  331.            mov [ecx+APPOBJ.bk], eax
  332.            popfd
  333. .done:
  334.            add esp, 4
  335.            ret
  336. .destroy:
  337.            call destroy_event.force
  338.            add esp, 4
  339.            ret
  340. .switch:
  341.            or [eax+EVENT.state], EVENT_WATCHED
  342.            mov eax, [TASK_BASE]
  343.            mov [eax+TASKDATA.state], byte 5
  344.            call change_task
  345.            mov eax, [.event]
  346.            jmp .wait
  347. restore .event
  348.  
  349. ; param
  350. ;  eax= event
  351. ;  ebx= id
  352. ;  ecx= flags
  353. ;  edx= event data
  354.  
  355. raise_event:
  356.            .event equ esp
  357.            push eax
  358.  
  359.            cmp [eax+APPOBJ.magic], 'EVNT'
  360.            jne .fail
  361.            cmp [eax+EVENT.id], ebx
  362.            jne .fail
  363.  
  364.            mov eax, [eax+APPOBJ.pid]
  365.            call pid_to_slot
  366.            test eax, eax
  367.            jz .fail
  368.  
  369.            mov esi, edx
  370.            test esi, esi
  371.            mov edx, [.event]
  372.            jz @F
  373.  
  374.            push ecx
  375.            lea edi, [edx+EVENT.code]
  376.            mov ecx, 6
  377.            cld
  378.            rep movsd
  379.            pop ecx
  380. @@:
  381.            test [edx+EVENT.state], EVENT_SIGNALED
  382.            jnz .done
  383.  
  384.            test ecx, EVENT_WATCHED
  385.            jz @F
  386.            test [edx+EVENT.state], EVENT_WATCHED
  387.            jz .done
  388. @@:
  389.            shl eax, 8
  390.            add eax, PROC_BASE+APP_EV_OFFSET
  391.  
  392.            pushfd
  393.            cli
  394.            mov ebx, [edx+APPOBJ.fd]
  395.            mov ecx, [edx+APPOBJ.bk]
  396.            mov [ebx+APPOBJ.bk], ecx
  397.            mov [ecx+APPOBJ.fd], ebx
  398.  
  399.            mov ecx, [eax+APPOBJ.fd]
  400.            mov [edx+APPOBJ.fd], ecx
  401.            mov [edx+APPOBJ.bk], eax
  402.            mov [eax+APPOBJ.fd], edx
  403.            mov [ecx+APPOBJ.bk], edx
  404.            or [edx+EVENT.state], EVENT_SIGNALED
  405.  
  406.            inc [eax+APPDATA.ev_count-APP_EV_OFFSET]
  407.            or  [eax+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
  408.            popfd
  409. .fail:
  410. .done:
  411.            add esp, 4
  412.            ret
  413. restore .event
  414.  
  415. ; param
  416. ;  eax= event
  417. ;  ebx= id
  418. align 4
  419. clear_event:
  420.            .event equ esp
  421.            push eax
  422.  
  423.            cmp [eax+APPOBJ.magic], 'EVNT'
  424.            jne .fail
  425.            cmp [eax+EVENT.id], ebx
  426.            jne .fail
  427.  
  428.            mov eax, [eax+APPOBJ.pid]
  429.            call pid_to_slot
  430.            test eax, eax
  431.            jz .fail
  432.  
  433.            shl eax, 8
  434.            add eax, PROC_BASE+APP_EV_OFFSET
  435.            mov edx, [.event]
  436.            pushfd
  437.            cli                         ;remove event from events
  438.            mov ebx, [edx+APPOBJ.fd]    ;list (reset event)
  439.            mov ecx, [edx+APPOBJ.bk]    ;and clear events flag
  440.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  441.            mov [ecx+APPOBJ.fd], ebx
  442.  
  443.            and [edx+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  444.  
  445.            dec [eax+APPDATA.ev_count-APP_EV_OFFSET]
  446.            jnz @F
  447.            and [eax+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
  448. @@:
  449.            add eax, (APP_OBJ_OFFSET-APP_EV_OFFSET)
  450.  
  451.            mov ecx, [eax+APPOBJ.fd]  ;insert event into
  452.            mov [edx+APPOBJ.fd], ecx  ;objects list
  453.            mov [edx+APPOBJ.bk], eax
  454.            mov [eax+APPOBJ.fd], edx
  455.            mov [ecx+APPOBJ.bk], edx
  456.            popfd
  457. .fail:
  458. .done:
  459.            add esp, 4
  460.            ret
  461. restore .event
  462.  
  463. sys_getevent:
  464.  
  465.      call   get_event_for_app
  466.      mov    [esp+36],eax
  467.      ret
  468.  
  469.  
  470. align 4
  471. sys_wait_event_timeout:
  472.  
  473.      mov   ebx,[timer_ticks]
  474.      add   ebx,eax
  475.      cmp   ebx,[timer_ticks]
  476.      jna   .swfet2
  477. .swfet1:
  478.      call  get_event_for_app
  479.      test  eax,eax
  480.      jne   .eventoccur_time
  481.      call  change_task
  482.      cmp   ebx,[timer_ticks]
  483.      jg    .swfet1
  484. .swfet2:
  485.      xor   eax,eax
  486. .eventoccur_time:
  487.      mov   [esp+36],eax
  488.      ret
  489.  
  490.  
  491. align 4
  492.  
  493. sys_waitforevent:
  494.  
  495.      call  get_event_for_app
  496.      test  eax,eax
  497.      jne   eventoccur
  498.    newwait:
  499.  
  500.      mov   eax, [TASK_BASE]
  501.      mov   [eax+TASKDATA.state], byte 5
  502.      call  change_task
  503.  
  504.      mov eax, [event_sched]
  505.  
  506.    eventoccur:
  507.      mov   [esp+36],eax
  508.      ret
  509.  
  510. get_event_for_app:
  511.  
  512.      pushad
  513.  
  514.      mov   edi,[TASK_BASE]              ; WINDOW REDRAW
  515.      test  [edi+TASKDATA.event_mask],dword 1
  516.      jz    no_eventoccur1
  517.      ;mov   edi,[TASK_BASE]
  518.      cmp   [edi-twdw+WDATA.fl_redraw],byte 0
  519.      je    no_eventoccur1
  520.      popad
  521.      mov   eax,1
  522.      ret
  523.    no_eventoccur1:
  524.  
  525.      ;mov   edi,[TASK_BASE]              ; KEY IN BUFFER
  526.      test  [edi+TASKDATA.event_mask],dword 2
  527.      jz    no_eventoccur2
  528.      mov   ecx, [CURRENT_TASK]
  529.      movzx edx,word [0xC000+ecx*2]
  530.      mov   eax, [TASK_COUNT]
  531.      cmp   eax,edx
  532.      jne   no_eventoccur2x
  533.      cmp   [0xf400],byte 0
  534.      je    no_eventoccur2x
  535.    eventoccur2:
  536.      popad
  537.      mov   eax,2
  538.      ret
  539.    no_eventoccur2x:
  540.         mov     eax, hotkey_buffer
  541. @@:
  542.         cmp     [eax], ecx
  543.         jz      eventoccur2
  544.         add     eax, 8
  545.         cmp     eax, hotkey_buffer+120*8
  546.         jb      @b
  547.    no_eventoccur2:
  548.  
  549.      ;mov   edi,[TASK_BASE]              ; BUTTON IN BUFFER
  550.      test  [edi+TASKDATA.event_mask],dword 4
  551.      jz    no_eventoccur3
  552.      cmp   [0xf500],byte 0
  553.      je    no_eventoccur3
  554.      mov   ecx, [CURRENT_TASK]
  555.      movzx edx, word [0xC000+ecx*2]
  556.      mov   eax, [TASK_COUNT]
  557.      cmp   eax,edx
  558.      jnz   no_eventoccur3
  559.      popad
  560.      mov   eax,[0xf501]
  561.      cmp   eax,65535
  562.      je    no_event_1
  563.      mov   eax,3
  564.      ret
  565.  
  566.     no_event_1:
  567.      mov   [window_minimize],1
  568.      mov   [0xf500],byte 0
  569.      xor   eax, eax
  570.      ret
  571.  
  572.    no_eventoccur3:
  573.  
  574.  
  575.      ;mov   edi,[TASK_BASE]              ; mouse event
  576.      test  [edi+TASKDATA.event_mask],dword 00100000b
  577.      jz    no_mouse_event
  578.      mov   eax,[CURRENT_TASK]
  579.      shl   eax,8
  580.      test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
  581.      jz    no_mouse_event
  582.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
  583.      popad
  584.      mov   eax,6
  585.      ret
  586.    no_mouse_event:
  587.  
  588.  
  589.      ;mov   edi,[TASK_BASE]              ; DESKTOP BACKGROUND REDRAW
  590.      test  [edi+TASKDATA.event_mask],dword 16
  591.      jz    no_eventoccur5
  592.      cmp   [0xfff0],byte 2
  593.      jnz   no_eventoccur5
  594.      popad
  595.      mov   eax,5
  596.      ret
  597.    no_eventoccur5:
  598.  
  599.      ;mov   edi,[TASK_BASE]              ; IPC
  600.      test  [edi+TASKDATA.event_mask],dword 01000000b
  601.      jz    no_ipc
  602.      mov   eax,[CURRENT_TASK]
  603.      shl   eax,8
  604.      test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
  605.      jz    no_ipc
  606.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
  607.      popad
  608.      mov   eax,7
  609.      ret
  610.    no_ipc:
  611.  
  612.  
  613.      ;mov   edi,[TASK_BASE]              ; STACK
  614.      test  [edi+TASKDATA.event_mask],dword 10000000b
  615.      jz    no_stack_event
  616.      mov   eax,[CURRENT_TASK]
  617.      shl   eax,8
  618.      test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
  619.      jz    no_stack_event
  620.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
  621.      popad
  622.      mov   eax,8
  623.      ret
  624.    no_stack_event:
  625.  
  626.      test  byte [edi+TASKDATA.event_mask+1], 1          ; DEBUG
  627.      jz    .test_IRQ
  628.      mov   eax, [CURRENT_TASK]
  629.      shl   eax, 8
  630.      test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
  631.      jz    .test_IRQ
  632.      and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
  633.      popad
  634.      mov   eax, 9
  635.      ret
  636.  
  637. ;.test_ext:
  638. ;     mov   eax, [CURRENT_TASK]
  639. ;     shl   eax, 8
  640. ;     test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
  641. ;     jz .test_IRQ
  642. ;     popad
  643. ;     mov eax, 10
  644. ;     ret
  645.  
  646. .test_IRQ:
  647.      cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
  648.      jbe   no_events
  649.  
  650.      mov   esi,0x2e0000              ; IRQ'S AND DATA
  651.      mov   ebx,0x00010000
  652.      xor   ecx, ecx
  653.    irq_event_test:
  654.      mov   edi,[TASK_BASE]
  655.      test  [edi+TASKDATA.event_mask],ebx
  656.      jz    no_irq_event
  657.      mov   edi,ecx
  658.      shl   edi,2
  659.      add   edi,irq_owner
  660.      mov   edx,[edi]
  661.      mov   eax,[TASK_BASE]
  662.      mov   eax,[eax+TASKDATA.pid]
  663.      cmp   edx,eax
  664.      jne   no_irq_event
  665.      cmp   [esi],dword 0
  666.      jz    no_irq_event
  667.      mov   eax,ecx
  668.      add   eax,16
  669.      mov   [esp+28],eax
  670.      popad
  671.      ret
  672.     no_irq_event:
  673.      add   esi,0x1000
  674.      shl   ebx,1
  675.      inc   ecx
  676.      cmp   ecx,16
  677.      jb    irq_event_test
  678.  
  679.    no_events:
  680.      popad
  681.      xor   eax, eax
  682.      ret
  683.  
  684.  
  685.  
  686.