Subversion Repositories Kolibri OS

Rev

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