Subversion Repositories Kolibri OS

Rev

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