Subversion Repositories Kolibri OS

Rev

Rev 671 | Rev 1059 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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