Subversion Repositories Kolibri OS

Rev

Rev 115 | Rev 230 | 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
;     push eax
128
;     push edx
129
;     mov edx, 0x400   ;bocsh
130
;     mov al,0xff      ;bocsh
131
;     out dx, al       ;bocsh
132
;     pop edx
133
;     pop eax
134
 
135
.wait:
136
           mov ebx,[CURRENT_TASK]
137
           shl ebx,8
138
           cmp [PROC_BASE+ebx+APPDATA.ev_count], 0
139
           je .switch
140
 
141
           mov esi, [PROC_BASE+ebx+APPDATA.ev_first]
142
           mov edx, [esi+EVENT.next]
143
           mov [PROC_BASE+ebx+APPDATA.ev_first], edx
144
           test edx, edx
145
           jnz @F
146
           mov [PROC_BASE+ebx+APPDATA.ev_last], edx
147
           and dword [PROC_BASE+ebx+APPDATA.event_mask], not EVENT_EXTENDED
148
@@:
149
           mov [edx+EVENT.prev], 0
150
           dec [PROC_BASE+ebx+APPDATA.ev_count]
151
 
152
           mov eax, esi
153
           and dword [esi], 0xFF00FFFF
154
           mov edi, [p_ev]
155
           mov ecx, 6
156
           cld
157
           rep movsd
158
           call free_event
159
           ret
160
.switch:
161
           mov eax, [0x3010]
162
           mov [eax+TASKDATA.state], byte 5
163
	   call change_task
164
	   jmp .wait
165
endp
166
 
1 ha 167
sys_getevent:
168
 
169
     call   get_event_for_app
170
     mov    [esp+36],eax
171
     ret
172
 
173
 
174
align 4
175
sys_wait_event_timeout:
176
 
21 poddubny 177
     mov   ebx,[timer_ticks]
1 ha 178
     add   ebx,eax
21 poddubny 179
     cmp   ebx,[timer_ticks]
1 ha 180
     jna   .swfet2
227 serge 181
.swfet1:
1 ha 182
     call  get_event_for_app
183
     test  eax,eax
184
     jne   .eventoccur_time
185
     call  change_task
21 poddubny 186
     cmp   ebx,[timer_ticks]
1 ha 187
     jg    .swfet1
227 serge 188
.swfet2:
1 ha 189
     xor   eax,eax
227 serge 190
.eventoccur_time:
1 ha 191
     mov   [esp+36],eax
192
     ret
193
 
194
 
195
align 4
196
 
197
sys_waitforevent:
198
 
199
     call  get_event_for_app
200
     test  eax,eax
201
     jne   eventoccur
202
   newwait:
203
 
21 poddubny 204
     mov   eax, [0x3010]
115 poddubny 205
     mov   [eax+TASKDATA.state], byte 5
1 ha 206
     call  change_task
207
 
21 poddubny 208
     mov eax, [event_sched]
209
 
1 ha 210
   eventoccur:
211
     mov   [esp+36],eax
212
     ret
213
 
214
get_event_for_app:
215
 
216
     pushad
217
 
218
     mov   edi,[0x3010]              ; WINDOW REDRAW
115 poddubny 219
     test  [edi+TASKDATA.event_mask],dword 1
1 ha 220
     jz    no_eventoccur1
21 poddubny 221
     ;mov   edi,[0x3010]
115 poddubny 222
     cmp   [edi-twdw+WDATA.fl_redraw],byte 0
1 ha 223
     je    no_eventoccur1
224
     popad
225
     mov   eax,1
226
     ret
227
   no_eventoccur1:
228
 
21 poddubny 229
     ;mov   edi,[0x3010]              ; KEY IN BUFFER
115 poddubny 230
     test  [edi+TASKDATA.event_mask],dword 2
1 ha 231
     jz    no_eventoccur2
232
     mov   ecx, [0x3000]
233
     movzx edx,word [0xC000+ecx*2]
234
     mov   eax, [0x3004]
235
     cmp   eax,edx
92 diamond 236
     jne   no_eventoccur2x
1 ha 237
     cmp   [0xf400],byte 0
92 diamond 238
     je    no_eventoccur2x
239
   eventoccur2:
1 ha 240
     popad
241
     mov   eax,2
242
     ret
92 diamond 243
   no_eventoccur2x:
244
        mov     eax, hotkey_buffer
245
@@:
246
        cmp     [eax], ecx
247
        jz      eventoccur2
248
        add     eax, 8
249
        cmp     eax, hotkey_buffer+120*8
250
        jb      @b
1 ha 251
   no_eventoccur2:
252
 
21 poddubny 253
     ;mov   edi,[0x3010]              ; BUTTON IN BUFFER
115 poddubny 254
     test  [edi+TASKDATA.event_mask],dword 4
1 ha 255
     jz    no_eventoccur3
21 poddubny 256
     cmp   [0xf500],byte 0
257
     je    no_eventoccur3
1 ha 258
     mov   ecx, [0x3000]
259
     movzx edx, word [0xC000+ecx*2]
260
     mov   eax, [0x3004]
261
     cmp   eax,edx
262
     jnz   no_eventoccur3
263
     popad
264
     mov   eax,[0xf501]
265
     cmp   eax,65535
266
     je    no_event_1
267
     mov   eax,3
268
     ret
269
 
270
    no_event_1:
271
     mov   [window_minimize],1
272
     mov   [0xf500],byte 0
273
     xor   eax, eax
274
     ret
275
 
276
   no_eventoccur3:
227 serge 277
 
278
 
21 poddubny 279
     ;mov   edi,[0x3010]              ; mouse event
115 poddubny 280
     test  [edi+TASKDATA.event_mask],dword 00100000b
21 poddubny 281
     jz    no_mouse_event
282
     mov   eax,[0x3000]
283
     shl   eax,8
115 poddubny 284
     test  [eax+0x80000+APPDATA.event_mask],dword 00100000b
21 poddubny 285
     jz    no_mouse_event
115 poddubny 286
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-00100000b
21 poddubny 287
     popad
288
     mov   eax,6
289
     ret
290
   no_mouse_event:
1 ha 291
 
227 serge 292
 
21 poddubny 293
     ;mov   edi,[0x3010]              ; DESKTOP BACKGROUND REDRAW
115 poddubny 294
     test  [edi+TASKDATA.event_mask],dword 16
1 ha 295
     jz    no_eventoccur5
296
     cmp   [0xfff0],byte 2
297
     jnz   no_eventoccur5
298
     popad
299
     mov   eax,5
300
     ret
301
   no_eventoccur5:
302
 
21 poddubny 303
     ;mov   edi,[0x3010]              ; IPC
115 poddubny 304
     test  [edi+TASKDATA.event_mask],dword 01000000b
1 ha 305
     jz    no_ipc
21 poddubny 306
     mov   eax,[0x3000]
307
     shl   eax,8
115 poddubny 308
     test  [eax+0x80000+APPDATA.event_mask],dword 01000000b
1 ha 309
     jz    no_ipc
115 poddubny 310
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-01000000b
1 ha 311
     popad
312
     mov   eax,7
313
     ret
314
   no_ipc:
315
 
316
 
21 poddubny 317
     ;mov   edi,[0x3010]              ; STACK
115 poddubny 318
     test  [edi+TASKDATA.event_mask],dword 10000000b
1 ha 319
     jz    no_stack_event
21 poddubny 320
     mov   eax,[0x3000]
321
     shl   eax,8
115 poddubny 322
     test  [eax+0x80000+APPDATA.event_mask],dword 10000000b
1 ha 323
     jz    no_stack_event
115 poddubny 324
     and   [eax+0x80000+APPDATA.event_mask],dword 0xffffffff-10000000b
1 ha 325
     popad
21 poddubny 326
     mov   eax,8
1 ha 327
     ret
328
   no_stack_event:
329
 
115 poddubny 330
     test  byte [edi+TASKDATA.event_mask+1], 1		; DEBUG
227 serge 331
     jz    .test_ext
40 halyavin 332
     mov   eax, [0x3000]
333
     shl   eax, 8
115 poddubny 334
     test  byte [eax+0x80000+APPDATA.event_mask+1], byte 1
227 serge 335
     jz    .test_ext
115 poddubny 336
     and   byte [eax+0x80000+APPDATA.event_mask+1], not 1
40 halyavin 337
     popad
338
     mov   eax, 9
339
     ret
340
 
227 serge 341
.test_ext:
342
     mov   eax, [0x3000]
343
     shl   eax, 8
344
     test  dword [eax+0x80000+APPDATA.event_mask], EVENT_EXTENDED
345
     jz .test_IRQ
346
     mov eax, 10
347
     ret
348
 
349
.test_IRQ:
350
 
351
 
115 poddubny 352
     cmp   dword [edi+TASKDATA.event_mask], 0xFFFF
21 poddubny 353
     jbe   no_events
1 ha 354
 
355
     mov   esi,0x2e0000              ; IRQ'S AND DATA
356
     mov   ebx,0x00010000
357
     xor   ecx, ecx
358
   irq_event_test:
359
     mov   edi,[0x3010]
115 poddubny 360
     test  [edi+TASKDATA.event_mask],ebx
1 ha 361
     jz    no_irq_event
362
     mov   edi,ecx
363
     shl   edi,2
364
     add   edi,irq_owner
365
     mov   edx,[edi]
366
     mov   eax,[0x3010]
115 poddubny 367
     mov   eax,[eax+TASKDATA.pid]
1 ha 368
     cmp   edx,eax
369
     jne   no_irq_event
370
     cmp   [esi],dword 0
371
     jz    no_irq_event
372
     mov   eax,ecx
373
     add   eax,16
374
     mov   [esp+28],eax
375
     popad
376
     ret
377
    no_irq_event:
378
     add   esi,0x1000
379
     shl   ebx,1
380
     inc   ecx
381
     cmp   ecx,16
382
     jb    irq_event_test
383
 
21 poddubny 384
   no_events:
1 ha 385
     popad
386
     xor   eax, eax
387
     ret
388