Клавиатура в DOS

Тема в разделе "WASM.BEGINNERS", создана пользователем Header, 17 сен 2006.

  1. Header

    Header New Member

    Публикаций:
    0
    Регистрация:
    9 сен 2006
    Сообщения:
    1
    В общем мне нужно перехватить в DOS особую комбинацию клавиш, допустим Alt-Shift-F1. Собственно это не представляет особой проблемы, но когда я хочу вывести на экран результат(нажата клавиша или нет), выводится какой-то мусор. Хотелось бы узнать где я сделал ошибку, может я что-то напутал с сегментами, оформлением процедур или ещё что-то сделал не так.
    Код (Text):
    1.     .model small
    2.     .stack 100h
    3.     .data
    4. lshift  equ 00001010b
    5. rshift  equ 00001001b
    6. f1_scan equ 2
    7.  
    8.  
    9. sExit   db "Press any key to continue...",'$'
    10. keys    db "Alt, Shift and F1 pressed",0dh,0ah,'$'
    11. rights  db "Right shift",0dh,0ah,'$'
    12. lefts   db "Left shift",0dh,0ah,'$'
    13. nokeys  db "Right combination havn't been pressed.",0dh,0ah,'$'
    14. ctls    db 0
    15.     .code
    16. start:
    17.     push @data
    18.     pop ds
    19.    
    20.     mov ax,0
    21.     int 10h
    22.        
    23.     mov ah,0
    24.     int 16h
    25.     mov bx,ax
    26.     mov ah,22h
    27.     int 16h
    28.     mov ctls,ah
    29.    
    30.     call compare_proc
    31.    
    32. exit:
    33.     lea dx,sExit
    34.     call print_proc
    35.  
    36.     mov ah,0
    37.     int 16h
    38.    
    39.     mov ax,4c00h
    40.     int 21h
    41.  
    42. print_proc proc
    43.     mov ah,9
    44.     int 21h
    45.     ret
    46. endp
    47.  
    48. compare_proc proc
    49. Left:
    50.     mov cl,ctls
    51.     and cl,lshift
    52.     cmp cl,lshift
    53.     jne Right
    54.     lea dx,lefts
    55.     jmp F1_pressed
    56.    
    57. Right:
    58.     mov cl,ctls
    59.     and cl,rshift
    60.     cmp cl,rshift
    61.     jne exit_proc
    62.     lea dx,rights
    63. F1_pressed:
    64.     ;cmp bh,f1_scan
    65.     ;jne exit_proc
    66.     ;lea dx,keys
    67.     ;call print_proc
    68.    
    69. exit_proc:
    70.     ;lea dx,nokeys
    71.     call print_proc
    72.     ret
    73. endp
    74.  
    75. end start
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Надо в цикле проверять наличие символов в буфере клавиатуры (INT16 AH=01).