Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1 ha 1
;// mike.dld [
2
 
3
VKEY_LSHIFT   = 0000000000000001b
4
VKEY_RSHIFT   = 0000000000000010b
5
VKEY_LCONTROL = 0000000000000100b
6
VKEY_RCONTROL = 0000000000001000b
7
VKEY_LALT     = 0000000000010000b
8
VKEY_RALT     = 0000000000100000b
9
VKEY_CAPSLOCK = 0000000001000000b
10
VKEY_NUMLOCK  = 0000000010000000b
11
VKEY_SCRLOCK  = 0000000100000000b
12
 
13
VKEY_SHIFT    = 0000000000000011b
14
VKEY_CONTROL  = 0000000000001100b
15
VKEY_ALT      = 0000000000110000b
16
 
17
uglobal
18
  align 4
19
  kb_state      dd 0
20
  ext_code      db 0
21
 
22
  keyboard_mode db 0
23
  keyboard_data db 0
24
 
25
  altmouseb     db 0
26
  ctrl_alt_del  db 0
27
 
28
  kb_lights     db 0
92 diamond 29
 
30
align 4
31
        hotkey_scancodes        rd      256     ; we have 256 scancodes
32
        hotkey_list             rd      256*4   ; max 256 defined hotkeys
33
        hotkey_buffer           rd      120*2   ; buffer for 120 hotkeys
1 ha 34
endg
35
 
92 diamond 36
iglobal
37
hotkey_tests    dd      hotkey_test0
38
                dd      hotkey_test1
39
                dd      hotkey_test2
40
                dd      hotkey_test3
41
                dd      hotkey_test4
42
hotkey_tests_num = 5
43
endg
44
 
45
hotkey_test0:
46
        test    al, al
47
        setz    al
48
        ret
49
hotkey_test1:
50
        test    al, al
51
        setnp   al
52
        ret
53
hotkey_test2:
54
        cmp     al, 3
55
        setz    al
56
        ret
57
hotkey_test3:
58
        cmp     al, 1
59
        setz    al
60
        ret
61
hotkey_test4:
62
        cmp     al, 2
63
        setz    al
64
        ret
65
 
66
hotkey_do_test:
67
        push    eax
68
        mov     edx, [kb_state]
69
        shr     edx, cl
70
        add     cl, cl
71
        mov     eax, [eax+4]
72
        shr     eax, cl
73
        and     eax, 15
74
        cmp     al, hotkey_tests_num
75
        jae     .fail
76
        xchg    eax, edx
77
        and     al, 3
78
        call    [hotkey_tests + edx*4]
79
        cmp     al, 1
80
        pop     eax
81
        ret
82
.fail:
83
        stc
84
        pop     eax
85
        ret
86
 
1 ha 87
align 4
88
irq1:
40 halyavin 89
       save_ring3_context
8 poddubny 90
       mov   ax, os_data
91
       mov   ds, ax
92
       mov   es, ax
1 ha 93
 
115 poddubny 94
       mov   eax, [0x3004] ; top window process
1 ha 95
       movzx eax,word[0xC400+eax*2]
96
       shl   eax,8
115 poddubny 97
       mov   al,[0x80000+eax+APPDATA.keyboard_mode]
1 ha 98
       mov   [keyboard_mode],al
99
 
100
       in    al,0x60
101
       mov   [keyboard_data],al
102
 
92 diamond 103
; ch = scancode
104
; cl = ext_code
105
; bh = 0 - normal key
106
; bh = 1 - modifier (Shift/Ctrl/Alt)
107
; bh = 2 - extended code
108
 
1 ha 109
       mov   ch,al
110
       cmp   al,0xE0
111
       je    @f
112
       cmp   al,0xE1
113
       jne   .normal_code
92 diamond 114
   @@:
115
        mov     bh, 2
116
        mov     [ext_code], al
117
        jmp     .writekey
1 ha 118
   .normal_code:
92 diamond 119
        mov     cl, 0
120
        xchg    cl, [ext_code]
1 ha 121
       and   al,0x7F
92 diamond 122
        mov     bh, 1
1 ha 123
   @@: cmp   al,0x2A
124
       jne   @f
125
       cmp   cl,0xE0
92 diamond 126
       je    .writekey
1 ha 127
       mov   eax,VKEY_LSHIFT
92 diamond 128
       jmp   .modifier
1 ha 129
   @@: cmp   al,0x36
130
       jne   @f
131
       cmp   cl,0xE0
92 diamond 132
       je    .writekey
1 ha 133
       mov   eax,VKEY_RSHIFT
92 diamond 134
       jmp   .modifier
1 ha 135
   @@: cmp   al,0x38
136
       jne   @f
92 diamond 137
        mov     eax, VKEY_LALT
138
        test    cl, cl
139
        jz      .modifier
140
        mov     al, VKEY_RALT
141
        jmp     .modifier
1 ha 142
   @@: cmp   al,0x1D
143
       jne   @f
92 diamond 144
        mov     eax, VKEY_LCONTROL
145
        test    cl, cl
146
        jz      .modifier
147
        mov     al, VKEY_RCONTROL
148
        cmp     cl, 0xE0
149
        jz      .modifier
150
        mov     [ext_code], cl
151
        jmp     .writekey
1 ha 152
   @@: cmp   al,0x3A
153
       jne   @f
154
       mov   bl,4
155
       mov   eax,VKEY_CAPSLOCK
156
       jmp   .no_key.xor
157
   @@: cmp   al,0x45
158
       jne   @f
92 diamond 159
        test    cl, cl
160
        jnz     .writekey
1 ha 161
       mov   bl,2
162
       mov   eax,VKEY_NUMLOCK
163
       jmp   .no_key.xor
164
   @@: cmp   al,0x46
165
       jne   @f
166
       mov   bl,1
167
       mov   eax,VKEY_SCRLOCK
168
       jmp   .no_key.xor
169
   @@:
92 diamond 170
       test  ch,ch
171
       js    .writekey
1 ha 172
       movzx eax,ch              ; plain key
173
       mov   bl,[keymap+eax]
174
       mov   edx,[kb_state]
175
       test  dl,VKEY_CONTROL     ; ctrl alt del
176
       jz    .noctrlaltdel
177
       test  dl,VKEY_ALT
178
       jz    .noctrlaltdel
92 diamond 179
       cmp   ch,53h
1 ha 180
       jne   .noctrlaltdel
181
       mov   [ctrl_alt_del],1
182
   .noctrlaltdel:
183
       test  dl,VKEY_CONTROL     ; ctrl on ?
184
       jz    @f
185
       sub   bl,0x60
186
   @@: test  dl,VKEY_SHIFT       ; shift on ?
187
       jz    @f
188
       mov   bl,[keymap_shift+eax]
189
   @@: test  dl,VKEY_ALT         ; alt on ?
190
       jz    @f
191
       mov   bl,[keymap_alt+eax]
192
; alt mouse ?
193
       xor   edx,edx
194
       cmp   bl,178
195
       jnz   .no_alt.up
196
       mov   edx,5*65536
197
       jmp   .mouse.change
198
   .no_alt.up:
199
       cmp   bl,177
200
       jnz   .no_alt.down
201
       mov   edx,251*65536
202
       jmp   .mouse.change
203
   .no_alt.down:
204
       cmp   bl,176
205
       jnz   .no_alt.left
206
       mov   edx,251*256
207
       jmp   .mouse.change
208
   .no_alt.left:
209
       cmp   bl,179
210
       jnz   .no_alt.right
211
       mov   edx,5*256
212
       jmp   .mouse.change
213
   .no_alt.right:
214
       cmp   bl,' '
215
       jne   @f
216
       xor   [altmouseb],1
217
   .mouse.change:
218
       mov   byte[0xF604],1; ps2 data
219
       mov   byte[0xFB00],0; ps2 chunk count
220
       mov   word[0x2E0000+4096*12],3; mouse data count
221
       mov   dl,[altmouseb]
222
       mov   [0x2E0000+4096*12+0x10],edx
223
       mov   bl,0
224
   @@:
92 diamond 225
        mov     bh, 0
226
        jmp     .writekey
227
.modifier:
228
        test    ch, ch
229
        js      .modifier.up
230
        or      [kb_state], eax
231
        jmp     .writekey
232
.modifier.up:
233
        not     eax
234
        and     [kb_state], eax
235
        jmp     .writekey
236
.no_key.xor:
237
        mov     bh, 0
238
        test    ch, ch
239
        js      .writekey
240
        xor     [kb_state], eax
241
        xor     [kb_lights], bl
242
        call    set_lights
243
 
244
.writekey:
245
; test for system hotkeys
246
        movzx   eax, ch
247
        cmp     bh, 1
248
        ja      .nohotkey
249
        jb      @f
250
        xor     eax, eax
251
@@:
252
        mov     eax, [hotkey_scancodes + eax*4]
253
.hotkey_loop:
254
        test    eax, eax
255
        jz      .nohotkey
256
        mov     cl, 0
257
        call    hotkey_do_test
258
        jc      .hotkey_cont
259
        mov     cl, 2
260
        call    hotkey_do_test
261
        jc      .hotkey_cont
262
        mov     cl, 4
263
        call    hotkey_do_test
264
        jnc     .hotkey_found
265
.hotkey_cont:
266
        mov     eax, [eax]
267
        jmp     .hotkey_loop
268
.hotkey_found:
269
        mov     eax, [eax+8]
270
; put key in buffer for process in slot eax
271
        mov     edi, hotkey_buffer
272
@@:
273
        cmp     dword [edi], 0
274
        jz      .found_free
275
        add     edi, 8
276
        cmp     edi, hotkey_buffer+120*8
277
        jb      @b
278
; no free space - replace first entry
279
        mov     edi, hotkey_buffer
280
.found_free:
281
        mov     [edi], eax
282
        movzx   eax, ch
283
        cmp     bh, 1
284
        jnz     @f
285
        xor     eax, eax
286
@@:
287
        mov     [edi+4], ax
288
        mov     eax, [kb_state]
289
        mov     [edi+6], ax
290
        jmp     .exit.irq1
291
.nohotkey:
1 ha 292
       cmp   [keyboard_mode],0 ; return from keymap
92 diamond 293
       jne   .scancode
294
        test    bh, bh
295
        jnz     .exit.irq1
296
        test    bl, bl
297
        jz      .exit.irq1
298
        jmp     .dowrite
299
.scancode:
300
        mov     bl, ch
301
.dowrite:
1 ha 302
       movzx eax,byte[0xF400]
303
       cmp   al,120
92 diamond 304
       jae   .exit.irq1
305
       inc   eax
1 ha 306
       mov   [0xF400],al
307
       mov   [0xF400+eax],bl
308
 
309
   .exit.irq1:
310
       mov   [check_idle_semaphore],5
311
 
312
       mov   al,0x20                  ; ready for next irq
313
       out   0x20,al
314
 
40 halyavin 315
       restore_ring3_context
8 poddubny 316
       iret
1 ha 317
 
318
set_lights:
319
       mov   al,0xED
320
       call  kb_write
321
       mov   al,[kb_lights]
322
       call  kb_write
323
       ret
324
 
325
;// mike.dld ]