Subversion Repositories Kolibri OS

Rev

Rev 354 | Rev 377 | 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, [0x3000+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+EVENT.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.  
  240.            test [eax+EVENT.state], MANUAL_RESET
  241.            jnz .done
  242.  
  243.            pushfd
  244.            cli                         ;remove event from events
  245.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  246.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  247.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  248.            mov [ecx+APPOBJ.fd], ebx
  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.            popfd
  253.  
  254.            test [eax+EVENT.state], MANUAL_DESTROY
  255.            jz .destroy
  256.  
  257.            add edx, (APP_OBJ_OFFSET-APP_EV_OFFSET)
  258.  
  259.            pushfd
  260.            cli
  261.            mov edx, [ecx+APPOBJ.fd]  ;insert event into
  262.            mov [eax+APPOBJ.fd], edx  ;objects list
  263.            mov [eax+APPOBJ.bk], ecx
  264.            mov [ecx+APPOBJ.fd], eax
  265.            mov [edx+APPOBJ.bk], eax
  266.            popfd
  267. .done:
  268.            ret
  269.  
  270. .destroy:
  271.            call destroy_event.force
  272.            ret
  273. .switch:
  274.            mov eax, [0x3010]
  275.            mov [eax+TASKDATA.state], byte 5
  276.            call change_task
  277.            jmp .wait
  278. endp
  279.  
  280. ; param
  281. ;  eax= event
  282. ;  ebx= id
  283.  
  284. align 4
  285. wait_event:
  286.            .event equ esp
  287.            push eax
  288. .wait:
  289.            cmp [eax+APPOBJ.magic], 'EVNT'
  290.            jne .done
  291.            cmp [eax+EVENT.id], ebx
  292.            jne .done
  293.  
  294.            test [eax+EVENT.state], EVENT_SIGNALED
  295.            jz .switch
  296.  
  297.            test [eax+EVENT.state], MANUAL_RESET
  298.            jnz .done
  299.  
  300.            mov edx,[CURRENT_TASK]
  301.            shl edx,8
  302.            add edx, PROC_BASE
  303.  
  304.            pushfd
  305.            cli                         ;remove event from events
  306.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  307.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  308.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  309.            mov [ecx+APPOBJ.fd], ebx
  310.            dec [edx+APPDATA.ev_count]
  311.            jnz @F
  312.            and [edx+APPDATA.event_mask], not EVENT_EXTENDED
  313. @@:
  314.            and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  315.            popfd
  316.  
  317.            test [eax+EVENT.state], MANUAL_DESTROY
  318.            jz .destroy
  319.  
  320.            add edx, APP_OBJ_OFFSET
  321.  
  322.            pushfd
  323.            cli
  324.            mov ecx, [edx+APPOBJ.fd]  ;insert event into
  325.            mov [eax+APPOBJ.fd], ecx  ;objects list
  326.            mov [eax+APPOBJ.bk], edx
  327.            mov [edx+APPOBJ.fd], eax
  328.            mov [ecx+APPOBJ.bk], eax
  329.            popfd
  330. .done:
  331.            add esp, 4
  332.            ret
  333. .destroy:
  334.            call destroy_event.force
  335.            add esp, 4
  336.            ret
  337. .switch:
  338.            or [eax+EVENT.state], EVENT_WATCHED
  339.            mov eax, [0x3010]
  340.            mov [eax+TASKDATA.state], byte 5
  341.            call change_task
  342.            mov eax, [.event]
  343.            jmp .wait
  344. restore .event
  345.  
  346. ; param
  347. ;  eax= event
  348. ;  ebx= id
  349. ;  ecx= flags
  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 edx, [.event]
  366.            test [edx+EVENT.state], EVENT_SIGNALED
  367.            jnz .done
  368.  
  369.            test ecx, EVENT_WATCHED
  370.            jz @F
  371.            test [edx+EVENT.state], EVENT_WATCHED
  372.            jz .done
  373. @@:
  374.            shl eax, 8
  375.            add eax, PROC_BASE+APP_EV_OFFSET
  376.  
  377.            pushfd
  378.            cli
  379.            mov ebx, [edx+APPOBJ.fd]
  380.            mov ecx, [edx+APPOBJ.bk]
  381.            mov [ebx+APPOBJ.bk], ecx
  382.            mov [ecx+APPOBJ.fd], ebx
  383.  
  384.            mov ecx, [eax+APPOBJ.fd]
  385.            mov [edx+APPOBJ.fd], ecx
  386.            mov [edx+APPOBJ.bk], eax
  387.            mov [eax+APPOBJ.fd], edx
  388.            mov [ecx+APPOBJ.bk], edx
  389.            or [edx+EVENT.state], EVENT_SIGNALED
  390.  
  391.            inc [eax+APPDATA.ev_count-APP_EV_OFFSET]
  392.            or  [eax+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
  393.            popfd
  394. .fail:
  395. .done:
  396.            add esp, 4
  397.            ret
  398. restore .event
  399.  
  400. sys_getevent:
  401.  
  402.      call   get_event_for_app
  403.      mov    [esp+36],eax
  404.      ret
  405.  
  406.  
  407. align 4
  408. sys_wait_event_timeout:
  409.  
  410.      mov   ebx,[timer_ticks]
  411.      add   ebx,eax
  412.      cmp   ebx,[timer_ticks]
  413.      jna   .swfet2
  414. .swfet1:
  415.      call  get_event_for_app
  416.      test  eax,eax
  417.      jne   .eventoccur_time
  418.      call  change_task
  419.      cmp   ebx,[timer_ticks]
  420.      jg    .swfet1
  421. .swfet2:
  422.      xor   eax,eax
  423. .eventoccur_time:
  424.      mov   [esp+36],eax
  425.      ret
  426.  
  427.  
  428. align 4
  429.  
  430. sys_waitforevent:
  431.  
  432.      call  get_event_for_app
  433.      test  eax,eax
  434.      jne   eventoccur
  435.    newwait:
  436.  
  437.      mov   eax, [0x3010]
  438.      mov   [eax+TASKDATA.state], byte 5
  439.      call  change_task
  440.  
  441.      mov eax, [event_sched]
  442.  
  443.    eventoccur:
  444.      mov   [esp+36],eax
  445.      ret
  446.  
  447. get_event_for_app:
  448.  
  449.      pushad
  450.  
  451.      mov   edi,[0x3010]              ; WINDOW REDRAW
  452.      test  [edi+TASKDATA.event_mask],dword 1
  453.      jz    no_eventoccur1
  454.      ;mov   edi,[0x3010]
  455.      cmp   [edi-twdw+WDATA.fl_redraw],byte 0
  456.      je    no_eventoccur1
  457.      popad
  458.      mov   eax,1
  459.      ret
  460.    no_eventoccur1:
  461.  
  462.      ;mov   edi,[0x3010]              ; KEY IN BUFFER
  463.      test  [edi+TASKDATA.event_mask],dword 2
  464.      jz    no_eventoccur2
  465.      mov   ecx, [0x3000]
  466.      movzx edx,word [0xC000+ecx*2]
  467.      mov   eax, [0x3004]
  468.      cmp   eax,edx
  469.      jne   no_eventoccur2x
  470.      cmp   [0xf400],byte 0
  471.      je    no_eventoccur2x
  472.    eventoccur2:
  473.      popad
  474.      mov   eax,2
  475.      ret
  476.    no_eventoccur2x:
  477.         mov     eax, hotkey_buffer
  478. @@:
  479.         cmp     [eax], ecx
  480.         jz      eventoccur2
  481.         add     eax, 8
  482.         cmp     eax, hotkey_buffer+120*8
  483.         jb      @b
  484.    no_eventoccur2:
  485.  
  486.      ;mov   edi,[0x3010]              ; BUTTON IN BUFFER
  487.      test  [edi+TASKDATA.event_mask],dword 4
  488.      jz    no_eventoccur3
  489.      cmp   [0xf500],byte 0
  490.      je    no_eventoccur3
  491.      mov   ecx, [0x3000]
  492.      movzx edx, word [0xC000+ecx*2]
  493.      mov   eax, [0x3004]
  494.      cmp   eax,edx
  495.      jnz   no_eventoccur3
  496.      popad
  497.      mov   eax,[0xf501]
  498.      cmp   eax,65535
  499.      je    no_event_1
  500.      mov   eax,3
  501.      ret
  502.  
  503.     no_event_1:
  504.      mov   [window_minimize],1
  505.      mov   [0xf500],byte 0
  506.      xor   eax, eax
  507.      ret
  508.  
  509.    no_eventoccur3:
  510.  
  511.  
  512.      ;mov   edi,[0x3010]              ; mouse event
  513.      test  [edi+TASKDATA.event_mask],dword 00100000b
  514.      jz    no_mouse_event
  515.      mov   eax,[0x3000]
  516.      shl   eax,8
  517.      test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
  518.      jz    no_mouse_event
  519.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
  520.      popad
  521.      mov   eax,6
  522.      ret
  523.    no_mouse_event:
  524.  
  525.  
  526.      ;mov   edi,[0x3010]              ; DESKTOP BACKGROUND REDRAW
  527.      test  [edi+TASKDATA.event_mask],dword 16
  528.      jz    no_eventoccur5
  529.      cmp   [0xfff0],byte 2
  530.      jnz   no_eventoccur5
  531.      popad
  532.      mov   eax,5
  533.      ret
  534.    no_eventoccur5:
  535.  
  536.      ;mov   edi,[0x3010]              ; IPC
  537.      test  [edi+TASKDATA.event_mask],dword 01000000b
  538.      jz    no_ipc
  539.      mov   eax,[0x3000]
  540.      shl   eax,8
  541.      test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
  542.      jz    no_ipc
  543.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
  544.      popad
  545.      mov   eax,7
  546.      ret
  547.    no_ipc:
  548.  
  549.  
  550.      ;mov   edi,[0x3010]              ; STACK
  551.      test  [edi+TASKDATA.event_mask],dword 10000000b
  552.      jz    no_stack_event
  553.      mov   eax,[0x3000]
  554.      shl   eax,8
  555.      test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
  556.      jz    no_stack_event
  557.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
  558.      popad
  559.      mov   eax,8
  560.      ret
  561.    no_stack_event:
  562.  
  563.      test  byte [edi+TASKDATA.event_mask+1], 1          ; DEBUG
  564.      jz    .test_IRQ
  565.      mov   eax, [0x3000]
  566.      shl   eax, 8
  567.      test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
  568.      jz    .test_IRQ
  569.      and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
  570.      popad
  571.      mov   eax, 9
  572.      ret
  573.  
  574. ;.test_ext:
  575. ;     mov   eax, [0x3000]
  576. ;     shl   eax, 8
  577. ;     test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
  578. ;     jz .test_IRQ
  579. ;     popad
  580. ;     mov eax, 10
  581. ;     ret
  582.  
  583. .test_IRQ:
  584.      cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
  585.      jbe   no_events
  586.  
  587.      mov   esi,0x2e0000              ; IRQ'S AND DATA
  588.      mov   ebx,0x00010000
  589.      xor   ecx, ecx
  590.    irq_event_test:
  591.      mov   edi,[0x3010]
  592.      test  [edi+TASKDATA.event_mask],ebx
  593.      jz    no_irq_event
  594.      mov   edi,ecx
  595.      shl   edi,2
  596.      add   edi,irq_owner
  597.      mov   edx,[edi]
  598.      mov   eax,[0x3010]
  599.      mov   eax,[eax+TASKDATA.pid]
  600.      cmp   edx,eax
  601.      jne   no_irq_event
  602.      cmp   [esi],dword 0
  603.      jz    no_irq_event
  604.      mov   eax,ecx
  605.      add   eax,16
  606.      mov   [esp+28],eax
  607.      popad
  608.      ret
  609.     no_irq_event:
  610.      add   esi,0x1000
  611.      shl   ebx,1
  612.      inc   ecx
  613.      cmp   ecx,16
  614.      jb    irq_event_test
  615.  
  616.    no_events:
  617.      popad
  618.      xor   eax, eax
  619.      ret
  620.  
  621.  
  622.  
  623.