Subversion Repositories Kolibri OS

Rev

Rev 8 | Rev 92 | 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
29
endg
30
 
31
align 4
32
irq1:
40 halyavin 33
       save_ring3_context
8 poddubny 34
       mov   ax, os_data
35
       mov   ds, ax
36
       mov   es, ax
1 ha 37
 
38
       movzx eax,word[0x3004] ; top window process
39
       movzx eax,word[0xC400+eax*2]
40
       shl   eax,8
41
       mov   al,[0x800B4+eax]
42
       mov   [keyboard_mode],al
43
 
44
       in    al,0x60
45
       mov   [keyboard_data],al
46
 
47
       mov   ch,al
48
       cmp   al,0xE0
49
       je    @f
50
       cmp   al,0xE1
51
       jne   .normal_code
52
   @@: mov   [ext_code],al
53
       jmp   .no_key.end
54
   .normal_code:
55
       mov   cl,[ext_code]
56
       mov   [ext_code],0
57
       and   al,0x7F
58
   @@: cmp   al,0x2A
59
       jne   @f
60
       cmp   cl,0xE0
61
       je    .no_key.end
62
       mov   eax,VKEY_LSHIFT
63
       jmp   .no_key
64
   @@: cmp   al,0x36
65
       jne   @f
66
       cmp   cl,0xE0
67
       je    .no_key.end
68
       mov   eax,VKEY_RSHIFT
69
       jmp   .no_key
70
   @@: cmp   al,0x38
71
       jne   @f
72
       cmp   cl,0xE0
73
       je    .alt.r
74
       mov   eax,VKEY_LALT
75
       jmp   .no_key
76
   .alt.r:
77
       mov   eax,VKEY_RALT
78
       jmp   .no_key
79
   @@: cmp   al,0x1D
80
       jne   @f
81
       cmp   cl,0
82
       jne   .ctrl.r
83
       mov   eax,VKEY_LCONTROL
84
       jmp   .no_key
85
   .ctrl.r:
86
       cmp   cl,0xE1
87
       jne   .ctrl.r.2
88
       mov   [ext_code],cl
89
       jmp   .no_key.end
90
   .ctrl.r.2:
91
       mov   eax,VKEY_RCONTROL
92
       jmp   .no_key
93
   @@: cmp   al,0x3A
94
       jne   @f
95
       mov   bl,4
96
       mov   eax,VKEY_CAPSLOCK
97
       jmp   .no_key.xor
98
   @@: cmp   al,0x45
99
       jne   @f
100
       cmp   cl,0
101
       jne   .no_key.end
102
       mov   bl,2
103
       mov   eax,VKEY_NUMLOCK
104
       jmp   .no_key.xor
105
   @@: cmp   al,0x46
106
       jne   @f
107
       mov   bl,1
108
       mov   eax,VKEY_SCRLOCK
109
       jmp   .no_key.xor
110
   @@:
111
       test  ch,0x80
112
       jnz   .no_key.end
113
       movzx eax,ch              ; plain key
114
       mov   bl,[keymap+eax]
115
       mov   edx,[kb_state]
116
       test  dl,VKEY_CONTROL     ; ctrl alt del
117
       jz    .noctrlaltdel
118
       test  dl,VKEY_ALT
119
       jz    .noctrlaltdel
120
       cmp   bl,134+48
121
       jne   .noctrlaltdel
122
       mov   [ctrl_alt_del],1
123
       jmp   .no_key.end
124
   .noctrlaltdel:
125
       test  dl,VKEY_CONTROL     ; ctrl on ?
126
       jz    @f
127
       sub   bl,0x60
128
   @@: test  dl,VKEY_SHIFT       ; shift on ?
129
       jz    @f
130
       mov   bl,[keymap_shift+eax]
131
   @@: test  dl,VKEY_ALT         ; alt on ?
132
       jz    @f
133
       mov   bl,[keymap_alt+eax]
134
; alt mouse ?
135
       xor   edx,edx
136
       cmp   bl,178
137
       jnz   .no_alt.up
138
       mov   edx,5*65536
139
       jmp   .mouse.change
140
   .no_alt.up:
141
       cmp   bl,177
142
       jnz   .no_alt.down
143
       mov   edx,251*65536
144
       jmp   .mouse.change
145
   .no_alt.down:
146
       cmp   bl,176
147
       jnz   .no_alt.left
148
       mov   edx,251*256
149
       jmp   .mouse.change
150
   .no_alt.left:
151
       cmp   bl,179
152
       jnz   .no_alt.right
153
       mov   edx,5*256
154
       jmp   .mouse.change
155
   .no_alt.right:
156
       cmp   bl,' '
157
       jne   @f
158
       xor   [altmouseb],1
159
   .mouse.change:
160
       mov   byte[0xF604],1; ps2 data
161
       mov   byte[0xFB00],0; ps2 chunk count
162
       mov   word[0x2E0000+4096*12],3; mouse data count
163
       mov   dl,[altmouseb]
164
       mov   [0x2E0000+4096*12+0x10],edx
165
       mov   bl,0
166
   @@:
167
       cmp   [keyboard_mode],0 ; return from keymap
168
       jne   .no_key.end
169
       mov   [keyboard_mode_sys],0
170
       cmp   bl,0
171
       je    .no_key.end
172
       movzx eax,byte[0xF400]
173
       cmp   al,120
174
       jae   .no_key.end
175
       inc   al
176
       mov   [0xF400],al
177
       mov   [0xF400+eax],bl
178
 
179
       jmp   .no_key.end
180
 
181
   .no_key:
182
       test  ch,0x80
183
       jz    .no_key.down
184
       not   eax
185
       and   [kb_state],eax
186
       jmp   .no_key.end
187
   .no_key.xor:
188
       test  ch,0x80
189
       jnz   .no_key.end
190
       xor   [kb_state],eax
191
       xor   [kb_lights],bl
192
       call  set_lights
193
       jmp   .no_key.end
194
   .no_key.down:
195
       or    [kb_state],eax
196
   .no_key.end:
197
       cmp   [keyboard_mode],1 ; return scancode
198
       jne   .no_scancode
199
       mov   [keyboard_mode_sys],1
200
       movzx eax,byte[0xF400]
201
       cmp   al,120
202
       jae   .no_scancode
203
       inc   al
204
       mov   [0xF400],al
205
       mov   [0xF400+eax],ch
206
   .no_scancode:
207
 
208
   .exit.irq1:
209
       mov   [check_idle_semaphore],5
210
 
211
       mov   al,0x20                  ; ready for next irq
212
       out   0x20,al
213
 
40 halyavin 214
       restore_ring3_context
8 poddubny 215
       iret
1 ha 216
 
217
set_lights:
218
       mov   al,0xED
219
       call  kb_write
220
       mov   al,[kb_lights]
221
       call  kb_write
222
       ret
223
 
224
;// mike.dld ]