![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 25.06.2010
Сообщений: 30
|
![]()
Нужна помощь в задаче: нужно определить размер буфера клавиатуры.
Читал, что он размером 32 байта вроде как. Нужно программно получить эту цифру(32). Как точно - не знаю, но вроде догадываюсь, направьте на путь истиный: Есть прога которая пишет в буфер: (часть) PHP код:
Как программно обработать то, что бипер работал? |
![]() |
![]() |
![]() |
#2 |
Форумчанин
Регистрация: 31.05.2009
Сообщений: 786
|
![]()
[AT]
Expects: AH 05H CH scan code to store CL ASCII character code or extended ASCII keystroke ─────────────────────────────────── ────────────────────────────── ─ Returns: AL 0=successfully stored 1=not stored (no room in buffer) ─────────────────────────────────── ────────────────────────────── ─ Info: This can be used to stuff data into the keyboard buffer, as if the user had typed the keys manually. This can be used by keyboard macro programs and other such utilities. Код:
![]() Последний раз редактировалось alexcoder; 31.03.2011 в 09:20. |
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
![]()
Merovingian
Можно использовать чтение буфера клавиатуры по адресам 0040:001Ah указатель на логическое начало буфера 0040:001Ch указатель на логический конец буфера 0040:001Eh память для хранения ASCII/скан-кодов начало 0040:003Eh конец буфера 0040:0080h указатель на физическое начало буфера 0040:0082h указатель на физический конец буфера После нажатия на клавишу ее скан-код из клавиатуры передается на системную плату, где временно запоминается. Программа BIOS INT 09h, записанная в ПЗУ, выбирает скан-код из микросхемы преобразует ее в ASCII-символ и записывает сам символ и его скан-код в буфер клавиатуры. Буфер клавиатуры — буфер кольцевого типа, состоит из 32 последовательно расположенных байтов, которые находятся в области данных BIOS. Этот буфер зарезервирован программами BIOS INT 09h и INT 16h в качестве связующего звена для хранения и передачи данных клавиатуры. INT 09h получает данные от клавиатуры и запоминает их в буфере, а INT 16h выбирает данные из буфера и передает их прикладной программе. Информация относящаяся к буферу клавиатуры может быть просмотрена с помощью отладчика DEBUG. Запустите отладчик и по приглашению в виде знака минус введите: D 40:80 L4 Эта команда выводит дамп (содержимое) 4 байт, расположенных в сегменте 40h со смещением 80h. По адресу 40:80h находится двухбайтовое смещение начала буфера клавиатуры, а в 40:82h хранится смещение конца буфера. Двухбайтовая величина смещения, записанная в 40:80h, преобразуется микропроцессором во время считывания в 001Eh, а записанная по адресу 40:82h — в 003Eh. Используются только величины смещений, так как BIOS полагает, что сегментный адрес буфера клавиатуры равен 40h (сегментный адрес). Таким образом, начало буфера клавиатуры имеет адрес 0040:001Eh, а конец — 0040:003Eh, байт с адресом 0040:003Eh буферу не принадлежит. 3Eh-1Eh=20h=32 Так как для записи кода каждой клавиши требуется два байта (скан-код и ASCII-код) поэтому буфер может запоминать до 16 кодов нажатых клавиш. Чтобы увидеть содержимое буфера введите: D 40:1E L20 По нечетным адресам расположены скан-код нажатых клавиш, а по четным ASCII-коды. В предыдущем дампе команда начинается с буквы «d», расположенной в 3 строке. Так как буфер клавиатуры кольцевой, текущее положение «головы» (первая занятая ячейка в буфере) и «хвоста» (указатель на первую свободную ячейку) постоянно меняются. Текущие адреса «головы» и «хвоста» хранятся по адресам 40:1h и 40:1Ch, чтобы их увидеть наберите: D 40:1A L4 С адреса 400h начинается область памяти, используемая программами BIOS для хранения данных, в том числе для буфера клавиатуры. Буфер начинается с адреса 41Eh и заканчивается адресом 43Dh. Все 32 адреса сгруппированы попарно — один байт для хранения ASCII-кода, выработанного программой INT 09h, а второй — для хранения скан-кода. Смещения первого и последнего байтов буфера указывают на положение самого буфера относительно адреса 400h. Эти смещения хранятся в двух последовательных словах по адресам 480h и 482h. Эти указатели позволяют программе INT 09h находить буфер клавиатуры. Два дополнительных указателя «голова» и «хвост» используются для отслеживания содержимого буфера. Эти указатели находятся в области данных BIOS, их адреса — 0040:001Ah и 0040:001Ch. «Голова» и «хвост» указывают на позицию справа от возврата каретки (0FFFFh для 101-клавишной клавиатуры). «Хвост» указывает на ту позицию, в которую будут занесены данные о следующем нажатии на клавишу, «голова» указы-вает на первый введенный символ (логическое начало буфера). Если «голова» равна «хвосту», то INT 09h и INT 16h считают, что буфер пуст. Под словом «пуст» понимается не затирание буфера, а одинаковое положение «головы» и «хвоста». При нажатии на клавиши указатель «головы» остается неизменным, указывая на логическое начало буфера. Когда все 16 элементов буфера заполнятся, «хвост» после достижения конца буфера переходит на начало буфера. В последнюю ячейку данные не заносятся, вместо этого порождается сигнал о переполнении буфера клавиатуры. Поэтому в буфере клавиатуры объемом 16 слов всегда хранится 15 кодов нажатых клавиш. Последний раз редактировалось Mikl___; 31.03.2011 в 13:23. |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 25.06.2010
Сообщений: 30
|
![]()
Спасибо большое! Разобрался))
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с буфером обмена ОС | truder | JavaScript, Ajax | 2 | 28.02.2011 05:21 |
Работа с буфером обмена. | star007 | Помощь студентам | 0 | 16.06.2010 20:37 |
Работа с буфером обмена | Gerzs | Общие вопросы Delphi | 2 | 26.03.2010 15:15 |
Работа с буфером обмена | АлексейМк | Общие вопросы C/C++ | 1 | 05.08.2009 00:24 |
работа с буфером данных | alexs2141 | Общие вопросы C/C++ | 5 | 06.06.2008 12:45 |