Subversion Repositories Kolibri OS

Rev

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