Subversion Repositories Kolibri OS

Rev

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