Здавалка
Главная | Обратная связь

Коды ASCII и работа BIOS



Обработчиком прерывания 9 в BIOS скан-коды превращаются в коды ASCII. Имеется два типа ASCII-кодов: однобайтные и расширенные. Однобайтные коды - коды алфавитно-цифровых символов, символов псевдографики, некоторых управляющих символов (последние по-разному интерпретируются разными периферийными устройствами). Расширенные ASCII-коды - двухбайтные, первый байт всегда 0, второй содержит код. Такие коды связаны с клавишами, которые не имеют литерного отображения: клавиши функциональной клавиатуры, управления курсором и т.п. Обработчик прерывания 9 BIOS вырабатывает требуемые ASCII-коды и записывает в буфер клавиатуры. Далее программа, выполняющая ввод, обращается к BIOS или к DOS, и средства системы выбирают символы из буфера и передают программе.

Буфер клавиатуры находится в области данных BIOS. Этот буфер занимает память с адресами от 0040:001 по 0040:003C. Буфер организован как циклическая очередь, то есть при заполнении указанной области памяти запись продолжается с ее начала. Два слова в области данных BIOS содержат адреса (смещения относительно начала области данных BIOS) начала и конца ("головы" и "хвоста") очереди. Адреса этих слов - 0040:001A и 0040:001C соответственно. Каждый код представлен в буфере BIOS двумя байтами. Для расширенных кодов ACSII первый байт содержит 0, а второй байт - ASCII-код. Для однобайтных кодов первый байт содержит ASCII-код, а второй байт - скан-код клавиши, породившей этот ASCII-код. В буфере клавиатуры BIOS размещаются 15 слов, содержащих коды введенных клавиш, 16-е слово зарезервировано для размещения в нем признака конца 0x0D1C. Добавление нового кода в буфер состоит в записи кода по адресу "хвоста" и модификации указателя "хвоста". Удаление - в выборке кода по адресу "головы" и модификации указателя "головы" (модификация указателей должна учитывать циклическую природу очереди). Для очистки буфера достаточно приравнять указатель "хвоста" указателю "головы".Не все клавиши или комбинации клавиш порождают ASCII-коды. Непорождающие клавиши и комбинации могут быть разделены на две группы: клавиши-переключатели и клавиши (комбинации) специальных действий.К клавишам-переключателям относятся: Shift, Ctrl, Alt, CapsLock, NumLock, ScrollLock, Insert (последняя, впрочем, наряду с переключением порождает и расширенный ASCII-код 0x0052). Нажатие клавиши-переключателя обрабатывается программами BIOS, в результате чего изменяются флаги состояния клавиатуры в области данных BIOS (два байта по адресам 0040: 0017, 0040:0018).

Наконец, клавиши (комбинации) специальных действий. Нажатие этих клавиш или комбинаций распознается обработчиком BIOS, который вместо генерации по ним ASCII-кодов выполняет некоторые предустановленные операции.

Функции стандартного ввода DOS

В DOS нет функций, ориентированных непосредственно на клавиатуру. Функции ввода DOS работают с файлом стандартного ввода, который по умолчанию связан с клавиатурой. Но при переназначении стандартного ввода функции DOS будут успешно работать и с другим источником.

Коротко перечислим функции DOS.

· Функция 1 - ввод символа с эхо, эта функция обрабатывает комбинацию клавиш Ctrl+Break. Возвращает ASCII-код в регистре AL, для расширенных ASCII-кодов требуется два обращения к функции: первое возвращает 0, а второе - код.

· Функция 7 - ввод символа без эхо, не обрабатывает комбинацию Ctrl+Break. Возвращает то же, что и функция 1.

· Функция 8 - ввод символа без эхо, обрабатывает Ctrl+Break, возвращает то же, что и функция 1.

· Функция 6 - ввод-вывод символов. Для ввода в регистр DL перед вызовом должен быть записан код 0xFF. При этом функция вводит символ без эхо и не обрабатывает Ctrl+Break. Если символа во входном потоке нет, функция устанавливает в 1 флаг Z, иначе - флаг Z сбрасывается, а в регистре AL - тот же выход, что и в предыдущих функциях.

· Функция 0x0B - проверка символа. Она записывает в регистр AL код 0xFF, если символ есть, или 0 - если символа нет. Эта функция обрабатывает Ctrl+Break и может использоваться для этой обработки.

Функция 0x0A - ввод строки. Перед вызовом этой функции надо в памяти сформировать буфер, первый байт которого содержит размер остальной части этого буфера. Адрес буфера передается функции в регистрах DS:DX. После выполнения ввода буфер, начиная с третьего байта содержит символы введенной строки, заканчивающиеся кодом 0x0D. Первый байт буфера - тот же, что и до вызова, а второй содержит длину введенной строки (без учета символа 0x0D).

Комбинация клавиш Ctrl+Break

Если нажата эта комбинация клавиш, то при первом же системном вызове она будет обработана. Обработка заключается обычно в немедленном завершении текущей программы. Обратите внимание на то, что комбинация обрабатывается не немедленно, а при вызове DOS. Начиная с самого нижнего уровня, порядок обработки этой комбинации следующий. Комбинация Ctrl+Break распознается BIOS при вводе. BIOS в этом случае вызывает прерывание 0x1B.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.