Subversion Repositories Kolibri OS

Rev

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

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