Subversion Repositories Kolibri OS

Rev

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

  1. ;
  2. ;   ZKEY. Version 0.51.
  3. ;   Virtual keyboard for KolibriOS.
  4. ;
  5. ;   Author:         Asper
  6. ;   Date of issue:  26.08.2009
  7. ;   Compiler:       FASM
  8. ;   Target:         KolibriOS
  9. ;
  10.  
  11. use32
  12.         org     0x0
  13.  
  14.         db      'MENUET00'      ; 8 byte id
  15.         dd      38              ; required os
  16.         dd      STARTAPP        ; program start
  17.         dd      I_END           ; program image size
  18.         dd      0x100000        ; required amount of memory
  19.         dd      0x00000000      ; reserved=no extended header
  20.  
  21. include "ASPAPI.INC"
  22.  
  23. N_KEYCOLOR equ 0x00677889 ; Normal button color
  24. C_KEYCOLOR equ 0x00344556 ; Control button color
  25. L_KEYCOLOR equ 0x00258778 ; Lock button color
  26. TEXTCOLOR  equ 0x00FFFFFF ; Button caption color
  27.  
  28. ASCII_KEYMAP_SIZE equ 128
  29. PROCINFO_SIZE equ 1024
  30. PROCINFO_BUFF equ ascii_keymap + ASCII_KEYMAP_SIZE
  31.  
  32. STARTAPP:
  33.         mov     ecx, 1     ; to send scancodes.
  34.         call    set_keyboard_mode
  35.  
  36.         call    reload_ascii_keymap
  37.         call    draw_window
  38.         jmp     get_zkey_window_slot_number
  39.  
  40. draw_window:
  41.   test   byte [red_type], 1
  42.   jnz    @f
  43.   test   byte [red_type], 2
  44.   jnz    .draw_switch_button
  45.   start_draw_window 100,370,600,210,0x14224466,labelt
  46.  
  47.   stdcall draw_button, 15,50,23,20,2,N_KEYCOLOR,keyText,3,TEXTCOLOR             ; Esc
  48.  
  49.   stdcall draw_button, 70,50,23,20,3,N_KEYCOLOR,keyText+3,2,TEXTCOLOR   ; F1
  50.   stdcall draw_button, 95,50,23,20,4,N_KEYCOLOR,keyText+5,2,TEXTCOLOR   ; F2
  51.   stdcall draw_button, 120,50,23,20,5,N_KEYCOLOR,keyText+7,2,TEXTCOLOR  ; F3
  52.   stdcall draw_button, 145,50,23,20,6,N_KEYCOLOR,keyText+9,2,TEXTCOLOR  ; F4
  53.  
  54.   stdcall draw_button, 183,50,23,20,7,N_KEYCOLOR,keyText+11,2,TEXTCOLOR ; F5
  55.   stdcall draw_button, 208,50,23,20,8,N_KEYCOLOR,keyText+13,2,TEXTCOLOR ; F6
  56.   stdcall draw_button, 233,50,23,20,9,N_KEYCOLOR,keyText+15,2,TEXTCOLOR ; F7
  57.   stdcall draw_button, 258,50,23,20,10,N_KEYCOLOR,keyText+17,2,TEXTCOLOR ; F8
  58.  
  59.   stdcall draw_button, 296,50,23,20,11,N_KEYCOLOR,keyText+19,2,TEXTCOLOR ; F9
  60.   stdcall draw_button, 321,50,23,20,12,N_KEYCOLOR,keyText+21,3,TEXTCOLOR ; F10
  61.   stdcall draw_button, 346,50,23,20,13,N_KEYCOLOR,keyText+24,3,TEXTCOLOR ; F11
  62.   stdcall draw_button, 371,50,23,20,14,N_KEYCOLOR,keyText+27,3,TEXTCOLOR ; F12
  63. @@:
  64.   stdcall draw_button, 15,80,23,20,15,N_KEYCOLOR,ascii_keymap+41,1,TEXTCOLOR ;keyText+30,2,TEXTCOLOR     ; ~ð
  65.   stdcall draw_button, 40,80,23,20,16,N_KEYCOLOR,ascii_keymap+2,1,TEXTCOLOR ;keyText+32,2,TEXTCOLOR      ; 1!
  66.   stdcall draw_button, 65,80,23,20,17,N_KEYCOLOR,ascii_keymap+3,1,TEXTCOLOR ;keyText+34,2,TEXTCOLOR      ; 2@
  67.   stdcall draw_button, 90,80,23,20,18,N_KEYCOLOR,ascii_keymap+4,1,TEXTCOLOR ;keyText+36,2,TEXTCOLOR      ; 3#
  68.   stdcall draw_button, 115,80,23,20,19,N_KEYCOLOR,ascii_keymap+5,1,TEXTCOLOR ;keyText+38,2,TEXTCOLOR     ; 4$
  69.   stdcall draw_button, 140,80,23,20,20,N_KEYCOLOR,ascii_keymap+6,1,TEXTCOLOR ;keyText+40,2,TEXTCOLOR     ; 5%
  70.   stdcall draw_button, 165,80,23,20,21,N_KEYCOLOR,ascii_keymap+7,1,TEXTCOLOR ;keyText+42,2,TEXTCOLOR     ; 6^
  71.   stdcall draw_button, 190,80,23,20,22,N_KEYCOLOR,ascii_keymap+8,1,TEXTCOLOR ;keyText+44,2,TEXTCOLOR     ; 7&
  72.   stdcall draw_button, 215,80,23,20,23,N_KEYCOLOR,ascii_keymap+9,1,TEXTCOLOR ;keyText+46,2,TEXTCOLOR     ; 8*
  73.   stdcall draw_button, 240,80,23,20,24,N_KEYCOLOR,ascii_keymap+10,1,TEXTCOLOR ;keyText+48,2,TEXTCOLOR    ; 9(
  74.   stdcall draw_button, 265,80,23,20,25,N_KEYCOLOR,ascii_keymap+11,1,TEXTCOLOR ;keyText+50,2,TEXTCOLOR    ; 0)
  75.   stdcall draw_button, 290,80,23,20,26,N_KEYCOLOR,ascii_keymap+12,1,TEXTCOLOR ;keyText+52,2,TEXTCOLOR    ; -_
  76.   stdcall draw_button, 315,80,23,20,27,N_KEYCOLOR,ascii_keymap+13,1,TEXTCOLOR ;keyText+54,2,TEXTCOLOR    ; =+
  77.   stdcall draw_button, 340,80,23,20,28,N_KEYCOLOR,ascii_keymap+43,1,TEXTCOLOR ;keyText+56,2,TEXTCOLOR    ; \|
  78.   stdcall draw_button, 365,80,30,20,29,N_KEYCOLOR,keyText+58,4,TEXTCOLOR ; bksp
  79.  
  80.   stdcall draw_button, 15 ,103,33,20,30,N_KEYCOLOR,keyText+62,3,TEXTCOLOR       ; Tab
  81.   stdcall draw_button, 50 ,103,23,20,31,N_KEYCOLOR,ascii_keymap+16,1,TEXTCOLOR ;keyText+65,2,TEXTCOLOR   ; Q‰
  82.   stdcall draw_button, 75 ,103,23,20,32,N_KEYCOLOR,ascii_keymap+17,1,TEXTCOLOR ;keyText+67,2,TEXTCOLOR   ; W–
  83.   stdcall draw_button, 100,103,23,20,33,N_KEYCOLOR,ascii_keymap+18,1,TEXTCOLOR ;keyText+69,2,TEXTCOLOR   ; E“
  84.   stdcall draw_button, 125,103,23,20,34,N_KEYCOLOR,ascii_keymap+19,1,TEXTCOLOR ;keyText+71,2,TEXTCOLOR   ; RŠ
  85.   stdcall draw_button, 150,103,23,20,35,N_KEYCOLOR,ascii_keymap+20,1,TEXTCOLOR ;keyText+73,2,TEXTCOLOR   ; T…
  86.   stdcall draw_button, 175,103,23,20,36,N_KEYCOLOR,ascii_keymap+21,1,TEXTCOLOR ;keyText+75,2,TEXTCOLOR   ; Y
  87.   stdcall draw_button, 200,103,23,20,37,N_KEYCOLOR,ascii_keymap+22,1,TEXTCOLOR ;keyText+77,2,TEXTCOLOR   ; Uƒ
  88.   stdcall draw_button, 225,103,23,20,38,N_KEYCOLOR,ascii_keymap+23,1,TEXTCOLOR ;keyText+79,2,TEXTCOLOR   ; I˜
  89.   stdcall draw_button, 250,103,23,20,39,N_KEYCOLOR,ascii_keymap+24,1,TEXTCOLOR ;keyText+81,2,TEXTCOLOR   ; O™
  90.   stdcall draw_button, 275,103,23,20,40,N_KEYCOLOR,ascii_keymap+25,1,TEXTCOLOR ;keyText+83,2,TEXTCOLOR   ; P‡
  91.   stdcall draw_button, 300,103,23,20,41,N_KEYCOLOR,ascii_keymap+26,1,TEXTCOLOR ;keyText+85,3,TEXTCOLOR   ; [{•
  92.   stdcall draw_button, 325,103,23,20,42,N_KEYCOLOR,ascii_keymap+27,1,TEXTCOLOR ;keyText+88,3,TEXTCOLOR   ; ]}š
  93.   stdcall draw_button, 350,103,45,43,43,N_KEYCOLOR,keyText+91,5,TEXTCOLOR       ; Enter
  94.  
  95.   stdcall draw_button, 15 ,126,43,20,44,L_KEYCOLOR,keyText+96 ,4,TEXTCOLOR      ; lock
  96.   stdcall draw_button, 60 ,126,23,20,45,N_KEYCOLOR,ascii_keymap+30,1,TEXTCOLOR ;keyText+100,2,TEXTCOLOR  ; A”
  97.   stdcall draw_button, 85 ,126,23,20,46,N_KEYCOLOR,ascii_keymap+31,1,TEXTCOLOR ;keyText+102,2,TEXTCOLOR  ; S›
  98.   stdcall draw_button, 110,126,23,20,47,N_KEYCOLOR,ascii_keymap+32,1,TEXTCOLOR ;keyText+104,2,TEXTCOLOR  ; D‚
  99.   stdcall draw_button, 135,126,23,20,48,N_KEYCOLOR,ascii_keymap+33,1,TEXTCOLOR ;keyText+106,2,TEXTCOLOR  ; F€
  100.   stdcall draw_button, 160,126,23,20,49,N_KEYCOLOR,ascii_keymap+34,1,TEXTCOLOR ;keyText+108,2,TEXTCOLOR  ; G
  101.   stdcall draw_button, 185,126,23,20,50,N_KEYCOLOR,ascii_keymap+35,1,TEXTCOLOR ;keyText+110,2,TEXTCOLOR  ; H
  102.   stdcall draw_button, 210,126,23,20,51,N_KEYCOLOR,ascii_keymap+36,1,TEXTCOLOR ;keyText+112,2,TEXTCOLOR  ; JŽ
  103.   stdcall draw_button, 235,126,23,20,52,N_KEYCOLOR,ascii_keymap+37,1,TEXTCOLOR ;keyText+114,2,TEXTCOLOR  ; K‹
  104.   stdcall draw_button, 260,126,23,20,53,N_KEYCOLOR,ascii_keymap+38,1,TEXTCOLOR ;keyText+116,2,TEXTCOLOR  ; L„
  105.   stdcall draw_button, 285,126,23,20,54,N_KEYCOLOR,ascii_keymap+39,1,TEXTCOLOR ;keyText+118,3,TEXTCOLOR  ; ;:†
  106.   stdcall draw_button, 310,126,23,20,55,N_KEYCOLOR,ascii_keymap+40,1,TEXTCOLOR ;keyText+121,3,TEXTCOLOR  ; '"
  107.  
  108.   stdcall draw_button, 15 ,149,53,20,56,C_KEYCOLOR,keyText+124,5,TEXTCOLOR      ; Shift
  109.   stdcall draw_button, 70 ,149,23,20,57,N_KEYCOLOR,ascii_keymap+44,1,TEXTCOLOR ;keyText+129,2,TEXTCOLOR  ; ZŸ
  110.   stdcall draw_button, 95 ,149,23,20,58,N_KEYCOLOR,ascii_keymap+45,1,TEXTCOLOR ;keyText+131,2,TEXTCOLOR  ; X—
  111.   stdcall draw_button, 120,149,23,20,59,N_KEYCOLOR,ascii_keymap+46,1,TEXTCOLOR ;keyText+133,2,TEXTCOLOR  ; C‘
  112.   stdcall draw_button, 145,149,23,20,60,N_KEYCOLOR,ascii_keymap+47,1,TEXTCOLOR ;keyText+135,2,TEXTCOLOR  ; VŒ
  113.   stdcall draw_button, 170,149,23,20,61,N_KEYCOLOR,ascii_keymap+48,1,TEXTCOLOR ;keyText+137,2,TEXTCOLOR  ; Bˆ
  114.   stdcall draw_button, 195,149,23,20,62,N_KEYCOLOR,ascii_keymap+49,1,TEXTCOLOR ;keyText+139,2,TEXTCOLOR  ; N’
  115.   stdcall draw_button, 220,149,23,20,63,N_KEYCOLOR,ascii_keymap+50,1,TEXTCOLOR ;keyText+141,2,TEXTCOLOR  ; Mœ
  116.   stdcall draw_button, 245,149,23,20,64,N_KEYCOLOR,ascii_keymap+51,1,TEXTCOLOR ;keyText+143,3,TEXTCOLOR  ; ,<
  117.   stdcall draw_button, 270,149,23,20,65,N_KEYCOLOR,ascii_keymap+52,1,TEXTCOLOR ;keyText+146,3,TEXTCOLOR  ; .>ž
  118.   stdcall draw_button, 295,149,23,20,66,N_KEYCOLOR,ascii_keymap+53,1,TEXTCOLOR ;keyText+149,2,TEXTCOLOR  ; /?
  119.  
  120.   test    byte [red_type], 1
  121.   jnz     @f
  122.   stdcall draw_button, 320,149,75,20,67,C_KEYCOLOR,keyText+151,5,TEXTCOLOR      ; Shift
  123.  
  124.   stdcall draw_button, 15 ,172,30,20,68,C_KEYCOLOR,keyText+156,4,TEXTCOLOR      ; Ctrl
  125.   stdcall draw_button, 47 ,172,30,20,69,C_KEYCOLOR,keyText+160,3,TEXTCOLOR      ; Win
  126.   stdcall draw_button, 79 ,172,30,20,70,C_KEYCOLOR,keyText+163,3,TEXTCOLOR      ; Alt
  127.   stdcall draw_button, 111,172,156,20,71,N_KEYCOLOR,keyText+166,1,TEXTCOLOR     ;  Space
  128.   stdcall draw_button, 269,172,30,20,72,C_KEYCOLOR,keyText+167,3,TEXTCOLOR      ; Alt
  129.   stdcall draw_button, 301,172,30,20,73,C_KEYCOLOR,keyText+170,3,TEXTCOLOR      ; Win
  130.   stdcall draw_button, 333,172,30,20,74,C_KEYCOLOR,keyText+173,3,TEXTCOLOR      ; [=]
  131.   stdcall draw_button, 365,172,30,20,75,C_KEYCOLOR,keyText+176,4,TEXTCOLOR      ; Ctrl
  132.  
  133.   stdcall draw_button, 405,50 ,23,20,76,N_KEYCOLOR,keyText+180,3,TEXTCOLOR      ; psc
  134.   stdcall draw_button, 430,50 ,23,20,77,L_KEYCOLOR,keyText+183,3,TEXTCOLOR      ; slk
  135.   stdcall draw_button, 455,50 ,23,20,78,N_KEYCOLOR,keyText+186,3,TEXTCOLOR      ; brk
  136.   stdcall draw_button, 405,80 ,23,20,79,N_KEYCOLOR,keyText+189,3,TEXTCOLOR      ; Ins
  137.   stdcall draw_button, 430,80 ,23,20,80,N_KEYCOLOR,keyText+192,2,TEXTCOLOR      ; Hm
  138.   stdcall draw_button, 455,80 ,23,20,81,N_KEYCOLOR,keyText+194,3,TEXTCOLOR      ; Pup
  139.   stdcall draw_button, 405,103 ,23,20,82,N_KEYCOLOR,keyText+197,3,TEXTCOLOR     ; Del
  140.   stdcall draw_button, 430,103 ,23,20,83,N_KEYCOLOR,keyText+200,3,TEXTCOLOR     ; End
  141.   stdcall draw_button, 455,103 ,23,20,84,N_KEYCOLOR,keyText+203,3,TEXTCOLOR     ; Pdn
  142.   stdcall draw_button, 430,149,23,20,85,C_KEYCOLOR,keyText+206,1,TEXTCOLOR      ; ^
  143.   stdcall draw_button, 405,172,23,20,86,C_KEYCOLOR,keyText+207,1,TEXTCOLOR      ; v
  144.   stdcall draw_button, 430,172,23,20,87,C_KEYCOLOR,keyText+208,1,TEXTCOLOR      ; <
  145.   stdcall draw_button, 455,172,23,20,88,C_KEYCOLOR,keyText+209,2,TEXTCOLOR      ;  >
  146.  
  147.   stdcall draw_button, 488,80 ,23,20,89,L_KEYCOLOR,keyText+211,3,TEXTCOLOR      ; nlk
  148.   stdcall draw_button, 513,80 ,23,20,90,N_KEYCOLOR,keyText+214,1,TEXTCOLOR      ; /
  149.   stdcall draw_button, 538,80 ,23,20,91,N_KEYCOLOR,keyText+215,1,TEXTCOLOR      ; *
  150.   stdcall draw_button, 563,80 ,23,20,92,N_KEYCOLOR,keyText+216,1,TEXTCOLOR      ; -
  151.   stdcall draw_button, 488,103 ,23,20,93,N_KEYCOLOR,keyText+217,1,TEXTCOLOR     ; 7
  152.   stdcall draw_button, 513,103 ,23,20,94,N_KEYCOLOR,keyText+218,1,TEXTCOLOR     ; 8
  153.   stdcall draw_button, 538,103 ,23,20,95,N_KEYCOLOR,keyText+219,1,TEXTCOLOR     ; 9
  154.   stdcall draw_button, 488,126,23,20,96,N_KEYCOLOR,keyText+220,1,TEXTCOLOR      ; 4
  155.   stdcall draw_button, 513,126,23,20,97,N_KEYCOLOR,keyText+221,1,TEXTCOLOR      ; 5
  156.   stdcall draw_button, 538,126,23,20,98,N_KEYCOLOR,keyText+222,1,TEXTCOLOR      ; 6
  157.   stdcall draw_button, 488,149,23,20,99,N_KEYCOLOR,keyText+223,1,TEXTCOLOR      ; 1
  158.   stdcall draw_button, 513,149,23,20,100,N_KEYCOLOR,keyText+224,1,TEXTCOLOR     ; 2
  159.   stdcall draw_button, 538,149,23,20,101,N_KEYCOLOR,keyText+225,1,TEXTCOLOR     ; 3
  160.   stdcall draw_button, 488,172,48,20,102,N_KEYCOLOR,keyText+226,1,TEXTCOLOR     ; 0
  161.   stdcall draw_button, 538,172,23,20,103,N_KEYCOLOR,keyText+227,1,TEXTCOLOR     ; .
  162.   stdcall draw_button, 563,103 ,23,43,104,N_KEYCOLOR,keyText+228,1,TEXTCOLOR    ; +
  163.   stdcall draw_button, 563,149,23,43,105,N_KEYCOLOR,keyText+229,3,TEXTCOLOR     ; Ent
  164.  
  165.  .draw_switch_button:
  166.   mov   eax, 6
  167.   mul   byte [keyboard_mode]
  168.   add   eax, SwitchText
  169.   stdcall draw_button, 513,28,46,20,106,0x00700000,eax,6,TEXTCOLOR       ; Scan/ASCII switch
  170.  
  171.   xor   al, al
  172.   xchg  al, [red_type]
  173.   test  al, 2
  174.   jnz   .skip_end_draw_window ; if we draw switch button without redraw window then end_draw_window not need
  175.  
  176. @@:
  177.  .draw_indicators_area:
  178.   call lights_on
  179.  
  180.   end_draw_window
  181.  
  182. .skip_end_draw_window:  
  183. ret
  184.  
  185. get_zkey_window_slot_number:
  186.         mov     eax, 18
  187.         mov     ebx, 7
  188.         int     0x40
  189.         mov     [zkey_window], eax
  190. set_event_mask:
  191.         mov     eax, 40
  192.         mov     ebx, 39
  193.         int     0x40
  194.  
  195. still:
  196.         call    get_receiver_window_slot_number
  197.         call    get_receiver_window_keyboard_mode ; return in ecx keyboard_mode for set_keyboard_mode
  198.         call    set_keyboard_mode
  199. ; delete_switch_button
  200.         mov eax, 8
  201.         mov edx, 0x80700000
  202.         int     0x40
  203.  mov    byte [red_type], 2
  204.         call    draw_window.draw_switch_button
  205.  
  206.         mov     eax, 10               ; Wait for an event in the queue.
  207.         int     0x40
  208.  
  209.         cmp     al,1                  ; redraw request ?
  210.         jz      red
  211.         cmp     al,2                  ; key in buffer ?
  212.         jz      key
  213.         cmp     al,3                  ; button in buffer ?
  214.         jz      button
  215.  
  216.         jmp     still
  217.  
  218. red:
  219.         call    draw_window
  220.         jmp     still
  221.  
  222. key:
  223.         mov     eax, 2
  224.         int     0x40
  225.  
  226. ;        push    ax
  227.         call    get_control_keys_state
  228.         cmp     [locks], ax
  229.         je      @f
  230.  
  231.       .reload:
  232.         call    reload_ascii_keymap
  233.         mov     byte [red_type], 1
  234.         call    draw_window
  235.        @@:
  236. ;        pop     dx
  237. ;        jmp     button.select_key_code
  238.         jmp     still
  239.  
  240. button:
  241.         mov     eax, 17             ; Get pressed button code
  242.         int     0x40
  243.         cmp     ah, 1               ; Test x button
  244.         je      close_app
  245.  
  246.         cmp     ah, 106             ; Test Scan/ASCII switch button
  247.         jne     .keyboard_keys
  248.         mov     cl, 1
  249.         sub     cl, byte [keyboard_mode]
  250.         call    set_keyboard_mode
  251.         mov     byte [red_type], 2
  252.         jmp     red
  253.  
  254.       .keyboard_keys:
  255.         cmp     ah, 2               ; Test if pressed buttons
  256.         jb      still               ; is a ZKEY keyboard key...
  257.         cmp     ah, 106
  258.         jnb     still               ; ...so, if not then still,
  259.         mov     [butt], ah          ; if yes then save pressed button ID
  260.       .test_slot:
  261.         mov     eax, [zkey_window]              ; Test is receiver ZKEY window
  262.         mov     ecx, [receiver_window]
  263.         cmp     eax, ecx
  264.         je      still                           ; if yes still.
  265.       .activate_receiver_window:
  266.         mov     eax, 18
  267.         mov     ebx, 3
  268.         int     0x40
  269.  
  270.       call reload_ascii_keymap
  271.  
  272.       .read_key_scancode:
  273.         xor     edx, edx
  274.         movzx   si, byte [butt]                 ; Read scan code of the key from the table.
  275.         sub     si, 2
  276.         mov     dl, [keyCodes+si]               ; Set dl = scancode of the key corresponding to the pressed button.
  277.         cmp     dl, 0xA0
  278.         jb      .select_key_code                ; If not extended key then select ascii or scan to send and then send it to the receiver.
  279.  
  280.         cmp     dl, 0xA6                        ; Test if it's extended2 key
  281.         jne     .read_ext_key                   ; if not go to prepare to send simply extended key.
  282.         mov     dl, 0xE1                        ; Send extended2 scancode...
  283.         call    send_key
  284.         mov     dl, 0x1D                        ; ...and extended scancode,
  285.         call    send_key                        ;
  286.         mov     dl, [keyCodes.ext2]             ; (There is only one ext2 key - 'Break')
  287.         jmp     .send_key_code                          ; so... send it's normal scan code.
  288.       .read_ext_key:
  289.         sub     dl, 0xA0                        ; Read extended key scan code from the table.
  290.         movzx   si, dl
  291.         mov     dl, [keyCodes.ext+si]
  292.      .send_ext:
  293.         push    dx                              ; Send extended scancode to the receiver's window.
  294.         mov     dl, 0xE0
  295.         call    send_key
  296.         pop     dx
  297. ;        jmp     .send_key_code
  298.       .select_key_code:                 ; Select what to send ASCII or scan.
  299.         cmp     [keyboard_mode], 0      ; Test if ZKEY must send ASCII.
  300.         jne     .send_key_code
  301.  
  302. ;        mov     esi, ext0               ; Set esi to the beginning of the ext0 table.
  303.         and     edx, 0x7F
  304. ;      @@:
  305. ;        cmp     dl, byte [esi]
  306. ;        je      .send_key_code
  307. ;        inc     esi
  308. ;        cmp     esi, ext0end
  309. ;        jng     @b
  310.       .read_ascii:
  311.         mov     dl, byte [ascii_keymap+edx]     ; Read ASCII from the keymap table.
  312.       .send_key_code:
  313.         call    send_key                ; Finally send the key to the receiver's window.
  314.       .wait:
  315.         mov     eax, 5
  316.         mov     ebx, 1                  ; Wait 0.01 second.
  317.         int     0x40
  318.       .activate_zkey_window:
  319.         mov     eax, 18
  320.         mov     ebx, 3
  321.         mov     ecx, [zkey_window]
  322.         int     0x40
  323.  
  324.         jmp     still
  325.  
  326.  
  327. close_app:
  328.     mov  eax,-1                  ; close this program
  329.     int  0x40
  330.  
  331.  
  332. ;**********************************
  333. ;*  input: ecx = type of mode     *
  334. ;**********************************
  335.  
  336. set_keyboard_mode:
  337.         mov     eax, 66
  338.         mov     ebx, 1     ; Set keyboard mode
  339.         int     0x40
  340.         mov     [keyboard_mode], cl
  341. ret
  342.  
  343. get_control_keys_state:    ; This routine works only in Scan keyboard mode.
  344.         mov     eax, 66
  345.         mov     ebx, 3
  346.         int     0x40
  347. ret
  348.  
  349.  
  350. ;**********************************
  351. ;*  input: ecx = type of map      *
  352. ;**********************************
  353.  
  354. get_keyboard_map:
  355.         mov     eax, 26
  356.         mov     ebx, 2
  357.         mov     edx, ascii_keymap
  358.         int     0x40
  359. ret
  360.  
  361.  
  362. reload_ascii_keymap:
  363.         call    get_control_keys_state
  364.         mov     ecx, 1
  365.  
  366.         test    ax, 3                           ; Shift pressed ?
  367.         jnz      @f
  368.         test    ax, 0x40                        ; Caps  Lock  on ?
  369.         jz      .load_ascii_keymap
  370.       @@:
  371.         mov     ecx, 2
  372.       .load_ascii_keymap:
  373.         call    get_keyboard_map
  374.   ret
  375.  
  376.  
  377.  
  378. get_receiver_window_slot_number:
  379.         mov     eax, 18
  380.         mov     ebx, 7
  381.         int     0x40
  382.         mov     ebx, [zkey_window]
  383.         cmp     eax, ebx
  384.         je      @f
  385.         mov     [receiver_window], eax
  386.       @@:
  387.   ret
  388.  
  389. get_receiver_window_keyboard_mode:
  390.         mov     eax, 9
  391.         mov     ebx, PROCINFO_BUFF
  392.         mov     ecx, [receiver_window]
  393.         int     0x40
  394.         movzx   ecx, byte [ebx + 75]
  395.         ret
  396.  
  397. ;************************************
  398. ;*  input: edx = code of the key    *
  399. ;************************************
  400.  
  401. send_key:
  402.         mov     eax, 72
  403.         mov     ebx, 1
  404.         mov     ecx, 2
  405.         int     0x40
  406.   ret
  407.  
  408. lights_on:
  409.    bar 491,51,95,15,0                      ; indicators area
  410.    rectangle 490,50,96,16,TEXTCOLOR
  411.  
  412.    call    get_control_keys_state
  413.    mov     [locks], ax
  414.    test ax, 0x40
  415.    jz @f
  416.    ;stdcall bar, 532, 53, 10, 11, 0x0000FF00
  417.    bar 532, 53, 10, 11, 0x0000FF00
  418.  @@:
  419.    test ax, 0x80
  420.    jz @f
  421.    ;stdcall bar, 500, 53, 10, 11, 0x0000FF00
  422.    bar 500, 53, 10, 11, 0x0000FF00
  423.  @@:
  424.    test ax, 0x100
  425.    jz @f
  426.    ;stdcall bar, 565, 53, 10, 11, 0x0000FF00
  427.    bar 565, 53, 10, 11, 0x0000FF00
  428.  @@:
  429. ret
  430.  
  431. ; DATA AREA
  432.  
  433. ; Application Title
  434. labelt db 'ZKEY v0.51 - keyboard for KolibriOS', 0
  435.  
  436. SwitchText db ' ASCII SCAN '
  437.  
  438. ;Button names
  439. keyText db 'EscF1F2F3F4F5F6F7F8F9F10F11F12'
  440.         db '~ð1!2@3#4$5%6^7&8*9(0)-_=+\|bksp'
  441.         db 'TabQ‰W–E“RŠT…YUƒI˜O™P‡{[•}]šEnter'
  442.         db 'lockA”S›D‚F€GHJŽK‹L„;:†''"'
  443.         db 'ShiftZŸX—C‘VŒBˆN’Mœ,<.>ž/?Shift'
  444.         db 'CtrlWinAlt AltWin[=]Ctrl'
  445.         db 'pscslkbrkInsHmPupDelEndPdn^<v >'
  446.         db 'nlk/*-7894561230.+Ent'
  447.  
  448. ;Key scan codes
  449. keyCodes:
  450.         db 0x01, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40, 0x41, 0x42, 0x43, 0x44, 0x57, 0x58
  451.         db 0x29, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x2B, 0x0E
  452.         db 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C
  453.         db 0x3A, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28
  454.         db 0x2A, 0x2C, 0x2D, 0x2E, 0x2F, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36
  455.         db 0x1D, 0xA0, 0x38, 0x39, 0xA1, 0xA2, 0xA3, 0xA4
  456.         db 0xA5, 0x46, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0
  457.         db 0x45, 0xB1, 0x37, 0x4A, 0x47, 0x48, 0x49, 0x4B, 0x4C, 0x4D, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x4E, 0xB2
  458.       .ext:
  459.         db 0x5B, 0x38, 0x5C, 0x5D, 0x1D
  460.         db 0x37, 0x00, 0x52, 0x47, 0x49, 0x53, 0x4F, 0x51, 0x48, 0x4B, 0x50, 0x4D
  461.         db 0x35, 0x1C
  462.       .ext2  db 0x45      ; Just Break :)
  463.  
  464. ;ext0:
  465. ;    db   0x1D, 0x29, 0x2A, 0x36, 0x37, 0x38, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, 0x40
  466. ;    db   0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D
  467. ;    db   0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x57, 0x58
  468. ;ext0end:
  469.  
  470. receiver_window dd 0      ; Slot number of the receiver
  471. zkey_window dd 0          ; Slot number of ZKEY
  472. butt    db 0              ; Pressed button ID
  473. locks   dw 0              ; NumLock, CapsLock, ScrollLock lights mask
  474.  
  475. keyboard_mode db 0        ; Scan or ASCII keys to send ?  0 - ASCII , 1 - Scan
  476. red_type      db 0        ; Type of window redraw. 0 - default , 1 - on ASCII_keymap change , 2 - Switch button pressed.
  477.  
  478. I_END:                    ; End of application code and data marker
  479.  
  480. ascii_keymap:
  481.