Предыдущая глава | ДИСПЕТЧЕР КОМАНД | Следующий раздел |
В данном разделе решается задача разработки диспетчера – программного модуля, обеспечивающего диалог с пользователем и выполняющего координацию работы других модулей программы (редактора). Применяемый при этом подход может быть использован для построения диспетчеров в других программных системах.
Почти любая полноценная программа является интерактивной, т.е. способной вести диалог со своим пользователем. Естественно, что наш редактор информации также должен быть интерактивным. Он должен воспринимать команды пользователя, набираемые на клавиатуре и выводить на экран ответные сообщения. При этом принято называть сообщения пользователя (например команды) входными сообщениями, а сообщения программы – выходными.
Распознавание команд пользователя поручим программному модулю (процедуре), называемому диспетчером команд. Данный модуль занимает центральное место в программной системе и координирует работу других модулей. Допустим, что наш редактор выполняет всего шесть команд, каждой из которых соответствует своя управляющая клавиша:
<F1> – вывести на экран начальный сектор (256 байт) ОП;
<F2> – записать скорректированный сектор в память;
<F3> – вывести на экран следующий сектор ОП;
<F5> – вывести на экран предыдущий сектор ОП;
<F6> – вывести на экран сектор N, где 0<=N<=256;
<F10> – закончить работу редактора.
Клавиша <F4> оставлена «в резерве» для реализации нами в будущем функции редактирования.
Как говорилось ранее, каждому выводимому на экран символу соответствует свой код ASCII. Но каждому из этих символов соответствует также свой скан–код BIOS. Добавление слова BIOS требуется потому, что, вообще то, говоря, существуют несколько скан-кодов. В данном случае речь идет о том скан-коде клавиши, который возвращает BIOS в вызвавшую его прикладную программу. Далее говоря «скан-код» мы будем подразумевать скан-код BIOS.
Грубо говоря, скан-код – номер нажатой клавиши. Но любой пользователь знает, что большинству клавиш соответствуют не один, а два или более символов. Поэтому один и тот же скан-код может соответствовать нескольким символам. Например, скан-код 16h соответствует четырем символам: u, U, г, Г. Поэтому для идентификации алфавитно-цифровых символов в обрабатывающих программах скан-коды не используются. Другое дело – управляющие символы, так как каждому из них соответствует своя отдельная клавиша.
Для того чтобы получить одновременно и ASCII-код клавиши, и ее скан-код, следует использовать системный вызов BIOS – “int 16h”, функция 0, выполняющий ввод символа с клавиатуры. После выполнения данного вызова в регистре AL содержится ASCII-код нажатой клавиши, а в регистре AH – ее скан-код.
Что касается управляющих клавиш, то они используются не для отображения на экране, а для управления работой программ. Многим из этих клавиш, в том числе и для <Fi>, соответствует один и тот же ASCII-код – 00h. Поэтому различить такие клавиши между собой можно лишь по их скан-коду:
3Bh – <F1>, 3Ch - <F2>, 3Dh - <F3>, 3Eh - <F4>,
3Fh - <F5>, 40h - <F6>, 41h - <F7>, 42h - <F8>,
43h - <F9>, 44h - <F10>.
Ниже приведен текст процедуры Read_byte, выполняющей ввод с клавиатуры любого символа – обычного или управляющего. При этом код ASCII символа возвращается в регистре AL, а в регистре АН возвращается соответствующий скан-код. Обратите внимание, что вывод “эха” символа не производится.
; Считывает код символа с клавиатуры
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Выход: AL – код ASCII символа (0 – управляющий символ)
; АН – скан-код символа
;
Read_byte:
mov ah,0 ; Ввод символа
int 16h ; без эха
П о м е с т и т е процедуру Read_byte в начало файла Kbd_io.asm, временно записав перед ней оператор “org 100h”, а затем выполните ее отладку, используя Debug. Для этого получите файл Kbd_io.com и наберите команду DOS:
DEBUG Kbd_io.com
Для запуска программы используйте команду Debug: “G i” , где i – адрес в листинге команды ret. Нажимая различные клавиши, проверьте правильность заполнения процедурой регистра АХ.
Предыдущая глава | В начало | Следующий раздел |