Subversion Repositories Kolibri OS

Rev

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

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