Subversion Repositories Kolibri OS

Rev

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

Rev 2465 Rev 2987
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2012. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2012. 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
 
Line 8... Line 8...
8
$Revision: 2465 $
8
$Revision: 2987 $
9
 
9
 
10
WINDOW_MOVE_AND_RESIZE_FLAGS = \
10
WINDOW_MOVE_AND_RESIZE_FLAGS = \
11
  mouse.WINDOW_RESIZE_N_FLAG + \
11
  mouse.WINDOW_RESIZE_N_FLAG + \
Line 21... Line 21...
21
  event_uid     dd 0
21
  event_uid     dd 0
22
endg
22
endg
23
EV_SPACE   = 512
23
EV_SPACE   = 512
24
FreeEvents = event_start-EVENT.fd    ; "âèðòóàëüíûé" event, èñïîëüçóþòñÿ òîëüêî ïîëÿ:
24
FreeEvents = event_start-EVENT.fd    ; "âèðòóàëüíûé" event, èñïîëüçóþòñÿ òîëüêî ïîëÿ:
25
                                     ;  FreeEvents.fd=event_start è FreeEvents.bk=event_end
25
                                     ;  FreeEvents.fd=event_start è FreeEvents.bk=event_end
-
 
26
;-----------------------------------------------------------------------------
26
align 4
27
align 4
27
init_events:                                       ;; used from kernel.asm
28
init_events:                                       ;; used from kernel.asm
28
        stdcall kernel_alloc, EV_SPACE*sizeof.EVENT
29
        stdcall kernel_alloc, EV_SPACE*sizeof.EVENT
29
        or      eax, eax
30
        or      eax, eax
30
        jz      .fail
31
        jz      .fail
31
      ; eax - current event, ebx - previos event below
32
      ; eax - current event, ebx - previos event below
32
        mov     ecx, EV_SPACE        ; current - in allocated space
33
        mov     ecx, EV_SPACE        ; current - in allocated space
33
        mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
34
        mov     ebx, FreeEvents      ; previos - íà÷àëî ñïèñêà
34
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
35
        push    ebx                  ; îíî æå è êîíåö ïîòîì áóäåò
-
 
36
;--------------------------------------
-
 
37
align 4
35
  @@:
38
@@:
36
        mov     [ebx+EVENT.fd], eax
39
        mov     [ebx+EVENT.fd], eax
37
        mov     [eax+EVENT.bk], ebx
40
        mov     [eax+EVENT.bk], ebx
38
        mov     ebx, eax             ; previos <- current
41
        mov     ebx, eax             ; previos <- current
39
        add     eax, sizeof.EVENT    ; new current
42
        add     eax, sizeof.EVENT    ; new current
40
        loop    @b
43
        loop    @b
41
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
44
        pop     eax                  ; âîò îíî êîíöîì è ñòàëî
42
        mov     [ebx+EVENT.fd], eax
45
        mov     [ebx+EVENT.fd], eax
43
        mov     [eax+EVENT.bk], ebx
46
        mov     [eax+EVENT.bk], ebx
-
 
47
;--------------------------------------
-
 
48
align 4
44
.fail:
49
.fail:
45
        ret
50
        ret
46
 
-
 
-
 
51
;-----------------------------------------------------------------------------
47
EVENT_WATCHED    equ 0x10000000 ;áèò 28
52
EVENT_WATCHED    equ 0x10000000 ;áèò 28
48
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
53
EVENT_SIGNALED   equ 0x20000000 ;áèò 29
49
MANUAL_RESET     equ 0x40000000 ;áèò 30
54
MANUAL_RESET     equ 0x40000000 ;áèò 30
50
MANUAL_DESTROY   equ 0x80000000 ;áèò 31
55
MANUAL_DESTROY   equ 0x80000000 ;áèò 31
51
 
-
 
-
 
56
;-----------------------------------------------------------------------------
52
align 4
57
align 4
53
create_event:                                      ;; EXPORT use
58
create_event:                                      ;; EXPORT use
54
;info:
59
;info:
55
;   Ïåðåíîñèì EVENT èç ñïèñêà FreeEvents â ñïèñîê ObjList òåêóùåãî ñëîòà
60
;   Ïåðåíîñèì EVENT èç ñïèñêà FreeEvents â ñïèñîê ObjList òåêóùåãî ñëîòà
56
;   EVENT.state óñòàíàâëèâàåì èç ecx, EVENT.code êîñâåííî èç esi (åñëè esi<>0)
61
;   EVENT.state óñòàíàâëèâàåì èç ecx, EVENT.code êîñâåííî èç esi (åñëè esi<>0)
Line 65... Line 70...
65
        add     ebx, APP_OBJ_OFFSET
70
        add     ebx, APP_OBJ_OFFSET
66
        mov     edx, [TASK_BASE]
71
        mov     edx, [TASK_BASE]
67
        mov     edx, [edx+TASKDATA.pid]
72
        mov     edx, [edx+TASKDATA.pid]
68
        pushfd
73
        pushfd
69
        cli
74
        cli
-
 
75
;--------------------------------------
70
 
76
align 4
71
set_event:                                         ;; INTERNAL use !!! don't use for Call
77
set_event:                                         ;; INTERNAL use !!! don't use for Call
72
;info:
78
;info:
73
;   Áåðåì íîâûé event èç FreeEvents, çàïîëíÿåì åãî ïîëÿ, êàê óêàçàíî â ecx,edx,esi
79
;   Áåðåì íîâûé event èç FreeEvents, çàïîëíÿåì åãî ïîëÿ, êàê óêàçàíî â ecx,edx,esi
74
;   è óñòàíàâëèâàåì â ñïèñîê, óêàçàííûé â ebx.
80
;   è óñòàíàâëèâàåì â ñïèñîê, óêàçàííûé â ebx.
75
;   Âîçâðàùàåì ñàì event (â eax), è åãî uid (â edx)
81
;   Âîçâðàùàåì ñàì event (â eax), è åãî uid (â edx)
Line 87... Line 93...
87
        jne     @f  ; not empty ???
93
        jne     @f  ; not empty ???
88
        pushad
94
        pushad
89
        call    init_events
95
        call    init_events
90
        popad
96
        popad
91
        jz      RemoveEventTo.break ; POPF+RET
97
        jz      RemoveEventTo.break ; POPF+RET
-
 
98
;--------------------------------------
-
 
99
align 4
92
  @@:
100
@@:
93
        mov     eax, [eax+EVENT.fd]
101
        mov     eax, [eax+EVENT.fd]
94
        mov     [eax+EVENT.magic], 'EVNT'
102
        mov     [eax+EVENT.magic], 'EVNT'
95
        mov     [eax+EVENT.destroy], destroy_event.internal
103
        mov     [eax+EVENT.destroy], destroy_event.internal
96
        mov     [eax+EVENT.state], ecx
104
        mov     [eax+EVENT.state], ecx
Line 101... Line 109...
101
        jz      RemoveEventTo
109
        jz      RemoveEventTo
102
        lea     edi, [eax+EVENT.code]
110
        lea     edi, [eax+EVENT.code]
103
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
111
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
104
        cld
112
        cld
105
        rep movsd
113
        rep movsd
-
 
114
;--------------------------------------
106
 
115
align 4
107
RemoveEventTo:                                     ;; INTERNAL use !!! don't use for Call
116
RemoveEventTo:                                     ;; INTERNAL use !!! don't use for Call
108
;param:
117
;param:
109
;   eax - óêàçàòåëü íà event, ÊÎÒÎÐÛÉ âñòàâëÿåì
118
;   eax - óêàçàòåëü íà event, ÊÎÒÎÐÛÉ âñòàâëÿåì
110
;   ebx - óêàçàòåëü íà event, ÏÎÑËÅ êîòîðîãî âñòàâëÿåì
119
;   ebx - óêàçàòåëü íà event, ÏÎÑËÅ êîòîðîãî âñòàâëÿåì
111
;scratched: ebx,ecx
120
;scratched: ebx,ecx
Line 116... Line 125...
116
        mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
125
        mov     [ecx+EVENT.bk], eax  ; NewRight.bk=Self
117
        xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
126
        xchg    ebx, [eax+EVENT.bk]  ; Self.bk=NewLeft,   ebx=OldLeft
118
        xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
127
        xchg    ecx, [eax+EVENT.fd]  ; Self.fd=NewRight,  ecx=OldRight
119
        mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
128
        mov     [ebx+EVENT.fd], ecx  ; OldLeft.fd=OldRight
120
        mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
129
        mov     [ecx+EVENT.bk], ebx  ; OldRight.bk=OldLeft
-
 
130
;--------------------------------------
-
 
131
align 4
121
.break:
132
.break:
122
        popfd
133
        popfd
123
        ret
134
        ret
124
 
-
 
-
 
135
;-----------------------------------------------------------------------------
125
align 4
136
align 4
126
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
137
NotDummyTest:                                      ;; INTERNAL use (not returned for fail !!!)
127
        pop     edi
138
        pop     edi
128
        call    DummyTest ; not returned for fail !!!
139
        call    DummyTest ; not returned for fail !!!
129
        mov     ebx, eax
140
        mov     ebx, eax
130
        mov     eax, [ebx+EVENT.pid]
141
        mov     eax, [ebx+EVENT.pid]
131
        push    edi
142
        push    edi
-
 
143
;--------------------------------------
-
 
144
align 4
132
.small: ; êðèâî êàê-òî...
145
.small: ; êðèâî êàê-òî...
133
        pop     edi
146
        pop     edi
134
        pushfd
147
        pushfd
135
        cli
148
        cli
136
        call    pid_to_slot ; saved all registers (eax - retval)
149
        call    pid_to_slot ; saved all registers (eax - retval)
137
        shl     eax, 8
150
        shl     eax, 8
138
        jz      RemoveEventTo.break ; POPF+RET
151
        jz      RemoveEventTo.break ; POPF+RET
139
        jmp     edi ; øòàòíûé âîçâðàò
152
        jmp     edi ; øòàòíûé âîçâðàò
140
 
-
 
-
 
153
;-----------------------------------------------------------------------------
141
align 4
154
align 4
142
raise_event:                                       ;; EXPORT use
155
raise_event:                                       ;; EXPORT use
143
;info:
156
;info:
144
;   Óñòàíàâëèâàåì äàííûå EVENT.code
157
;   Óñòàíàâëèâàåì äàííûå EVENT.code
145
;   Åñëè òàì ôëàã EVENT_SIGNALED óæå àêòèâåí - áîëüøå íè÷åãî
158
;   Åñëè òàì ôëàã EVENT_SIGNALED óæå àêòèâåí - áîëüøå íè÷åãî
Line 156... Line 169...
156
        jz      @f
169
        jz      @f
157
        lea     edi, [ebx+EVENT.code]
170
        lea     edi, [ebx+EVENT.code]
158
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
171
        mov     ecx, (sizeof.EVENT -EVENT.code)/4
159
        cld
172
        cld
160
        rep movsd
173
        rep movsd
-
 
174
;--------------------------------------
-
 
175
align 4
161
  @@:
176
@@:
162
        test    byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
177
        test    byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
163
        jnz     RemoveEventTo.break  ; POPF+RET
178
        jnz     RemoveEventTo.break  ; POPF+RET
164
        bt      edx, 28 ;EVENT_WATCHED
179
        bt      edx, 28 ;EVENT_WATCHED
165
        jnc     @f
180
        jnc     @f
166
        test    byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24
181
        test    byte[ebx+EVENT.state+3], EVENT_WATCHED shr 24
167
        jz      RemoveEventTo.break  ; POPF+RET
182
        jz      RemoveEventTo.break  ; POPF+RET
-
 
183
;--------------------------------------
-
 
184
align 4
168
  @@:
185
@@:
169
        or      byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
186
        or      byte[ebx+EVENT.state+3], EVENT_SIGNALED shr 24
170
        add     eax, SLOT_BASE+APP_EV_OFFSET
187
        add     eax, SLOT_BASE+APP_EV_OFFSET
171
        xchg    eax, ebx
188
        xchg    eax, ebx
172
        jmp     RemoveEventTo
189
        jmp     RemoveEventTo
173
 
-
 
-
 
190
;-----------------------------------------------------------------------------
174
align 4
191
align 4
175
clear_event:                                       ;; EXPORT use
192
clear_event:                                       ;; EXPORT use
176
;info:
193
;info:
177
;
194
;
178
;param:
195
;param:
Line 182... Line 199...
182
        call    NotDummyTest ; not returned for fail !!!
199
        call    NotDummyTest ; not returned for fail !!!
183
        add     eax, SLOT_BASE+APP_OBJ_OFFSET
200
        add     eax, SLOT_BASE+APP_OBJ_OFFSET
184
        and     byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
201
        and     byte[ebx+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
185
        xchg    eax, ebx
202
        xchg    eax, ebx
186
        jmp     RemoveEventTo
203
        jmp     RemoveEventTo
187
 
-
 
-
 
204
;-----------------------------------------------------------------------------
188
align 4
205
align 4
189
send_event:                                        ;; EXPORT use
206
send_event:                                        ;; EXPORT use
190
;info:
207
;info:
191
;   Ñîçäàåò íîâûé EVENT (âûòàñêèâàåò èç ñïèñêà FreeEvents) â ñïèñêå EventList
208
;   Ñîçäàåò íîâûé EVENT (âûòàñêèâàåò èç ñïèñêà FreeEvents) â ñïèñêå EventList
192
;   öåëåâîãî ñëîòà (eax=pid), ñ äàííûìè èç esi êîñâåííî, è state=EVENT_SIGNALED
209
;   öåëåâîãî ñëîòà (eax=pid), ñ äàííûìè èç esi êîñâåííî, è state=EVENT_SIGNALED
Line 205... Line 222...
205
        mov     edx, eax
222
        mov     edx, eax
206
        call    NotDummyTest.small ; not returned for fail !!!
223
        call    NotDummyTest.small ; not returned for fail !!!
207
        lea     ebx, [eax+SLOT_BASE+APP_EV_OFFSET]
224
        lea     ebx, [eax+SLOT_BASE+APP_EV_OFFSET]
208
        mov     ecx, EVENT_SIGNALED
225
        mov     ecx, EVENT_SIGNALED
209
        jmp     set_event
226
        jmp     set_event
210
 
-
 
-
 
227
;-----------------------------------------------------------------------------
211
align 4
228
align 4
212
DummyTest:                                         ;; INTERNAL use (not returned for fail !!!)
229
DummyTest:                                         ;; INTERNAL use (not returned for fail !!!)
213
;param:
230
;param:
214
;   eax - event
231
;   eax - event
215
;   ebx - uid (for Dummy testing)
232
;   ebx - uid (for Dummy testing)
216
        cmp     [eax+EVENT.magic], 'EVNT'
233
        cmp     [eax+EVENT.magic], 'EVNT'
217
        jne     @f
234
        jne     @f
218
        cmp     [eax+EVENT.id], ebx
235
        cmp     [eax+EVENT.id], ebx
219
        je      .ret
236
        je      .ret
-
 
237
;--------------------------------------
-
 
238
align 4
220
  @@:
239
@@:
221
        pop     eax
240
        pop     eax
222
        xor     eax, eax
241
        xor     eax, eax
-
 
242
;--------------------------------------
-
 
243
align 4
223
.ret:
244
.ret:
224
        ret
245
        ret
225
 
-
 
226
 
-
 
-
 
246
;-----------------------------------------------------------------------------
227
align 4
247
align 4
228
Wait_events:
248
Wait_events:
229
        or      ebx, -1; infinite timeout
249
        or      ebx, -1; infinite timeout
-
 
250
;--------------------------------------
-
 
251
align 4
230
Wait_events_ex:
252
Wait_events_ex:
231
;info:
253
;info:
232
;   Îæèäàíèå "àáñòðàêòíîãî" ñîáûòèÿ ÷åðåç ïåðåâîä ñëîòà â 5-þ ïîçèöèþ.
254
;   Îæèäàíèå "àáñòðàêòíîãî" ñîáûòèÿ ÷åðåç ïåðåâîä ñëîòà â 5-þ ïîçèöèþ.
233
;   Àáñòðàêòíîñòü çàêëþ÷åíà â òîì, ÷òî ôàêò ñîáûòèÿ îïðåäåëÿåòñÿ ôóíêöèåé APPDATA.wait_test,
255
;   Àáñòðàêòíîñòü çàêëþ÷åíà â òîì, ÷òî ôàêò ñîáûòèÿ îïðåäåëÿåòñÿ ôóíêöèåé APPDATA.wait_test,
234
;   êîòîðàÿ çàäàåòñÿ êëèåíòîì è ìîæåò áûòü ôàêòè÷åñêè ëþáîé.
256
;   êîòîðàÿ çàäàåòñÿ êëèåíòîì è ìîæåò áûòü ôàêòè÷åñêè ëþáîé.
Line 258... Line 280...
258
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
280
        Mov     [esi+APPDATA.wait_begin],eax,[timer_ticks]
259
        mov     eax, [TASK_BASE]
281
        mov     eax, [TASK_BASE]
260
        mov     [eax+TASKDATA.state], 5
282
        mov     [eax+TASKDATA.state], 5
261
        call    change_task
283
        call    change_task
262
        mov     eax, [esi+APPDATA.wait_param]
284
        mov     eax, [esi+APPDATA.wait_param]
-
 
285
;--------------------------------------
-
 
286
align 4
263
  @@:
287
@@:
264
        ret
288
        ret
265
 
-
 
-
 
289
;-----------------------------------------------------------------------------
266
align 4
290
align 4
267
wait_event:                                        ;; EXPORT use
291
wait_event:                                        ;; EXPORT use
268
;info:
292
;info:
269
;   Îæèäàíèå ôëàãà EVENT_SIGNALED â ñîâåðøåííî êîíêðåòíîì Event
293
;   Îæèäàíèå ôëàãà EVENT_SIGNALED â ñîâåðøåííî êîíêðåòíîì Event
270
;   (óñòàíàâëèâàåìîãî, íàäî ïîëàãàòü, ÷åðåç raise_event)
294
;   (óñòàíàâëèâàåìîãî, íàäî ïîëàãàòü, ÷åðåç raise_event)
Line 279... Line 303...
279
        call    DummyTest
303
        call    DummyTest
280
        mov     ecx, eax             ; wait_param
304
        mov     ecx, eax             ; wait_param
281
        mov     edx, get_event_alone ; wait_test
305
        mov     edx, get_event_alone ; wait_test
282
        call    Wait_events          ; timeout ignored
306
        call    Wait_events          ; timeout ignored
283
        jmp     wait_finish
307
        jmp     wait_finish
284
 
-
 
-
 
308
;-----------------------------------------------------------------------------
285
align 4
309
align 4
286
get_event_ex:                                      ;; f68:14
310
get_event_ex:                                      ;; f68:14
287
;info:
311
;info:
288
;   Îæèäàíèå ëþáîãî ñîáûòèÿ â î÷åðåäè EventList òåêóùåãî ñëîòà
312
;   Îæèäàíèå ëþáîãî ñîáûòèÿ â î÷åðåäè EventList òåêóùåãî ñëîòà
289
;   Äàííûå ñîáûòèÿ code - êîïèðóþòñÿ â ïàìÿòü ïðèëîæåíèÿ (êîñâåííî ïî edi)
313
;   Äàííûå ñîáûòèÿ code - êîïèðóþòñÿ â ïàìÿòü ïðèëîæåíèÿ (êîñâåííî ïî edi)
Line 301... Line 325...
301
        lea     esi, [eax+EVENT.code]
325
        lea     esi, [eax+EVENT.code]
302
        mov     ecx, (sizeof.EVENT-EVENT.code)/4
326
        mov     ecx, (sizeof.EVENT-EVENT.code)/4
303
        cld
327
        cld
304
        rep movsd
328
        rep movsd
305
        mov     byte[edi-(sizeof.EVENT-EVENT.code)+2], cl;clear priority field
329
        mov     byte[edi-(sizeof.EVENT-EVENT.code)+2], cl;clear priority field
-
 
330
;--------------------------------------
-
 
331
align 4
306
wait_finish:
332
wait_finish:
307
        test    byte[eax+EVENT.state+3], MANUAL_RESET shr 24
333
        test    byte[eax+EVENT.state+3], MANUAL_RESET shr 24
308
        jnz     get_event_queue.ret  ; RET
334
        jnz     get_event_queue.ret  ; RET
309
        and     byte[eax+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
335
        and     byte[eax+EVENT.state+3], not((EVENT_SIGNALED+EVENT_WATCHED)shr 24)
310
        test    byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24
336
        test    byte[eax+EVENT.state+3], MANUAL_DESTROY shr 24
Line 312... Line 338...
312
        mov     ebx, [current_slot]
338
        mov     ebx, [current_slot]
313
        add     ebx, APP_OBJ_OFFSET
339
        add     ebx, APP_OBJ_OFFSET
314
        pushfd
340
        pushfd
315
        cli
341
        cli
316
        jmp     RemoveEventTo
342
        jmp     RemoveEventTo
317
 
-
 
-
 
343
;-----------------------------------------------------------------------------
318
align 4
344
align 4
319
destroy_event:                                     ;; EXPORT use
345
destroy_event:                                     ;; EXPORT use
320
;info:
346
;info:
321
;   Ïåðåíîñèì EVENT â ñïèñîê FreeEvents, ÷èñòèì ïîëÿ magic,destroy,pid,id
347
;   Ïåðåíîñèì EVENT â ñïèñîê FreeEvents, ÷èñòèì ïîëÿ magic,destroy,pid,id
322
;param:
348
;param:
Line 324... Line 350...
324
;   ebx - uid (for Dummy testing)
350
;   ebx - uid (for Dummy testing)
325
;retval:
351
;retval:
326
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
352
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
327
;scratched: ebx,ecx
353
;scratched: ebx,ecx
328
        call    DummyTest ; not returned for fail !!!
354
        call    DummyTest ; not returned for fail !!!
-
 
355
;--------------------------------------
-
 
356
align 4
329
.internal:
357
.internal:
330
        xor     ecx, ecx  ; clear common header
358
        xor     ecx, ecx  ; clear common header
331
        pushfd
359
        pushfd
332
        cli
360
        cli
333
        mov     [eax+EVENT.magic], ecx
361
        mov     [eax+EVENT.magic], ecx
334
        mov     [eax+EVENT.destroy], ecx
362
        mov     [eax+EVENT.destroy], ecx
335
        mov     [eax+EVENT.pid], ecx
363
        mov     [eax+EVENT.pid], ecx
336
        mov     [eax+EVENT.id], ecx
364
        mov     [eax+EVENT.id], ecx
337
        mov     ebx, FreeEvents
365
        mov     ebx, FreeEvents
338
        jmp     RemoveEventTo
366
        jmp     RemoveEventTo
339
 
-
 
-
 
367
;-----------------------------------------------------------------------------
340
align 4
368
align 4
341
get_event_queue:
369
get_event_queue:
342
;info:
370
;info:
343
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ get_event_ex
371
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ get_event_ex
344
;warning:
372
;warning:
Line 351... Line 379...
351
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
379
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
352
        add     ebx, APP_EV_OFFSET
380
        add     ebx, APP_EV_OFFSET
353
        mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
381
        mov     eax, [ebx+APPOBJ.bk] ; âûáèðàåì ñ êîíöà, ïî ïðèíöèïó FIFO
354
        cmp     eax, ebx ; empty ???
382
        cmp     eax, ebx ; empty ???
355
        je      get_event_alone.ret0
383
        je      get_event_alone.ret0
-
 
384
;--------------------------------------
-
 
385
align 4
356
.ret:
386
.ret:
357
        ret
387
        ret
358
 
-
 
-
 
388
;-----------------------------------------------------------------------------
359
align 4
389
align 4
360
get_event_alone:
390
get_event_alone:
361
;info:
391
;info:
362
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ wait_event
392
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ wait_event
363
;warning:
393
;warning:
Line 370... Line 400...
370
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
400
;   eax - àäðåñ îáúåêòà EVENT (=0 => fail)
371
        mov     eax, [ebx+APPDATA.wait_param]
401
        mov     eax, [ebx+APPDATA.wait_param]
372
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
402
        test    byte[eax+EVENT.state+3], EVENT_SIGNALED shr 24
373
        jnz     .ret
403
        jnz     .ret
374
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
404
        or      byte[eax+EVENT.state+3], EVENT_WATCHED shr 24
-
 
405
;--------------------------------------
-
 
406
align 4
375
.ret0:
407
.ret0:
376
        xor     eax, eax; NO event!!!
408
        xor     eax, eax; NO event!!!
-
 
409
;--------------------------------------
-
 
410
align 4
377
.ret:
411
.ret:
378
        ret
412
        ret
379
 
-
 
-
 
413
;-----------------------------------------------------------------------------
380
align 4
414
align 4
381
sys_sendwindowmsg:                                 ;; f72
415
sys_sendwindowmsg:                                 ;; f72
382
        dec     ebx
416
        dec     ebx
383
        jnz     .ret ;subfunction==1 ?
417
        jnz     .ret ;subfunction==1 ?
384
       ;pushfd  ;à íàôèãà?
418
        pushfd
385
        cli
419
        cli
386
        sub     ecx, 2
420
        sub     ecx, 2
387
        je      .sendkey
421
        je      .sendkey
388
        dec     ecx
422
        dec     ecx
389
        jnz     .retf
423
        jnz     .retf
-
 
424
;--------------------------------------
-
 
425
align 4
390
.sendbtn:
426
.sendbtn:
391
        cmp     byte[BTN_COUNT], 1
427
        cmp     byte[BTN_COUNT], 1
392
        jae     .result ;overflow
428
        jae     .result ;overflow
393
        inc     byte[BTN_COUNT]
429
        inc     byte[BTN_COUNT]
394
        shl     edx, 8
430
        shl     edx, 8
395
        mov     [BTN_BUFF], edx
431
        mov     [BTN_BUFF], edx
396
        jmp     .result
432
        jmp     .result
-
 
433
;--------------------------------------
-
 
434
align 4
397
.sendkey:
435
.sendkey:
398
        movzx   eax, byte[KEY_COUNT]
436
        movzx   eax, byte[KEY_COUNT]
399
        cmp     al, 120
437
        cmp     al, 120
400
        jae     .result ;overflow
438
        jae     .result ;overflow
401
        inc     byte[KEY_COUNT]
439
        inc     byte[KEY_COUNT]
402
        mov     [KEY_COUNT+1+eax], dl
440
        mov     [KEY_COUNT+1+eax], dl
-
 
441
;--------------------------------------
-
 
442
align 4
403
.result:
443
.result:
404
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
444
        setae   byte[esp+32] ;ñ÷èòàåì, ÷òî èñõîäíî: dword[esp+32]==72
-
 
445
;--------------------------------------
-
 
446
align 4
-
 
447
.retf:
405
.retf: ;popfd
448
        popfd
-
 
449
;--------------------------------------
-
 
450
align 4
406
.ret:
451
.ret:
407
        ret
452
        ret
408
 
-
 
-
 
453
;-----------------------------------------------------------------------------
409
align 4
454
align 4
410
sys_getevent:                                      ;; f11
455
sys_getevent:                                      ;; f11
411
        mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
456
        mov     ebx, [current_slot];ïîêà ýòî âîïðîñ, ÷åãî êóäû ñóâàòü..........
412
        pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
457
        pushfd  ; ýòî ñëåäñòâèå îáùåé êîíöåïöèè: ïóñòü ô-ÿ òåñòèðîâàíèÿ èìååò
413
        cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
458
        cli     ; ïðàâî ðàññ÷èòûâàòü íà çàêðûòûå ïðåðûâàíèÿ, êàê ïðè âûçîâå èç shed
414
        call    get_event_for_app
459
        call    get_event_for_app
415
        popfd
460
        popfd
416
        mov     [esp+32], eax
461
        mov     [esp+32], eax
417
        ret
462
        ret
418
 
-
 
-
 
463
;-----------------------------------------------------------------------------
419
align 4
464
align 4
420
sys_waitforevent:                                  ;; f10
465
sys_waitforevent:                                  ;; f10
421
        or      ebx, -1; infinite timeout
466
        or      ebx, -1; infinite timeout
-
 
467
;--------------------------------------
-
 
468
align 4
422
sys_wait_event_timeout:                            ;; f23
469
sys_wait_event_timeout:                            ;; f23
423
        mov     edx, get_event_for_app; wait_test
470
        mov     edx, get_event_for_app; wait_test
424
        call    Wait_events_ex        ; ebx - timeout
471
        call    Wait_events_ex        ; ebx - timeout
425
        mov     [esp+32], eax
472
        mov     [esp+32], eax
426
        ret
473
        ret
427
 
-
 
-
 
474
;-----------------------------------------------------------------------------
428
align 4
475
align 4
429
get_event_for_app:                                 ;; used from f10,f11,f23
476
get_event_for_app:                                 ;; used from f10,f11,f23
430
;info:
477
;info:
431
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23)
478
;   êëèåíòñêàÿ ô-ÿ òåñòèðîâàíèÿ äëÿ ïðèëîæåíèé (f10,f23)
432
;warning:
479
;warning:
Line 440... Line 487...
440
        movzx   edi, bh               ; bh  is assumed as [CURRENT_TASK]
487
        movzx   edi, bh               ; bh  is assumed as [CURRENT_TASK]
441
        shl     edi, 5
488
        shl     edi, 5
442
        add     edi, CURRENT_TASK     ; edi is assumed as [TASK_BASE]
489
        add     edi, CURRENT_TASK     ; edi is assumed as [TASK_BASE]
443
        mov     ecx, [edi+TASKDATA.event_mask]
490
        mov     ecx, [edi+TASKDATA.event_mask]
444
        and     ecx, 0x7FFFFFFF
491
        and     ecx, 0x7FFFFFFF
-
 
492
;--------------------------------------
-
 
493
align 4
445
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
494
.loop: ; ïîêà íå èñ÷åðïàåì âñå áèòû ìàñêè
446
        bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
495
        bsr     eax, ecx       ; íàõîäèì íåíóëåâîé áèò ìàñêè (31 -> 0)
447
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
496
        jz      .no_events     ; èñ÷åðïàëè âñå áèòû ìàñêè, íî íè÷åãî íå íàøëè ???
448
        btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
497
        btr     ecx, eax       ; ñáðàñûâàåì ïðîâåðÿåìûé áèò ìàñêè
449
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
498
       ; ïåðåõîäèì íà îáðàáîò÷èê ýòîãî (eax) áèòà
450
        cmp     eax, 9
499
        cmp     eax, 9
451
        jae     .loop          ; eax=[9..31], ignored
500
        jae     .loop          ; eax=[9..31], ignored (event 10...32)
-
 
501
 
452
        cmp     eax, 3
502
        cmp     eax, 3
453
        je      .loop          ; eax=3, ignored
503
        je      .loop          ; eax=3, ignored (event 4)
-
 
504
 
-
 
505
        cmp     eax, 4
-
 
506
        je      .FlagAutoReset  ; eax=4, retvals=eax+1 (event 5)
-
 
507
 
-
 
508
        cmp     eax, 5
-
 
509
        je      .mouse_check  ; eax=5, retvals=eax+1 (event 6)
-
 
510
 
454
        ja      .FlagAutoReset ; eax=[4..8], retvals=eax+1
511
        ja      .FlagAutoReset ; eax=[6..8], retvals=eax+1 (event 7...9)
-
 
512
 
455
        cmp     eax, 1
513
        cmp     eax, 1
456
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1
514
        jae     .BtKy          ; eax=[1,2],  retvals=eax+1 (event 2,3)
-
 
515
;--------------------------------------
-
 
516
align 4
457
.WndRedraw:                    ; eax=0, retval WndRedraw=1
517
.WndRedraw:                    ; eax=0, retval WndRedraw=1
458
        cmp     [edi-twdw+WDATA.fl_redraw], al;al==0
518
        cmp     [edi-twdw+WDATA.fl_redraw], al;al==0
459
        jne     .result
519
        jne     .result
460
        jmp     .loop
520
        jmp     .loop
-
 
521
;--------------------------------------
-
 
522
align 4
461
  .no_events:
523
.no_events:
462
        xor     eax, eax
524
        xor     eax, eax
463
        ret
525
        ret
464
 
-
 
465
.FlagAutoReset: ; retvals: BgrRedraw=5, Mouse=6, IPC=7, Stack=8, Debug=9
-
 
466
        cmp     eax, 5; Mouse 5+1=6
526
;--------------------------------------
-
 
527
align 4
467
        jne     .no_mouse_check
528
.mouse_check:    ; Mouse 5+1=6
468
        push    eax
529
        push    eax
469
        mov     eax, [TASK_BASE]
530
        mov     eax, [TASK_BASE]
470
        mov     eax, [eax + TASKDATA.event_mask]
531
        mov     eax, [eax + TASKDATA.event_mask]
471
        test    eax, 0x80000000 ; bit 31: active/inactive filter f.40
532
        test    eax, 0x80000000 ; bit 31: active/inactive filter f.40
472
        jz      @f
533
        jz      @f
473
        pop     eax
534
        pop     eax
474
        jmp     .no_mouse_check
535
        jmp     .FlagAutoReset
-
 
536
;--------------------------------------
-
 
537
align 4
475
@@:
538
@@:
476
; If the window is captured and moved by the user, then no mouse events!!!
539
; If the window is captured and moved by the user, then no mouse events!!!
477
        mov     al, [mouse.active_sys_window.action]
540
        mov     al, [mouse.active_sys_window.action]
478
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
541
        and     al, WINDOW_MOVE_AND_RESIZE_FLAGS
479
        test    al, al
542
        test    al, al
480
        pop     eax
543
        pop     eax
481
        jnz     .loop
544
        jnz     .loop
-
 
545
;--------------------------------------
482
.no_mouse_check:
546
align 4
-
 
547
.FlagAutoReset: ; retvals: BgrRedraw=5, IPC=7, Stack=8, Debug=9
483
        btr     [ebx+APPDATA.event_mask], eax
548
        btr     [ebx+APPDATA.event_mask], eax
484
        jnc     .loop
549
        jnc     .loop
-
 
550
;--------------------------------------
-
 
551
align 4
485
  .result:      ; retval = eax+1
552
.result:      ; retval = eax+1
486
        inc     eax
553
        inc     eax
487
        ret
554
        ret
-
 
555
;--------------------------------------
-
 
556
align 4
488
  .BtKy:
557
.BtKy:
489
        movzx   edx, bh
558
        movzx   edx, bh
490
        movzx   edx, word[WIN_STACK+edx*2]
559
        movzx   edx, word[WIN_STACK+edx*2]
491
        je      .Keys          ; eax=1, retval Keys=2
560
        je      .Keys          ; eax=1, retval Keys=2
-
 
561
;--------------------------------------
-
 
562
align 4
492
.Buttons:                      ; eax=2, retval Buttons=3
563
.Buttons:                      ; eax=2, retval Buttons=3
493
        cmp     byte[BTN_COUNT], 0
564
        cmp     byte[BTN_COUNT], 0
494
        je      .loop          ; empty ???
565
        je      .loop          ; empty ???
495
        cmp     edx, [TASK_COUNT]
566
        cmp     edx, [TASK_COUNT]
496
        jne     .loop          ; not Top ???
567
        jne     .loop          ; not Top ???
Line 499... Line 570...
499
        cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
570
        cmp     edx, 0xFFFF    ;-ID for Minimize-Button of Form
500
        jne     .result
571
        jne     .result
501
        mov     [window_minimize], 1
572
        mov     [window_minimize], 1
502
        dec     byte[BTN_COUNT]
573
        dec     byte[BTN_COUNT]
503
        jmp     .loop
574
        jmp     .loop
-
 
575
;--------------------------------------
-
 
576
align 4
504
.Keys:    ; eax==1
577
.Keys:    ; eax==1
505
        cmp     edx, [TASK_COUNT]
578
        cmp     edx, [TASK_COUNT]
506
        jne     @f             ; not Top ???
579
        jne     @f             ; not Top ???
507
        cmp     [KEY_COUNT], al; al==1
580
        cmp     [KEY_COUNT], al; al==1
508
        jae     .result        ; not empty ???
581
        jae     .result        ; not empty ???
-
 
582
;--------------------------------------
-
 
583
align 4
509
  @@:
584
@@:
510
        mov     edx, hotkey_buffer
585
        mov     edx, hotkey_buffer
-
 
586
;--------------------------------------
-
 
587
align 4
511
  @@:
588
@@:
512
        cmp     [edx], bh      ; bh - slot for testing
589
        cmp     [edx], bh      ; bh - slot for testing
513
        je      .result
590
        je      .result
514
        add     edx, 8
591
        add     edx, 8
515
        cmp     edx, hotkey_buffer+120*8
592
        cmp     edx, hotkey_buffer+120*8
516
        jb      @b
593
        jb      @b
517
        jmp     .loop
594
        jmp     .loop
518
;end.
595
;end.
-
 
596
;-----------------------------------------------------------------------------
519
597