Subversion Repositories Kolibri OS

Rev

Rev 3320 | Rev 3356 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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