Работа с буфером клавиатуры
Работа с буфером клавиатуры в основном сводится к 2 операциям:
1. Очистка буфера.
2. Проверка символов в буфере.
Буфер клавиатуры имеет объем 32 байта. Буфер может накапливать до 15 нажатий на клавишу, независимо от того, являются ли они однобайтными кодами ASCII или двухбайтными расширенными кодами (последнее нажатие, которое может быть максимально 16-м по счету, зарезервировано для клавиши <Enter>, которая разрешает исполнение введенной с клавиатуры команды для командного процессора COMMAND.COM). Таким образом, буфер должен отвести два байта памяти для каждого нажатия на клавишу. Для однобайтных кодов первый байт содержит код ASCII, а второй - скан-код клавиши. Для расширенных кодов первый байт содержит ASCII 0, а второй номер расширенного кода. Этот код обычно совпадает со скан-кодом клавиши, но не всегда, поскольку некоторые клавиши могут комбинироваться с клавишами сдвига для генерации различных кодов.
Буфер устроен как циклическая очередь, которую называют также буфером FIFO (первый вошел - первый ушел). Как и любой буфер, он занимает непрерывную область адресов памяти. Однако не имеется определенной ячейки памяти, в которой находилось бы всегда начало строки в буфере. Вместо этого два указателя хранят позиции головы и хвоста строки символов, находящейся в буфере в текущий момент. Указатель головы указывает на позицию, занятую первым символом в буфере, а указатель хвоста - на позицию, следующую за последним символом (т.е. на первую свободную). Новые нажатия клавиш запасаются в позициях, следующих за хвостом (в старших адресах памяти) и соответственно обновляется указатель хвоста буфера. После того, как израсходовано все буферное пространство, новые символы продолжают вставляться, начиная с самого начала буферной области; поэтому возможны ситуации, когда голова строки в буфере имеет больший адрес, чем хвост. После того как буфер заполнен, новые вводимые символы игнорируются, при этом прерывание клавиатуры выдает гудок через динамик. В этот момент указатель хвоста указывает на ячейку перед головой в циклической очереди буфера (куда можно занести нажатие <Enter>). В то время как указатель на голову установлен на первый введенный символ, указатель на хвост установлен на позицию за последним введенным символом. Когда оба указателя равны, то буфер пуст. Поэтому чтобы очистить буфер клавиатуры, достаточно установить указатели на одно и тоже значение. Чтобы разрешить ввод 15 символов требуется 16-я пустая позиция, 2 байта которой всегда содержат код возврата каретки (ASCII 13) и скан-код клавиши <Enter>, равный 28. Эта пустая позиция непосредственно предшествует голове строки символов. 32 байта буфера начинаются с адреса 0040:001E. Указатели на голову и хвост расположены по адресам 0040:001A и 0040:001C, соответственно. Хотя под указатели отведено 2 байта, используется только младший байт. Значения указателей меняются от 30 до 60, что соответствует позициям в области данных BIOS. Для очистки буфера надо просто установить значение ячейки 0040:001A равным значению ячейки 0040:001C.
Проверка и установка статусов клавиш-переключателей
Два байта, расположенные в ячейках памяти 0040:0017 и 0040:0018 содержат биты, отражающие статус клавиши сдвига и других клавиш-переключателей следующим образом:
Байт | Бит | Клавиша | Значение, когда бит = 1 |
0040:0017 | Insert | Режим включен | |
CapsLock | Режим включен | ||
NumLock | Режим включен | ||
ScrollLock | Режим включен | ||
Alt | Клавиша нажата | ||
Ctrl | Клавиша нажата | ||
левый Shift | Клавиша нажата | ||
правый Shift | Клавиша нажата | ||
0040:0018 | Insert | Клавиша нажата | |
CapsLock | Клавиша нажата | ||
NumLock | Клавиша нажата | ||
ScrollLock | Клавиша нажата | ||
Ctrl-NumLock | Режим включен |
Остальные биты не используются.
Прерывание клавиатуры немедленно обновляет эти биты статуса, как только будет нажата одна из клавиш-переключателей, даже если не было считано ни одного символа из буфера клавиатуры.
Проверка и установка статуса клавиш-переключателей возможна с помощью использования механизма прерывания или непосредственно при работе с памятью.
Функция 2H прерывания 16H предоставляет доступ к одному, но только одному из байтов статуса. Это байт по адресу 0040:0017, который содержит больше полезной информации. Байт возвращается в AL.
;---проверка статуса клавиши вставки
MOV AH,2 ;номер функции
INT 16H ;получаем байт статуса
TEST AL,10000000B ;проверяем бит 7
JZ INSERT_OFF ;если 0, то INSERT выключен
В следующем примере устанавливается режим вставки, за счет установки бита 7 байта статуса по адресу 0040:0017 (который адресуется как 0000:0417).
SUB AX,AX ;устанавливаем добавочный сегмент на
MOV ES,AX ;начало памяти
MOV AL,10000000B ;готовим бит 7 к установке
OR ES:[417H],AL ;меняем байт статуса
Устройство, работа и организация памяти накопителей на магнитных дисках. Их основные технические характеристики. Работа с физическими и логическими секторами. Главная загрузочная запись (MBR), ее структура. Корректировка таблицы разделов. Основные служебные поля жесткого диска FAT32, с их структура, организация и использование.