Subversion Repositories Kolibri OS

Rev

Rev 8 | Rev 92 | 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. endg
  30.  
  31. align 4
  32. irq1:
  33.        save_ring3_context
  34.        mov   ax, os_data
  35.        mov   ds, ax
  36.        mov   es, ax
  37.  
  38.        movzx eax,word[0x3004] ; top window process
  39.        movzx eax,word[0xC400+eax*2]
  40.        shl   eax,8
  41.        mov   al,[0x800B4+eax]
  42.        mov   [keyboard_mode],al
  43.  
  44.        in    al,0x60
  45.        mov   [keyboard_data],al
  46.  
  47.        mov   ch,al
  48.        cmp   al,0xE0
  49.        je    @f
  50.        cmp   al,0xE1
  51.        jne   .normal_code
  52.    @@: mov   [ext_code],al
  53.        jmp   .no_key.end
  54.    .normal_code:
  55.        mov   cl,[ext_code]
  56.        mov   [ext_code],0
  57.        and   al,0x7F
  58.    @@: cmp   al,0x2A
  59.        jne   @f
  60.        cmp   cl,0xE0
  61.        je    .no_key.end
  62.        mov   eax,VKEY_LSHIFT
  63.        jmp   .no_key
  64.    @@: cmp   al,0x36
  65.        jne   @f
  66.        cmp   cl,0xE0
  67.        je    .no_key.end
  68.        mov   eax,VKEY_RSHIFT
  69.        jmp   .no_key
  70.    @@: cmp   al,0x38
  71.        jne   @f
  72.        cmp   cl,0xE0
  73.        je    .alt.r
  74.        mov   eax,VKEY_LALT
  75.        jmp   .no_key
  76.    .alt.r:
  77.        mov   eax,VKEY_RALT
  78.        jmp   .no_key
  79.    @@: cmp   al,0x1D
  80.        jne   @f
  81.        cmp   cl,0
  82.        jne   .ctrl.r
  83.        mov   eax,VKEY_LCONTROL
  84.        jmp   .no_key
  85.    .ctrl.r:
  86.        cmp   cl,0xE1
  87.        jne   .ctrl.r.2
  88.        mov   [ext_code],cl
  89.        jmp   .no_key.end
  90.    .ctrl.r.2:
  91.        mov   eax,VKEY_RCONTROL
  92.        jmp   .no_key
  93.    @@: cmp   al,0x3A
  94.        jne   @f
  95.        mov   bl,4
  96.        mov   eax,VKEY_CAPSLOCK
  97.        jmp   .no_key.xor
  98.    @@: cmp   al,0x45
  99.        jne   @f
  100.        cmp   cl,0
  101.        jne   .no_key.end
  102.        mov   bl,2
  103.        mov   eax,VKEY_NUMLOCK
  104.        jmp   .no_key.xor
  105.    @@: cmp   al,0x46
  106.        jne   @f
  107.        mov   bl,1
  108.        mov   eax,VKEY_SCRLOCK
  109.        jmp   .no_key.xor
  110.    @@:
  111.        test  ch,0x80
  112.        jnz   .no_key.end
  113.        movzx eax,ch              ; plain key
  114.        mov   bl,[keymap+eax]
  115.        mov   edx,[kb_state]
  116.        test  dl,VKEY_CONTROL     ; ctrl alt del
  117.        jz    .noctrlaltdel
  118.        test  dl,VKEY_ALT
  119.        jz    .noctrlaltdel
  120.        cmp   bl,134+48
  121.        jne   .noctrlaltdel
  122.        mov   [ctrl_alt_del],1
  123.        jmp   .no_key.end
  124.    .noctrlaltdel:
  125.        test  dl,VKEY_CONTROL     ; ctrl on ?
  126.        jz    @f
  127.        sub   bl,0x60
  128.    @@: test  dl,VKEY_SHIFT       ; shift on ?
  129.        jz    @f
  130.        mov   bl,[keymap_shift+eax]
  131.    @@: test  dl,VKEY_ALT         ; alt on ?
  132.        jz    @f
  133.        mov   bl,[keymap_alt+eax]
  134. ; alt mouse ?
  135.        xor   edx,edx
  136.        cmp   bl,178
  137.        jnz   .no_alt.up
  138.        mov   edx,5*65536
  139.        jmp   .mouse.change
  140.    .no_alt.up:
  141.        cmp   bl,177
  142.        jnz   .no_alt.down
  143.        mov   edx,251*65536
  144.        jmp   .mouse.change
  145.    .no_alt.down:
  146.        cmp   bl,176
  147.        jnz   .no_alt.left
  148.        mov   edx,251*256
  149.        jmp   .mouse.change
  150.    .no_alt.left:
  151.        cmp   bl,179
  152.        jnz   .no_alt.right
  153.        mov   edx,5*256
  154.        jmp   .mouse.change
  155.    .no_alt.right:
  156.        cmp   bl,' '
  157.        jne   @f
  158.        xor   [altmouseb],1
  159.    .mouse.change:
  160.        mov   byte[0xF604],1; ps2 data
  161.        mov   byte[0xFB00],0; ps2 chunk count
  162.        mov   word[0x2E0000+4096*12],3; mouse data count
  163.        mov   dl,[altmouseb]
  164.        mov   [0x2E0000+4096*12+0x10],edx
  165.        mov   bl,0
  166.    @@:
  167.        cmp   [keyboard_mode],0 ; return from keymap
  168.        jne   .no_key.end
  169.        mov   [keyboard_mode_sys],0
  170.        cmp   bl,0
  171.        je    .no_key.end
  172.        movzx eax,byte[0xF400]
  173.        cmp   al,120
  174.        jae   .no_key.end
  175.        inc   al
  176.        mov   [0xF400],al
  177.        mov   [0xF400+eax],bl
  178.  
  179.        jmp   .no_key.end
  180.  
  181.    .no_key:
  182.        test  ch,0x80
  183.        jz    .no_key.down
  184.        not   eax
  185.        and   [kb_state],eax
  186.        jmp   .no_key.end
  187.    .no_key.xor:
  188.        test  ch,0x80
  189.        jnz   .no_key.end
  190.        xor   [kb_state],eax
  191.        xor   [kb_lights],bl
  192.        call  set_lights
  193.        jmp   .no_key.end
  194.    .no_key.down:
  195.        or    [kb_state],eax
  196.    .no_key.end:
  197.        cmp   [keyboard_mode],1 ; return scancode
  198.        jne   .no_scancode
  199.        mov   [keyboard_mode_sys],1
  200.        movzx eax,byte[0xF400]
  201.        cmp   al,120
  202.        jae   .no_scancode
  203.        inc   al
  204.        mov   [0xF400],al
  205.        mov   [0xF400+eax],ch
  206.    .no_scancode:
  207.  
  208.    .exit.irq1:
  209.        mov   [check_idle_semaphore],5
  210.  
  211.        mov   al,0x20                  ; ready for next irq
  212.        out   0x20,al
  213.  
  214.        restore_ring3_context
  215.        iret
  216.  
  217. set_lights:
  218.        mov   al,0xED
  219.        call  kb_write
  220.        mov   al,[kb_lights]
  221.        call  kb_write
  222.        ret
  223.  
  224. ;// mike.dld ]
  225.