Subversion Repositories Kolibri OS

Rev

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

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