Subversion Repositories Kolibri OS

Rev

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