INT 2lh, функция 0Ch. Очистка входного буфера и ввод
Очищает кольцевой буфер клавиатуры и активизирует функцию ввода.
При вызове: AH=0Ch
АL="номер требуемой функции ввода.
Допустимы функции 01, 06, 07, 08, 0Ah DS:DX=адpec буфера (если AL=0Ah)
При возврате: АL=байт входных данных (если при вызове AL=0Ah, данные помещаются в буфер)
Функции 0lh, 06h, 07h и 08h при каждом вызове вводят в программу один символ из кольцевого буфера ввода; при необходимости ввести группу символов (строку) функции следует использовать в цикле. Различаются эти функции наличием или отсутствием эха, а также реакцией на ввод с клавиатуры сочетания <Сtrl>/С. Функции 0lh и 06h отображают вводимые символы на экране (эхо); функции 07h и 08h этого не делают, что дает возможность вводить данные тайком от окружающих (например, пароль или ключ). Второе важное различие описываемых функций касается их реакции на ввод сочетания <Ctrl>/C. При выполнении функций 0lh и 08h DOS проверяет каждый введенный символ и, обнаружив во входном потоке код <Ctrl>/C (03h),аварийно завершает программу. Функции же 06h и 07h пропускают код <Ctrl>/C в программу, не инициируя по нему никаких специальных действий. Такой метод ввода используется прикладными программами, если перед завершением в них должны быть выполнены определенные программные действия (сброс буферов на диск, модификация файлов и проч.). Аварийное завершение такой программы средства DOS по коду <Ctrl>/C могло бы привести к нарушению ее работоспособности.
Функция 0Ah передает в буфер пользователя отроку, введенную с клавиатуры; строка должна заканчиваться нажатием клавиши <Enter>. Длина строки может достигать 254 символов. Вводимые символы отображаются на экране; при вводе <Ctrl>/C происходит аварийное завершение программы. Функция 0Bh позволяет проверить наличие в кольцевом буфере ввода ожидающих символов. При обнаружении символов программа должна извлечь их из буфера одной из функций ввода; если символов нет, программа может продолжить выполнение. Такая методика используется в программах, носящих циклический характер, если требуется обеспечить управление ходом выполнения программы с клавиатуры терминала. В каждом шаге цикла после выполнения запланированных действий проверяется состояние кольцевого буфера ввода; если в течение предыдущего шага цикла оператор нажал на какую-либо клавишу, программа проанализирует введенный код и осуществит выход из цикла и переход в ту или иную точку; если же буфер оказывается пуст, циклическое выполнение продолжится.
Функция 0Bh чувствительна к <Ctrl>/C. Это дает возможность организовать с ее помощью аварийное завершение программы на тех ее участках, где выполняются чисто процессорные действия. Если, например, включить вызов функции 0Bh в цикл, .то при отсутствии ввода с клавиатуры цикл будет выполняться обычным образом, но после ввода <Ctrl>/C программа аварийно завершится, хотя на выполняемом участке программы не используются функции ввода-вывода.
Функция 0Сh служит для организации ввода с предварительной очисткой кольцевого буфера. Все функции, кроме 0Сh, вводят в программу наиболее старый из скопившихся в кольцевом буфере ввода символов, реализуя тем самым возможность ввода с упреждением. В этом режиме оператор может нажимать на клавиши еще до выдачи программой запроса на ввод; коды нажатых клавиш (не более 15) будут накапливаться в кольцевом буфере ввода и извлекаться оттуда в программу по мере выполнения ею запросов на ввод- В отличие от этого, функция 0Сh сначала очищает кольцевой буфер и лишь затем ожидает ввода символа с клавиатуры. В результате коды всех ранее нажатых (по предположению -случайно) клавиш теряются. Обычно функция ввода 0Сh стоит в программе непосредственно вслед за функцией вывода на экран символьной строки с предложением оператору вводить данные. В результате из кольцевого буфера убирается весь "мусор" от случайных нажатий, в программу же поступает лишь то, что вводится оператором после запроса программы. При этом режим ввода (с эхом или без него и т.д.) определяется тем, какая именно функция ввода (0lh, 06h, 07h, 08h или 0Ah) реализуется "внутри"функции 0Сh.
Все функции DOS ввода с клавитуры допускают перенаправление ввода (из файла, последовательного порта, из вывода другой программы). Если требуется избавиться от этого качества, следует использовать файловую функцию ввода 3Fh и специально выделенный дескриптор.
Функции 0lh, 07h, 08h и 0Ah являются синхронными, т.е. при отсутствии символа в кольцевом буфере ждут его ввода. Функция 06h позволяет определить состояние кольцевого буфера и при наличии в нем кода извлечь этот код и обработать его, а при отсутствии - продолжить выполнение программы.
Функции 0lh, 06h, 07h и 08h позволяют вводить в программу расширенные коды ASCII. Для этого, обнаружив, что введенный код ASCII равен нулю, следует выполнить функцию повторно. Это дает возможность управления прикладными программами с помощью функциональных клавиш, а также сочетаний <ALT>/цифра, <Alt>/буква
Функция 06h позволяет вводить в программу коды символов с помощью сочетания <Аи>/<цифра на цифровой клавиатуое> (втом числе коды первых 32 символов кодовой таблицы и вторую половину кодовой таблицы).
Сравнительные характеристики функций DOS ввода с клавиатуры приведены в таблице.
0lh | 06h | 07h | 08h | 0Ah | 0Bh | 0СЬ | |
Эхо | + | + | - | „ | + | +/* | |
Реакция на <Ctri>/C | + | - | - | + | + | + | +/- |
Перенаправление | + | + | + | + | '+ | + | + |
Ожидание символа | + | - | + | 4- | + | - | +/- |
Расширенные ASCII | + | + | + | + | - | + | |
<Аlt>+код | - | + | + | + | - | +/- | |
Очистка буфера | - | - | - | - | - | + |
Работа с клавиатурой на уровне BIOS (INT 16h) позволяет считывать двухбайтовые коды, поступающие в кольцевой буфер ввода (код ASCII + скен-код) и анализировать слово флагов клавиатуры (нажатие клавиш <Shift>, <Caps Lock> и др.). Для ввода используются следующие функции прерывания INT 16h:
00h - чтение двухбайтового кода из входного буфера;
0lh - чтении состояния клавиатуры; и двухбайтового кода без извлечения его из буфера;
02h - чтение флагов клавиатуры.
Функция 00h позволяет в одном действии получить полный двухбайтовый код нажатой клавиши или комбинации клавиш, из которого, в частности, можно извлечь скен-код (некоторые программы идентифицируют нажатые клавиши не по кодам ASCII, а по их скен-кодам), а также получить значащую часть расширенного кода ASCII (при нажатии, например, функциональных клавиш), функция 00h является синхронной: при ее выполнении программа останавливается в ожидании нажатия клавиши.
Функция 0lh относится к числу асинхронных: определив состояние клавиатуры (точнее - буфера ввода), она возвращает управление программе. Состояние буфера возвращается в флаге ZF:если в буфере имеются ожидающие ввода в программу символы, ZF=0, если же буфер пуст, ZF=1. При наличии в буфере кода символа его можно проанализировать, так как он возвращается функцией в регистре АХ (АН=скен-код, АL=код ASCII). Необходимо однако иметь в виду, что функция 0lh, копируя двухбайтовый код в регистр АХ, не очищает при этом кольцевой буфер. Забрать символ с очисткой буфера можно затем функцией 00h.
Функция 02h - чтение флагов клавиатуры - передает в программу содержимое слова флагов (ячейка 417h). Она может использоваться программами, работающими на уровне скен-кодов, для определения состояния клавиш <Shift>, <Caps Lock> и др
Задание к лабораторной работе.
1)Напишите программу для ввода своей фамилии, используя 1)функцию 01h и 2) 0Сh(c функцией 08h). Результат ввода выведите на монитор с помощью функции DOS 40h
2. Наберите и отладьте программу (используйте директивы упрощенного описания сегментов). Используйте команды: TASM /zi <filename.asm> и Tlink /v <filename.obj>
a).
mov cx, <количество букв в Вашей фамилии>
m1:
mov ah,00
int 16h
loop m1
mov ax, 4c00h
int 21h
b) С помощью td.exe определите скен-коды клавиш, которыми Вы набираете свою фамилию. Результат занесите в протокол. Зависит ли результат от: 1) регистра (нижний верхний). 2)русского или английского написания фамилии.
с) Определите и запишите в протокол скен-коды функциональных клавиш:
F<ваш номер в группе>
Return, DEL, INSERT, PgUp, PgDn, HOME, END, BACKSPACE