Subversion Repositories Kolibri OS

Rev

Rev 485 | Rev 2198 | 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.     mov  eax,12                    ; function 12:tell os about windowdraw
  159.     mov  ebx,1                     ; 1, start of draw
  160.     mcall
  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
  167.     or   edx, 0x34000000
  168.     mov  edi, title                ; WINDOW LABEL
  169.     mcall
  170.                                    
  171.     mov  eax, 4
  172.     mov  ebx, 15*65536+10
  173.     xor  ecx, ecx
  174.     mov  edx, text
  175.     mov  esi, text.len
  176.     mcall
  177.  
  178.     call draw_codes
  179.  
  180.     mov  eax,12                    ; function 12:tell os about windowdraw
  181.     mov  ebx,2                     ; 2, end of draw
  182.     mcall
  183.  
  184.     ret
  185.  
  186.  
  187. draw_codes:
  188.  
  189.     mov  eax,47
  190.     mov  ebx,6*65536
  191.     mov  edx,15*65536+35
  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
  200.     mov  ebx,15*65536+160
  201.     mov  edx,[sc.work]
  202.     mcall
  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
  213.     mcall
  214.     popa
  215.     movzx  ecx,byte [scan_codes+edi]
  216.     mcall     ; number
  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.  
  296.   title      db   'СКАНКОДЫ КЛАВИАТУРЫ',0
  297. else
  298.   text:
  299.       db 'READING RAW SCANCODE DATA'
  300.   .len = $ - text
  301.  
  302.   title      db   'KEYBOARD SCANCODES',0
  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:
  319.