ПРОГРАММИРОВАНИЕ СИСТЕМНЫХ ФУНКЦИЙ BIOS И DOS ДЛЯ РАБОТЫ С КЛАВИАТУРОЙ
2.1. Цель работы
Целью настоящей работы является изучение возможностей базовой системы ввода-вывода и дисковой операционной системы для программирования ввода информации с клавиатуры.
2.2. Теоретическая часть
2.2.1. Системные функции BIOS для работы с клавиатурой
Базовая система ввода-вывода (BIOS) имеет три функции для работы с клавиатурой. Они являются частью клавиатурного драйвера и выполняются с помощью прерывания 16h. Номер конкретной функции задается в регистре AН. Результат выполнения функции получается в регистрах AL и AH.
2.2.1.1. Чтение очередного символа
Функция AH=00h помещает в регистр AL очередной ASCII-код символа, введенного с клавиатуры, а в регистр AH заносит скэнкод этого символа. Если буфер клавиатуры пуст, то компьютер ожидает нажатия клавиши. Если клавиша или комбинация клавиш генерирует расширенный код, то в регистр AL помещается 0, а в регистр AH расширенный код. Введенный символ на экране не отображается.
MOV AH,00h
INT 16h
2.2.1.2. Справка о наличии символа
Функция AH=01h сбрасывает флаг нуля в 0 (ZF=0), если в буфере клавиатуры есть символ для чтения, и устанавливает флаг в 1, если буфер пуст. Этот символ и его скэн-код будут помещены в регистры AL и AH соответственно. Символ остается в буфере.
MOV AH,01h
INT 16h
2.2.1.3 Определение текущего состояния клавиатуры
Функция 02h помещает в регистр AL содержимое первого из двух байтов состояния клавиатуры с абсолютными адресами 417h и 418h. Если нужно узнать содержимое второго байта, его необходимо прочитать из памяти.
Содержимое первого байта (417h):
Бит клавиша значение, когда бит = 1
7 Ins ; режим вставки включен
6 CapsLock ; фиксация верхнего регистра
5 NumLock ; фиксация цифровой клавиатуры
4 ScrollLock ; прокрутка экрана включена
3 Alt ; клавиша нажата
2 Ctrl ; клавиша нажата
1 Shift ; клавиша нажата
Содержимое второго байта (418h):
7 Ins ; клавиша нажата
6 CapsLock ; клавиша нажата
5 NumLock ; клавиша нажата
4 ScrollLock ; клавиша нажата
3 Ctrl-NumLock ; режим паузы
Остальные биты не используются.
MOV AH,02h
INT 16h
Системные функции, осуществляемые прерыванием 16h, принадлежат к числу тех, которые позволяют создавать программы, не зависящие от операционной системы.
Тем не менее целесообразней пользоваться более гибкими возможностями системных функций для работы с клавиатурой, вызываемых с помощью прерывания 21h.
2.2.2 Системные функции DOS для работы с клавиатурой
Функции DOS для чтения с клавиатуры различаются, главным образом, по трем признакам:
а) ожидают ли ввода или нет;
б) выводят ли после чтения символ на экран;
в) проверяется ли при их выполнении наличие "Ctrl-Break" или нет.
2.2.2.1 Ввод с клавиатуры с эхоотображением
Функция 01h ожидает ввода символа, если буфер клавиатуры пуст, а затем выводит его на экран в текущую позицию курсора. Введенный символ помещается в регистр AL. Если AL содержит 00Н, это означает, что получен расширенный ASCII-код, второй байт которого будет прочитан при следующем выполнении функции. При выполнении функции осуществляется проверка наличия "Ctrl-Break". Клавиша Esc игнорируется. Клавиша Backspace сдвигает курсор на одну позицию влево, но символ, находящийся в этой позиции, не стирается. Клавиша Enter вызывает перемещение курсора в первую позицию текущей строки (нет автоматического перевода строки).
MOV AH,01h ; номер функции
INT 21h ; ожидаем нажатия клавиши
CMP AL,0 ; расширенный код ?
JE EXT_CODE ; если да, то на процедуру обработки
........ ...... .. расширенного кода
EXT_CODE: INT 21h ; получаем в AL номер кода
CMP AL,77 ; проверка на (-->)
JNE C_R ; если нет, то следующая проверка
JMP CUR_RIT ; если да, то на процедуру
C_R: CMP AL,75 ; и т.д.
2.2.2.2 Ввод символа без ожидания
Некоторые программы, работающие в реальном времени, не могут останавливаться и ждать нажатия клавиши. Такие программы принимают символ из буфера, только тогда, когда это им удобно, например, это игровые программы.
Функция 6 прерывания 21h – единственный способ получить введенный символ без ожидания. Эта функция не дает эха на экране и не распознает Ctrl-Break. Перед вызовом прерываний в DL должно быть помещено FFh. Иначе функция 6 будет печатать символ, находящийся в DL в текущую позицию курсора. Если символ принят, то он помещается в AL. Нулевое значение говорит о расширенном коде, и прерывание должно быть повторено.
MOV AH,6 ; номер функции
MOV DL,FFh ; запрос ввода с клавиатуры
INT 21H ; получение символа
JZ NO_CHAR ; переход, если нет символа
CMP AL,0 ; проверка на расширенный код
JE EXT_COD ; переход,если расширенный код
...........
EXT_COD: INT 21h
2.2.2.3. Прямой ввод с клавиатуры без эхо
Функции 7 и 8 прерывания 21h ожидают ввода символа, если буфер клавиатуры пуст. Появление символа на экране не отображается. При этом функция 8 распознает Ctrl-Break, а функция 7 не реагирует на него. В обоих случаях символ возвращается в AL. Когда в AL содержится 0, получен расширенный код. Нужно повторить прерывание, и в AL появится второй байт расширенного кода.
MOV AH,7 ; номер функции
INT 21h ; ожидаем ввод символа
CMP AL,0 ; проверка на расширенный код
JE EXT_COD ; переход на процедуру, иначе код
символа в AL
2.2.2.4. Проверка состояния клавиатуры
Функция 0B помещает значение FF в регистр AL, если буфер клавиатуры содержит один или более символов, и значение 0, когда буфер пуст.
MOV AH,0Bh ; номер функции
INT 21h ; вызываем прерывание
CMP AL,FFh ; сравниваем с FF
JE GET_KEY ; переход, если буфер не пуст
2.2.2.5. Получение строки символов
Функция 0A позволяет вводить строку длиной до 254 символов, выдавая эхо на экран. Эта функция продолжает ввод поступающих символов до тех пор, пока не нажата клавиша Enter. DS:DX указывает на адрес памяти, куда должна быть помещена строка. Первый байт в этой позиции должен содержать число байтов, отводимых для этой строки. После того как строка введена, второй байт даст число реально введенных символов. Сама строка начинается с третьего байта.
MOV AX,5000h ; указываем адрес области данных
MOV DS,AX ;
MOV DX,0 ;
MOV BX,DX ;
MOV AL,51 ; указываем длину строки
MOV [BX],AL ; заполняем первый байт
MOV AH,0Ah ; номер функции
INT 21h ; получаем строку
Эта функция выполняет команды редактирования строки. Нажатие клавиши Backspace или "стрелка-влево" удаляет символ с экрана без помещения его в память. Расширенные коды игнорируются, пустые строки допускаются (имеется в виду клавиша Enter, которой не предшествует другой символ). Когда вводится больше символов, чем отведено места для строки, лишние символы игнорируются, и включается гудок динамика.
2.2.2.6. Очистка буфера клавиатуры и ввод символа
Функция 0С выполняет любую из функций ввода с клавиатуры 1,6,7,8 и A, но перед этим чистит буфер клавиатуры. Надо просто поместить номер функции ввода в AL.
MOV AH,0Ch ; номер функции
MOV AL,1 ; выбираем функцию ввода символа
INT 21h ; чистим буфер,ждем ввода
2.2.2.7. Установка позиции курсора
Функция 02h прерывания 10h устанавливает курсор в любую позицию на экране в соответствии с координатами строки и столбца. Номер страницы обычно равен 0, но может иметь значение от 0 до 3 при 80 столбцах на экране. Для установки позиции курсора необходимо занести в регистр AH значение 02, в регистр BH – номер страницы и в регистр DX – координаты строки и столбца.
MOV AH,02 ; номер функции
MOV BH, 00 ; номер страницы
MOV DH,строка ; номер строки
MOV DL,столбец ; номер столбца
INT 10h ; устанавливаем курсор
2.2.2.8. Очистка экрана
Выведенная на экран информация остается на экране до тех пор, пока не будет смещена в результате прокручивания или замене на на том же месте другой информацией. Когда программа пользователя начинает свое выполнение, экран может быть очищен. Очищаемая область экрана может начинаться в любой позиции и заканчиваться в любой другой позиции с большим номером. Начальное значение строки и столбца заносится в регистр CX, конечное – в DX, значение 07 в регистр BH и 0600h в AX. В следующем примере выполняется очистка всего экрана:
MOV AX,0600h ; AH=06 (прокрутка), AL=00 (весь экран)
MOV BH,07 ; нормальный атрибут
MOV CX,0000 ; верхняя левая позиция
MOV DX,184Fh ; нижняя правая позиция
INT 10h ; передача управления в BIOS
Значение 06 в регистре AH указывает на выполнение операции очистки экрана. Эта операция очищает экран пробелами. В регистр AL заносится число сдвигаемых строк (00 - весь экран). CH и CL содержат строку и столбец левого верхнего угла, а DH и DL –строку и столбец правого нижнего угла. Появляющиеся из-за сдвига строки чистые, они выводятся с кодом атрибутов из BH.
3. Порядок выполнения работы
1. Напишите и выполните, пользуясь отладчиком DEBUG, команды для установки курсора по координатам: строка 20, столбец 58.
2. Напишите и выполните, пользуясь отладчиком DEBUG, команды для очистки экрана, начиная с 0-го столбца 12 строки, до 79-го столбца 22-й строки.
3. Пользуясь отладчиком DEBUG, введите с клавиатуры дату в формате дд/мм/гг в центре предварительно очищенного экрана.
4. Используя отладчик DEBUG, проверьте воздействие на содержимое регистра AX нажатие клавиш на клавиатуре. Для этого введите следующие команды:
MOV AH,00
INT 16h
JMP 100
Используя команду U 100,104, дисассемблируете программу и с помощью G 104 выполните команды MOV и INT. Выполнение программы остановится, и процессор перейдет в ожидание ввода. Для проверки регистра AH нажмите любую клавишу. Нажимая различные клавиши, проверьте работу этой программы.
5. Напишите и выполните программу, которая переводит курсор в 24 строку и нулевой столбец, если нажата клавиша PgDn.
4. Требования к отчету
Отчет по лабораторной работе должен содержать:
а) титульный лист;
б) условие задания;
в) текст программ на языке Ассемблера;
г) ответы на контрольные вопросы.
5. Контрольные вопросы
1. Какие шестнадцатеричные значения строки и столбца соответствуют нижнему правому углу экрана?
2. В какие регистры помещается скэн-код и код символа при нажатии символьной клавиши?
3. Какая информация будет находиться в регистре AL после нажатии функциональной клавиши?
|