Subversion Repositories Kolibri OS

Rev

Rev 227 | Rev 254 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
227 serge 1
struc EVENT
2
{  .code    rd 1
3
            rd 5
4
   .next    rd 1   ;+24
5
   .prev    rd 1   ;+28
6
}
7
EVENT_SIZE  equ 32
8
 
9
virtual at 0
10
  EVENT EVENT
11
end virtual
12
 
13
align 4
14
init_events:
15
           stdcall kernel_alloc, 1024*EVENT_SIZE
16
           mov [events], eax
17
           xor eax, eax
18
           not eax
19
           mov edi, event_map
20
           mov [event_start], edi
21
           mov ecx, 128/4
22
           cld
23
           rep stosd
24
           mov [event_end], edi
25
           ret
26
 
27
align 4
28
proc alloc_event
29
 
30
           pushfd
31
           cli
32
           mov ebx, [event_start]
33
           mov ecx, [event_end]
34
.l1:
35
           bsf eax,[ebx]
36
           jnz .found
37
           add ebx,4
38
           cmp ebx, ecx
39
           jb .l1
40
           popfd
41
           xor eax,eax
42
           ret
43
.found:
44
           btr [ebx], eax
45
           mov [event_start],ebx
46
           sub ebx, event_map
47
           shl ebx, 3
48
           add eax,ebx
49
           shl eax,5
50
           add eax, [events]
51
           popfd
52
           xor ebx, ebx
53
           mov [eax+EVENT.next], ebx
54
           mov [eax+EVENT.prev], ebx
55
           ret
56
endp
57
 
58
align 4
59
free_event:
60
           pushfd
61
           cli
62
           sub eax, [events]
63
           shr eax, 5
64
           mov ebx, event_map
65
           bts [ebx], eax
66
           shr eax, 3
67
           and eax, not 3
68
           add eax, ebx
69
           cmp [event_start], eax
70
           ja @f
71
           popfd
72
           ret
73
@@:
74
           mov [event_start], eax
75
           popfd
76
           ret
77
 
78
align 4
79
proc send_event stdcall pid:dword, event:dword
80
           locals
81
             slot     dd ?
82
           endl
83
 
84
           mov eax, [pid]
85
           call pid_to_slot
86
           test eax, eax
87
           jz .fail
88
 
89
           shl eax, 8
90
           cmp [PROC_BASE+eax+APPDATA.ev_count], 32
91
           ja .fail
92
 
93
           mov [slot], eax
94
           call alloc_event
95
           test eax, eax
96
           jz .fail
97
 
98
           mov edi, eax
99
           mov ecx, 6
100
           mov esi, [event]
101
           cld
102
           rep movsd
103
 
104
           mov esi, eax
105
           mov eax, [slot]
106
           mov edi, [PROC_BASE+eax+APPDATA.ev_last]
107
           mov [esi+EVENT.prev], edi
108
           test edi, edi
109
           jz .set_last
110
           mov [edi+EVENT.next], esi
111
.set_last:
112
           mov edx, [PROC_BASE+eax+APPDATA.ev_first]
113
           test edx, edx
114
           jnz @F
115
           mov [PROC_BASE+eax+APPDATA.ev_first], esi
116
@@:
117
           mov [PROC_BASE+eax+APPDATA.ev_last], esi
118
           inc [PROC_BASE+eax+APPDATA.ev_count]
119
           or  [PROC_BASE+eax+APPDATA.event_mask], EVENT_EXTENDED
120
.fail:
121
           ret
122
endp
123
 
124
align 4
125
proc get_event_ex stdcall, p_ev:dword, timeout:dword
126
 
127
.wait:
128
           mov ebx,[CURRENT_TASK]
129
           shl ebx,8
130
           cmp [PROC_BASE+ebx+APPDATA.ev_count], 0
131
           je .switch
132
 
133
           mov esi, [PROC_BASE+ebx+APPDATA.ev_first]
134
           mov edx, [esi+EVENT.next]
135
           mov [PROC_BASE+ebx+APPDATA.ev_first], edx
136
           test edx, edx
230 serge 137
           jz @F
138
           mov [edx+EVENT.prev], 0
139
@@:
227 serge 140
           jnz @F
141
           mov [PROC_BASE+ebx+APPDATA.ev_last], edx
142
           and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
143
@@:
144
           dec [PROC_BASE+ebx+APPDATA.ev_count]
145
 
146
           mov eax, esi
147
           and dword [esi], 0xFF00FFFF
148
           mov edi, [p_ev]
149
           mov ecx, 6
150
           cld
151
           rep movsd
152
           call free_event
153
           ret
154
.switch:
155
           mov eax, [0x3010]
156
           mov [eax+TASKDATA.state], byte 5
157
	   call change_task
158
	   jmp .wait
159
endp
160
 
1 ha 161
sys_getevent:
162
 
163
     call   get_event_for_app
164
     mov    [esp+36],eax
165
     ret
166
 
167
 
168
align 4
169
sys_wait_event_timeout:
170
 
21 poddubny 171
     mov   ebx,[timer_ticks]
1 ha 172
     add   ebx,eax
21 poddubny 173
     cmp   ebx,[timer_ticks]
1 ha 174
     jna   .swfet2
227 serge 175
.swfet1:
1 ha 176
     call  get_event_for_app
177
     test  eax,eax
178
     jne   .eventoccur_time
179
     call  change_task
21 poddubny 180
     cmp   ebx,[timer_ticks]
1 ha 181
     jg    .swfet1
227 serge 182
.swfet2:
1 ha 183
     xor   eax,eax
227 serge 184
.eventoccur_time:
1 ha 185
     mov   [esp+36],eax
186
     ret
187
 
188
 
189
align 4
190
 
191
sys_waitforevent:
192
 
193
     call  get_event_for_app
194
     test  eax,eax
195
     jne   eventoccur
196
   newwait:
197
 
21 poddubny 198
     mov   eax, [0x3010]
115 poddubny 199
     mov   [eax+TASKDATA.state], byte 5
1 ha 200
     call  change_task
201
 
21 poddubny 202
     mov eax, [event_sched]
203
 
1 ha 204
   eventoccur:
205
     mov   [esp+36],eax
206
     ret
207
 
208
get_event_for_app:
209
 
210
     pushad
211
 
212
     mov   edi,[0x3010]              ; WINDOW REDRAW
115 poddubny 213
     test  [edi+TASKDATA.event_mask],dword 1
1 ha 214
     jz    no_eventoccur1
21 poddubny 215
     ;mov   edi,[0x3010]
115 poddubny 216
     cmp   [edi-twdw+WDATA.fl_redraw],byte 0
1 ha 217
     je    no_eventoccur1
218
     popad
219
     mov   eax,1
220
     ret
221
   no_eventoccur1:
222
 
21 poddubny 223
     ;mov   edi,[0x3010]              ; KEY IN BUFFER
115 poddubny 224
     test  [edi+TASKDATA.event_mask],dword 2
1 ha 225
     jz    no_eventoccur2
226
     mov   ecx, [0x3000]
227
     movzx edx,word [0xC000+ecx*2]
228
     mov   eax, [0x3004]
229
     cmp   eax,edx
92 diamond 230
     jne   no_eventoccur2x
1 ha 231
     cmp   [0xf400],byte 0
92 diamond 232
     je    no_eventoccur2x
233
   eventoccur2:
1 ha 234
     popad
235
     mov   eax,2
236
     ret
92 diamond 237
   no_eventoccur2x:
238
        mov     eax, hotkey_buffer
239
@@:
240
        cmp     [eax], ecx
241
        jz      eventoccur2
242
        add     eax, 8
243
        cmp     eax, hotkey_buffer+120*8
244
        jb      @b
1 ha 245
   no_eventoccur2:
246
 
21 poddubny 247
     ;mov   edi,[0x3010]              ; BUTTON IN BUFFER
115 poddubny 248
     test  [edi+TASKDATA.event_mask],dword 4
1 ha 249
     jz    no_eventoccur3
21 poddubny 250
     cmp   [0xf500],byte 0
251
     je    no_eventoccur3
1 ha 252
     mov   ecx, [0x3000]
253
     movzx edx, word [0xC000+ecx*2]
254
     mov   eax, [0x3004]
255
     cmp   eax,edx
256
     jnz   no_eventoccur3
257
     popad
258
     mov   eax,[0xf501]
259
     cmp   eax,65535
260
     je    no_event_1
261
     mov   eax,3
262
     ret
263
 
264
    no_event_1:
265
     mov   [window_minimize],1
266
     mov   [0xf500],byte 0
267
     xor   eax, eax
268
     ret
269
 
270
   no_eventoccur3:
227 serge 271
 
272
 
21 poddubny 273
     ;mov   edi,[0x3010]              ; mouse event
115 poddubny 274
     test  [edi+TASKDATA.event_mask],dword 00100000b
21 poddubny 275
     jz    no_mouse_event
276
     mov   eax,[0x3000]
277
     shl   eax,8
115 poddubny 278
     test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
21 poddubny 279
     jz    no_mouse_event
115 poddubny 280
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
21 poddubny 281
     popad
282
     mov   eax,6
283
     ret
284
   no_mouse_event:
1 ha 285
 
227 serge 286
 
21 poddubny 287
     ;mov   edi,[0x3010]              ; DESKTOP BACKGROUND REDRAW
115 poddubny 288
     test  [edi+TASKDATA.event_mask],dword 16
1 ha 289
     jz    no_eventoccur5
290
     cmp   [0xfff0],byte 2
291
     jnz   no_eventoccur5
292
     popad
293
     mov   eax,5
294
     ret
295
   no_eventoccur5:
296
 
21 poddubny 297
     ;mov   edi,[0x3010]              ; IPC
115 poddubny 298
     test  [edi+TASKDATA.event_mask],dword 01000000b
1 ha 299
     jz    no_ipc
21 poddubny 300
     mov   eax,[0x3000]
301
     shl   eax,8
115 poddubny 302
     test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
1 ha 303
     jz    no_ipc
115 poddubny 304
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
1 ha 305
     popad
306
     mov   eax,7
307
     ret
308
   no_ipc:
309
 
310
 
21 poddubny 311
     ;mov   edi,[0x3010]              ; STACK
115 poddubny 312
     test  [edi+TASKDATA.event_mask],dword 10000000b
1 ha 313
     jz    no_stack_event
21 poddubny 314
     mov   eax,[0x3000]
315
     shl   eax,8
115 poddubny 316
     test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
1 ha 317
     jz    no_stack_event
115 poddubny 318
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
1 ha 319
     popad
21 poddubny 320
     mov   eax,8
1 ha 321
     ret
322
   no_stack_event:
323
 
115 poddubny 324
     test  byte [edi+TASKDATA.event_mask+1], 1		; DEBUG
227 serge 325
     jz    .test_ext
40 halyavin 326
     mov   eax, [0x3000]
327
     shl   eax, 8
115 poddubny 328
     test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
227 serge 329
     jz    .test_ext
115 poddubny 330
     and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
40 halyavin 331
     popad
332
     mov   eax, 9
333
     ret
334
 
227 serge 335
.test_ext:
336
     mov   eax, [0x3000]
337
     shl   eax, 8
338
     test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
339
     jz .test_IRQ
340
     mov eax, 10
341
     ret
342
 
343
.test_IRQ:
344
 
345
 
115 poddubny 346
     cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
21 poddubny 347
     jbe   no_events
1 ha 348
 
349
     mov   esi,0x2e0000              ; IRQ'S AND DATA
350
     mov   ebx,0x00010000
351
     xor   ecx, ecx
352
   irq_event_test:
353
     mov   edi,[0x3010]
115 poddubny 354
     test  [edi+TASKDATA.event_mask],ebx
1 ha 355
     jz    no_irq_event
356
     mov   edi,ecx
357
     shl   edi,2
358
     add   edi,irq_owner
359
     mov   edx,[edi]
360
     mov   eax,[0x3010]
115 poddubny 361
     mov   eax,[eax+TASKDATA.pid]
1 ha 362
     cmp   edx,eax
363
     jne   no_irq_event
364
     cmp   [esi],dword 0
365
     jz    no_irq_event
366
     mov   eax,ecx
367
     add   eax,16
368
     mov   [esp+28],eax
369
     popad
370
     ret
371
    no_irq_event:
372
     add   esi,0x1000
373
     shl   ebx,1
374
     inc   ecx
375
     cmp   ecx,16
376
     jb    irq_event_test
377
 
21 poddubny 378
   no_events:
1 ha 379
     popad
380
     xor   eax, eax
381
     ret
382