Subversion Repositories Kolibri OS

Rev

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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;                                                              ;;
  3. ;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
  4. ;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
  5. ;; Distributed under terms of the GNU General Public License    ;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7.  
  8. $Revision: 864 $
  9.  
  10.  
  11. align 4
  12. init_events:
  13.  
  14.            mov ecx, 512*EVENT_SIZE
  15.            mov edx, PG_SW
  16.            call @mem_alloc@8
  17.  
  18.            mov [events], eax
  19.            xor eax, eax
  20.            mov [event_uid], eax
  21.            not eax
  22.            mov edi, event_map
  23.            mov [event_start], edi
  24.            mov ecx, 64/4
  25.            cld
  26.            rep stosd
  27.            mov [event_end], edi
  28.            ret
  29.  
  30. align 4
  31. proc alloc_event
  32.  
  33.            pushfd
  34.            cli
  35.            mov ebx, [event_start]
  36.            mov ecx, [event_end]
  37. .l1:
  38.            bsf eax,[ebx]
  39.            jnz .found
  40.            add ebx,4
  41.            cmp ebx, ecx
  42.            jb .l1
  43.            popfd
  44.            xor eax,eax
  45.            ret
  46. .found:
  47.            btr [ebx], eax
  48.            mov [event_start],ebx
  49.            inc [event_uid]
  50.  
  51.            sub ebx, event_map
  52.            lea eax,[eax+ebx*8]
  53.  
  54.            lea ebx, [eax+eax*4]
  55.            shl eax,5
  56.            lea eax,[eax+ebx*4]   ;eax*=52 (EVENT_SIZE)
  57.            add eax, [events]
  58.            mov ebx, [event_uid]
  59.            popfd
  60.            ret
  61. endp
  62.  
  63. align 4
  64. free_event:
  65.            sub eax, [events]
  66.            mov ecx, EVENT_SIZE
  67.            mov ebx, event_map
  68.            cdq
  69.            div ecx
  70.  
  71.            pushfd
  72.            cli
  73.            bts [ebx], eax
  74.            shr eax, 3
  75.            and eax, not 3
  76.            add eax, ebx
  77.            cmp [event_start], eax
  78.            ja @f
  79.            popfd
  80.            ret
  81. @@:
  82.            mov [event_start], eax
  83.            popfd
  84.            ret
  85.  
  86. EVENT_WATCHED    equ 0x10000000
  87. EVENT_SIGNALED   equ 0x20000000
  88. MANUAL_RESET     equ 0x40000000
  89. MANUAL_DESTROY   equ 0x80000000
  90.  
  91.  
  92. ; param
  93. ;  eax= event data
  94. ;  ebx= flags
  95. ;
  96. ; retval
  97. ;  eax= event
  98. ;  edx= id
  99.  
  100. create_event:
  101.            .flags  equ  esp+4
  102.            .data   equ  esp
  103.  
  104.            push ebx
  105.            push eax
  106.  
  107.            call alloc_event
  108.            test eax, eax
  109.            jz .fail
  110.  
  111.            mov [eax+APPOBJ.magic], 'EVNT'
  112.            mov [eax+APPOBJ.destroy], destroy_event.internal
  113.            mov [eax+EVENT.id], ebx
  114.  
  115.            mov ebx, [CURRENT_TASK]
  116.            shl ebx, 5
  117.            mov ebx, [CURRENT_TASK+ebx+4]
  118.            mov [eax+APPOBJ.pid], ebx
  119.            mov edx, [.flags]
  120.            mov [eax+EVENT.state], edx
  121.  
  122.            mov esi, [.data]
  123.            test esi, esi
  124.            jz @F
  125.            lea edi, [eax+EVENT.code]
  126.            mov ecx, 6
  127.            cld
  128.            rep movsd
  129. @@:
  130.            mov ecx, [current_slot]
  131.            add ecx, APP_OBJ_OFFSET
  132.  
  133.            pushfd
  134.            cli
  135.            mov edx, [ecx+APPOBJ.fd]
  136.            mov [eax+APPOBJ.fd], edx
  137.            mov [eax+APPOBJ.bk], ecx
  138.            mov [ecx+APPOBJ.fd], eax
  139.            mov [edx+APPOBJ.bk], eax
  140.            popfd
  141.            mov edx, [eax+EVENT.id]
  142. .fail:
  143.            add esp, 8
  144.            ret
  145.  
  146. restore .flags
  147. restore .data
  148.  
  149. ; param
  150. ;  eax= event
  151. ;  ebx= id
  152.  
  153. destroy_event:
  154.  
  155.            cmp [eax+APPOBJ.magic], 'EVNT'
  156.            jne .fail
  157.            cmp [eax+EVENT.id], ebx
  158.            jne .fail
  159. .internal:
  160.            mov ebx, [eax+APPOBJ.fd]
  161.            mov ecx, [eax+APPOBJ.bk]
  162.            mov [ebx+APPOBJ.bk], ecx
  163.            mov [ecx+APPOBJ.fd], ebx
  164. .force:
  165.            xor edx, edx             ;clear common header
  166.            mov [eax], edx
  167.            mov [eax+4], edx
  168.            mov [eax+8], edx
  169.            mov [eax+12], edx
  170.            mov [eax+16], edx
  171.  
  172.            call free_event          ;release object memory
  173. .fail:
  174.            ret
  175.  
  176. align 4
  177. proc send_event stdcall pid:dword, event:dword
  178.            locals
  179.              slot     dd ?
  180.            endl
  181.  
  182.            mov eax, [pid]
  183.            call pid_to_slot
  184.            test eax, eax
  185.            jz .fail
  186.  
  187.            shl eax, 8
  188.            cmp [SLOT_BASE+eax+APPDATA.ev_count], 32
  189.            ja .fail
  190.  
  191.            mov [slot], eax
  192.  
  193.            call alloc_event
  194.            test eax, eax
  195.            jz .fail
  196.  
  197.            lea edi, [eax+EVENT.code]
  198.            mov ecx, 6
  199.            mov esi, [event]
  200.            cld
  201.            rep movsd
  202.  
  203.            mov ecx, [slot]
  204.            add ecx, SLOT_BASE+APP_EV_OFFSET
  205.  
  206.            mov [eax+APPOBJ.magic], 'EVNT'
  207.            mov [eax+APPOBJ.destroy], destroy_event
  208.            mov ebx, [pid]
  209.            mov [eax+APPOBJ.pid], ebx
  210.            mov [eax+EVENT.state], EVENT_SIGNALED
  211.  
  212.            pushfd
  213.            cli                         ;insert event into
  214.            mov edx, [ecx+APPOBJ.fd]    ;events list
  215.            mov [eax+APPOBJ.fd], edx    ;and set events flag
  216.            mov [eax+APPOBJ.bk], ecx
  217.            mov [ecx+APPOBJ.fd], eax
  218.            mov [edx+APPOBJ.bk], eax
  219.            inc [ecx+APPDATA.ev_count-APP_EV_OFFSET]
  220.            or  [ecx+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
  221.            popfd
  222. .fail:
  223.            ret
  224. endp
  225.  
  226. ; timeout ignored
  227.  
  228. align 4
  229. proc get_event_ex stdcall, p_ev:dword, timeout:dword
  230.  
  231. .wait:
  232.            mov edx,[current_slot]
  233. ;           cmp [SLOT_BASE+edx+APPDATA.ev_count], 0
  234. ;           je .switch
  235.  
  236.            add edx, APP_EV_OFFSET
  237.  
  238.            mov eax, [edx+APPOBJ.fd]
  239.            cmp eax, edx
  240.            je .switch
  241.  
  242.            lea esi, [eax+EVENT.code]
  243.            mov edi, [p_ev]                ;copy event data
  244.            mov ecx, 6
  245.            cld
  246.            rep movsd
  247.  
  248.            and dword [edi-24], 0xFF00FFFF ;clear priority field
  249.                                          ;
  250.            test [eax+EVENT.state], MANUAL_RESET
  251.            jnz .done
  252.  
  253.            pushfd
  254.            cli                         ;remove event from events
  255.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  256.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  257.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  258.            mov [ecx+APPOBJ.fd], ebx
  259.  
  260.            and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  261.  
  262.            dec [edx+APPDATA.ev_count-APP_EV_OFFSET]
  263.            jnz @F
  264.            and [edx+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
  265. @@:
  266.            popfd
  267.  
  268.            test [eax+EVENT.state], MANUAL_DESTROY
  269.            jz .destroy
  270.  
  271.            add edx, (APP_OBJ_OFFSET-APP_EV_OFFSET)
  272.  
  273.            pushfd
  274.            cli
  275.            mov ebx, [edx+APPOBJ.fd]  ;insert event into
  276.            mov [eax+APPOBJ.fd], ebx  ;objects list
  277.            mov [eax+APPOBJ.bk], edx
  278.            mov [edx+APPOBJ.fd], eax
  279.            mov [ebx+APPOBJ.bk], eax
  280.            popfd
  281. .done:
  282.            ret
  283.  
  284. .destroy:
  285.            call destroy_event.force
  286.            ret
  287. .switch:
  288.            mov eax, [TASK_BASE]
  289.            mov [eax+TASKDATA.state], byte 5
  290.            call change_task
  291.            jmp .wait
  292. endp
  293.  
  294. ; param
  295. ;  eax= event
  296. ;  ebx= id
  297.  
  298. align 4
  299. wait_event:
  300.            .event equ esp
  301.            push eax
  302. .wait:
  303.            cmp [eax+APPOBJ.magic], 'EVNT'
  304.            jne .done
  305.            cmp [eax+EVENT.id], ebx
  306.            jne .done
  307.  
  308.            test [eax+EVENT.state], EVENT_SIGNALED
  309.            jz .switch
  310.  
  311.            test [eax+EVENT.state], MANUAL_RESET
  312.            jnz .done
  313.  
  314.            mov edx,[current_slot]
  315.  
  316.            pushfd
  317.            cli                         ;remove event from events
  318.            mov ebx, [eax+APPOBJ.fd]    ;list (reset event)
  319.            mov ecx, [eax+APPOBJ.bk]    ;and clear events flag
  320.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  321.            mov [ecx+APPOBJ.fd], ebx
  322.            dec [edx+APPDATA.ev_count]
  323.            jnz @F
  324.            and [edx+APPDATA.event_mask], not EVENT_EXTENDED
  325. @@:
  326.            and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  327.            popfd
  328.  
  329.            test [eax+EVENT.state], MANUAL_DESTROY
  330.            jz .destroy
  331.  
  332.            add edx, APP_OBJ_OFFSET
  333.  
  334.            pushfd
  335.            cli
  336.            mov ecx, [edx+APPOBJ.fd]  ;insert event into
  337.            mov [eax+APPOBJ.fd], ecx  ;objects list
  338.            mov [eax+APPOBJ.bk], edx
  339.            mov [edx+APPOBJ.fd], eax
  340.            mov [ecx+APPOBJ.bk], eax
  341.            popfd
  342. .done:
  343.            add esp, 4
  344.            ret
  345. .destroy:
  346.            call destroy_event.force
  347.            add esp, 4
  348.            ret
  349. .switch:
  350.            or [eax+EVENT.state], EVENT_WATCHED
  351.            mov eax, [TASK_BASE]
  352.            mov [eax+TASKDATA.state], byte 5
  353.            call change_task
  354.            mov eax, [.event]
  355.            jmp .wait
  356. restore .event
  357.  
  358. ; param
  359. ;  eax= event
  360. ;  ebx= id
  361. ;  ecx= flags
  362. ;  edx= event data
  363.  
  364. raise_event:
  365.            .event equ esp
  366.            push eax
  367.  
  368.            cmp [eax+APPOBJ.magic], 'EVNT'
  369.            jne .fail
  370.            cmp [eax+EVENT.id], ebx
  371.            jne .fail
  372.  
  373.            mov eax, [eax+APPOBJ.pid]
  374.            call pid_to_slot
  375.            test eax, eax
  376.            jz .fail
  377.  
  378.            mov esi, edx
  379.            test esi, esi
  380.            mov edx, [.event]
  381.            jz @F
  382.  
  383.            push ecx
  384.            lea edi, [edx+EVENT.code]
  385.            mov ecx, 6
  386.            cld
  387.            rep movsd
  388.            pop ecx
  389. @@:
  390.            test [edx+EVENT.state], EVENT_SIGNALED
  391.            jnz .done
  392.  
  393.            test ecx, EVENT_WATCHED
  394.            jz @F
  395.            test [edx+EVENT.state], EVENT_WATCHED
  396.            jz .done
  397. @@:
  398.            shl eax, 8
  399.            add eax, SLOT_BASE+APP_EV_OFFSET
  400.  
  401.            pushfd
  402.            cli
  403.            mov ebx, [edx+APPOBJ.fd]
  404.            mov ecx, [edx+APPOBJ.bk]
  405.            mov [ebx+APPOBJ.bk], ecx
  406.            mov [ecx+APPOBJ.fd], ebx
  407.  
  408.            mov ecx, [eax+APPOBJ.fd]
  409.            mov [edx+APPOBJ.fd], ecx
  410.            mov [edx+APPOBJ.bk], eax
  411.            mov [eax+APPOBJ.fd], edx
  412.            mov [ecx+APPOBJ.bk], edx
  413.            or [edx+EVENT.state], EVENT_SIGNALED
  414.  
  415.            inc [eax+APPDATA.ev_count-APP_EV_OFFSET]
  416.            or  [eax+APPDATA.event_mask-APP_EV_OFFSET], EVENT_EXTENDED
  417.            popfd
  418. .fail:
  419. .done:
  420.            add esp, 4
  421.            ret
  422. restore .event
  423.  
  424. ; param
  425. ;  eax= event
  426. ;  ebx= id
  427. align 4
  428. clear_event:
  429.            .event equ esp
  430.            push eax
  431.  
  432.            cmp [eax+APPOBJ.magic], 'EVNT'
  433.            jne .fail
  434.            cmp [eax+EVENT.id], ebx
  435.            jne .fail
  436.  
  437.            mov eax, [eax+APPOBJ.pid]
  438.            call pid_to_slot
  439.            test eax, eax
  440.            jz .fail
  441.  
  442.            shl eax, 8
  443.            add eax, SLOT_BASE+APP_EV_OFFSET
  444.            mov edx, [.event]
  445.            pushfd
  446.            cli                         ;remove event from events
  447.            mov ebx, [edx+APPOBJ.fd]    ;list (reset event)
  448.            mov ecx, [edx+APPOBJ.bk]    ;and clear events flag
  449.            mov [ebx+APPOBJ.bk], ecx    ;if no active events
  450.            mov [ecx+APPOBJ.fd], ebx
  451.  
  452.            and [edx+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
  453.  
  454.            dec [eax+APPDATA.ev_count-APP_EV_OFFSET]
  455.            jnz @F
  456.            and [eax+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
  457. @@:
  458.            add eax, (APP_OBJ_OFFSET-APP_EV_OFFSET)
  459.  
  460.            mov ecx, [eax+APPOBJ.fd]  ;insert event into
  461.            mov [edx+APPOBJ.fd], ecx  ;objects list
  462.            mov [edx+APPOBJ.bk], eax
  463.            mov [eax+APPOBJ.fd], edx
  464.            mov [ecx+APPOBJ.bk], edx
  465.            popfd
  466. .fail:
  467. .done:
  468.            add esp, 4
  469.            ret
  470. restore .event
  471.  
  472. sys_getevent:
  473.  
  474.         call    get_event_for_app
  475.         mov     [esp + 32],eax
  476.         ret
  477.  
  478. sys_waitforevent:
  479.         or      ebx, 0xFFFFFFFF         ; infinite timeout
  480.         jmp     @f
  481.  
  482. sys_wait_event_timeout:
  483.         add     ebx, [timer_ticks]
  484. @@:
  485.         mov     eax, [current_slot]
  486.         mov     [eax + APPDATA.wait_timeout], ebx
  487.         call    get_event_for_app
  488.         test    eax, eax
  489.         jnz     eventoccur
  490.  
  491.         mov     eax, [TASK_BASE]
  492.         mov     [eax+TASKDATA.state], byte 5
  493.         call    change_task
  494.  
  495.         mov     eax, [event_sched]
  496. eventoccur:
  497.         mov     [esp+32], eax
  498.         ret
  499.  
  500. sys_sendwindowmsg:
  501.         dec     eax
  502.         jnz     .ret
  503.         cmp     ebx, 3
  504.         jz      .sendbtn
  505.         cmp     ebx, 2
  506.         jnz     .ret
  507. .sendkey:
  508.         pushf
  509.         cli
  510.         movzx   eax, byte [KEY_COUNT]
  511.         cmp     al, 120
  512.         jae     .overflow
  513.         inc     eax
  514.         mov     [KEY_COUNT], al
  515.         mov     [KEY_COUNT+eax], cl
  516.         jmp     .ok
  517. .overflow:
  518.         popf
  519.         mov     dword [esp+36], 1
  520.         ret
  521. .sendbtn:
  522.         pushf
  523.         cli
  524.         cmp     byte [BTN_COUNT], 0
  525.         jnz     .overflow
  526.         mov     byte [BTN_COUNT], 1
  527.         mov     [BTN_BUFF], ecx
  528. .ok:
  529.         popf
  530.         and     dword [esp+36], 0
  531. .ret:
  532.         ret
  533.  
  534. get_event_for_app:
  535.  
  536.      pushad
  537.  
  538.      mov   edi,[TASK_BASE]              ; WINDOW REDRAW
  539.      test  [edi+TASKDATA.event_mask], 1
  540.      jz    no_eventoccur1
  541.      ;mov   edi,[TASK_BASE]
  542.      cmp   [edi-twdw+WDATA.fl_redraw],byte 0
  543.      je    no_eventoccur1
  544.      popad
  545.      mov   eax,1
  546.      ret
  547.    no_eventoccur1:
  548.  
  549.      ;mov   edi,[TASK_BASE]              ; KEY IN BUFFER
  550.      test  [edi+TASKDATA.event_mask],dword 2
  551.      jz    no_eventoccur2
  552.      mov   ecx, [CURRENT_TASK]
  553.      movzx edx,word [WIN_STACK+ecx*2]
  554.      mov   eax, [TASK_COUNT]
  555.      cmp   eax,edx
  556.      jne   no_eventoccur2x
  557.      cmp   [KEY_COUNT],byte 0
  558.      je    no_eventoccur2x
  559.    eventoccur2:
  560.      popad
  561.      mov   eax,2
  562.      ret
  563.    no_eventoccur2x:
  564.         mov     eax, hotkey_buffer
  565. @@:
  566.         cmp     [eax], ecx
  567.         jz      eventoccur2
  568.         add     eax, 8
  569.         cmp     eax, hotkey_buffer+120*8
  570.         jb      @b
  571.    no_eventoccur2:
  572.  
  573.      ;mov   edi,[TASK_BASE]              ; BUTTON IN BUFFER
  574.      test  [edi+TASKDATA.event_mask],dword 4
  575.      jz    no_eventoccur3
  576.      cmp   [BTN_COUNT],byte 0
  577.      je    no_eventoccur3
  578.      mov   ecx, [CURRENT_TASK]
  579.      movzx edx, word [WIN_STACK+ecx*2]
  580.      mov   eax, [TASK_COUNT]
  581.      cmp   eax,edx
  582.      jnz   no_eventoccur3
  583.      popad
  584.      mov   eax,[BTN_BUFF]
  585.      cmp   eax,65535
  586.      je    no_event_1
  587.      mov   eax,3
  588.      ret
  589.  
  590.     no_event_1:
  591.      mov   [window_minimize],1
  592.      mov   [BTN_COUNT],byte 0
  593.      xor   eax, eax
  594.      ret
  595.  
  596. no_eventoccur3:
  597.  
  598.      ;mov   edi,[TASK_BASE]              ; mouse event
  599.      mov eax, [CURRENT_TASK]
  600.      shl eax, 8
  601.      add eax, SLOT_BASE
  602.      test  [edi+TASKDATA.event_mask],dword 00100000b
  603.      jz    no_mouse_event
  604.  
  605.      test  [eax+APPDATA.event_mask],dword 00100000b
  606.      jz    no_mouse_event
  607.      and   [eax+APPDATA.event_mask],dword (not 00100000b)
  608.      popad
  609.      mov   eax,6
  610.      ret
  611. no_mouse_event:
  612.  
  613.      ;mov   edi,[TASK_BASE]              ; DESKTOP BACKGROUND REDRAW
  614.      test  [edi+TASKDATA.event_mask], 16
  615.      jz    no_eventoccur5
  616. ;     cmp   [REDRAW_BACKGROUND],byte 2
  617. ;     jnz   no_eventoccur5
  618.      test  [eax+APPDATA.event_mask], 16
  619.      jz    no_eventoccur5
  620.      and   [eax+APPDATA.event_mask], not 16
  621.      popad
  622.      mov   eax,5
  623.      ret
  624. no_eventoccur5:
  625.  
  626.      ;mov   edi,[TASK_BASE]              ; IPC
  627.      test  [edi+TASKDATA.event_mask],dword 01000000b
  628.      jz    no_ipc
  629.      test  [eax+APPDATA.event_mask],dword 01000000b
  630.      jz    no_ipc
  631.      and   [eax+APPDATA.event_mask],dword 0xffffffff-01000000b
  632.      popad
  633.      mov   eax,7
  634.      ret
  635. no_ipc:
  636.  
  637.      ;mov   edi,[TASK_BASE]              ; STACK
  638.      test  [edi+TASKDATA.event_mask],dword 10000000b
  639.      jz    no_stack_event
  640.      test  [eax+APPDATA.event_mask],dword 10000000b
  641.      jz    no_stack_event
  642.      and   [eax+APPDATA.event_mask],dword 0xffffffff-10000000b
  643.      popad
  644.      mov   eax,8
  645.      ret
  646. no_stack_event:
  647.  
  648.      test  byte [edi+TASKDATA.event_mask+1], 1          ; DEBUG
  649.      jz    .test_IRQ
  650.      test  byte [eax+APPDATA.event_mask+1], byte 1
  651.      jz    .test_IRQ
  652.      and   byte [eax+APPDATA.event_mask+1], not 1
  653.      popad
  654.      mov   eax, 9
  655.      ret
  656.  
  657. ;.test_ext:
  658. ;     mov   eax, [CURRENT_TASK]
  659. ;     shl   eax, 8
  660. ;     test  dword [eax+SLOT_BASE+APPDATA.event_mask], EVENT_EXTENDED
  661. ;     jz .test_IRQ
  662. ;     popad
  663. ;     mov eax, 10
  664. ;     ret
  665.  
  666. .test_IRQ:
  667.      cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
  668.      jbe   no_events
  669.  
  670.      mov   esi,IRQ_SAVE              ; IRQ'S AND DATA
  671.      mov   ebx,0x00010000
  672.      xor   ecx, ecx
  673.    irq_event_test:
  674.      mov   edi,[TASK_BASE]
  675.      test  [edi+TASKDATA.event_mask],ebx
  676.      jz    no_irq_event
  677.      mov   edi,ecx
  678.      shl   edi,2
  679.      add   edi,irq_owner
  680.      mov   edx,[edi]
  681.      mov   eax,[TASK_BASE]
  682.      mov   eax,[eax+TASKDATA.pid]
  683.      cmp   edx,eax
  684.      jne   no_irq_event
  685.      cmp   [esi],dword 0
  686.      jz    no_irq_event
  687.      mov   eax,ecx
  688.      add   eax,16
  689.      mov   [esp+28],eax
  690.      popad
  691.      ret
  692.     no_irq_event:
  693.      add   esi,0x1000
  694.      shl   ebx,1
  695.      inc   ecx
  696.      cmp   ecx,16
  697.      jb    irq_event_test
  698.  
  699.    no_events:
  700.      popad
  701.      xor   eax, eax
  702.      ret
  703.  
  704.  
  705.  
  706.