- •ПЕРЕЧЕНЬ СОКРАЩЕНИЙ
- •ПРЕДИСЛОВИЕ
- •Регистр флагов
- •Программа вывода строки
- •Примеры резервирования памяти
- •Регистровая адресация
- •Непосредственная адресация
- •Прямая адресация
- •Косвенная регистровая адресация
- •Адресация по базе
- •Пример программы задержки выполнения
- •Сложение, вычитание, умножение, деление
- •Рис. 15.1. Структурная схема ввода данных с клавиатуры
- •Пример программы для ввода с клавиатуры
- •Пример посимвольного ввода
- •Сортировка выбором
- •Сортировка вставками
- •Использование параметров в макрокомандах
- •Библиографический список
- •Приложение 1
- •Перечень команд
- •Приложение 2
ВDХ указывается адрес буфера, в BХ указывается дескриптор стандартного ввода.
Влюбом случае аккумулятор Ax возвращает число реально введенных символов, т. е. байт.
Если ввести больше символов, чем затребовано функцией 3F, то в буфер пользователя пересылается точное число символов, а оставшиеся будут в буфере ОС, готовые к вводу.
Если не принять специальных мер к очистке буфера, символы поступят в программу при очередном прерывании ОС с функцией 3F, даже если оператор не начал вводить очередную порцию данных. Схема ввода данных с клавиатуры приведена на рис. 15.1.
|
|
|
|
|
|
|
МП |
|
|
|
|
Адрес ПОП |
||
|
|
|
|
Аппаратное |
|
|
|
|
|
|
из вектора |
|||
|
|
|
|
|
|
|
|
|
|
прерывания 09h |
||||
|
|
|
|
прерывание 09h |
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
Порт 60h |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Скэн-код |
|
|
|
|
|
|
|
|
|
|
|
|
Контроллер |
|
|
|
|
|
|
|
Слово флагов |
|||
|
|
|
|
|
|
|
|
|
|
|
|
|||
Клавиатура |
|
|
клавиатуры |
|
|
ПОП |
|
|
|
клавиатуры |
||||
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
int 09h |
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Скэн-код |
||||||
|
|
|
Кольцевой |
|
|
|
ASCII код |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
||
|
|
|
буфер ввода |
|
|
|
|
|
|
|
|
|
|
|
Голова 

Скэн | ASCII
Скэн | ASCII
Программа
пользователя
|
|
|
|
|
int 16h |
|
|
|
Хвост |
|
|
|
|
|
Рис. 15.1. Структурная схема ввода данных с клавиатуры
71
Работой клавиатуры управляет контроллер клавиатуры.
В его функции входит распознавание нажатой клавиши и помещение закрепленного за ней кода в свой выходной регистр с номером 60h. Код клавиши (скэн-код) является порядковым номером клавиши. Каждой клавише присваивается два скэн-кода – нажатия (меньший) и отжатия клавиши.
Определение введенного символа включает в себя не только считывание скэн-кода нажатой клавиши, но и выяснение того, были ли при этом нажаты Shift или Caps Lock. Этим анализом занимается Программа Обработки Прерывания от клавиатуры.
Нажатие и отпускание клавиши вызывает аппаратное прерывание IRQ1 и запуск Программы Обработки Прерывания (INT 09h). Эта программа хранится по фиксированному адресу в BIOS. За клавиатурой закреплен вектор с номером 09h, адрес ПОП располагается в словах по
адресу 24h и 26h. Программа работает с двумя областями памяти: кольцевым буфером ввода, куда помещаются ASCII-коды нажа-
тых клавиш; словом состояния клавиатуры, где фиксируется состояние управ-
ляющих клавиш.
ПОП считывает из порта 60h скэн-код и анализирует его значение. Если это управляющая клавиша и код нажатия, то в слове флагов кла-
виатуры устанавливается бит, который сбросится при отпускании клавиши.
При нажатии любой другой клавиши скэн-код нажатия по таблице
трансляции кодов формируется в ASCII-код и сохраняется в двух байтах: скен-код и ASCII-код.
Полученный 2-байтовый код засылается программой в кольцевой буфер ввода (из 15 слов), который служит для синхронизации ввода данных с клавиатуры и программы пользователя. Коды символа извлекаются из него в том порядке, как поступали. У него есть два указателя: хвостовой хранит адрес свободной ячейки, головной – адрес самого старого кода, еще не востребованного программой.
Выполняемая программа, желая получить код нажатой клавиши,
должна вызвать прерывание INT 16H, которое активизирует драйвер клавиатуры BIOS. Драйвер считывает из кольцевого буфера содержи-
мое ячейки, адрес которой находится в головном указателе и увеличивает этот адрес на два.
В процессе занесения кодов хвостовой указатель может дойти до конца буфера, в этом случае поступление очередного кода адрес указа-
72
