Последние записи
- Рандомное слайдшоу
- Событие для произвольной области внутри TImage
- Удаление папки с файлами
- Распечатка файла
- Преобразовать массив байт в вещественное число (single)
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
23rd
Май
Работа с буфером клавиатуры
Posted by Chas under Топик-обзор
Нужна помощь в задаче: нужно определить размер буфера клавиатуры.
Читал, что он размером 32 байта вроде как. Нужно программно получить эту цифру(32). Как точно — не знаю, но вроде догадываюсь, направьте на путь истиный
alexcoder:
[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.
#include int main(){
union REGS rg;
unsigned int i,n;
for(i=0,n=0; i<64000; i++) // на 16 иттерации, как я понял, бипер запищит,
//т.к. буфер переполнится
{
rg.h.ah = 5;
rg.h.cl = '*'; // записываем в буфер символ
rg.h.ch = 9;
int86(0x16, &rg, &rg);
if(rg.h.al==0) n++;
}
printf("%d",n);
return 0;
}[/code]
Каждое нажатие в буфере занимает 2 байта
Mikl___:
Можно использовать чтение буфера клавиатуры по адресам
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 кодов нажатых клавиш.
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)