Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2209 Serge 3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
431 serge 4
;; Copyright (C) MenuetOS 2000-2004 Ville Mikael Turjanmaa      ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 2434 $
9
 
10
 
1 ha 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
20
 
21
VKEY_SHIFT    = 0000000000000011b
22
VKEY_CONTROL  = 0000000000001100b
23
VKEY_ALT      = 0000000000110000b
24
 
25
uglobal
26
  align 4
2434 Serge 27
  kb_state      dd 0
28
  ext_code      db 0
1 ha 29
 
30
  keyboard_mode db 0
31
  keyboard_data db 0
32
 
2434 Serge 33
  altmouseb     db 0
34
  ctrl_alt_del  db 0
1 ha 35
 
2434 Serge 36
  kb_lights     db 0
92 diamond 37
 
38
align 4
2434 Serge 39
        hotkey_scancodes        rd      256     ; we have 256 scancodes
40
        hotkey_list             rd      256*4   ; max 256 defined hotkeys
41
        hotkey_buffer           rd      120*2   ; buffer for 120 hotkeys
1 ha 42
endg
43
 
92 diamond 44
iglobal
2434 Serge 45
hotkey_tests    dd      hotkey_test0
46
                dd      hotkey_test1
47
                dd      hotkey_test2
48
                dd      hotkey_test3
49
                dd      hotkey_test4
92 diamond 50
hotkey_tests_num = 5
51
endg
2209 Serge 52
;---------------------------------------------------------------------
92 diamond 53
hotkey_test0:
2434 Serge 54
        test    al, al
55
        setz    al
56
        ret
2209 Serge 57
;---------------------------------------------------------------------
92 diamond 58
hotkey_test1:
2434 Serge 59
        test    al, al
60
        setnp   al
61
        ret
2209 Serge 62
;---------------------------------------------------------------------
92 diamond 63
hotkey_test2:
2434 Serge 64
        cmp     al, 3
65
        setz    al
66
        ret
2209 Serge 67
;---------------------------------------------------------------------
92 diamond 68
hotkey_test3:
2434 Serge 69
        cmp     al, 1
70
        setz    al
71
        ret
2209 Serge 72
;---------------------------------------------------------------------
92 diamond 73
hotkey_test4:
2434 Serge 74
        cmp     al, 2
75
        setz    al
76
        ret
2209 Serge 77
;---------------------------------------------------------------------
92 diamond 78
hotkey_do_test:
2434 Serge 79
        push    eax
80
        mov     edx, [kb_state]
81
        shr     edx, cl
82
        add     cl, cl
83
        mov     eax, [eax+4]
84
        shr     eax, cl
85
        and     eax, 15
86
        cmp     al, hotkey_tests_num
87
        jae     .fail
88
 
89
        xchg    eax, edx
90
        and     al, 3
91
        call    [hotkey_tests + edx*4]
92
        cmp     al, 1
93
        pop     eax
94
        ret
2209 Serge 95
;--------------------------------------
92 diamond 96
.fail:
2434 Serge 97
        stc
98
        pop     eax
99
        ret
2209 Serge 100
;---------------------------------------------------------------------
1 ha 101
align 4
2010 serge 102
set_keyboard_data:
2434 Serge 103
        movzx   eax, word[TASK_COUNT]; top window process
104
        movzx   eax, word[WIN_POS+eax*2]
105
        shl     eax, 8
106
        mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
107
        mov     [keyboard_mode], al
108
 
109
        mov     eax, ecx
110
 
111
        push    ebx esi edi ebp
112
        call    send_scancode
113
        pop     ebp edi esi ebx
114
        ret
2209 Serge 115
;---------------------------------------------------------------------
2010 serge 116
align 4
1 ha 117
irq1:
2434 Serge 118
        movzx   eax, word[TASK_COUNT]; top window process
119
        movzx   eax, word[WIN_POS+eax*2]
120
        shl     eax, 8
121
        mov     al, [SLOT_BASE+eax+APPDATA.keyboard_mode]
122
        mov     [keyboard_mode], al
123
 
124
        in      al, 0x60
2209 Serge 125
;--------------------------------------
2010 serge 126
send_scancode:
2434 Serge 127
        mov     [keyboard_data], al
92 diamond 128
; ch = scancode
129
; cl = ext_code
130
; bh = 0 - normal key
131
; bh = 1 - modifier (Shift/Ctrl/Alt)
132
; bh = 2 - extended code
2434 Serge 133
        mov     ch, al
134
        cmp     al, 0xE0
135
        je      @f
136
 
137
        cmp     al, 0xE1
138
        jne     .normal_code
2209 Serge 139
@@:
2434 Serge 140
        mov     bh, 2
141
        mov     [ext_code], al
142
        jmp     .writekey
2209 Serge 143
;--------------------------------------
144
.normal_code:
2434 Serge 145
        mov     cl, 0
146
        xchg    cl, [ext_code]
147
        and     al, 0x7F
148
        mov     bh, 1
2209 Serge 149
@@:
2434 Serge 150
        cmp     al, 0x2A
151
        jne     @f
152
 
153
        cmp     cl, 0xE0
154
        je      .writekey
155
 
156
        mov     eax, VKEY_LSHIFT
157
        jmp     .modifier
2209 Serge 158
;--------------------------------------
159
@@:
2434 Serge 160
        cmp     al, 0x36
161
        jne     @f
162
 
163
        cmp     cl, 0xE0
164
        je      .writekey
165
 
166
        mov     eax, VKEY_RSHIFT
167
        jmp     .modifier
2209 Serge 168
;--------------------------------------
169
@@:
2434 Serge 170
        cmp     al, 0x38
171
        jne     @f
172
 
173
        mov     eax, VKEY_LALT
174
        test    cl, cl
175
        jz      .modifier
176
 
177
        mov     al, VKEY_RALT
178
        jmp     .modifier
2209 Serge 179
;--------------------------------------
180
@@:
2434 Serge 181
        cmp     al, 0x1D
182
        jne     @f
183
 
184
        mov     eax, VKEY_LCONTROL
185
        test    cl, cl
186
        jz      .modifier
187
 
188
        mov     al, VKEY_RCONTROL
189
        cmp     cl, 0xE0
190
        jz      .modifier
191
 
192
        mov     [ext_code], cl
193
        jmp     .writekey
2209 Serge 194
;--------------------------------------
195
@@:
2434 Serge 196
        cmp     al, 0x3A
197
        jne     @f
198
 
199
        mov     bl, 4
200
        mov     eax, VKEY_CAPSLOCK
201
        jmp     .no_key.xor
2209 Serge 202
;--------------------------------------
203
@@:
2434 Serge 204
        cmp     al, 0x45
205
        jne     @f
206
        test    cl, cl
207
        jnz     .writekey
208
 
209
        mov     bl, 2
210
        mov     eax, VKEY_NUMLOCK
211
        jmp     .no_key.xor
2209 Serge 212
;--------------------------------------
213
@@:
2434 Serge 214
        cmp     al, 0x46
215
        jne     @f
216
 
217
        mov     bl, 1
218
        mov     eax, VKEY_SCRLOCK
219
        jmp     .no_key.xor
2209 Serge 220
;--------------------------------------
221
@@:
2434 Serge 222
        xor     ebx, ebx
223
        test    ch, ch
224
        js      .writekey
225
 
226
        movzx   eax, ch          ; plain key
227
        mov     bl, [keymap+eax]
228
        mov     edx, [kb_state]
229
        test    dl, VKEY_CONTROL ; ctrl alt del
230
        jz      .noctrlaltdel
231
 
232
        test    dl, VKEY_ALT
233
        jz      .noctrlaltdel
234
 
235
        cmp     ch, 53h
236
        jne     .noctrlaltdel
237
 
238
        mov     [ctrl_alt_del], 1
2209 Serge 239
.noctrlaltdel:
2434 Serge 240
        test    dl, VKEY_CONTROL ; ctrl on ?
241
        jz      @f
242
 
243
        sub     bl, 0x60
2209 Serge 244
@@:
2434 Serge 245
        test    dl, VKEY_CAPSLOCK        ; caps lock on ?
246
        jz      .no_caps_lock
247
 
248
        test    dl, VKEY_SHIFT   ; shift on ?
249
        jz      .keymap_shif
250
 
251
        jmp     @f
2209 Serge 252
;--------------------------------------
253
.no_caps_lock:
2434 Serge 254
        test    dl, VKEY_SHIFT   ; shift on ?
255
        jz      @f
256
.keymap_shif:
257
        mov     bl, [keymap_shift+eax]
2209 Serge 258
@@:
2434 Serge 259
        test    dl, VKEY_ALT     ; alt on ?
260
        jz      @f
261
 
262
        mov     bl, [keymap_alt+eax]
2209 Serge 263
@@:
2434 Serge 264
        jmp     .writekey
2209 Serge 265
;--------------------------------------
92 diamond 266
.modifier:
2434 Serge 267
        test    ch, ch
268
        js      .modifier.up
269
        or      [kb_state], eax
270
        jmp     .writekey
2209 Serge 271
;--------------------------------------
92 diamond 272
.modifier.up:
2434 Serge 273
        not     eax
274
        and     [kb_state], eax
275
        jmp     .writekey
2209 Serge 276
;--------------------------------------
92 diamond 277
.no_key.xor:
2434 Serge 278
        mov     bh, 0
279
        test    ch, ch
280
        js      .writekey
281
 
282
        xor     [kb_state], eax
283
        xor     [kb_lights], bl
284
        call    set_lights
92 diamond 285
.writekey:
286
; test for system hotkeys
2434 Serge 287
        movzx   eax, ch
288
        cmp     bh, 1
289
        ja      .nohotkey
290
        jb      @f
291
 
292
        xor     eax, eax
92 diamond 293
@@:
2434 Serge 294
        mov     eax, [hotkey_scancodes + eax*4]
92 diamond 295
.hotkey_loop:
2434 Serge 296
        test    eax, eax
297
        jz      .nohotkey
298
 
299
        mov     cl, 0
300
        call    hotkey_do_test
301
        jc      .hotkey_cont
302
 
303
        mov     cl, 2
304
        call    hotkey_do_test
305
        jc      .hotkey_cont
306
 
307
        mov     cl, 4
308
        call    hotkey_do_test
309
        jnc     .hotkey_found
92 diamond 310
.hotkey_cont:
2434 Serge 311
        mov     eax, [eax]
312
        jmp     .hotkey_loop
2209 Serge 313
;--------------------------------------
92 diamond 314
.hotkey_found:
2434 Serge 315
        mov     eax, [eax+8]
92 diamond 316
; put key in buffer for process in slot eax
2434 Serge 317
        mov     edi, hotkey_buffer
92 diamond 318
@@:
2434 Serge 319
        cmp     dword [edi], 0
320
        jz      .found_free
321
 
322
        add     edi, 8
323
        cmp     edi, hotkey_buffer+120*8
324
        jb      @b
92 diamond 325
; no free space - replace first entry
2434 Serge 326
        mov     edi, hotkey_buffer
92 diamond 327
.found_free:
2434 Serge 328
        mov     [edi], eax
329
        movzx   eax, ch
330
        cmp     bh, 1
331
        jnz     @f
332
 
333
        xor     eax, eax
92 diamond 334
@@:
2434 Serge 335
        mov     [edi+4], ax
336
        mov     eax, [kb_state]
337
        mov     [edi+6], ax
338
        jmp     .exit.irq1
2209 Serge 339
;--------------------------------------
92 diamond 340
.nohotkey:
2434 Serge 341
        cmp     [keyboard_mode], 0; return from keymap
342
        jne     .scancode
343
 
344
        test    bh, bh
345
        jnz     .exit.irq1
346
 
347
        test    bl, bl
348
        jz      .exit.irq1
582 Rus 349
 
2434 Serge 350
        test    [kb_state], VKEY_NUMLOCK
641 diamond 351
        jz      .dowrite
2434 Serge 352
 
353
        cmp     cl, 0xE0
354
        jz      .dowrite
355
 
356
        cmp     ch, 55
357
        jnz     @f
358
 
359
        mov     bl, 0x2A        ;*
360
        jmp     .dowrite
2209 Serge 361
;--------------------------------------
362
@@:
2434 Serge 363
        cmp     ch, 71
364
        jb      .dowrite
365
 
366
        cmp     ch, 83
367
        ja      .dowrite
368
 
369
        movzx   eax, ch
370
        mov     bl, [numlock_map + eax - 71]
371
        jmp     .dowrite
2209 Serge 372
;--------------------------------------
92 diamond 373
.scancode:
2434 Serge 374
        mov     bl, ch
92 diamond 375
.dowrite:
2434 Serge 376
        movzx   eax, byte[KEY_COUNT]
377
        cmp     al, 120
378
        jae     .exit.irq1
379
        inc     eax
380
        mov     [KEY_COUNT], al
381
        mov     [KEY_COUNT+eax], bl
2209 Serge 382
.exit.irq1:
2434 Serge 383
        mov     [check_idle_semaphore], 5
384
        ret
2209 Serge 385
;---------------------------------------------------------------------
1 ha 386
set_lights:
2434 Serge 387
        mov     al, 0xED
388
        call    kb_write
389
        mov     al, [kb_lights]
390
        call    kb_write
391
        ret
2209 Serge 392
;---------------------------------------------------------------------
582 Rus 393
numlock_map:
2434 Serge 394
    db   0x37   ;Num 7
395
    db   0x38   ;Num 8
396
    db   0x39   ;Num 9
397
    db   0x2D   ;Num -
398
    db   0x34   ;Num 4
399
    db   0x35   ;Num 5
400
    db   0x36   ;Num 6
401
    db   0x2B   ;Num +
402
    db   0x31   ;Num 1
403
    db   0x32   ;Num 2
404
    db   0x33   ;Num 3
405
    db   0x30   ;Num 0
406
    db   0x2E   ;Num .
2209 Serge 407
;---------------------------------------------------------------------