Subversion Repositories Kolibri OS

Rev

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