Здравствуйте! Скажите, пожалуйста, можно ли, не прибегая к прерываниям, имитировать нажатие клавиши (напр., пробела)? То есть напрямую занести скан-код в порт? Что-то у меня такой код не работает: Код (Text): mov AL, 4BH out 60H, AL Хочу сделать это как можно на более низком уровне, не прибегая ко всяким там int 21H. Спасибо за помощь! ps - да, чуть не забыл - имею дело с чистым досом.
SII Эм... а с прерыванием? Кому под DOS можно доказывать, что нажата клавиша, если в данный момент исполняется одна единственная программа: своя собственная?
Clerk Ну положим, что никакого фонового исполнения там нету, а резидент - это кусок кода, попросивший DOS не писать поверх него ничего после возврата управления, который получает управление в лучшем случае тогда, когда возникают перехваченные им прерывания... Хотя в принципе да... спасибо. Не подумал, что им ещё можно что-то доказывать. Подумал только про то, что, будучи резидентом, можно перехватывать, например, int 16h и возвращать значения нажатых клавиш, но большого смысла в этом не усмотрел.
значит, минимум - это использовать int 16H? ps - кстати, а почему через порты напрямую такая штука не действует? какая разница, откуда байт - из микросхемы клавиатуры или из регистра?
Большая разница. Контроллер смотрит, с какой стороны к нему информация идёт, и предпринимает соответствующие действия.
Можно, только не таким способом, который продемонстрировал автор, правда прерывание будет возникать так, как будто код действительно пришел от клавиатуры. Генерацию прерываний можно и отключить, но лишь в целом, а не для данной конкретной ситуации.
Если после записи в 60 порт вызвать int 9, то должно сработать. Доказывать нажатие клавиши не только резидентам, такое редко бывает нужно, а наоборот, основной программе из резидентной. Но для этого лучше использовать соответствующую функцию 16 прерывания, будет гораздо проще, чем посылать коды нажатий и отпусканий. Но это может не сработать, если обманываемая программа резидентная или обрабатывает клавиатуру сама.
а каким..? именно это и требуется. надо обмануть не резидент, а обычную прогу. Правда, не знаю, как она обрабатывает нажатия. что-то это не работает... попробую через int 16H [добавлено позже:] Не понимаю, какой функцией 16H прерывания можно имитировать нажатие? у меня в хелпе речь только о трёх функциях: ожидание след. нажатой клавиши, проверить готовность символа, читать состояние shift-клавиш...
все можно, в контроллере это предусмотрено выкопал из своей древенй проги исполнялось внутри перерывания, так что cli и прочее добавь сам Код (Text): crk macro call canreadk endm crm macro call canreadm endm cwp macro call canwritep endm cwc macro call canwritec endm sendkey macro call sndkey endm ;тута mov dl,1Ah sendkey ;-----------------------------begin makros------------------------------------- canreadk: in al,64h ;and al,1 ;jz canreadk shr al,1 jnc canreadk ret canreadm: in al,64h test al,1 jz canreadm test al,20h jnz ecanreadm in al,60h jmp canreadm ecanreadm: ret canwritep: in al,64h and al,2 jnz canwritep ret canwritec: in al,64h and al,3 jnz canwritec ret sndkey: cwc mov al,0D2h out 64h,al cwp mov al,dl out 60h,al ret