Subversion Repositories Kolibri OS

Rev

Rev 551 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 551 Rev 2198
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
 
-
 
158
    mov  eax,12                    ; function 12:tell os about windowdraw
157
 
159
    mov  ebx,1                     ; 1, start of draw
-
 
160
    mcall
158
    mcall 12, 1                        ; start window redraw
161
 
159
 
162
                                   ; DRAW WINDOW
160
                                   ; DRAW WINDOW
163
    mov  eax, 0                    ; function 0 : define and draw window
161
    mov  eax, 0                    ; function 0 : define and draw window
164
    mov  ebx, 100*65536+200        ; [x start] *65536 + [x size]
162
    mov  ebx, 100*65536+200        ; [x start] *65536 + [x size]
165
    mov  ecx, 100*65536+275        ; [y start] *65536 + [y size]
163
    mov  ecx, 100*65536+267        ; [y start] *65536 + [y size]
166
    mov  edx, [sc.work]            ; color of work area RRGGBB,8->color gl
164
    mov  edx, [sc.work]            ; color of work area RRGGBB,8->color gl
167
    or   edx, 0x34000000
165
    or   edx, 0x34000000
168
    mov  edi, title                ; WINDOW LABEL
166
    mov  edi, title                ; WINDOW LABEL
169
    mcall
167
    mcall
170
                                   
168
                                   
171
    mov  eax, 4
169
    mov  eax, 4
172
    mov  ebx, 15*65536+10
170
    mov  ebx, 15*65536+10
173
    xor  ecx, ecx
171
    xor  ecx, ecx
174
    mov  edx, text
172
    mov  edx, text
175
    mov  esi, text.len
173
    mov  esi, text.len
176
    mcall
174
    mcall
177
 
175
 
178
    call draw_codes
176
    call draw_codes
179
 
-
 
180
    mov  eax,12                    ; function 12:tell os about windowdraw
177
 
181
    mov  ebx,2                     ; 2, end of draw
-
 
182
    mcall
178
    mcall 12, 2                        ; end window redraw
183
 
179
 
184
    ret
180
    ret
185
 
181
 
186
 
182
 
187
draw_codes:
183
draw_codes:
188
 
184
 
189
    mov  eax,47
185
    mov  eax,47
190
    mov  ebx,6*65536
186
    mov  ebx,6*65536
191
    mov  edx,15*65536+35
187
    mov  edx,15*65536+35
192
    mov  edi,0
188
    mov  edi,0
193
    mov  esi,0
189
    mov  esi,0
194
  newscan:
190
  newscan:
195
    pusha
191
    pusha
196
    mov  cx,dx
192
    mov  cx,dx
197
    shl  ecx,16
193
    shl  ecx,16
198
    add  ecx,10
194
    add  ecx,10
199
    mov  eax,13   ; filled rectangle
195
    mov  eax,13   ; filled rectangle
200
    mov  ebx,15*65536+160
196
    mov  ebx,15*65536+160
201
    mov  edx,[sc.work]
197
    mov  edx,[sc.work]
202
    mcall
198
    mcall
203
    popa
199
    popa
204
    pusha
200
    pusha
205
    mov  ebx,edx
201
    mov  ebx,edx
206
    add  ebx,70*65536
202
    add  ebx,70*65536
207
    mov  eax,4    ; text
203
    mov  eax,4    ; text
208
    mov  ecx,[sc.work_text]
204
    mov  ecx,[sc.work_text]
209
    mov  edx,key_codes
205
    mov  edx,key_codes
210
    imul edi,12
206
    imul edi,12
211
    add  edx,edi
207
    add  edx,edi
212
    mov  esi,12
208
    mov  esi,12
213
    mcall
209
    mcall
214
    popa
210
    popa
215
    movzx  ecx,byte [scan_codes+edi]
211
    movzx  ecx,byte [scan_codes+edi]
216
    mcall     ; number
212
    mcall     ; number
217
    inc  ecx
213
    inc  ecx
218
    add  edx,12
214
    add  edx,12
219
    inc  edi
215
    inc  edi
220
    cmp  edi,16
216
    cmp  edi,16
221
    jne  newscan
217
    jne  newscan
222
 
218
 
223
    ret
219
    ret
224
 
220
 
225
 
221
 
226
; DATA AREA
222
; DATA AREA
227
 
223
 
228
ext0:
224
ext0:
229
 
225
 
230
    db    1,0,'Esc     '
226
    db    1,0,'Esc     '
231
    db   28,0,'Enter   '
227
    db   28,0,'Enter   '
232
    db   29,0,'L-Ctrl  '
228
    db   29,0,'L-Ctrl  '
233
    db   41,0,'1/2     '
229
    db   41,0,'1/2     '
234
    db   42,0,'L-Shift '
230
    db   42,0,'L-Shift '
235
    db   54,0,'R-Shift '
231
    db   54,0,'R-Shift '
236
    db   55,0,'Num *   '
232
    db   55,0,'Num *   '
237
    db   56,0,'Alt     '
233
    db   56,0,'Alt     '
238
    db   58,0,'CapsLck '
234
    db   58,0,'CapsLck '
239
    db   59,0,'F1      '
235
    db   59,0,'F1      '
240
    db   60,0,'F2      '
236
    db   60,0,'F2      '
241
    db   61,0,'F3      '
237
    db   61,0,'F3      '
242
    db   62,0,'F4      '
238
    db   62,0,'F4      '
243
    db   63,0,'F5      '
239
    db   63,0,'F5      '
244
    db   64,0,'F6      '
240
    db   64,0,'F6      '
245
    db   65,0,'F7      '
241
    db   65,0,'F7      '
246
    db   66,0,'F8      '
242
    db   66,0,'F8      '
247
    db   67,0,'F9      '
243
    db   67,0,'F9      '
248
    db   68,0,'F10     '
244
    db   68,0,'F10     '
249
    db   69,0,'NumLock '
245
    db   69,0,'NumLock '
250
    db   70,0,'SclLock '
246
    db   70,0,'SclLock '
251
    db   71,0,'Num 7   '
247
    db   71,0,'Num 7   '
252
    db   72,0,'Num 8   '
248
    db   72,0,'Num 8   '
253
    db   73,0,'Num 9   '
249
    db   73,0,'Num 9   '
254
    db   74,0,'Num -   '
250
    db   74,0,'Num -   '
255
    db   75,0,'Num 4   '
251
    db   75,0,'Num 4   '
256
    db   76,0,'Num 5   '
252
    db   76,0,'Num 5   '
257
    db   77,0,'Num 6   '
253
    db   77,0,'Num 6   '
258
    db   78,0,'Num +   '
254
    db   78,0,'Num +   '
259
    db   79,0,'Num 1   '
255
    db   79,0,'Num 1   '
260
    db   80,0,'Num 2   '
256
    db   80,0,'Num 2   '
261
    db   81,0,'Num 3   '
257
    db   81,0,'Num 3   '
262
    db   82,0,'Num 0   '
258
    db   82,0,'Num 0   '
263
    db   83,0,'Num ,   '
259
    db   83,0,'Num ,   '
264
    db   87,0,'F11     '
260
    db   87,0,'F11     '
265
    db   88,0,'F12     '
261
    db   88,0,'F12     '
266
 
262
 
267
    db   28,1,'Num Ent '
263
    db   28,1,'Num Ent '
268
    db   29,1,'R-Ctrl  '
264
    db   29,1,'R-Ctrl  '
269
    db   53,1,'Num /   '
265
    db   53,1,'Num /   '
270
    db   55,1,'PrScr   '
266
    db   55,1,'PrScr   '
271
    db   56,1,'Alt Gr  '
267
    db   56,1,'Alt Gr  '
272
    db   71,1,'Home    '
268
    db   71,1,'Home    '
273
    db   72,1,'Up-A    '
269
    db   72,1,'Up-A    '
274
    db   73,1,'PgUp    '
270
    db   73,1,'PgUp    '
275
    db   75,1,'Left-A  '
271
    db   75,1,'Left-A  '
276
    db   77,1,'Right-A '
272
    db   77,1,'Right-A '
277
    db   79,1,'End     '
273
    db   79,1,'End     '
278
    db   80,1,'Down-A  '
274
    db   80,1,'Down-A  '
279
    db   81,1,'PgDown  '
275
    db   81,1,'PgDown  '
280
    db   82,1,'Insert  '
276
    db   82,1,'Insert  '
281
    db   83,1,'Delete  '
277
    db   83,1,'Delete  '
282
    db   91,1,'Menu-1  '
278
    db   91,1,'Menu-1  '
283
    db   92,1,'Menu-2  '
279
    db   92,1,'Menu-2  '
284
    db   93,1,'Menu-3  '
280
    db   93,1,'Menu-3  '
285
 
281
 
286
    db   29,2,'Break   '
282
    db   29,2,'Break   '
287
 
283
 
288
ext0end:
284
ext0end:
289
 
285
 
290
 
286
 
291
if lang eq ru
287
if lang eq ru
292
  text:
288
  text:
293
      db '‘—ˆ’›‚€ž „€›… ‘ Š‹€‚ˆ€’“›'
289
      db '‘—ˆ’›‚€ž „€›… ‘ Š‹€‚ˆ€’“›'
294
  .len = $ - text
290
  .len = $ - text
295
 
291
 
296
  title      db   '‘Š€ŠŽ„› Š‹€‚ˆ€’“›',0
292
  title      db   '‘ª ­ª®¤ë ª« ¢¨ âãàë',0
297
else
293
else
298
  text:
294
  text:
299
      db 'READING RAW SCANCODE DATA'
295
      db 'READING RAW SCANCODE DATA'
300
  .len = $ - text
296
  .len = $ - text
301
 
297
 
302
  title      db   'KEYBOARD SCANCODES',0
298
  title      db   'Keyboard scancodes',0
303
end if
299
end if
304
 
300
 
305
ext  db 0x0
301
ext  db 0x0
306
ext2 db 0x0
302
ext2 db 0x0
307
 
303
 
308
pos dd 0x0
304
pos dd 0x0
309
 
305
 
310
I_END:
306
I_END:
311
 
307
 
312
sc system_colors
308
sc system_colors
313
 
309
 
314
scan_codes: times 16 db ?
310
scan_codes: times 16 db ?
315
 
311
 
316
key_codes:  times 16 dd ?,?,?
312
key_codes:  times 16 dd ?,?,?
317
 
313
 
318
keymap:
314
keymap: