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