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 |
- |