Subversion Repositories Kolibri OS

Rev

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

  1. ;// mike.dld [
  2.  
  3. VKEY_LSHIFT   = 0000000000000001b
  4. VKEY_RSHIFT   = 0000000000000010b
  5. VKEY_LCONTROL = 0000000000000100b
  6. VKEY_RCONTROL = 0000000000001000b
  7. VKEY_LALT     = 0000000000010000b
  8. VKEY_RALT     = 0000000000100000b
  9. VKEY_CAPSLOCK = 0000000001000000b
  10. VKEY_NUMLOCK  = 0000000010000000b
  11. VKEY_SCRLOCK  = 0000000100000000b
  12.  
  13. VKEY_SHIFT    = 0000000000000011b
  14. VKEY_CONTROL  = 0000000000001100b
  15. VKEY_ALT      = 0000000000110000b
  16.  
  17. uglobal
  18.   align 4
  19.   kb_state      dd 0
  20.   ext_code      db 0
  21.  
  22.   keyboard_mode db 0
  23.   keyboard_data db 0
  24.  
  25.   altmouseb     db 0
  26.   ctrl_alt_del  db 0
  27.  
  28.   kb_lights     db 0
  29.  
  30. align 4
  31.         hotkey_scancodes        rd      256     ; we have 256 scancodes
  32.         hotkey_list             rd      256*4   ; max 256 defined hotkeys
  33.         hotkey_buffer           rd      120*2   ; buffer for 120 hotkeys
  34. endg
  35.  
  36. iglobal
  37. hotkey_tests    dd      hotkey_test0
  38.                 dd      hotkey_test1
  39.                 dd      hotkey_test2
  40.                 dd      hotkey_test3
  41.                 dd      hotkey_test4
  42. hotkey_tests_num = 5
  43. endg
  44.  
  45. hotkey_test0:
  46.         test    al, al
  47.         setz    al
  48.         ret
  49. hotkey_test1:
  50.         test    al, al
  51.         setnp   al
  52.         ret
  53. hotkey_test2:
  54.         cmp     al, 3
  55.         setz    al
  56.         ret
  57. hotkey_test3:
  58.         cmp     al, 1
  59.         setz    al
  60.         ret
  61. hotkey_test4:
  62.         cmp     al, 2
  63.         setz    al
  64.         ret
  65.  
  66. hotkey_do_test:
  67.         push    eax
  68.         mov     edx, [kb_state]
  69.         shr     edx, cl
  70.         add     cl, cl
  71.         mov     eax, [eax+4]
  72.         shr     eax, cl
  73.         and     eax, 15
  74.         cmp     al, hotkey_tests_num
  75.         jae     .fail
  76.         xchg    eax, edx
  77.         and     al, 3
  78.         call    [hotkey_tests + edx*4]
  79.         cmp     al, 1
  80.         pop     eax
  81.         ret
  82. .fail:
  83.         stc
  84.         pop     eax
  85.         ret
  86.  
  87. align 4
  88. irq1:
  89.        save_ring3_context
  90.        mov   ax, os_data
  91.        mov   ds, ax
  92.        mov   es, ax
  93.  
  94.        movzx eax,word[0x3004] ; top window process
  95.        movzx eax,word[0xC400+eax*2]
  96.        shl   eax,8
  97.        mov   al,[0x800B4+eax]
  98.        mov   [keyboard_mode],al
  99.  
  100.        in    al,0x60
  101.        mov   [keyboard_data],al
  102.  
  103. ; ch = scancode
  104. ; cl = ext_code
  105. ; bh = 0 - normal key
  106. ; bh = 1 - modifier (Shift/Ctrl/Alt)
  107. ; bh = 2 - extended code
  108.  
  109.        mov   ch,al
  110.        cmp   al,0xE0
  111.        je    @f
  112.        cmp   al,0xE1
  113.        jne   .normal_code
  114.    @@:
  115.         mov     bh, 2
  116.         mov     [ext_code], al
  117.         jmp     .writekey
  118.    .normal_code:
  119.         mov     cl, 0
  120.         xchg    cl, [ext_code]
  121.        and   al,0x7F
  122.         mov     bh, 1
  123.    @@: cmp   al,0x2A
  124.        jne   @f
  125.        cmp   cl,0xE0
  126.        je    .writekey
  127.        mov   eax,VKEY_LSHIFT
  128.        jmp   .modifier
  129.    @@: cmp   al,0x36
  130.        jne   @f
  131.        cmp   cl,0xE0
  132.        je    .writekey
  133.        mov   eax,VKEY_RSHIFT
  134.        jmp   .modifier
  135.    @@: cmp   al,0x38
  136.        jne   @f
  137.         mov     eax, VKEY_LALT
  138.         test    cl, cl
  139.         jz      .modifier
  140.         mov     al, VKEY_RALT
  141.         jmp     .modifier
  142.    @@: cmp   al,0x1D
  143.        jne   @f
  144.         mov     eax, VKEY_LCONTROL
  145.         test    cl, cl
  146.         jz      .modifier
  147.         mov     al, VKEY_RCONTROL
  148.         cmp     cl, 0xE0
  149.         jz      .modifier
  150.         mov     [ext_code], cl
  151.         jmp     .writekey
  152.    @@: cmp   al,0x3A
  153.        jne   @f
  154.        mov   bl,4
  155.        mov   eax,VKEY_CAPSLOCK
  156.        jmp   .no_key.xor
  157.    @@: cmp   al,0x45
  158.        jne   @f
  159.         test    cl, cl
  160.         jnz     .writekey
  161.        mov   bl,2
  162.        mov   eax,VKEY_NUMLOCK
  163.        jmp   .no_key.xor
  164.    @@: cmp   al,0x46
  165.        jne   @f
  166.        mov   bl,1
  167.        mov   eax,VKEY_SCRLOCK
  168.        jmp   .no_key.xor
  169.    @@:
  170.        test  ch,ch
  171.        js    .writekey
  172.        movzx eax,ch              ; plain key
  173.        mov   bl,[keymap+eax]
  174.        mov   edx,[kb_state]
  175.        test  dl,VKEY_CONTROL     ; ctrl alt del
  176.        jz    .noctrlaltdel
  177.        test  dl,VKEY_ALT
  178.        jz    .noctrlaltdel
  179.        cmp   ch,53h
  180.        jne   .noctrlaltdel
  181.        mov   [ctrl_alt_del],1
  182.    .noctrlaltdel:
  183.        test  dl,VKEY_CONTROL     ; ctrl on ?
  184.        jz    @f
  185.        sub   bl,0x60
  186.    @@: test  dl,VKEY_SHIFT       ; shift on ?
  187.        jz    @f
  188.        mov   bl,[keymap_shift+eax]
  189.    @@: test  dl,VKEY_ALT         ; alt on ?
  190.        jz    @f
  191.        mov   bl,[keymap_alt+eax]
  192. ; alt mouse ?
  193.        xor   edx,edx
  194.        cmp   bl,178
  195.        jnz   .no_alt.up
  196.        mov   edx,5*65536
  197.        jmp   .mouse.change
  198.    .no_alt.up:
  199.        cmp   bl,177
  200.        jnz   .no_alt.down
  201.        mov   edx,251*65536
  202.        jmp   .mouse.change
  203.    .no_alt.down:
  204.        cmp   bl,176
  205.        jnz   .no_alt.left
  206.        mov   edx,251*256
  207.        jmp   .mouse.change
  208.    .no_alt.left:
  209.        cmp   bl,179
  210.        jnz   .no_alt.right
  211.        mov   edx,5*256
  212.        jmp   .mouse.change
  213.    .no_alt.right:
  214.        cmp   bl,' '
  215.        jne   @f
  216.        xor   [altmouseb],1
  217.    .mouse.change:
  218.        mov   byte[0xF604],1; ps2 data
  219.        mov   byte[0xFB00],0; ps2 chunk count
  220.        mov   word[0x2E0000+4096*12],3; mouse data count
  221.        mov   dl,[altmouseb]
  222.        mov   [0x2E0000+4096*12+0x10],edx
  223.        mov   bl,0
  224.    @@:
  225.         mov     bh, 0
  226.         jmp     .writekey
  227. .modifier:
  228.         test    ch, ch
  229.         js      .modifier.up
  230.         or      [kb_state], eax
  231.         jmp     .writekey
  232. .modifier.up:
  233.         not     eax
  234.         and     [kb_state], eax
  235.         jmp     .writekey
  236. .no_key.xor:
  237.         mov     bh, 0
  238.         test    ch, ch
  239.         js      .writekey
  240.         xor     [kb_state], eax
  241.         xor     [kb_lights], bl
  242.         call    set_lights
  243.  
  244. .writekey:
  245. ; test for system hotkeys
  246.         movzx   eax, ch
  247.         cmp     bh, 1
  248.         ja      .nohotkey
  249.         jb      @f
  250.         xor     eax, eax
  251. @@:
  252.         mov     eax, [hotkey_scancodes + eax*4]
  253. .hotkey_loop:
  254.         test    eax, eax
  255.         jz      .nohotkey
  256.         mov     cl, 0
  257.         call    hotkey_do_test
  258.         jc      .hotkey_cont
  259.         mov     cl, 2
  260.         call    hotkey_do_test
  261.         jc      .hotkey_cont
  262.         mov     cl, 4
  263.         call    hotkey_do_test
  264.         jnc     .hotkey_found
  265. .hotkey_cont:
  266.         mov     eax, [eax]
  267.         jmp     .hotkey_loop
  268. .hotkey_found:
  269.         mov     eax, [eax+8]
  270. ; put key in buffer for process in slot eax
  271.         mov     edi, hotkey_buffer
  272. @@:
  273.         cmp     dword [edi], 0
  274.         jz      .found_free
  275.         add     edi, 8
  276.         cmp     edi, hotkey_buffer+120*8
  277.         jb      @b
  278. ; no free space - replace first entry
  279.         mov     edi, hotkey_buffer
  280. .found_free:
  281.         mov     [edi], eax
  282.         movzx   eax, ch
  283.         cmp     bh, 1
  284.         jnz     @f
  285.         xor     eax, eax
  286. @@:
  287.         mov     [edi+4], ax
  288.         mov     eax, [kb_state]
  289.         mov     [edi+6], ax
  290.         jmp     .exit.irq1
  291. .nohotkey:
  292.        cmp   [keyboard_mode],0 ; return from keymap
  293.        jne   .scancode
  294.         test    bh, bh
  295.         jnz     .exit.irq1
  296.         test    bl, bl
  297.         jz      .exit.irq1
  298.         jmp     .dowrite
  299. .scancode:
  300.         mov     bl, ch
  301. .dowrite:
  302.        movzx eax,byte[0xF400]
  303.        cmp   al,120
  304.        jae   .exit.irq1
  305.        inc   eax
  306.        mov   [0xF400],al
  307.        mov   [0xF400+eax],bl
  308.  
  309.    .exit.irq1:
  310.        mov   [check_idle_semaphore],5
  311.  
  312.        mov   al,0x20                  ; ready for next irq
  313.        out   0x20,al
  314.  
  315.        restore_ring3_context
  316.        iret
  317.  
  318. set_lights:
  319.        mov   al,0xED
  320.        call  kb_write
  321.        mov   al,[kb_lights]
  322.        call  kb_write
  323.        ret
  324.  
  325. ;// mike.dld ]
  326.