можно ли имитировать нажатие клавиши без прерывания?

Тема в разделе "WASM.BEGINNERS", создана пользователем senseysensor, 13 мар 2009.

  1. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    Здравствуйте!
    Скажите, пожалуйста, можно ли, не прибегая к прерываниям, имитировать нажатие клавиши (напр., пробела)? То есть напрямую занести скан-код в порт?

    Что-то у меня такой код не работает:
    Код (Text):
    1. mov AL, 4BH
    2. out 60H, AL
    Хочу сделать это как можно на более низком уровне, не прибегая ко всяким там int 21H.

    Спасибо за помощь!

    ps - да, чуть не забыл - имею дело с чистым досом.
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Нельзя.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    SII
    Эм... а с прерыванием? :) Кому под DOS можно доказывать, что нажата клавиша, если в данный момент исполняется одна единственная программа: своя собственная?
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    l_inc
    Резидентам ?
    Последние изза фонового исполнения образуют примитивную мультизадачность.
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Clerk
    Ну положим, что никакого фонового исполнения там нету, а резидент - это кусок кода, попросивший DOS не писать поверх него ничего после возврата управления, который получает управление в лучшем случае тогда, когда возникают перехваченные им прерывания... Хотя в принципе да... спасибо. Не подумал, что им ещё можно что-то доказывать. :) Подумал только про то, что, будучи резидентом, можно перехватывать, например, int 16h и возвращать значения нажатых клавиш, но большого смысла в этом не усмотрел.
     
  6. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    значит, минимум - это использовать int 16H?

    ps - кстати, а почему через порты напрямую такая штука не действует? какая разница, откуда байт - из микросхемы клавиатуры или из регистра?
     
  7. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Большая разница. Контроллер смотрит, с какой стороны к нему информация идёт, и предпринимает соответствующие действия.
     
  8. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Можно, только не таким способом, который продемонстрировал автор, правда прерывание будет возникать так, как будто код действительно пришел от клавиатуры. Генерацию прерываний можно и отключить, но лишь в целом, а не для данной конкретной ситуации.
     
  9. Vov4ick

    Vov4ick Владимир

    Публикаций:
    0
    Регистрация:
    8 окт 2006
    Сообщения:
    581
    Адрес:
    МО
    Если после записи в 60 порт вызвать int 9, то должно сработать. Доказывать нажатие клавиши не только резидентам, такое редко бывает нужно, а наоборот, основной программе из резидентной. Но для этого лучше использовать соответствующую функцию 16 прерывания, будет гораздо проще, чем посылать коды нажатий и отпусканий. Но это может не сработать, если обманываемая программа резидентная или обрабатывает клавиатуру сама.
     
  10. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    а каким..? именно это и требуется. надо обмануть не резидент, а обычную прогу. Правда, не знаю, как она обрабатывает нажатия.

    что-то это не работает...

    попробую через int 16H

    [добавлено позже:]
    Не понимаю, какой функцией 16H прерывания можно имитировать нажатие? у меня в хелпе речь только о трёх функциях: ожидание след. нажатой клавиши, проверить готовность символа, читать состояние shift-клавиш...
     
  11. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    все можно, в контроллере это предусмотрено
    выкопал из своей древенй проги
    исполнялось внутри перерывания, так что cli и прочее добавь сам

    Код (Text):
    1. crk macro
    2. call canreadk
    3. endm
    4. crm macro
    5. call canreadm
    6. endm
    7. cwp macro
    8. call canwritep
    9. endm
    10. cwc macro
    11. call canwritec
    12. endm
    13. sendkey macro
    14. call sndkey
    15. endm
    16.  
    17. ;тута
    18. mov dl,1Ah
    19. sendkey
    20.  
    21. ;-----------------------------begin makros-------------------------------------
    22. canreadk:
    23. in al,64h
    24. ;and al,1
    25. ;jz canreadk
    26. shr al,1
    27. jnc canreadk
    28. ret
    29.  
    30. canreadm:
    31. in al,64h
    32. test al,1
    33. jz canreadm
    34. test al,20h
    35. jnz ecanreadm
    36. in al,60h
    37. jmp canreadm
    38. ecanreadm:
    39. ret
    40.  
    41. canwritep:
    42. in al,64h
    43. and al,2
    44. jnz canwritep
    45. ret
    46.  
    47. canwritec:
    48. in al,64h
    49. and al,3
    50. jnz canwritec
    51. ret
    52.  
    53. sndkey:
    54. cwc
    55. mov al,0D2h
    56. out 64h,al
    57. cwp
    58. mov al,dl
    59. out 60h,al
    60. ret
     
  12. senseysensor

    senseysensor New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2009
    Сообщения:
    17
    Спасибо огромное!!!!!!! вечером попробую.