Subversion Repositories Kolibri OS

Rev

Rev 864 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
431 serge 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
227 serge 7
 
593 mikedld 8
$Revision: 928 $
9
 
10
 
227 serge 11
align 4
12
init_events:
864 serge 13
 
14
           mov ecx, 512*EVENT_SIZE
15
           mov edx, PG_SW
16
           call @mem_alloc@8
17
 
227 serge 18
           mov [events], eax
19
           xor eax, eax
354 serge 20
           mov [event_uid], eax
227 serge 21
           not eax
22
           mov edi, event_map
23
           mov [event_start], edi
354 serge 24
           mov ecx, 64/4
227 serge 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
354 serge 49
           inc [event_uid]
50
 
227 serge 51
           sub ebx, event_map
254 serge 52
           lea eax,[eax+ebx*8]
354 serge 53
 
54
           lea ebx, [eax+eax*4]
227 serge 55
           shl eax,5
354 serge 56
           lea eax,[eax+ebx*4]   ;eax*=52 (EVENT_SIZE)
227 serge 57
           add eax, [events]
354 serge 58
           mov ebx, [event_uid]
227 serge 59
           popfd
60
           ret
61
endp
62
 
63
align 4
64
free_event:
354 serge 65
           sub eax, [events]
66
           mov ecx, EVENT_SIZE
67
           mov ebx, event_map
68
           cdq
69
           div ecx
70
 
227 serge 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
 
354 serge 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'
363 serge 112
           mov [eax+APPOBJ.destroy], destroy_event.internal
354 serge 113
           mov [eax+EVENT.id], ebx
114
 
115
           mov ebx, [CURRENT_TASK]
116
           shl ebx, 5
379 serge 117
           mov ebx, [CURRENT_TASK+ebx+4]
354 serge 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
@@:
465 serge 130
           mov ecx, [current_slot]
131
           add ecx, APP_OBJ_OFFSET
354 serge 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
363 serge 159
.internal:
354 serge 160
           mov ebx, [eax+APPOBJ.fd]
161
           mov ecx, [eax+APPOBJ.bk]
162
           mov [ebx+APPOBJ.bk], ecx
163
           mov [ecx+APPOBJ.fd], ebx
363 serge 164
.force:
354 serge 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
 
227 serge 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
380 serge 188
           cmp [SLOT_BASE+eax+APPDATA.ev_count], 32
227 serge 189
           ja .fail
190
 
191
           mov [slot], eax
354 serge 192
 
227 serge 193
           call alloc_event
194
           test eax, eax
195
           jz .fail
196
 
354 serge 197
           lea edi, [eax+EVENT.code]
227 serge 198
           mov ecx, 6
199
           mov esi, [event]
200
           cld
201
           rep movsd
202
 
354 serge 203
           mov ecx, [slot]
380 serge 204
           add ecx, SLOT_BASE+APP_EV_OFFSET
354 serge 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
227 serge 222
.fail:
223
           ret
224
endp
225
 
354 serge 226
; timeout ignored
227
 
227 serge 228
align 4
229
proc get_event_ex stdcall, p_ev:dword, timeout:dword
230
 
231
.wait:
465 serge 232
           mov edx,[current_slot]
380 serge 233
;           cmp [SLOT_BASE+edx+APPDATA.ev_count], 0
377 serge 234
;           je .switch
227 serge 235
 
465 serge 236
           add edx, APP_EV_OFFSET
227 serge 237
 
377 serge 238
           mov eax, [edx+APPOBJ.fd]
354 serge 239
           cmp eax, edx
240
           je .switch
241
 
242
           lea esi, [eax+EVENT.code]
243
           mov edi, [p_ev]                ;copy event data
227 serge 244
           mov ecx, 6
245
           cld
246
           rep movsd
354 serge 247
 
248
           and dword [edi-24], 0xFF00FFFF ;clear priority field
377 serge 249
                                         ;
354 serge 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
377 serge 259
 
260
           and [eax+EVENT.state], not (EVENT_SIGNALED+EVENT_WATCHED)
261
 
354 serge 262
           dec [edx+APPDATA.ev_count-APP_EV_OFFSET]
263
           jnz @F
264
           and [edx+APPDATA.event_mask-APP_EV_OFFSET], not EVENT_EXTENDED
377 serge 265
@@:
354 serge 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
377 serge 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
354 serge 280
           popfd
281
.done:
227 serge 282
           ret
354 serge 283
 
284
.destroy:
363 serge 285
           call destroy_event.force
354 serge 286
           ret
227 serge 287
.switch:
379 serge 288
           mov eax, [TASK_BASE]
227 serge 289
           mov [eax+TASKDATA.state], byte 5
290
	   call change_task
291
	   jmp .wait
292
endp
293
 
354 serge 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
 
465 serge 314
           mov edx,[current_slot]
354 serge 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:
363 serge 346
           call destroy_event.force
354 serge 347
           add esp, 4
348
           ret
349
.switch:
350
           or [eax+EVENT.state], EVENT_WATCHED
379 serge 351
           mov eax, [TASK_BASE]
354 serge 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
377 serge 362
;  edx= event data
354 serge 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
 
377 serge 378
           mov esi, edx
379
           test esi, esi
354 serge 380
           mov edx, [.event]
377 serge 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
@@:
354 serge 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
380 serge 399
           add eax, SLOT_BASE+APP_EV_OFFSET
354 serge 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
 
377 serge 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
380 serge 443
           add eax, SLOT_BASE+APP_EV_OFFSET
377 serge 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
 
1 ha 472
sys_getevent:
473
 
671 Ghost 474
	call	get_event_for_app
475
	mov	[esp + 32],eax
476
	ret
1 ha 477
 
531 diamond 478
sys_waitforevent:
671 Ghost 479
        or      ebx, 0xFFFFFFFF         ; infinite timeout
531 diamond 480
        jmp     @f
1 ha 481
 
482
sys_wait_event_timeout:
671 Ghost 483
        add     ebx, [timer_ticks]
531 diamond 484
@@:
671 Ghost 485
        mov     eax, [current_slot]
486
        mov     [eax + APPDATA.wait_timeout], ebx
531 diamond 487
        call    get_event_for_app
488
        test    eax, eax
489
        jnz     eventoccur
1 ha 490
 
531 diamond 491
        mov     eax, [TASK_BASE]
492
        mov     [eax+TASKDATA.state], byte 5
493
        call    change_task
1 ha 494
 
531 diamond 495
        mov     eax, [event_sched]
496
eventoccur:
671 Ghost 497
        mov     [esp+32], eax
531 diamond 498
        ret
1 ha 499
 
665 diamond 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
928 serge 510
        mov  eax, [KEY_COUNT]
511
        cmp  eax, 120
512
        jae  .overflow
513
        inc  eax
514
        mov  [KEY_COUNT], eax
515
        mov  [KEY_BUFF+eax-1], cl
516
        jmp  .ok
665 diamond 517
.overflow:
518
        popf
519
        mov     dword [esp+36], 1
520
        ret
521
.sendbtn:
522
        pushf
523
        cli
928 serge 524
        cmp     [BTN_COUNT], 0
665 diamond 525
        jnz     .overflow
928 serge 526
        mov     [BTN_COUNT], 1
665 diamond 527
        mov     [BTN_BUFF], ecx
528
.ok:
529
        popf
530
        and     dword [esp+36], 0
531
.ret:
532
        ret
533
 
1 ha 534
get_event_for_app:
535
 
536
     pushad
537
 
379 serge 538
     mov   edi,[TASK_BASE]              ; WINDOW REDRAW
531 diamond 539
     test  [edi+TASKDATA.event_mask], 1
1 ha 540
     jz    no_eventoccur1
379 serge 541
     ;mov   edi,[TASK_BASE]
115 poddubny 542
     cmp   [edi-twdw+WDATA.fl_redraw],byte 0
1 ha 543
     je    no_eventoccur1
544
     popad
545
     mov   eax,1
546
     ret
547
   no_eventoccur1:
548
 
379 serge 549
     ;mov   edi,[TASK_BASE]              ; KEY IN BUFFER
115 poddubny 550
     test  [edi+TASKDATA.event_mask],dword 2
1 ha 551
     jz    no_eventoccur2
379 serge 552
     mov   ecx, [CURRENT_TASK]
380 serge 553
     movzx edx,word [WIN_STACK+ecx*2]
379 serge 554
     mov   eax, [TASK_COUNT]
1 ha 555
     cmp   eax,edx
92 diamond 556
     jne   no_eventoccur2x
928 serge 557
     cmp   [KEY_COUNT], 0
92 diamond 558
     je    no_eventoccur2x
559
   eventoccur2:
1 ha 560
     popad
561
     mov   eax,2
562
     ret
92 diamond 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
1 ha 571
   no_eventoccur2:
572
 
379 serge 573
     ;mov   edi,[TASK_BASE]              ; BUTTON IN BUFFER
115 poddubny 574
     test  [edi+TASKDATA.event_mask],dword 4
1 ha 575
     jz    no_eventoccur3
928 serge 576
     cmp   [BTN_COUNT], 0
21 poddubny 577
     je    no_eventoccur3
379 serge 578
     mov   ecx, [CURRENT_TASK]
380 serge 579
     movzx edx, word [WIN_STACK+ecx*2]
379 serge 580
     mov   eax, [TASK_COUNT]
1 ha 581
     cmp   eax,edx
582
     jnz   no_eventoccur3
583
     popad
381 serge 584
     mov   eax,[BTN_BUFF]
1 ha 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
928 serge 592
     mov   [BTN_COUNT], 0
1 ha 593
     xor   eax, eax
594
     ret
595
 
465 serge 596
no_eventoccur3:
227 serge 597
 
379 serge 598
     ;mov   edi,[TASK_BASE]              ; mouse event
473 diamond 599
     mov eax, [CURRENT_TASK]
600
     shl eax, 8
601
     add eax, SLOT_BASE
115 poddubny 602
     test  [edi+TASKDATA.event_mask],dword 00100000b
21 poddubny 603
     jz    no_mouse_event
465 serge 604
 
473 diamond 605
     test  [eax+APPDATA.event_mask],dword 00100000b
21 poddubny 606
     jz    no_mouse_event
473 diamond 607
     and   [eax+APPDATA.event_mask],dword (not 00100000b)
21 poddubny 608
     popad
609
     mov   eax,6
610
     ret
465 serge 611
no_mouse_event:
1 ha 612
 
379 serge 613
     ;mov   edi,[TASK_BASE]              ; DESKTOP BACKGROUND REDRAW
473 diamond 614
     test  [edi+TASKDATA.event_mask], 16
1 ha 615
     jz    no_eventoccur5
928 serge 616
;     cmp   [redraw_background], 2
473 diamond 617
;     jnz   no_eventoccur5
618
     test  [eax+APPDATA.event_mask], 16
619
     jz    no_eventoccur5
620
     and   [eax+APPDATA.event_mask], not 16
1 ha 621
     popad
622
     mov   eax,5
623
     ret
465 serge 624
no_eventoccur5:
1 ha 625
 
379 serge 626
     ;mov   edi,[TASK_BASE]              ; IPC
115 poddubny 627
     test  [edi+TASKDATA.event_mask],dword 01000000b
1 ha 628
     jz    no_ipc
473 diamond 629
     test  [eax+APPDATA.event_mask],dword 01000000b
1 ha 630
     jz    no_ipc
473 diamond 631
     and   [eax+APPDATA.event_mask],dword 0xffffffff-01000000b
1 ha 632
     popad
633
     mov   eax,7
634
     ret
465 serge 635
no_ipc:
1 ha 636
 
379 serge 637
     ;mov   edi,[TASK_BASE]              ; STACK
115 poddubny 638
     test  [edi+TASKDATA.event_mask],dword 10000000b
1 ha 639
     jz    no_stack_event
473 diamond 640
     test  [eax+APPDATA.event_mask],dword 10000000b
1 ha 641
     jz    no_stack_event
473 diamond 642
     and   [eax+APPDATA.event_mask],dword 0xffffffff-10000000b
1 ha 643
     popad
21 poddubny 644
     mov   eax,8
1 ha 645
     ret
465 serge 646
no_stack_event:
1 ha 647
 
115 poddubny 648
     test  byte [edi+TASKDATA.event_mask+1], 1		; DEBUG
354 serge 649
     jz    .test_IRQ
473 diamond 650
     test  byte [eax+APPDATA.event_mask+1], byte 1
354 serge 651
     jz    .test_IRQ
473 diamond 652
     and   byte [eax+APPDATA.event_mask+1], not 1
40 halyavin 653
     popad
654
     mov   eax, 9
655
     ret
656
 
354 serge 657
;.test_ext:
379 serge 658
;     mov   eax, [CURRENT_TASK]
354 serge 659
;     shl   eax, 8
380 serge 660
;     test  dword [eax+SLOT_BASE+APPDATA.event_mask], EVENT_EXTENDED
354 serge 661
;     jz .test_IRQ
662
;     popad
663
;     mov eax, 10
664
;     ret
227 serge 665
 
666
.test_IRQ:
115 poddubny 667
     cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
21 poddubny 668
     jbe   no_events
1 ha 669
 
381 serge 670
     mov   esi,IRQ_SAVE              ; IRQ'S AND DATA
1 ha 671
     mov   ebx,0x00010000
672
     xor   ecx, ecx
673
   irq_event_test:
379 serge 674
     mov   edi,[TASK_BASE]
115 poddubny 675
     test  [edi+TASKDATA.event_mask],ebx
1 ha 676
     jz    no_irq_event
677
     mov   edi,ecx
678
     shl   edi,2
679
     add   edi,irq_owner
680
     mov   edx,[edi]
379 serge 681
     mov   eax,[TASK_BASE]
115 poddubny 682
     mov   eax,[eax+TASKDATA.pid]
1 ha 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
 
21 poddubny 699
   no_events:
1 ha 700
     popad
701
     xor   eax, eax
702
     ret
703