Subversion Repositories Kolibri OS

Rev

Rev 115 | Rev 230 | 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. ;     push eax
  128. ;     push edx
  129. ;     mov edx, 0x400   ;bocsh
  130. ;     mov al,0xff      ;bocsh
  131. ;     out dx, al       ;bocsh
  132. ;     pop edx
  133. ;     pop eax
  134.  
  135. .wait:
  136.            mov ebx,[CURRENT_TASK]
  137.            shl ebx,8
  138.            cmp [PROC_BASE+ebx+APPDATA.ev_count], 0
  139.            je .switch
  140.  
  141.            mov esi, [PROC_BASE+ebx+APPDATA.ev_first]
  142.            mov edx, [esi+EVENT.next]
  143.            mov [PROC_BASE+ebx+APPDATA.ev_first], edx
  144.            test edx, edx
  145.            jnz @F
  146.            mov [PROC_BASE+ebx+APPDATA.ev_last], edx
  147.            and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
  148. @@:
  149.            mov [edx+EVENT.prev], 0
  150.            dec [PROC_BASE+ebx+APPDATA.ev_count]
  151.  
  152.            mov eax, esi
  153.            and dword [esi], 0xFF00FFFF
  154.            mov edi, [p_ev]
  155.            mov ecx, 6
  156.            cld
  157.            rep movsd
  158.            call free_event
  159.            ret
  160. .switch:
  161.            mov eax, [0x3010]
  162.            mov [eax+TASKDATA.state], byte 5
  163.            call change_task
  164.            jmp .wait
  165. endp
  166.  
  167. sys_getevent:
  168.  
  169.      call   get_event_for_app
  170.      mov    [esp+36],eax
  171.      ret
  172.  
  173.  
  174. align 4
  175. sys_wait_event_timeout:
  176.  
  177.      mov   ebx,[timer_ticks]
  178.      add   ebx,eax
  179.      cmp   ebx,[timer_ticks]
  180.      jna   .swfet2
  181. .swfet1:
  182.      call  get_event_for_app
  183.      test  eax,eax
  184.      jne   .eventoccur_time
  185.      call  change_task
  186.      cmp   ebx,[timer_ticks]
  187.      jg    .swfet1
  188. .swfet2:
  189.      xor   eax,eax
  190. .eventoccur_time:
  191.      mov   [esp+36],eax
  192.      ret
  193.  
  194.  
  195. align 4
  196.  
  197. sys_waitforevent:
  198.  
  199.      call  get_event_for_app
  200.      test  eax,eax
  201.      jne   eventoccur
  202.    newwait:
  203.  
  204.      mov   eax, [0x3010]
  205.      mov   [eax+TASKDATA.state], byte 5
  206.      call  change_task
  207.  
  208.      mov eax, [event_sched]
  209.  
  210.    eventoccur:
  211.      mov   [esp+36],eax
  212.      ret
  213.  
  214. get_event_for_app:
  215.  
  216.      pushad
  217.  
  218.      mov   edi,[0x3010]              ; WINDOW REDRAW
  219.      test  [edi+TASKDATA.event_mask],dword 1
  220.      jz    no_eventoccur1
  221.      ;mov   edi,[0x3010]
  222.      cmp   [edi-twdw+WDATA.fl_redraw],byte 0
  223.      je    no_eventoccur1
  224.      popad
  225.      mov   eax,1
  226.      ret
  227.    no_eventoccur1:
  228.  
  229.      ;mov   edi,[0x3010]              ; KEY IN BUFFER
  230.      test  [edi+TASKDATA.event_mask],dword 2
  231.      jz    no_eventoccur2
  232.      mov   ecx, [0x3000]
  233.      movzx edx,word [0xC000+ecx*2]
  234.      mov   eax, [0x3004]
  235.      cmp   eax,edx
  236.      jne   no_eventoccur2x
  237.      cmp   [0xf400],byte 0
  238.      je    no_eventoccur2x
  239.    eventoccur2:
  240.      popad
  241.      mov   eax,2
  242.      ret
  243.    no_eventoccur2x:
  244.         mov     eax, hotkey_buffer
  245. @@:
  246.         cmp     [eax], ecx
  247.         jz      eventoccur2
  248.         add     eax, 8
  249.         cmp     eax, hotkey_buffer+120*8
  250.         jb      @b
  251.    no_eventoccur2:
  252.  
  253.      ;mov   edi,[0x3010]              ; BUTTON IN BUFFER
  254.      test  [edi+TASKDATA.event_mask],dword 4
  255.      jz    no_eventoccur3
  256.      cmp   [0xf500],byte 0
  257.      je    no_eventoccur3
  258.      mov   ecx, [0x3000]
  259.      movzx edx, word [0xC000+ecx*2]
  260.      mov   eax, [0x3004]
  261.      cmp   eax,edx
  262.      jnz   no_eventoccur3
  263.      popad
  264.      mov   eax,[0xf501]
  265.      cmp   eax,65535
  266.      je    no_event_1
  267.      mov   eax,3
  268.      ret
  269.  
  270.     no_event_1:
  271.      mov   [window_minimize],1
  272.      mov   [0xf500],byte 0
  273.      xor   eax, eax
  274.      ret
  275.  
  276.    no_eventoccur3:
  277.  
  278.  
  279.      ;mov   edi,[0x3010]              ; mouse event
  280.      test  [edi+TASKDATA.event_mask],dword 00100000b
  281.      jz    no_mouse_event
  282.      mov   eax,[0x3000]
  283.      shl   eax,8
  284.      test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
  285.      jz    no_mouse_event
  286.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
  287.      popad
  288.      mov   eax,6
  289.      ret
  290.    no_mouse_event:
  291.  
  292.  
  293.      ;mov   edi,[0x3010]              ; DESKTOP BACKGROUND REDRAW
  294.      test  [edi+TASKDATA.event_mask],dword 16
  295.      jz    no_eventoccur5
  296.      cmp   [0xfff0],byte 2
  297.      jnz   no_eventoccur5
  298.      popad
  299.      mov   eax,5
  300.      ret
  301.    no_eventoccur5:
  302.  
  303.      ;mov   edi,[0x3010]              ; IPC
  304.      test  [edi+TASKDATA.event_mask],dword 01000000b
  305.      jz    no_ipc
  306.      mov   eax,[0x3000]
  307.      shl   eax,8
  308.      test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
  309.      jz    no_ipc
  310.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
  311.      popad
  312.      mov   eax,7
  313.      ret
  314.    no_ipc:
  315.  
  316.  
  317.      ;mov   edi,[0x3010]              ; STACK
  318.      test  [edi+TASKDATA.event_mask],dword 10000000b
  319.      jz    no_stack_event
  320.      mov   eax,[0x3000]
  321.      shl   eax,8
  322.      test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
  323.      jz    no_stack_event
  324.      and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
  325.      popad
  326.      mov   eax,8
  327.      ret
  328.    no_stack_event:
  329.  
  330.      test  byte [edi+TASKDATA.event_mask+1], 1          ; DEBUG
  331.      jz    .test_ext
  332.      mov   eax, [0x3000]
  333.      shl   eax, 8
  334.      test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
  335.      jz    .test_ext
  336.      and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
  337.      popad
  338.      mov   eax, 9
  339.      ret
  340.  
  341. .test_ext:
  342.      mov   eax, [0x3000]
  343.      shl   eax, 8
  344.      test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
  345.      jz .test_IRQ
  346.      mov eax, 10
  347.      ret
  348.  
  349. .test_IRQ:
  350.  
  351.  
  352.      cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
  353.      jbe   no_events
  354.  
  355.      mov   esi,0x2e0000              ; IRQ'S AND DATA
  356.      mov   ebx,0x00010000
  357.      xor   ecx, ecx
  358.    irq_event_test:
  359.      mov   edi,[0x3010]
  360.      test  [edi+TASKDATA.event_mask],ebx
  361.      jz    no_irq_event
  362.      mov   edi,ecx
  363.      shl   edi,2
  364.      add   edi,irq_owner
  365.      mov   edx,[edi]
  366.      mov   eax,[0x3010]
  367.      mov   eax,[eax+TASKDATA.pid]
  368.      cmp   edx,eax
  369.      jne   no_irq_event
  370.      cmp   [esi],dword 0
  371.      jz    no_irq_event
  372.      mov   eax,ecx
  373.      add   eax,16
  374.      mov   [esp+28],eax
  375.      popad
  376.      ret
  377.     no_irq_event:
  378.      add   esi,0x1000
  379.      shl   ebx,1
  380.      inc   ecx
  381.      cmp   ecx,16
  382.      jb    irq_event_test
  383.  
  384.    no_events:
  385.      popad
  386.      xor   eax, eax
  387.      ret
  388.  
  389.  
  390.  
  391.