Rev 1547 | Rev 2549 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1547 | Asper | 1 | ; |
2 | ; ZKEY. Version 0.5. |
||
3 | ; Virtual keyboard for KolibriOS. |
||
4 | ; |
||
5 | ; Author: Asper |
||
6 | ; Date of issue: 26.08.2009 |
||
7 | ; Compiler: FASM |
||
8 | ; Target: KolibriOS |
||
9 | ; |
||
10 | |||
11 | use32 |
||
12 | org 0x0 |
||
13 | |||
14 | db 'MENUET00' ; 8 byte id |
||
15 | dd 38 ; required os |
||
16 | dd STARTAPP ; program start |
||
17 | dd I_END ; program image size |
||
18 | dd 0x100000 ; required amount of memory |
||
19 | dd 0x00000000 ; reserved=no extended header |
||
20 | |||
1728 | clevermous | 21 | include "ASPAPI.INC" |
1547 | Asper | 22 | |
23 | N_KEYCOLOR equ 0x00677889 ; Normal button color |
||
24 | C_KEYCOLOR equ 0x00344556 ; Control button color |
||
25 | L_KEYCOLOR equ 0x00258778 ; Lock button color |
||
26 | TEXTCOLOR equ 0x00FFFFFF ; Button caption color |
||
27 | |||
28 | |||
29 | STARTAPP: |
||
30 | mov ecx, 1 ; to send scancodes. |
||
31 | call set_keyboard_mode |
||
32 | |||
33 | call reload_ascii_keymap |
||
34 | call draw_window |
||
35 | jmp get_zkey_window_slot_number |
||
36 | |||
37 | draw_window: |
||
38 | test byte [red_type], 1 |
||
39 | jnz @f |
||
40 | test byte [red_type], 2 |
||
41 | jnz .draw_switch_button |
||
42 | start_draw_window 100,370,600,210,0x04224466,labelt, 35;labellen-labelt |
||
43 | |||
44 | stdcall draw_button, 15,50,23,20,2,N_KEYCOLOR,keyText,3,TEXTCOLOR ; Esc |
||
45 | |||
46 | stdcall draw_button, 70,50,23,20,3,N_KEYCOLOR,keyText+3,2,TEXTCOLOR ; F1 |
||
47 | stdcall draw_button, 95,50,23,20,4,N_KEYCOLOR,keyText+5,2,TEXTCOLOR ; F2 |
||
48 | stdcall draw_button, 120,50,23,20,5,N_KEYCOLOR,keyText+7,2,TEXTCOLOR ; F3 |
||
49 | stdcall draw_button, 145,50,23,20,6,N_KEYCOLOR,keyText+9,2,TEXTCOLOR ; F4 |
||
50 | |||
51 | stdcall draw_button, 183,50,23,20,7,N_KEYCOLOR,keyText+11,2,TEXTCOLOR ; F5 |
||
52 | stdcall draw_button, 208,50,23,20,8,N_KEYCOLOR,keyText+13,2,TEXTCOLOR ; F6 |
||
53 | stdcall draw_button, 233,50,23,20,9,N_KEYCOLOR,keyText+15,2,TEXTCOLOR ; F7 |
||
54 | stdcall draw_button, 258,50,23,20,10,N_KEYCOLOR,keyText+17,2,TEXTCOLOR ; F8 |
||
55 | |||
56 | stdcall draw_button, 296,50,23,20,11,N_KEYCOLOR,keyText+19,2,TEXTCOLOR ; F9 |
||
57 | stdcall draw_button, 321,50,23,20,12,N_KEYCOLOR,keyText+21,3,TEXTCOLOR ; F10 |
||
58 | stdcall draw_button, 346,50,23,20,13,N_KEYCOLOR,keyText+24,3,TEXTCOLOR ; F11 |
||
59 | stdcall draw_button, 371,50,23,20,14,N_KEYCOLOR,keyText+27,3,TEXTCOLOR ; F12 |
||
60 | @@: |
||
61 | stdcall draw_button, 15,80,23,20,15,N_KEYCOLOR,ascii_keymap+41,1,TEXTCOLOR ;keyText+30,2,TEXTCOLOR ; ~ |
||
62 | stdcall draw_button, 40,80,23,20,16,N_KEYCOLOR,ascii_keymap+2,1,TEXTCOLOR ;keyText+32,2,TEXTCOLOR ; 1! |
||
63 | stdcall draw_button, 65,80,23,20,17,N_KEYCOLOR,ascii_keymap+3,1,TEXTCOLOR ;keyText+34,2,TEXTCOLOR ; 2@ |
||
64 | stdcall draw_button, 90,80,23,20,18,N_KEYCOLOR,ascii_keymap+4,1,TEXTCOLOR ;keyText+36,2,TEXTCOLOR ; 3# |
||
65 | stdcall draw_button, 115,80,23,20,19,N_KEYCOLOR,ascii_keymap+5,1,TEXTCOLOR ;keyText+38,2,TEXTCOLOR ; 4$ |
||
66 | stdcall draw_button, 140,80,23,20,20,N_KEYCOLOR,ascii_keymap+6,1,TEXTCOLOR ;keyText+40,2,TEXTCOLOR ; 5% |
||
67 | stdcall draw_button, 165,80,23,20,21,N_KEYCOLOR,ascii_keymap+7,1,TEXTCOLOR ;keyText+42,2,TEXTCOLOR ; 6^ |
||
68 | stdcall draw_button, 190,80,23,20,22,N_KEYCOLOR,ascii_keymap+8,1,TEXTCOLOR ;keyText+44,2,TEXTCOLOR ; 7& |
||
69 | stdcall draw_button, 215,80,23,20,23,N_KEYCOLOR,ascii_keymap+9,1,TEXTCOLOR ;keyText+46,2,TEXTCOLOR ; 8* |
||
70 | stdcall draw_button, 240,80,23,20,24,N_KEYCOLOR,ascii_keymap+10,1,TEXTCOLOR ;keyText+48,2,TEXTCOLOR ; 9( |
||
71 | stdcall draw_button, 265,80,23,20,25,N_KEYCOLOR,ascii_keymap+11,1,TEXTCOLOR ;keyText+50,2,TEXTCOLOR ; 0) |
||
72 | stdcall draw_button, 290,80,23,20,26,N_KEYCOLOR,ascii_keymap+12,1,TEXTCOLOR ;keyText+52,2,TEXTCOLOR ; -_ |
||
73 | stdcall draw_button, 315,80,23,20,27,N_KEYCOLOR,ascii_keymap+13,1,TEXTCOLOR ;keyText+54,2,TEXTCOLOR ; =+ |
||
74 | stdcall draw_button, 340,80,23,20,28,N_KEYCOLOR,ascii_keymap+43,1,TEXTCOLOR ;keyText+56,2,TEXTCOLOR ; \| |
||
75 | stdcall draw_button, 365,80,30,20,29,N_KEYCOLOR,keyText+58,4,TEXTCOLOR ; bksp |
||
76 | |||
77 | stdcall draw_button, 15 ,103,33,20,30,N_KEYCOLOR,keyText+62,3,TEXTCOLOR ; Tab |
||
78 | stdcall draw_button, 50 ,103,23,20,31,N_KEYCOLOR,ascii_keymap+16,1,TEXTCOLOR ;keyText+65,2,TEXTCOLOR ; Q |
||
79 | stdcall draw_button, 75 ,103,23,20,32,N_KEYCOLOR,ascii_keymap+17,1,TEXTCOLOR ;keyText+67,2,TEXTCOLOR ; W |
||
80 | stdcall draw_button, 100,103,23,20,33,N_KEYCOLOR,ascii_keymap+18,1,TEXTCOLOR ;keyText+69,2,TEXTCOLOR ; E |
||
81 | stdcall draw_button, 125,103,23,20,34,N_KEYCOLOR,ascii_keymap+19,1,TEXTCOLOR ;keyText+71,2,TEXTCOLOR ; R |
||
82 | stdcall draw_button, 150,103,23,20,35,N_KEYCOLOR,ascii_keymap+20,1,TEXTCOLOR ;keyText+73,2,TEXTCOLOR ; T |
||
83 | stdcall draw_button, 175,103,23,20,36,N_KEYCOLOR,ascii_keymap+21,1,TEXTCOLOR ;keyText+75,2,TEXTCOLOR ; Y |
||
84 | stdcall draw_button, 200,103,23,20,37,N_KEYCOLOR,ascii_keymap+22,1,TEXTCOLOR ;keyText+77,2,TEXTCOLOR ; U |
||
85 | stdcall draw_button, 225,103,23,20,38,N_KEYCOLOR,ascii_keymap+23,1,TEXTCOLOR ;keyText+79,2,TEXTCOLOR ; I |
||
86 | stdcall draw_button, 250,103,23,20,39,N_KEYCOLOR,ascii_keymap+24,1,TEXTCOLOR ;keyText+81,2,TEXTCOLOR ; O |
||
87 | stdcall draw_button, 275,103,23,20,40,N_KEYCOLOR,ascii_keymap+25,1,TEXTCOLOR ;keyText+83,2,TEXTCOLOR ; P |
||
88 | stdcall draw_button, 300,103,23,20,41,N_KEYCOLOR,ascii_keymap+26,1,TEXTCOLOR ;keyText+85,3,TEXTCOLOR ; [{ |
||
89 | stdcall draw_button, 325,103,23,20,42,N_KEYCOLOR,ascii_keymap+27,1,TEXTCOLOR ;keyText+88,3,TEXTCOLOR ; ]} |
||
90 | stdcall draw_button, 350,103,45,43,43,N_KEYCOLOR,keyText+91,5,TEXTCOLOR ; Enter |
||
91 | |||
92 | stdcall draw_button, 15 ,126,43,20,44,L_KEYCOLOR,keyText+96 ,4,TEXTCOLOR ; lock |
||
93 | stdcall draw_button, 60 ,126,23,20,45,N_KEYCOLOR,ascii_keymap+30,1,TEXTCOLOR ;keyText+100,2,TEXTCOLOR ; A |
||
94 | stdcall draw_button, 85 ,126,23,20,46,N_KEYCOLOR,ascii_keymap+31,1,TEXTCOLOR ;keyText+102,2,TEXTCOLOR ; S |
||
95 | stdcall draw_button, 110,126,23,20,47,N_KEYCOLOR,ascii_keymap+32,1,TEXTCOLOR ;keyText+104,2,TEXTCOLOR ; D |
||
96 | stdcall draw_button, 135,126,23,20,48,N_KEYCOLOR,ascii_keymap+33,1,TEXTCOLOR ;keyText+106,2,TEXTCOLOR ; F |
||
97 | stdcall draw_button, 160,126,23,20,49,N_KEYCOLOR,ascii_keymap+34,1,TEXTCOLOR ;keyText+108,2,TEXTCOLOR ; G |
||
98 | stdcall draw_button, 185,126,23,20,50,N_KEYCOLOR,ascii_keymap+35,1,TEXTCOLOR ;keyText+110,2,TEXTCOLOR ; H |
||
99 | stdcall draw_button, 210,126,23,20,51,N_KEYCOLOR,ascii_keymap+36,1,TEXTCOLOR ;keyText+112,2,TEXTCOLOR ; J |
||
100 | stdcall draw_button, 235,126,23,20,52,N_KEYCOLOR,ascii_keymap+37,1,TEXTCOLOR ;keyText+114,2,TEXTCOLOR ; K |
||
101 | stdcall draw_button, 260,126,23,20,53,N_KEYCOLOR,ascii_keymap+38,1,TEXTCOLOR ;keyText+116,2,TEXTCOLOR ; L |
||
102 | stdcall draw_button, 285,126,23,20,54,N_KEYCOLOR,ascii_keymap+39,1,TEXTCOLOR ;keyText+118,3,TEXTCOLOR ; ;: |
||
103 | stdcall draw_button, 310,126,23,20,55,N_KEYCOLOR,ascii_keymap+40,1,TEXTCOLOR ;keyText+121,3,TEXTCOLOR ; '" |
||
104 | |||
105 | stdcall draw_button, 15 ,149,53,20,56,C_KEYCOLOR,keyText+124,5,TEXTCOLOR ; Shift |
||
106 | stdcall draw_button, 70 ,149,23,20,57,N_KEYCOLOR,ascii_keymap+44,1,TEXTCOLOR ;keyText+129,2,TEXTCOLOR ; Z |
||
107 | stdcall draw_button, 95 ,149,23,20,58,N_KEYCOLOR,ascii_keymap+45,1,TEXTCOLOR ;keyText+131,2,TEXTCOLOR ; X |
||
108 | stdcall draw_button, 120,149,23,20,59,N_KEYCOLOR,ascii_keymap+46,1,TEXTCOLOR ;keyText+133,2,TEXTCOLOR ; C |
||
109 | stdcall draw_button, 145,149,23,20,60,N_KEYCOLOR,ascii_keymap+47,1,TEXTCOLOR ;keyText+135,2,TEXTCOLOR ; V |
||
110 | stdcall draw_button, 170,149,23,20,61,N_KEYCOLOR,ascii_keymap+48,1,TEXTCOLOR ;keyText+137,2,TEXTCOLOR ; B |
||
111 | stdcall draw_button, 195,149,23,20,62,N_KEYCOLOR,ascii_keymap+49,1,TEXTCOLOR ;keyText+139,2,TEXTCOLOR ; N |
||
112 | stdcall draw_button, 220,149,23,20,63,N_KEYCOLOR,ascii_keymap+50,1,TEXTCOLOR ;keyText+141,2,TEXTCOLOR ; M |
||
113 | stdcall draw_button, 245,149,23,20,64,N_KEYCOLOR,ascii_keymap+51,1,TEXTCOLOR ;keyText+143,3,TEXTCOLOR ; ,< |
||
114 | stdcall draw_button, 270,149,23,20,65,N_KEYCOLOR,ascii_keymap+52,1,TEXTCOLOR ;keyText+146,3,TEXTCOLOR ; .> |
||
115 | stdcall draw_button, 295,149,23,20,66,N_KEYCOLOR,ascii_keymap+53,1,TEXTCOLOR ;keyText+149,2,TEXTCOLOR ; /? |
||
116 | |||
117 | test byte [red_type], 1 |
||
118 | jnz @f |
||
119 | stdcall draw_button, 320,149,75,20,67,C_KEYCOLOR,keyText+151,5,TEXTCOLOR ; Shift |
||
120 | |||
121 | stdcall draw_button, 15 ,172,30,20,68,C_KEYCOLOR,keyText+156,4,TEXTCOLOR ; Ctrl |
||
122 | stdcall draw_button, 47 ,172,30,20,69,C_KEYCOLOR,keyText+160,3,TEXTCOLOR ; Win |
||
123 | stdcall draw_button, 79 ,172,30,20,70,C_KEYCOLOR,keyText+163,3,TEXTCOLOR ; Alt |
||
124 | stdcall draw_button, 111,172,156,20,71,N_KEYCOLOR,keyText+166,1,TEXTCOLOR ; Space |
||
125 | stdcall draw_button, 269,172,30,20,72,C_KEYCOLOR,keyText+167,3,TEXTCOLOR ; Alt |
||
126 | stdcall draw_button, 301,172,30,20,73,C_KEYCOLOR,keyText+170,3,TEXTCOLOR ; Win |
||
127 | stdcall draw_button, 333,172,30,20,74,C_KEYCOLOR,keyText+173,3,TEXTCOLOR ; [=] |
||
128 | stdcall draw_button, 365,172,30,20,75,C_KEYCOLOR,keyText+176,4,TEXTCOLOR ; Ctrl |
||
129 | |||
130 | stdcall draw_button, 405,50 ,23,20,76,N_KEYCOLOR,keyText+180,3,TEXTCOLOR ; psc |
||
131 | stdcall draw_button, 430,50 ,23,20,77,L_KEYCOLOR,keyText+183,3,TEXTCOLOR ; slk |
||
132 | stdcall draw_button, 455,50 ,23,20,78,N_KEYCOLOR,keyText+186,3,TEXTCOLOR ; brk |
||
133 | stdcall draw_button, 405,80 ,23,20,79,N_KEYCOLOR,keyText+189,3,TEXTCOLOR ; Ins |
||
134 | stdcall draw_button, 430,80 ,23,20,80,N_KEYCOLOR,keyText+192,2,TEXTCOLOR ; Hm |
||
135 | stdcall draw_button, 455,80 ,23,20,81,N_KEYCOLOR,keyText+194,3,TEXTCOLOR ; Pup |
||
136 | stdcall draw_button, 405,103 ,23,20,82,N_KEYCOLOR,keyText+197,3,TEXTCOLOR ; Del |
||
137 | stdcall draw_button, 430,103 ,23,20,83,N_KEYCOLOR,keyText+200,3,TEXTCOLOR ; End |
||
138 | stdcall draw_button, 455,103 ,23,20,84,N_KEYCOLOR,keyText+203,3,TEXTCOLOR ; Pdn |
||
139 | stdcall draw_button, 430,149,23,20,85,C_KEYCOLOR,keyText+206,1,TEXTCOLOR ; ^ |
||
140 | stdcall draw_button, 405,172,23,20,86,C_KEYCOLOR,keyText+207,1,TEXTCOLOR ; v |
||
141 | stdcall draw_button, 430,172,23,20,87,C_KEYCOLOR,keyText+208,1,TEXTCOLOR ; < |
||
142 | stdcall draw_button, 455,172,23,20,88,C_KEYCOLOR,keyText+209,2,TEXTCOLOR ; > |
||
143 | |||
144 | stdcall draw_button, 488,80 ,23,20,89,L_KEYCOLOR,keyText+211,3,TEXTCOLOR ; nlk |
||
145 | stdcall draw_button, 513,80 ,23,20,90,N_KEYCOLOR,keyText+214,1,TEXTCOLOR ; / |
||
146 | stdcall draw_button, 538,80 ,23,20,91,N_KEYCOLOR,keyText+215,1,TEXTCOLOR ; * |
||
147 | stdcall draw_button, 563,80 ,23,20,92,N_KEYCOLOR,keyText+216,1,TEXTCOLOR ; - |
||
148 | stdcall draw_button, 488,103 ,23,20,93,N_KEYCOLOR,keyText+217,1,TEXTCOLOR ; 7 |
||
149 | stdcall draw_button, 513,103 ,23,20,94,N_KEYCOLOR,keyText+218,1,TEXTCOLOR ; 8 |
||
150 | stdcall draw_button, 538,103 ,23,20,95,N_KEYCOLOR,keyText+219,1,TEXTCOLOR ; 9 |
||
151 | stdcall draw_button, 488,126,23,20,96,N_KEYCOLOR,keyText+220,1,TEXTCOLOR ; 4 |
||
152 | stdcall draw_button, 513,126,23,20,97,N_KEYCOLOR,keyText+221,1,TEXTCOLOR ; 5 |
||
153 | stdcall draw_button, 538,126,23,20,98,N_KEYCOLOR,keyText+222,1,TEXTCOLOR ; 6 |
||
154 | stdcall draw_button, 488,149,23,20,99,N_KEYCOLOR,keyText+223,1,TEXTCOLOR ; 1 |
||
155 | stdcall draw_button, 513,149,23,20,100,N_KEYCOLOR,keyText+224,1,TEXTCOLOR ; 2 |
||
156 | stdcall draw_button, 538,149,23,20,101,N_KEYCOLOR,keyText+225,1,TEXTCOLOR ; 3 |
||
157 | stdcall draw_button, 488,172,48,20,102,N_KEYCOLOR,keyText+226,1,TEXTCOLOR ; 0 |
||
158 | stdcall draw_button, 538,172,23,20,103,N_KEYCOLOR,keyText+227,1,TEXTCOLOR ; . |
||
159 | stdcall draw_button, 563,103 ,23,43,104,N_KEYCOLOR,keyText+228,1,TEXTCOLOR ; + |
||
160 | stdcall draw_button, 563,149,23,43,105,N_KEYCOLOR,keyText+229,3,TEXTCOLOR ; Ent |
||
161 | |||
162 | .draw_switch_button: |
||
163 | mov eax, 6 |
||
164 | mul byte [keyboard_mode] |
||
165 | add eax, SwitchText |
||
166 | stdcall draw_button, 513,28,46,20,106,0x00700000,eax,6,TEXTCOLOR ; Scan/ASCII switch |
||
167 | @@: |
||
168 | .draw_indicators_area: |
||
169 | call lights_on |
||
170 | |||
171 | mov byte [red_type], 0 |
||
172 | end_draw_window |
||
173 | ret |
||
174 | |||
175 | get_zkey_window_slot_number: |
||
176 | mov eax, 18 |
||
177 | mov ebx, 7 |
||
178 | int 0x40 |
||
179 | mov [zkey_window], eax |
||
180 | set_event_mask: |
||
181 | mov eax, 40 |
||
182 | mov ebx, 39 |
||
183 | int 0x40 |
||
184 | |||
185 | still: |
||
186 | call get_receiver_window_slot_number |
||
187 | |||
188 | |||
189 | mov eax, 10 ; Wait for an event in the queue. |
||
190 | int 0x40 |
||
191 | |||
192 | cmp al,1 ; redraw request ? |
||
193 | jz red |
||
194 | cmp al,2 ; key in buffer ? |
||
195 | jz key |
||
196 | cmp al,3 ; button in buffer ? |
||
197 | jz button |
||
198 | |||
199 | jmp still |
||
200 | |||
201 | red: |
||
202 | call draw_window |
||
203 | jmp still |
||
204 | |||
205 | key: |
||
206 | mov eax, 2 |
||
207 | int 0x40 |
||
208 | |||
209 | ; push ax |
||
210 | call get_control_keys_state |
||
211 | cmp [locks], ax |
||
212 | je @f |
||
213 | |||
214 | .reload: |
||
215 | call reload_ascii_keymap |
||
216 | mov byte [red_type], 1 |
||
217 | call draw_window |
||
218 | @@: |
||
219 | ; pop dx |
||
220 | ; jmp button.select_key_code |
||
221 | jmp still |
||
222 | |||
223 | button: |
||
224 | mov eax, 17 ; Get pressed button code |
||
225 | int 0x40 |
||
226 | cmp ah, 1 ; Test x button |
||
227 | je close_app |
||
228 | |||
229 | cmp ah, 106 ; Test Scan/ASCII switch button |
||
230 | jne .keyboard_keys |
||
231 | mov cl, 1 |
||
232 | sub cl, byte [keyboard_mode] |
||
233 | call set_keyboard_mode |
||
234 | mov byte [red_type], 2 |
||
235 | jmp red |
||
236 | |||
237 | .keyboard_keys: |
||
238 | cmp ah, 2 ; Test if pressed buttons |
||
239 | jb still ; is a ZKEY keyboard key... |
||
240 | cmp ah, 106 |
||
241 | jnb still ; ...so, if not then still, |
||
242 | mov [butt], ah ; if yes then save pressed button ID |
||
243 | .test_slot: |
||
244 | mov eax, [zkey_window] ; Test is receiver ZKEY window |
||
245 | mov ecx, [receiver_window] |
||
246 | cmp eax, ecx |
||
247 | je still ; if yes still. |
||
248 | .activate_receiver_window: |
||
249 | mov eax, 18 |
||
250 | mov ebx, 3 |
||
251 | int 0x40 |
||
252 | |||
253 | call reload_ascii_keymap |
||
254 | |||
255 | .read_key_scancode: |
||
256 | xor edx, edx |
||
257 | movzx si, byte [butt] ; Read scan code of the key from the table. |
||
258 | sub si, 2 |
||
259 | mov dl, [keyCodes+si] ; Set dl = scancode of the key corresponding to the pressed button. |
||
260 | cmp dl, 0xA0 |
||
261 | jb .select_key_code ; If not extended key then select ascii or scan to send and then send it to the receiver. |
||
262 | |||
263 | cmp dl, 0xA6 ; Test if it's extended2 key |
||
264 | jne .read_ext_key ; if not go to prepare to send simply extended key. |
||
265 | mov dl, 0xE1 ; Send extended2 scancode... |
||
266 | call send_key |
||
267 | mov dl, 0x1D ; ...and extended scancode, |
||
268 | call send_key ; |
||
269 | mov dl, [keyCodes.ext2] ; (There is only one ext2 key - 'Break') |
||
270 | jmp .send_key_code ; so... send it's normal scan code. |
||
271 | .read_ext_key: |
||
272 | sub dl, 0xA0 ; Read extended key scan code from the table. |
||
273 | movzx si, dl |
||
274 | mov dl, [keyCodes.ext+si] |
||
275 | .send_ext: |
||
276 | push dx ; Send extended scancode to the receiver's window. |
||
277 | mov dl, 0xE0 |
||
278 | call send_key |
||
279 | pop dx |
||
280 | ; jmp .send_key_code |
||
281 | .select_key_code: ; Select what to send ASCII or scan. |
||
282 | cmp [keyboard_mode], 0 ; Test if ZKEY must send ASCII. |
||
283 | jne .send_key_code |
||
284 | |||
285 | ; mov esi, ext0 ; Set esi to the beginning of the ext0 table. |
||
286 | and edx, 0x7F |
||
287 | ; @@: |
||
288 | ; cmp dl, byte [esi] |
||
289 | ; je .send_key_code |
||
290 | ; inc esi |
||
291 | ; cmp esi, ext0end |
||
292 | ; jng @b |
||
293 | .read_ascii: |
||
294 | mov dl, byte [ascii_keymap+edx] ; Read ASCII from the keymap table. |
||
295 | .send_key_code: |
||
296 | call send_key ; Finally send the key to the receiver's window. |
||
297 | .wait: |
||
298 | mov eax, 5 |
||
299 | mov ebx, 1 ; Wait 0.01 second. |
||
300 | int 0x40 |
||
301 | .activate_zkey_window: |
||
302 | mov eax, 18 |
||
303 | mov ebx, 3 |
||
304 | mov ecx, [zkey_window] |
||
305 | int 0x40 |
||
306 | |||
307 | jmp still |
||
308 | |||
309 | |||
310 | close_app: |
||
311 | mov eax,-1 ; close this program |
||
312 | int 0x40 |
||
313 | |||
314 | |||
315 | ;********************************** |
||
316 | ;* input: ecx = type of mode * |
||
317 | ;********************************** |
||
318 | |||
319 | set_keyboard_mode: |
||
320 | mov eax, 66 |
||
321 | mov ebx, 1 ; Set keyboard mode |
||
322 | int 0x40 |
||
323 | mov [keyboard_mode], cl |
||
324 | ret |
||
325 | |||
326 | get_control_keys_state: ; This routine works only in Scan keyboard mode. |
||
327 | mov eax, 66 |
||
328 | mov ebx, 3 |
||
329 | int 0x40 |
||
330 | ret |
||
331 | |||
332 | |||
333 | ;********************************** |
||
334 | ;* input: ecx = type of map * |
||
335 | ;********************************** |
||
336 | |||
337 | get_keyboard_map: |
||
338 | mov eax, 26 |
||
339 | mov ebx, 2 |
||
340 | mov edx, ascii_keymap |
||
341 | int 0x40 |
||
342 | ret |
||
343 | |||
344 | |||
345 | reload_ascii_keymap: |
||
346 | call get_control_keys_state |
||
347 | mov ecx, 1 |
||
348 | |||
349 | test ax, 3 ; Shift pressed ? |
||
350 | jnz @f |
||
351 | test ax, 0x40 ; Caps Lock on ? |
||
352 | jz .load_ascii_keymap |
||
353 | @@: |
||
354 | mov ecx, 2 |
||
355 | .load_ascii_keymap: |
||
356 | call get_keyboard_map |
||
357 | ret |
||
358 | |||
359 | |||
360 | |||
361 | get_receiver_window_slot_number: |
||
362 | mov eax, 18 |
||
363 | mov ebx, 7 |
||
364 | int 0x40 |
||
365 | mov ebx, [zkey_window] |
||
366 | cmp eax, ebx |
||
367 | je @f |
||
368 | mov [receiver_window], eax |
||
369 | @@: |
||
370 | ret |
||
371 | |||
372 | ;************************************ |
||
373 | ;* input: edx = code of the key * |
||
374 | ;************************************ |
||
375 | |||
376 | send_key: |
||
377 | mov eax, 72 |
||
378 | mov ebx, 1 |
||
379 | mov ecx, 2 |
||
380 | int 0x40 |
||
381 | ret |
||
382 | |||
383 | lights_on: |
||
384 | bar 491,51,95,15,0 ; indicators area |
||
385 | rectangle 490,50,96,16,TEXTCOLOR |
||
386 | |||
387 | call get_control_keys_state |
||
388 | mov [locks], ax |
||
389 | test ax, 0x40 |
||
390 | jz @f |
||
391 | ;stdcall bar, 532, 53, 10, 11, 0x0000FF00 |
||
392 | bar 532, 53, 10, 11, 0x0000FF00 |
||
393 | @@: |
||
394 | test ax, 0x80 |
||
395 | jz @f |
||
396 | ;stdcall bar, 500, 53, 10, 11, 0x0000FF00 |
||
397 | bar 500, 53, 10, 11, 0x0000FF00 |
||
398 | @@: |
||
399 | test ax, 0x100 |
||
400 | jz @f |
||
401 | ;stdcall bar, 565, 53, 10, 11, 0x0000FF00 |
||
402 | bar 565, 53, 10, 11, 0x0000FF00 |
||
403 | @@: |
||
404 | ret |
||
405 | |||
406 | ; DATA AREA |
||
407 | |||
408 | ; Application Title |
||
409 | labelt db 'ZKEY v.0.5 - keyboard for KolibriOS' |
||
410 | labellen: |
||
411 | |||
412 | SwitchText db ' ASCII SCAN ' |
||
413 | |||
414 | ;Button names |
||
415 | keyText db 'EscF1F2F3F4F5F6F7F8F9F10F11F12' |
||
416 | db '~1!2@3#4$5%6^7&8*9(0)-_=+\|bksp' |
||
417 | db 'TabQWERTYUIOP{[}]Enter' |
||
418 | db 'lockASDFGHJKL;:''"' |
||
419 | db 'ShiftZXCVBNM,<.>/?Shift' |
||
420 | db 'CtrlWinAlt AltWin[=]Ctrl' |
||
421 | db 'pscslkbrkInsHmPupDelEndPdn^ |
||
422 | db 'nlk/*-7894561230.+Ent' |
||
423 | |||
424 | ;Key scan codes |
||
425 | keyCodes: |
||
426 | db 0x01, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x58 |
||
427 | db 0x29, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x2B, 0x0E |
||
428 | db 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C |
||
429 | db 0x3A, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28 |
||
430 | db 0x2A, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36 |
||
431 | db 0x1D, 0xA0, 0x38, 0x39, 0xA1, 0xA2, 0xA3, 0xA4 |
||
432 | db 0xA5, 0x46, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0 |
||
433 | db 0x45, 0xB1, 0x37, 0x4A, 0x47, 0x48, 0x49, 0x4B, 0x4C, 0x4D, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x4E, 0xB2 |
||
434 | .ext: |
||
435 | db 0x5B, 0x38, 0x5C, 0x5D, 0x1D |
||
436 | db 0x37, 0x00, 0x52, 0x47, 0x49, 0x53, 0x4F, 0x51, 0x48, 0x4B, 0x50, 0x4D |
||
437 | db 0x35, 0x1C |
||
438 | .ext2 db 0x45 ; Just Break :) |
||
439 | |||
440 | ;ext0: |
||
441 | ; db 0x1D, 0x29, 0x2A, 0x36, 0x37, 0x38, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40 |
||
442 | ; db 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D |
||
443 | ; db 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x57, 0x58 |
||
444 | ;ext0end: |
||
445 | |||
446 | receiver_window dd 0 ; Slot number of the receiver |
||
447 | zkey_window dd 0 ; Slot number of ZKEY |
||
448 | butt db 0 ; Pressed button ID |
||
449 | locks dw 0 ; NumLock, CapsLock, ScrollLock lights mask |
||
450 | |||
451 | keyboard_mode db 0 ; Scan or ASCII keys to send ? 0 - ASCII , 1 - Scan |
||
452 | red_type db 0 ; Type of window redraw. 0 - default , 1 - on ASCII_keymap change , 2 - Switch button pressed. |
||
453 | |||
454 | I_END: ; End of application code and data marker |
||
455 | |||
456 | ascii_keymap: |