Функции BIOS для работы с консолью
Получение состояния флагов клавиатуры (02h, 12h, 22h int 16h)
BIOS предоставляет функцию 02h для получения состояния световых индикаторов клавиатуры и некоторых управляющих клавиш.
Вход: АН = 02h получить состояние флагов клавиатуры (для 84-клавишной клавиатуры).
Выход: AL = битовое поле, установленные биты которого соответствуют состоянию следующих флагов:
- 7 – режим вставки активен;
- 6 – индикатор CapsLock включен;
- 5 – индикатор NumLock включен;
- 4 – индикатор ScrollLock включен;
- 3 – нажата клавиша ALT (любая клавиша ALT на 101-102-клавишной клавиатуре);
- 2 – нажата клавиша CTRL (любая клавиша CTRL на 101-102-клавишной клавиатуре);
- 1 – нажата левая клавиша SHIFT;
- 0 – нажата правая клавиша SHIFT.
Поддержка расширенных клавиатур осуществляется функциями 12h и 22h BIOS.
Вход: АН = 12h, 22h получить состояние флагов клавиатуры (для 101-102 – и 122-клавишных клавиатур).
Выход: AL = первое битовое поле, установленные биты которого соответствуют состоянию флагов, возвращаемых в регистре AL функцией 02h;
АН = второе битовое поле, установленные биты которого соответствуют следующему состоянию флагов:
- 7 – нажата клавиша SysReq (SysRq);
- 6 – нажата клавиша CapsLock;
- 5 – нажата клавиша NumLock;
- 4 – нажата клавиша Scrolllock;
- 3 – нажата правая клавиша ALT;
- 2 – нажата правая клавиша CTRL;
- 1 – нажата левая клавиша ALT;
- 0 – нажата левая клавиша CTRL.
Кроме этого, состояние данных флагов можно прочитать из оперативной памяти по адресам: 0040h:0017h (AL) и O040h:0010h (АН).
Запись символа в буфер клавиатуры (05h int 16h)
Вход: АН = 05h запись символа в буфер клавиатуры:
- СН = скан-код;
- CL = символ ASCII.
Выход: AL = состояние:
- 00h – успешная запись;
- 01h – ошибка (буфер клавиатуры заполнен).
С помощью этой функции можно осуществлять подыгрыш для программ, которые ожидают ввода с клавиатуры. Сам буфер клавиатуры организован по принципу кольца, имеет размер 16 байт и занимает в памяти диапазон адресов 0040h:001Eh…0040h:003Dh. В ячейке 0040h:001Ah хранится адрес начала буфера, а в ячейке 0040h: OOlCh – адрес конца. Если содержимое этих ячеек равно, то буфер пуст. Одному символу в буфере соответствует слово, в котором первый байт – скан-код клавиши, а второй – символ ASCII. Исследовать данную функцию можно с использованием операции сцепления (|) MS DOS. Для этого оформим фрагмент кода для определения наличия символа в буфере и его ввода в виде отдельной программы.
В командную строку MS DOS необходимо ввести строку:
prog_1.exe | prog_2.exe >p.txt
В результате всех этих действий будет создан файл p.txt, который и будет содержать строку str из файла prog_1.asm.