Subversion Repositories Kolibri OS

Rev

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