Subversion Repositories Kolibri OS

Rev

Rev 485 | Rev 2198 | 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: