Subversion Repositories Kolibri OS

Rev

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

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