Subversion Repositories Kolibri OS

Rev

Rev 551 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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