Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 3355 $
9
 
10
 
11
VKEY_LSHIFT   = 0000000000000001b
12
VKEY_RSHIFT   = 0000000000000010b
13
VKEY_LCONTROL = 0000000000000100b
14
VKEY_RCONTROL = 0000000000001000b
15
VKEY_LALT     = 0000000000010000b
16
VKEY_RALT     = 0000000000100000b
17
VKEY_CAPSLOCK = 0000000001000000b
18
VKEY_NUMLOCK  = 0000000010000000b
19
VKEY_SCRLOCK  = 0000000100000000b
3355 mario79 20
VKEY_LWIN     = 0000001000000000b
21
VKEY_RWIN     = 0000010000000000b
2288 clevermous 22
 
23
VKEY_SHIFT    = 0000000000000011b
24
VKEY_CONTROL  = 0000000000001100b
25
VKEY_ALT      = 0000000000110000b
26
 
27
uglobal
28
  align 4
29
  kb_state      dd 0
30
  ext_code      db 0
31
 
32
  keyboard_mode db 0
33
  keyboard_data db 0
34
 
35
  altmouseb     db 0
36
  ctrl_alt_del  db 0
37
 
38
  kb_lights     db 0
2601 clevermous 39
  old_kb_lights db 0
2288 clevermous 40
 
41
align 4
42
        hotkey_scancodes        rd      256     ; we have 256 scancodes
43
        hotkey_list             rd      256*4   ; max 256 defined hotkeys
44
        hotkey_buffer           rd      120*2   ; buffer for 120 hotkeys
45
endg
46
 
47
iglobal
48
hotkey_tests    dd      hotkey_test0
49
                dd      hotkey_test1
50
                dd      hotkey_test2
51
                dd      hotkey_test3
52
                dd      hotkey_test4
53
hotkey_tests_num = 5
54
endg
55
;---------------------------------------------------------------------
56
hotkey_test0:
57
        test    al, al
58
        setz    al
59
        ret
60
;---------------------------------------------------------------------
61
hotkey_test1:
62
        test    al, al
63
        setnp   al
64
        ret
65
;---------------------------------------------------------------------
66
hotkey_test2:
67
        cmp     al, 3
68
        setz    al
69
        ret
70
;---------------------------------------------------------------------
71
hotkey_test3:
72
        cmp     al, 1
73
        setz    al
74
        ret
75
;---------------------------------------------------------------------
76
hotkey_test4:
77
        cmp     al, 2
78
        setz    al
79
        ret
80
;---------------------------------------------------------------------
81
hotkey_do_test:
82
        push    eax
83
        mov     edx, [kb_state]
84
        shr     edx, cl
85
        add     cl, cl
86
        mov     eax, [eax+4]
87
        shr     eax, cl
88
        and     eax, 15
89
        cmp     al, hotkey_tests_num
90
        jae     .fail
91
 
92
        xchg    eax, edx
93
        and     al, 3
94
        call    [hotkey_tests + edx*4]
95
        cmp     al, 1
96
        pop     eax
97
        ret
98
;--------------------------------------
99
.fail:
100
        stc
101
        pop     eax
102
        ret
103
;---------------------------------------------------------------------
104
align 4
105
set_keyboard_data:
106
        movzx   eax, word[TASK_COUNT]; top window process
107
        movzx   eax, word[WIN_POS+eax*2]
108
        shl     eax, 8
109
        mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
110
        mov     [keyboard_mode], al
111
 
112
        mov     eax, ecx
113
 
114
        push    ebx esi edi ebp
115
        call    send_scancode
116
        pop     ebp edi esi ebx
117
        ret
118
;---------------------------------------------------------------------
2601 clevermous 119
struct KEYBOARD
120
next           dd      ?
121
prev           dd      ?
122
functions      dd      ?
123
userdata       dd      ?
124
ends
125
struct KBDFUNC
126
strucsize      dd      ?
127
close          dd      ?
128
setlights      dd      ?
129
ends
130
 
131
iglobal
132
keyboards:
133
        dd      keyboards
134
        dd      keyboards
135
endg
136
uglobal
137
keyboard_list_mutex     MUTEX
138
endg
139
 
140
register_keyboard:
141
        push    ebx
142
        push    sizeof.KEYBOARD
143
        pop     eax
144
        call    malloc
145
        test    eax, eax
146
        jz      .nothing
147
        mov     ecx, [esp+4+4]
148
        mov     [eax+KEYBOARD.functions], ecx
149
        mov     ecx, [esp+8+4]
150
        mov     [eax+KEYBOARD.userdata], ecx
151
        xchg    eax, ebx
152
        mov     ecx, keyboard_list_mutex
153
        call    mutex_lock
154
        mov     ecx, keyboards
155
        mov     edx, [ecx+KEYBOARD.prev]
156
        mov     [ebx+KEYBOARD.next], ecx
157
        mov     [ebx+KEYBOARD.prev], edx
158
        mov     [edx+KEYBOARD.next], ebx
159
        mov     [ecx+KEYBOARD.prev], ebx
160
        mov     ecx, [ebx+KEYBOARD.functions]
161
        cmp     [ecx+KBDFUNC.strucsize], KBDFUNC.setlights
162
        jbe     .unlock
163
        mov     ecx, [ecx+KBDFUNC.setlights]
164
        test    ecx, ecx
165
        jz      .unlock
166
        stdcall ecx, [ebx+KEYBOARD.userdata], dword [kb_lights]
167
.unlock:
168
        mov     ecx, keyboard_list_mutex
169
        call    mutex_unlock
170
        xchg    eax, ebx
171
.nothing:
172
        pop     ebx
173
        ret     8
174
 
175
delete_keyboard:
176
        push    ebx
177
        mov     ebx, [esp+4+4]
178
        mov     ecx, keyboard_list_mutex
179
        call    mutex_lock
180
        mov     eax, [ebx+KEYBOARD.next]
181
        mov     edx, [ebx+KEYBOARD.prev]
182
        mov     [eax+KEYBOARD.prev], edx
183
        mov     [edx+KEYBOARD.next], eax
184
        call    mutex_unlock
185
        mov     ecx, [ebx+KEYBOARD.functions]
186
        cmp     [ecx+KBDFUNC.strucsize], KBDFUNC.close
187
        jbe     .nothing
188
        mov     ecx, [ecx+KBDFUNC.close]
189
        test    ecx, ecx
190
        jz      .nothing
191
        stdcall ecx, [ebx+KEYBOARD.userdata]
192
.nothing:
193
        pop     ebx
194
        ret     4
195
;---------------------------------------------------------------------
2288 clevermous 196
align 4
197
irq1:
198
        movzx   eax, word[TASK_COUNT]; top window process
199
        movzx   eax, word[WIN_POS+eax*2]
200
        shl     eax, 8
201
        mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
202
        mov     [keyboard_mode], al
203
 
204
        in      al, 0x60
205
;--------------------------------------
206
send_scancode:
207
        mov     [keyboard_data], al
208
; ch = scancode
209
; cl = ext_code
210
; bh = 0 - normal key
211
; bh = 1 - modifier (Shift/Ctrl/Alt)
212
; bh = 2 - extended code
213
        mov     ch, al
214
        cmp     al, 0xE0
215
        je      @f
216
 
217
        cmp     al, 0xE1
218
        jne     .normal_code
219
@@:
220
        mov     bh, 2
221
        mov     [ext_code], al
222
        jmp     .writekey
223
;--------------------------------------
224
.normal_code:
225
        mov     cl, 0
226
        xchg    cl, [ext_code]
227
        and     al, 0x7F
228
        mov     bh, 1
3355 mario79 229
;--------------------------------------
2288 clevermous 230
@@:
3355 mario79 231
        cmp     al, 0x5B
232
        jne     @f
233
 
234
        cmp     cl, 0xE0
235
        jne     .writekey
236
 
237
        mov     eax, VKEY_LWIN
238
        jmp     .modifier
239
;--------------------------------------
240
@@:
241
        cmp     al, 0x5C
242
        jne     @f
243
 
244
        cmp     cl, 0xE0
245
        jne     .writekey
246
 
247
        mov     eax, VKEY_RWIN
248
        jmp     .modifier
249
;--------------------------------------
250
@@:
2288 clevermous 251
        cmp     al, 0x2A
252
        jne     @f
253
 
254
        cmp     cl, 0xE0
255
        je      .writekey
256
 
257
        mov     eax, VKEY_LSHIFT
258
        jmp     .modifier
259
;--------------------------------------
260
@@:
261
        cmp     al, 0x36
262
        jne     @f
263
 
264
        cmp     cl, 0xE0
265
        je      .writekey
266
 
267
        mov     eax, VKEY_RSHIFT
268
        jmp     .modifier
269
;--------------------------------------
270
@@:
271
        cmp     al, 0x38
272
        jne     @f
273
 
274
        mov     eax, VKEY_LALT
275
        test    cl, cl
276
        jz      .modifier
277
 
278
        mov     al, VKEY_RALT
279
        jmp     .modifier
280
;--------------------------------------
281
@@:
282
        cmp     al, 0x1D
283
        jne     @f
284
 
285
        mov     eax, VKEY_LCONTROL
286
        test    cl, cl
287
        jz      .modifier
288
 
289
        mov     al, VKEY_RCONTROL
290
        cmp     cl, 0xE0
291
        jz      .modifier
292
 
293
        mov     [ext_code], cl
294
        jmp     .writekey
295
;--------------------------------------
296
@@:
297
        cmp     al, 0x3A
298
        jne     @f
299
 
300
        mov     bl, 4
301
        mov     eax, VKEY_CAPSLOCK
302
        jmp     .no_key.xor
303
;--------------------------------------
304
@@:
305
        cmp     al, 0x45
306
        jne     @f
307
        test    cl, cl
308
        jnz     .writekey
309
 
310
        mov     bl, 2
311
        mov     eax, VKEY_NUMLOCK
312
        jmp     .no_key.xor
313
;--------------------------------------
314
@@:
315
        cmp     al, 0x46
316
        jne     @f
317
 
318
        mov     bl, 1
319
        mov     eax, VKEY_SCRLOCK
320
        jmp     .no_key.xor
321
;--------------------------------------
322
@@:
323
        xor     ebx, ebx
324
        test    ch, ch
325
        js      .writekey
326
 
327
        movzx   eax, ch          ; plain key
328
        mov     bl, [keymap+eax]
329
        mov     edx, [kb_state]
330
        test    dl, VKEY_CONTROL ; ctrl alt del
331
        jz      .noctrlaltdel
332
 
333
        test    dl, VKEY_ALT
334
        jz      .noctrlaltdel
335
 
336
        cmp     ch, 53h
337
        jne     .noctrlaltdel
338
 
339
        mov     [ctrl_alt_del], 1
340
.noctrlaltdel:
341
        test    dl, VKEY_CONTROL ; ctrl on ?
342
        jz      @f
343
 
344
        sub     bl, 0x60
345
@@:
346
        test    dl, VKEY_CAPSLOCK        ; caps lock on ?
347
        jz      .no_caps_lock
348
 
349
        test    dl, VKEY_SHIFT   ; shift on ?
350
        jz      .keymap_shif
351
 
352
        jmp     @f
353
;--------------------------------------
354
.no_caps_lock:
355
        test    dl, VKEY_SHIFT   ; shift on ?
356
        jz      @f
357
.keymap_shif:
358
        mov     bl, [keymap_shift+eax]
359
@@:
360
        test    dl, VKEY_ALT     ; alt on ?
361
        jz      @f
362
 
363
        mov     bl, [keymap_alt+eax]
364
@@:
365
        jmp     .writekey
366
;--------------------------------------
367
.modifier:
368
        test    ch, ch
369
        js      .modifier.up
370
        or      [kb_state], eax
371
        jmp     .writekey
372
;--------------------------------------
373
.modifier.up:
374
        not     eax
375
        and     [kb_state], eax
376
        jmp     .writekey
377
;--------------------------------------
378
.no_key.xor:
379
        mov     bh, 0
380
        test    ch, ch
381
        js      .writekey
382
 
383
        xor     [kb_state], eax
384
        xor     [kb_lights], bl
385
.writekey:
2611 mario79 386
        pushad
2288 clevermous 387
; test for system hotkeys
388
        movzx   eax, ch
389
        cmp     bh, 1
390
        ja      .nohotkey
391
        jb      @f
392
 
393
        xor     eax, eax
394
@@:
395
        mov     eax, [hotkey_scancodes + eax*4]
396
.hotkey_loop:
397
        test    eax, eax
398
        jz      .nohotkey
399
 
400
        mov     cl, 0
401
        call    hotkey_do_test
402
        jc      .hotkey_cont
403
 
404
        mov     cl, 2
405
        call    hotkey_do_test
406
        jc      .hotkey_cont
407
 
408
        mov     cl, 4
409
        call    hotkey_do_test
410
        jnc     .hotkey_found
411
.hotkey_cont:
412
        mov     eax, [eax]
413
        jmp     .hotkey_loop
414
;--------------------------------------
415
.hotkey_found:
416
        mov     eax, [eax+8]
417
; put key in buffer for process in slot eax
418
        mov     edi, hotkey_buffer
419
@@:
420
        cmp     dword [edi], 0
421
        jz      .found_free
422
 
423
        add     edi, 8
424
        cmp     edi, hotkey_buffer+120*8
425
        jb      @b
426
; no free space - replace first entry
427
        mov     edi, hotkey_buffer
428
.found_free:
429
        mov     [edi], eax
430
        movzx   eax, ch
431
        cmp     bh, 1
432
        jnz     @f
433
 
434
        xor     eax, eax
435
@@:
436
        mov     [edi+4], ax
437
        mov     eax, [kb_state]
438
        mov     [edi+6], ax
2709 mario79 439
 
440
        cmp     [PID_lock_input], dword 0
441
        je      .nohotkey
442
 
443
        popad
444
        jmp     .exit.irq1
2288 clevermous 445
;--------------------------------------
446
.nohotkey:
2611 mario79 447
        popad
2709 mario79 448
 
2288 clevermous 449
        cmp     [keyboard_mode], 0; return from keymap
450
        jne     .scancode
451
 
452
        test    bh, bh
453
        jnz     .exit.irq1
454
 
455
        test    bl, bl
456
        jz      .exit.irq1
457
 
458
        test    [kb_state], VKEY_NUMLOCK
459
        jz      .dowrite
460
 
461
        cmp     cl, 0xE0
462
        jz      .dowrite
463
 
464
        cmp     ch, 55
465
        jnz     @f
466
 
467
        mov     bl, 0x2A        ;*
468
        jmp     .dowrite
469
;--------------------------------------
470
@@:
471
        cmp     ch, 71
472
        jb      .dowrite
473
 
474
        cmp     ch, 83
475
        ja      .dowrite
476
 
477
        movzx   eax, ch
478
        mov     bl, [numlock_map + eax - 71]
479
        jmp     .dowrite
480
;--------------------------------------
481
.scancode:
482
        mov     bl, ch
483
.dowrite:
484
        movzx   eax, byte[KEY_COUNT]
485
        cmp     al, 120
486
        jae     .exit.irq1
487
        inc     eax
488
        mov     [KEY_COUNT], al
489
        mov     [KEY_COUNT+eax], bl
490
.exit.irq1:
491
        mov     [check_idle_semaphore], 5
492
        ret
493
;---------------------------------------------------------------------
494
set_lights:
2601 clevermous 495
        push    ebx esi
496
        mov     ecx, keyboard_list_mutex
497
        call    mutex_lock
498
        mov     esi, keyboards
499
.loop:
500
        mov     esi, [esi+KEYBOARD.next]
501
        cmp     esi, keyboards
502
        jz      .done
503
        mov     eax, [esi+KEYBOARD.functions]
504
        cmp     dword [eax], KBDFUNC.setlights
505
        jbe     .loop
506
        mov     eax, [eax+KBDFUNC.setlights]
507
        test    eax, eax
508
        jz      .loop
509
        stdcall eax, [esi+KEYBOARD.userdata], dword [kb_lights]
510
        jmp     .loop
511
.done:
512
        mov     ecx, keyboard_list_mutex
513
        call    mutex_unlock
514
        pop     esi ebx
515
        ret
516
 
517
ps2_set_lights:
3320 clevermous 518
        stdcall disable_irq, 1
2288 clevermous 519
        mov     al, 0xED
520
        call    kb_write
2601 clevermous 521
        mov     al, [esp+8]
522
        call    kb_write
3320 clevermous 523
        stdcall enable_irq, 1
2601 clevermous 524
        ret     8
525
 
526
;// mike.dld ]
527
check_lights_state:
2288 clevermous 528
        mov     al, [kb_lights]
2601 clevermous 529
        cmp     al, [old_kb_lights]
530
        jz      .nothing
531
        mov     [old_kb_lights], al
532
        call    set_lights
533
.nothing:
2288 clevermous 534
        ret
535
;---------------------------------------------------------------------
536
numlock_map:
537
    db   0x37   ;Num 7
538
    db   0x38   ;Num 8
539
    db   0x39   ;Num 9
540
    db   0x2D   ;Num -
541
    db   0x34   ;Num 4
542
    db   0x35   ;Num 5
543
    db   0x36   ;Num 6
544
    db   0x2B   ;Num +
545
    db   0x31   ;Num 1
546
    db   0x32   ;Num 2
547
    db   0x33   ;Num 3
548
    db   0x30   ;Num 0
549
    db   0x2E   ;Num .
550
;---------------------------------------------------------------------