Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

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