Subversion Repositories Kolibri OS

Rev

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