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