Subversion Repositories Kolibri OS

Rev

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