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 ] |