Rev 485 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 485 | Rev 551 | ||
---|---|---|---|
1 | ; |
1 | ; |
2 | ; KEYBOARD SCANCODE EXAMPLE |
2 | ; KEYBOARD SCANCODE EXAMPLE |
3 | ; |
3 | ; |
4 | ; Compile with FASM for Menuet |
4 | ; Compile with FASM for Menuet |
5 | ; |
5 | ; |
6 | 6 | ||
7 | include "lang.inc" |
7 | include "lang.inc" |
8 | include "..\..\..\macros.inc" |
8 | include "..\..\..\macros.inc" |
9 | 9 | ||
10 | use32 |
10 | use32 |
11 | org 0x0 |
11 | org 0x0 |
12 | 12 | ||
13 | db 'MENUET01' ; 8 byte id |
13 | db 'MENUET01' ; 8 byte id |
14 | dd 0x01 ; header version |
14 | dd 0x01 ; header version |
15 | dd START ; start of code |
15 | dd START ; start of code |
16 | dd I_END ; size of image |
16 | dd I_END ; size of image |
17 | dd 0x1000 ; memory for app |
17 | dd 0x1000 ; memory for app |
18 | dd 0x1000 ; esp |
18 | dd 0x1000 ; esp |
19 | dd 0x0 , 0x0 ; I_Param , I_Icon |
19 | dd 0x0 , 0x0 ; I_Param , I_Icon |
20 | 20 | ||
21 | START: ; start of execution |
21 | START: ; start of execution |
22 | 22 | ||
23 | mov eax,66 ; keyboard mode definitions |
23 | mov eax,66 ; keyboard mode definitions |
24 | mov ebx,1 ; set |
24 | mov ebx,1 ; set |
25 | mov ecx,1 ; return scancodes |
25 | mov ecx,1 ; return scancodes |
26 | mcall |
26 | mcall |
27 | 27 | ||
28 | mov eax,26 ; get setup for keyboard |
28 | mov eax,26 ; get setup for keyboard |
29 | mov ebx,2 |
29 | mov ebx,2 |
30 | mov ecx,1 ; base keymap |
30 | mov ecx,1 ; base keymap |
31 | mov edx,keymap |
31 | mov edx,keymap |
32 | mcall |
32 | mcall |
33 | 33 | ||
34 | mov eax, 48 ; GET SYSTEM COLORS |
34 | mov eax, 48 ; GET SYSTEM COLORS |
35 | mov ebx, 3 |
35 | mov ebx, 3 |
36 | mov ecx, sc |
36 | mov ecx, sc |
37 | mov edx, sizeof.system_colors |
37 | mov edx, sizeof.system_colors |
38 | mcall |
38 | mcall |
39 | 39 | ||
40 | red: |
40 | red: |
41 | call draw_window |
41 | call draw_window |
42 | 42 | ||
43 | still: |
43 | still: |
44 | 44 | ||
45 | mov eax,10 ; wait here for event |
45 | mov eax,10 ; wait here for event |
46 | mcall |
46 | mcall |
47 | 47 | ||
48 | cmp eax,1 ; redraw request ? |
48 | cmp eax,1 ; redraw request ? |
49 | je red |
49 | je red |
50 | cmp eax,2 ; key in buffer ? |
50 | cmp eax,2 ; key in buffer ? |
51 | je key |
51 | je key |
52 | cmp eax,3 ; button in buffer ? |
52 | cmp eax,3 ; button in buffer ? |
53 | je button |
53 | je button |
54 | 54 | ||
55 | jmp still |
55 | jmp still |
56 | 56 | ||
57 | 57 | ||
58 | key: ; key |
58 | key: ; key |
59 | mov eax,2 ; just read it and ignore |
59 | mov eax,2 ; just read it and ignore |
60 | mcall |
60 | mcall |
61 | 61 | ||
62 | mov esi,scan_codes+1 |
62 | mov esi,scan_codes+1 |
63 | mov edi,scan_codes+0 |
63 | mov edi,scan_codes+0 |
64 | mov ecx,15 |
64 | mov ecx,15 |
65 | cld |
65 | cld |
66 | rep movsb |
66 | rep movsb |
67 | 67 | ||
68 | mov esi,key_codes+12 |
68 | mov esi,key_codes+12 |
69 | mov edi,key_codes+0 |
69 | mov edi,key_codes+0 |
70 | mov ecx,15*12 |
70 | mov ecx,15*12 |
71 | cld |
71 | cld |
72 | rep movsb |
72 | rep movsb |
73 | 73 | ||
74 | shr eax,8 ; scancode |
74 | shr eax,8 ; scancode |
75 | and eax,0xff |
75 | and eax,0xff |
76 | mov [scan_codes+15],al |
76 | mov [scan_codes+15],al |
77 | 77 | ||
78 | mov [key_codes+15*12+8],dword 'Down' |
78 | mov [key_codes+15*12+8],dword 'Down' |
79 | cmp eax,128 |
79 | cmp eax,128 |
80 | jb no_up |
80 | jb no_up |
81 | mov [key_codes+15*12+8],dword 'Up ' |
81 | mov [key_codes+15*12+8],dword 'Up ' |
82 | no_up: |
82 | no_up: |
83 | 83 | ||
84 | mov ebx,eax |
84 | mov ebx,eax |
85 | and ebx,0x7f |
85 | and ebx,0x7f |
86 | 86 | ||
87 | movzx edx,byte [keymap+ebx] ; key from keymap |
87 | movzx edx,byte [keymap+ebx] ; key from keymap |
88 | mov [key_codes+15*12+0],edx |
88 | mov [key_codes+15*12+0],edx |
89 | mov [key_codes+15*12+4],dword ' ' |
89 | mov [key_codes+15*12+4],dword ' ' |
90 | 90 | ||
91 | movzx edx,byte [ext] |
91 | movzx edx,byte [ext] |
92 | shl edx,8 |
92 | shl edx,8 |
93 | add ebx,edx |
93 | add ebx,edx |
94 | 94 | ||
95 | mov esi,ext0-10 |
95 | mov esi,ext0-10 |
96 | new_ext0: |
96 | new_ext0: |
97 | add esi,10 |
97 | add esi,10 |
98 | cmp esi,ext0end |
98 | cmp esi,ext0end |
99 | jg exit_ext0 |
99 | jg exit_ext0 |
100 | movzx edx,word [esi] |
100 | movzx edx,word [esi] |
101 | cmp edx,ebx |
101 | cmp edx,ebx |
102 | jne new_ext0 |
102 | jne new_ext0 |
103 | mov edx,[esi+2] |
103 | mov edx,[esi+2] |
104 | mov [key_codes+15*12+0],edx |
104 | mov [key_codes+15*12+0],edx |
105 | mov edx,[esi+6] |
105 | mov edx,[esi+6] |
106 | mov [key_codes+15*12+4],edx |
106 | mov [key_codes+15*12+4],edx |
107 | exit_ext0: |
107 | exit_ext0: |
108 | no_ext_off: |
108 | no_ext_off: |
109 | 109 | ||
110 | cmp [ext2],0 |
110 | cmp [ext2],0 |
111 | je noext2dec |
111 | je noext2dec |
112 | dec [ext2] |
112 | dec [ext2] |
113 | jne noext2dec |
113 | jne noext2dec |
114 | mov [key_codes+15*12+0],dword '----' |
114 | mov [key_codes+15*12+0],dword '----' |
115 | mov [key_codes+15*12+4],dword '----' |
115 | mov [key_codes+15*12+4],dword '----' |
116 | noext2dec: |
116 | noext2dec: |
117 | 117 | ||
118 | mov [ext],0 |
118 | mov [ext],0 |
119 | 119 | ||
120 | cmp eax,224 |
120 | cmp eax,224 |
121 | jne no_ext |
121 | jne no_ext |
122 | mov [key_codes+15*12+0],dword ' ' |
122 | mov [key_codes+15*12+0],dword ' ' |
123 | mov [key_codes+15*12+4],dword ' ' |
123 | mov [key_codes+15*12+4],dword ' ' |
124 | mov [key_codes+15*12+8],dword 'Ext ' |
124 | mov [key_codes+15*12+8],dword 'Ext ' |
125 | mov [ext],1 |
125 | mov [ext],1 |
126 | no_ext: |
126 | no_ext: |
127 | 127 | ||
128 | cmp eax,225 |
128 | cmp eax,225 |
129 | jne no_ext2 |
129 | jne no_ext2 |
130 | mov [key_codes+15*12+0],dword ' ' |
130 | mov [key_codes+15*12+0],dword ' ' |
131 | mov [key_codes+15*12+4],dword ' ' |
131 | mov [key_codes+15*12+4],dword ' ' |
132 | mov [key_codes+15*12+8],dword 'Ext2' |
132 | mov [key_codes+15*12+8],dword 'Ext2' |
133 | mov [ext],2 |
133 | mov [ext],2 |
134 | mov [ext2],2 |
134 | mov [ext2],2 |
135 | no_ext2: |
135 | no_ext2: |
136 | 136 | ||
137 | 137 | ||
138 | call draw_codes |
138 | call draw_codes |
139 | jmp still |
139 | jmp still |
140 | 140 | ||
141 | 141 | ||
142 | 142 | ||
143 | button: ; button |
143 | button: ; button |
144 | or eax, -1 ; close this program |
144 | or eax, -1 ; close this program |
145 | mcall |
145 | mcall |
146 | 146 | ||
147 | 147 | ||
148 | 148 | ||
149 | 149 | ||
150 | ; ********************************************* |
150 | ; ********************************************* |
151 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
151 | ; ******* WINDOW DEFINITIONS AND DRAW ******** |
152 | ; ********************************************* |
152 | ; ********************************************* |
153 | 153 | ||
154 | 154 | ||
155 | draw_window: |
155 | draw_window: |
156 | 156 | ||
157 | 157 | ||
158 | mov eax,12 ; function 12:tell os about windowdraw |
158 | mov eax,12 ; function 12:tell os about windowdraw |
159 | mov ebx,1 ; 1, start of draw |
159 | mov ebx,1 ; 1, start of draw |
160 | mcall |
160 | mcall |
161 | 161 | ||
162 | ; DRAW WINDOW |
162 | ; DRAW WINDOW |
163 | mov eax, 0 ; function 0 : define and draw window |
163 | mov eax, 0 ; function 0 : define and draw window |
164 | mov ebx, 100*65536+200 ; [x start] *65536 + [x size] |
164 | mov ebx, 100*65536+200 ; [x start] *65536 + [x size] |
165 | mov ecx, 100*65536+275 ; [y start] *65536 + [y size] |
165 | mov ecx, 100*65536+275 ; [y start] *65536 + [y size] |
166 | mov edx, [sc.work] ; color of work area RRGGBB,8->color gl |
166 | mov edx, [sc.work] ; color of work area RRGGBB,8->color gl |
167 | or edx, 0x33000000 |
167 | or edx, 0x34000000 |
168 | mov edi, title ; WINDOW LABEL |
168 | mov edi, title ; WINDOW LABEL |
169 | mcall |
169 | mcall |
170 | 170 | ||
171 | mov eax, 4 |
171 | mov eax, 4 |
172 | mov ebx, 15*65536+10 |
172 | mov ebx, 15*65536+10 |
173 | xor ecx, ecx |
173 | xor ecx, ecx |
174 | mov edx, text |
174 | mov edx, text |
175 | mov esi, text.len |
175 | mov esi, text.len |
176 | mcall |
176 | mcall |
177 | 177 | ||
178 | call draw_codes |
178 | call draw_codes |
179 | 179 | ||
180 | mov eax,12 ; function 12:tell os about windowdraw |
180 | mov eax,12 ; function 12:tell os about windowdraw |
181 | mov ebx,2 ; 2, end of draw |
181 | mov ebx,2 ; 2, end of draw |
182 | mcall |
182 | mcall |
183 | 183 | ||
184 | ret |
184 | ret |
185 | 185 | ||
186 | 186 | ||
187 | draw_codes: |
187 | draw_codes: |
188 | 188 | ||
189 | mov eax,47 |
189 | mov eax,47 |
190 | mov ebx,6*65536 |
190 | mov ebx,6*65536 |
191 | mov edx,15*65536+35 |
191 | mov edx,15*65536+35 |
192 | mov edi,0 |
192 | mov edi,0 |
193 | mov esi,0 |
193 | mov esi,0 |
194 | newscan: |
194 | newscan: |
195 | pusha |
195 | pusha |
196 | mov cx,dx |
196 | mov cx,dx |
197 | shl ecx,16 |
197 | shl ecx,16 |
198 | add ecx,10 |
198 | add ecx,10 |
199 | mov eax,13 ; filled rectangle |
199 | mov eax,13 ; filled rectangle |
200 | mov ebx,15*65536+160 |
200 | mov ebx,15*65536+160 |
201 | mov edx,[sc.work] |
201 | mov edx,[sc.work] |
202 | mcall |
202 | mcall |
203 | popa |
203 | popa |
204 | pusha |
204 | pusha |
205 | mov ebx,edx |
205 | mov ebx,edx |
206 | add ebx,70*65536 |
206 | add ebx,70*65536 |
207 | mov eax,4 ; text |
207 | mov eax,4 ; text |
208 | mov ecx,[sc.work_text] |
208 | mov ecx,[sc.work_text] |
209 | mov edx,key_codes |
209 | mov edx,key_codes |
210 | imul edi,12 |
210 | imul edi,12 |
211 | add edx,edi |
211 | add edx,edi |
212 | mov esi,12 |
212 | mov esi,12 |
213 | mcall |
213 | mcall |
214 | popa |
214 | popa |
215 | movzx ecx,byte [scan_codes+edi] |
215 | movzx ecx,byte [scan_codes+edi] |
216 | mcall ; number |
216 | mcall ; number |
217 | inc ecx |
217 | inc ecx |
218 | add edx,12 |
218 | add edx,12 |
219 | inc edi |
219 | inc edi |
220 | cmp edi,16 |
220 | cmp edi,16 |
221 | jne newscan |
221 | jne newscan |
222 | 222 | ||
223 | ret |
223 | ret |
224 | 224 | ||
225 | 225 | ||
226 | ; DATA AREA |
226 | ; DATA AREA |
227 | 227 | ||
228 | ext0: |
228 | ext0: |
229 | 229 | ||
230 | db 1,0,'Esc ' |
230 | db 1,0,'Esc ' |
231 | db 28,0,'Enter ' |
231 | db 28,0,'Enter ' |
232 | db 29,0,'L-Ctrl ' |
232 | db 29,0,'L-Ctrl ' |
233 | db 41,0,'1/2 ' |
233 | db 41,0,'1/2 ' |
234 | db 42,0,'L-Shift ' |
234 | db 42,0,'L-Shift ' |
235 | db 54,0,'R-Shift ' |
235 | db 54,0,'R-Shift ' |
236 | db 55,0,'Num * ' |
236 | db 55,0,'Num * ' |
237 | db 56,0,'Alt ' |
237 | db 56,0,'Alt ' |
238 | db 58,0,'CapsLck ' |
238 | db 58,0,'CapsLck ' |
239 | db 59,0,'F1 ' |
239 | db 59,0,'F1 ' |
240 | db 60,0,'F2 ' |
240 | db 60,0,'F2 ' |
241 | db 61,0,'F3 ' |
241 | db 61,0,'F3 ' |
242 | db 62,0,'F4 ' |
242 | db 62,0,'F4 ' |
243 | db 63,0,'F5 ' |
243 | db 63,0,'F5 ' |
244 | db 64,0,'F6 ' |
244 | db 64,0,'F6 ' |
245 | db 65,0,'F7 ' |
245 | db 65,0,'F7 ' |
246 | db 66,0,'F8 ' |
246 | db 66,0,'F8 ' |
247 | db 67,0,'F9 ' |
247 | db 67,0,'F9 ' |
248 | db 68,0,'F10 ' |
248 | db 68,0,'F10 ' |
249 | db 69,0,'NumLock ' |
249 | db 69,0,'NumLock ' |
250 | db 70,0,'SclLock ' |
250 | db 70,0,'SclLock ' |
251 | db 71,0,'Num 7 ' |
251 | db 71,0,'Num 7 ' |
252 | db 72,0,'Num 8 ' |
252 | db 72,0,'Num 8 ' |
253 | db 73,0,'Num 9 ' |
253 | db 73,0,'Num 9 ' |
254 | db 74,0,'Num - ' |
254 | db 74,0,'Num - ' |
255 | db 75,0,'Num 4 ' |
255 | db 75,0,'Num 4 ' |
256 | db 76,0,'Num 5 ' |
256 | db 76,0,'Num 5 ' |
257 | db 77,0,'Num 6 ' |
257 | db 77,0,'Num 6 ' |
258 | db 78,0,'Num + ' |
258 | db 78,0,'Num + ' |
259 | db 79,0,'Num 1 ' |
259 | db 79,0,'Num 1 ' |
260 | db 80,0,'Num 2 ' |
260 | db 80,0,'Num 2 ' |
261 | db 81,0,'Num 3 ' |
261 | db 81,0,'Num 3 ' |
262 | db 82,0,'Num 0 ' |
262 | db 82,0,'Num 0 ' |
263 | db 83,0,'Num , ' |
263 | db 83,0,'Num , ' |
264 | db 87,0,'F11 ' |
264 | db 87,0,'F11 ' |
265 | db 88,0,'F12 ' |
265 | db 88,0,'F12 ' |
266 | 266 | ||
267 | db 28,1,'Num Ent ' |
267 | db 28,1,'Num Ent ' |
268 | db 29,1,'R-Ctrl ' |
268 | db 29,1,'R-Ctrl ' |
269 | db 53,1,'Num / ' |
269 | db 53,1,'Num / ' |
270 | db 55,1,'PrScr ' |
270 | db 55,1,'PrScr ' |
271 | db 56,1,'Alt Gr ' |
271 | db 56,1,'Alt Gr ' |
272 | db 71,1,'Home ' |
272 | db 71,1,'Home ' |
273 | db 72,1,'Up-A ' |
273 | db 72,1,'Up-A ' |
274 | db 73,1,'PgUp ' |
274 | db 73,1,'PgUp ' |
275 | db 75,1,'Left-A ' |
275 | db 75,1,'Left-A ' |
276 | db 77,1,'Right-A ' |
276 | db 77,1,'Right-A ' |
277 | db 79,1,'End ' |
277 | db 79,1,'End ' |
278 | db 80,1,'Down-A ' |
278 | db 80,1,'Down-A ' |
279 | db 81,1,'PgDown ' |
279 | db 81,1,'PgDown ' |
280 | db 82,1,'Insert ' |
280 | db 82,1,'Insert ' |
281 | db 83,1,'Delete ' |
281 | db 83,1,'Delete ' |
282 | db 91,1,'Menu-1 ' |
282 | db 91,1,'Menu-1 ' |
283 | db 92,1,'Menu-2 ' |
283 | db 92,1,'Menu-2 ' |
284 | db 93,1,'Menu-3 ' |
284 | db 93,1,'Menu-3 ' |
285 | 285 | ||
286 | db 29,2,'Break ' |
286 | db 29,2,'Break ' |
287 | 287 | ||
288 | ext0end: |
288 | ext0end: |
289 | 289 | ||
290 | 290 | ||
291 | if lang eq ru |
291 | if lang eq ru |
292 | text: |
292 | text: |
293 | db ' ' |
293 | db ' ' |
294 | .len = $ - text |
294 | .len = $ - text |
295 | 295 | ||
296 | title db ' ',0 |
296 | title db ' ',0 |
297 | else |
297 | else |
298 | text: |
298 | text: |
299 | db 'READING RAW SCANCODE DATA' |
299 | db 'READING RAW SCANCODE DATA' |
300 | .len = $ - text |
300 | .len = $ - text |
301 | 301 | ||
302 | title db 'KEYBOARD SCANCODES',0 |
302 | title db 'KEYBOARD SCANCODES',0 |
303 | end if |
303 | end if |
304 | 304 | ||
305 | ext db 0x0 |
305 | ext db 0x0 |
306 | ext2 db 0x0 |
306 | ext2 db 0x0 |
307 | 307 | ||
308 | pos dd 0x0 |
308 | pos dd 0x0 |
309 | 309 | ||
310 | I_END: |
310 | I_END: |
311 | 311 | ||
312 | sc system_colors |
312 | sc system_colors |
313 | 313 | ||
314 | scan_codes: times 16 db ? |
314 | scan_codes: times 16 db ? |
315 | 315 | ||
316 | key_codes: times 16 dd ?,?,? |
316 | key_codes: times 16 dd ?,?,? |
317 | 317 | ||
318 | keymap: |
318 | keymap: |