Subversion Repositories Kolibri OS

Rev

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

  1. struc EVENT
  2. {  .code    rd 1
  3.             rd 5
  4.    .next    rd 1   ;+24
  5.    .prev    rd 1   ;+28
  6. }
  7. EVENT_SIZE  equ 32
  8.  
  9. virtual at 0
  10.   EVENT EVENT
  11. end virtual
  12.  
  13. align 4
  14. init_events:
  15.            stdcall kernel_alloc, 1024*EVENT_SIZE
  16.            mov [events], eax
  17.            xor eax, eax
  18.            not eax
  19.            mov edi, event_map
  20.            mov [event_start], edi
  21.            mov ecx, 128/4
  22.            cld
  23.            rep stosd
  24.            mov [event_end], edi
  25.            ret
  26.  
  27. align 4
  28. proc alloc_event
  29.  
  30.            pushfd
  31.            cli
  32.            mov ebx, [event_start]
  33.            mov ecx, [event_end]
  34. .l1:
  35.            bsf eax,[ebx]
  36.            jnz .found
  37.            add ebx,4
  38.            cmp ebx, ecx
  39.            jb .l1
  40.            popfd
  41.            xor eax,eax
  42.            ret
  43. .found:
  44.            btr [ebx], eax
  45.            mov [event_start],ebx
  46.            sub ebx, event_map
  47.            lea eax,[eax+ebx*8]
  48.            shl eax,5
  49.            add eax, [events]
  50.            popfd
  51.            xor ebx, ebx
  52.            mov [eax+EVENT.next], ebx
  53.            mov [eax+EVENT.prev], ebx
  54.            ret
  55. endp
  56.  
  57. align 4
  58. free_event:
  59.            pushfd
  60.            cli
  61.            sub eax, [events]
  62.            shr eax, 5
  63.            mov ebx, event_map
  64.            bts [ebx], eax
  65.            shr eax, 3
  66.            and eax, not 3
  67.            add eax, ebx
  68.            cmp [event_start], eax
  69.            ja @f
  70.            popfd
  71.            ret
  72. @@:
  73.            mov [event_start], eax
  74.            popfd
  75.            ret
  76.  
  77. align 4
  78. proc send_event stdcall pid:dword, event:dword
  79.            locals
  80.              slot     dd ?
  81.            endl
  82.  
  83.            mov eax, [pid]
  84.            call pid_to_slot
  85.            test eax, eax
  86.            jz .fail
  87.  
  88.            shl eax, 8
  89.            cmp [PROC_BASE+eax+APPDATA.ev_count], 32
  90.            ja .fail
  91.  
  92.            mov [slot], eax
  93.            call alloc_event
  94.            test eax, eax
  95.            jz .fail
  96.  
  97.            mov edi, eax
  98.            mov ecx, 6
  99.            mov esi, [event]
  100.            cld
  101.            rep movsd
  102.  
  103.            mov esi, eax
  104.            mov eax, [slot]
  105.            mov edi, [PROC_BASE+eax+APPDATA.ev_last]
  106.            mov [esi+EVENT.prev], edi
  107.            test edi, edi
  108.            jz .set_last
  109.            mov [edi+EVENT.next], esi
  110. .set_last:
  111.            mov edx, [PROC_BASE+eax+APPDATA.ev_first]
  112.            test edx, edx
  113.            jnz @F
  114.            mov [PROC_BASE+eax+APPDATA.ev_first], esi
  115. @@:
  116.            mov [PROC_BASE+eax+APPDATA.ev_last], esi
  117.            inc [PROC_BASE+eax+APPDATA.ev_count]
  118.            or  [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED
  119. .fail:
  120.            ret
  121. endp
  122.  
  123. align 4
  124. proc get_event_ex stdcall, p_ev:dword, timeout:dword
  125.  
  126. .wait:
  127.            mov ebx,[CURRENT_TASK]
  128.            shl ebx,8
  129.            cmp [PROC_BASE+ebx+APPDATA.ev_count], 0
  130.            je .switch
  131.  
  132.            mov esi, [PROC_BASE+ebx+APPDATA.ev_first]
  133.            mov edx, [esi+EVENT.next]
  134.            mov [PROC_BASE+ebx+APPDATA.ev_first], edx
  135.            test edx, edx
  136.            jz @F
  137.            mov [edx+EVENT.prev], 0
  138. @@:
  139.            jnz @F
  140.            mov [PROC_BASE+ebx+APPDATA.ev_last], edx
  141.            and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
  142. @@:
  143.            dec [PROC_BASE+ebx+APPDATA.ev_count]
  144.  
  145.            mov eax, esi
  146.            and dword [esi], 0xFF00FFFF
  147.            mov edi, [p_ev]
  148.            mov ecx, 6
  149.            cld
  150.            rep movsd
  151.            call free_event
  152.            ret
  153. .switch:
  154.            mov eax, [0x3010]
  155.            mov [eax+TASKDATA.state], byte 5
  156.            call change_task
  157.            jmp .wait
  158. endp
  159.  
  160. sys_getevent:
  161.  
  162.      call   get_event_for_app
  163.      mov    [esp+36],eax
  164.      ret
  165.  
  166.  
  167. align 4
  168. sys_wait_event_timeout:
  169.  
  170.      mov   ebx,[timer_ticks]
  171.      add   ebx,eax
  172.      cmp   ebx,[timer_ticks]
  173.      jna   .swfet2
  174. .swfet1:
  175.      call  get_event_for_app
  176.      test  eax,eax
  177.      jne   .eventoccur_time
  178.      call  change_task
  179.      cmp   ebx,[timer_ticks]
  180.      jg    .swfet1
  181. .swfet2:
  182.      xor   eax,eax
  183. .eventoccur_time:
  184.      mov   [esp+36],eax
  185.      ret
  186.  
  187.  
  188. align 4
  189.  
  190. sys_waitforevent:
  191.  
  192.      call  get_event_for_app
  193.      test  eax,eax
  194.      jne   eventoccur
  195.    newwait:
  196.  
  197.      mov   eax, [0x3010]
  198.      mov   [eax+TASKDATA.state], byte 5
  199.      call  change_task
  200.  
  201.      mov eax, [event_sched]
  202.  
  203.    eventoccur:
  204.      mov   [esp+36],eax
  205.      ret
  206.  
  207. get_event_for_app:
  208.  
  209.      pushad
  210.  
  211.      mov   edi,[0x3010]              ; WINDOW REDRAW
  212.      test  [edi+TASKDATA.event_mask],dword 1
  213.      jz    no_eventoccur1
  214.      ;mov   edi,[0x3010]
  215.      cmp   [edi-twdw+WDATA.fl_redraw],byte 0
  216.      je    no_eventoccur1
  217.      popad
  218.      mov   eax,1
  219.      ret
  220.    no_eventoccur1:
  221.  
  222.      ;mov   edi,[0x3010]              ; KEY IN BUFFER
  223.      test  [edi+TASKDATA.event_mask],dword 2
  224.      jz    no_eventoccur2
  225.      mov   ecx, [0x3000]
  226.      movzx edx,word [0xC000+ecx*2]
  227.      mov   eax, [0x3004]
  228.      cmp   eax,edx
  229.      jne   no_eventoccur2x
  230.      cmp   [0xf400],byte 0
  231.      je    no_eventoccur2x
  232.    eventoccur2:
  233.      popad
  234.      mov   eax,2
  235.      ret
  236.    no_eventoccur2x:
  237.         mov     eax, hotkey_buffer
  238. @@:
  239.         cmp     [eax], ecx
  240.         jz      eventoccur2
  241.         add     eax, 8
  242.         cmp     eax, hotkey_buffer+120*8
  243.         jb      @b
  244.    no_eventoccur2:
  245.  
  246.      ;mov   edi,[0x3010]              ; BUTTON IN BUFFER
  247.      test  [edi+TASKDATA.event_mask],dword 4
  248.      jz    no_eventoccur3
  249.      cmp   [0xf500],byte 0
  250.      je    no_eventoccur3
  251.      mov   ecx, [0x3000]
  252.      movzx edx, word [0xC000+ecx*2]
  253.      mov   eax, [0x3004]
  254.      cmp   eax,edx
  255.      jnz   no_eventoccur3
  256.      popad
  257.      mov   eax,[0xf501]
  258.      cmp   eax,65535
  259.      je    no_event_1
  260.      mov   eax,3
  261.      ret
  262.  
  263.     no_event_1:
  264.      mov   [window_minimize],1
  265.      mov   [0xf500],byte 0
  266.      xor   eax, eax
  267.      ret
  268.  
  269.    no_eventoccur3:
  270.  
  271.  
  272.      ;mov   edi,[0x3010]              ; mouse event
  273.      test  [edi+TASKDATA.event_mask],dword 00100000b
  274.      jz    no_mouse_event
  275.      mov   eax,[0x3000]
  276.      shl   eax,8
  277.      test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
  278.      jz    no_mouse_event
  279.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
  280.      popad
  281.      mov   eax,6
  282.      ret
  283.    no_mouse_event:
  284.  
  285.  
  286.      ;mov   edi,[0x3010]              ; DESKTOP BACKGROUND REDRAW
  287.      test  [edi+TASKDATA.event_mask],dword 16
  288.      jz    no_eventoccur5
  289.      cmp   [0xfff0],byte 2
  290.      jnz   no_eventoccur5
  291.      popad
  292.      mov   eax,5
  293.      ret
  294.    no_eventoccur5:
  295.  
  296.      ;mov   edi,[0x3010]              ; IPC
  297.      test  [edi+TASKDATA.event_mask],dword 01000000b
  298.      jz    no_ipc
  299.      mov   eax,[0x3000]
  300.      shl   eax,8
  301.      test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
  302.      jz    no_ipc
  303.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
  304.      popad
  305.      mov   eax,7
  306.      ret
  307.    no_ipc:
  308.  
  309.  
  310.      ;mov   edi,[0x3010]              ; STACK
  311.      test  [edi+TASKDATA.event_mask],dword 10000000b
  312.      jz    no_stack_event
  313.      mov   eax,[0x3000]
  314.      shl   eax,8
  315.      test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
  316.      jz    no_stack_event
  317.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
  318.      popad
  319.      mov   eax,8
  320.      ret
  321.    no_stack_event:
  322.  
  323.      test  byte [edi+TASKDATA.event_mask+1], 1          ; DEBUG
  324.      jz    .test_ext
  325.      mov   eax, [0x3000]
  326.      shl   eax, 8
  327.      test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
  328.      jz    .test_ext
  329.      and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
  330.      popad
  331.      mov   eax, 9
  332.      ret
  333.  
  334. .test_ext:
  335.      mov   eax, [0x3000]
  336.      shl   eax, 8
  337.      test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
  338.      jz .test_IRQ
  339.      mov eax, 10
  340.      ret
  341.  
  342. .test_IRQ:
  343.  
  344.  
  345.      cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
  346.      jbe   no_events
  347.  
  348.      mov   esi,0x2e0000              ; IRQ'S AND DATA
  349.      mov   ebx,0x00010000
  350.      xor   ecx, ecx
  351.    irq_event_test:
  352.      mov   edi,[0x3010]
  353.      test  [edi+TASKDATA.event_mask],ebx
  354.      jz    no_irq_event
  355.      mov   edi,ecx
  356.      shl   edi,2
  357.      add   edi,irq_owner
  358.      mov   edx,[edi]
  359.      mov   eax,[0x3010]
  360.      mov   eax,[eax+TASKDATA.pid]
  361.      cmp   edx,eax
  362.      jne   no_irq_event
  363.      cmp   [esi],dword 0
  364.      jz    no_irq_event
  365.      mov   eax,ecx
  366.      add   eax,16
  367.      mov   [esp+28],eax
  368.      popad
  369.      ret
  370.     no_irq_event:
  371.      add   esi,0x1000
  372.      shl   ebx,1
  373.      inc   ecx
  374.      cmp   ecx,16
  375.      jb    irq_event_test
  376.  
  377.    no_events:
  378.      popad
  379.      xor   eax, eax
  380.      ret
  381.  
  382.  
  383.  
  384.