Уважаемые знатоки, подскажите пожалуйста человеку не смыслящему в языке ассемблера как правильно работать с клавиатурой через порты. Задача проста, записать в буффер клавиатуры скан-код. А вопросов много. 0) Через 64 порт вырубаю и врубаю мышку... значит дело в мозге 1) Порты 60 и 61 или 60 и 64 ? Да 61 для совместимости и многаво букв но всё же 3) Коды какие использовать? их вроде там три варианта, где бы почитать. 4) надо ли при работе через 64й щелкать клавиатуру, как при чтении через 61й 5) можно ли писать через 61й ? 6) что-то новее Джордейна и полнее Фроловых почитать есть? Прошу не бить за столь безграмотно составленный пост. С уважением, Clotho
как отключаю грызуна Код (Text): w_: __asm in al,64h __asm test al,10b __asm jnz w_ __asm mov al,0A7h __asm out 64h,al
За запись в буффер, как я понимаю, отвечает команда 0D2h порта 64, но что-то как-то мне её правильно использовать не удалось... =(
0) не понял вообще. Как, впрочем, и задачу в целом. 1) С 8042 - обмен через 60/64, с 8048 - через 60. Набор команд у них разный. 3) Какой надо - такой и пишите. 4) Забудьте 61 порт как страшный сон времен ХТ. Уже давно он никому не нужен, но абсолютное большинство ресурсов, которые называют себя "посвященными программированию" тупо копипастят друг у друга бред с передергиванием 7 бита в этом порту. Так уже не нужно делать лет эдак 10-15. 5) 61 порт уже не используется. Вообще. Совсем. Навсегда. Кирдык. 6) Спрашивать гугл по ключам что-то типа 8042 KBD interface.
Не путай человека. Там все по другому. Чтобы послать команду в 8048. Надо вначале подать команду в 8042, а после послать данные. А вот как эти данные интерпретировать зависит от 8042. clotho Неправильно это команда выполняет другую роль.
Благодарю уважаемых Vic3Dexe и Pavia что откликнулись. 8042 и 8048 функционально, абсолютно разные контроллеры --- 8042 процессор клавиатуры, а 8048 микросхема работы с переферией. Я правильно это понимаю???
Задача, как я её понимаю, состоит в том, чтобы не привязываясь к конктретной ОС <<нажимать>> кнопки клавиатуры. Код про грызуна приведён только для того чтобы показать что я могу писать в порты.
Вопрос к уважаемому Pavia Так же ночью наткнулся на следующий пост: Видимо я не один так понимаю смысл команды D2 контроллера 8042. Мне начинать скать правильную литературу? P.S. Код приведённый в цитате не даёт желаемого эффекта.
И ещё к уважаемому Pavia Пожалуйста, конкретизуруйте Ваше высказывания относительно команды D2 . Я, если надо, конкретизирую свою задачу.
Итак, формулировка задачи в принципе утряслась. Как писать в буффер клавиатуры через 64й порт. Когда и сколько ждать. И самое главное, что-то после отправки данных через порт 60 делать надо? Везде всё написано по-разному =( Общий костяк Код (Text): in al,64h ждать mov al,0D2h out 64h,al mov al, скан-код out 60h,al Почему я не наблюдаю эффекта? или я не там смотрю?
Код (Text): mov al,0D2h out 64h,al ждать приема кода команды mov al, скан-код out 60h,al ждать приема данных После можно получать отправленный код (например, в обработчике прерывания).
Чтобы включить светодиод надо обращаться к 8042 через 64 порт? Ну-ну =) Если ты имеешь ввиду, что весь траффик к 8048 проходит через 8042, то я согласен, но система команд у них разная, и обращаться к ним нужно по-разному. 8042 - это контроллер клавомыши (родился в АТ, располагался на маме, сейчас в составе южного моста) отвечающий за обслуживание интерфейсов PS/2, AT KBD, PS/2 mouse, а 8048 (сейчас ее аналоги) - это контроллер в самой клаве, отвечающий за сканирование клавиш, управление светодиодами, генерацию скан-кодов и пр. низкоуровневые вещи. Поскольку весь обмен с 8048 идет через порт клавы (а, следовательно, и через 8042), 8042 может влиять на процесс, например, транслируя скан-коды от 8048 из set 2 в set 1.
Позволю себе уточнить: 8042 — программируемый микроконтроллер (прожигается на заводе, можно прицепить внешнее ПЗУ через ноги GPIO), зачастую он не в составе южного моста, а в составе отдельного SuperIO (обычно там же FDC/COM/LPT/Smartcard и прочая) на шине LPC.
Спасибо уважаемым Vic3Dexe и baldr за прояснение ситуации. Вопрос к уважаемому Phantom_84. А если я по собственной наивности не желаю писать обработчик? Вот вызвать int 16 у меня не получилось, система ушла в ребут... (По этой причине пишу в порты.) Где-то я читал, что после записи в буфер клавы, следует, именно следует, передать управление текущему обработчику, так ли это? Общий вопрос, как <<увидеть>> результат? То есть надо написать процедуру которая определяет/устанавливает набор скан-кодов потом пишет в порт, или просто написать в порт, и выполнить её, скажем, при активном фокусе на окне текстового редактора, или тут так не прокатит? Спасибо всем пытающимся читать мой бред.
int 16h получает данные из клавиатурного буфера BIOS, помещаемые туда обработчиком, висящим на int 9. Ты можешь получить код при помощи int 16h, только нужно учитывать, что у BIOS свой формат.
Phantom_84, я имел ввиду пятую функцию int 16 --- поместить данные в буффер. Привела к перезагрузке. (Хотя тут скорее моя вина, ведь нельзя было туда фар джампом, так?) Вот здесь я читал про обязательный вызов обработчика http://www.computer-engineering.org/ Вопрос остаётся открытым: я маленький резидент, гажу в буффер клавиатуры, как сделать чтобы всё записаное в буффер оттуда считалось (обработчиком?) и пошло дальше?
Far jump'ом не стóит, обработчик ожидает кой-чего в стэке. Гадить в буфер клавиатуры надо аккуратно если прерывания разрешены. Атомарные операции и всё такое.