Справочник программиста на персональном компьютере фирмы IBM. Клавиатура - Ожидание нажатия клавиши и эхо на экран
ОГЛАВЛЕНИЕ
3.1.4 Ожидание нажатия клавиши и эхо на экран.
При вводе данных и текста, эхо вводимых символов обычно вы-
дается на экран. При этом такие символы как возврат каретки или
забой переводятся в соответствующие перемещения курсора, а не
изображаются как ASCII символы для этих кодов. Выдача эха проис-
ходит в той позиции, где предварительно был установлен курсор и
текст автоматически переносится на следующую строку при достиже-
нии конца текущей. Перенос на следующую строку не требует спе-
циального кода, поскольку символы помещаются в следующую позицию
буферной памяти дисплея, которая представляет из себя одну длин-
ную строку, включающую все 25 строк дисплея.
Высокий уровень.
В Бейсике надо перехватить введенный символ с помощью операто-
ра INKEY$, как показано в [3.1.3]. Затем его надо вывести на
экран, прежде чем получать таким же способом следующий. Для выво-
да можно использовать либо оператор PRINT, либо оператором POKE
прямо поместить символ в видеобуфер, используя отображение в
память, как показано в [4.3.1] (буфер начинается с сегмента памя-
ти &HB000 для монохромного адаптера и с &HB800 - для цветного
адаптера). При использовании PRINT не забудьте поставить в конце
двоеточие, иначе будет автоматически добавлен код возврата карет-
ки. Ниже приведены примеры использования обоих методов. При этом
не проводится никакого анализа на управляющие символы. Вводимые
символы формируются в виде строки данных в переменной KEYSTROKE$.
100 ' метод использующий PRINT
110 LOCATE 10,40 'установка курсора в позицию 10,40
120 KEYSTROKE$="" 'очистка переменной
130 C$=INKEY$:IF C$="" THEN 130 'ожидание ввода символа
140 KEYSTROKE$=KEYSTROKE$ + C$ 'запись его в переменную
150 PRINT C$; 'печать символа
160 GOTO 130 'прием следующего символа
100 ' метод использующий POKE
110 DEF SEG = &HB000 'установка сегмента на видеобуфер
120 POINTER = 1678 'указатель на позицию 10,40
130 KEYSTROKE$="" 'очистка переменной
140 C$=INKEY$:IF C$="" THEN 140 'ожидание ввода символа
150 KEYSTROKE$=KEYSTROKE$ + C$ 'запись его в переменную
160 POKE POINTER,ASC(C$) 'помещение символа в видеобуфер
170 POINTER=POINTER + 2 'сдвиг указателя на следующий символ
180 GOTO 140 'прием следующего символа
Средний уровень.
Функция 1 прерывания 21H ожидает ввода символа, если буфер
клавиатуры пуст, а затем выводит его на экран в текущую позицию
курсора. Обрабатывается Ctrl-Break, поэтому может выполняться
процедура обработки Ctrl-Break [3.2.8]. Введенный символ возвра-
щается в AL. При вводе расширенного кода AL содержит ASCII 0. Для
получения в AL второго байта расширенного кода надо повторить
прерывание.
;---получение введенного символа
MOV AH,1 ;номер функции
INT 21H ;ожидаем нажатия клавиши
CMP AL,0 ;расширенный код?
JE EXTENDED_CODE ;если да, то на спец. процедуру
. ;иначе символ находится в AL
;---процедура обработки расширенных кодов
INT 21H ;получаем в AL номер кода
CMP AL,77 ;проверка на "курсор-вправо"
JNE C_R ;если нет, проверка следующего
JMP CURSOR_RIGHT ;если да, то на процедуру
C_R: CMP AL,75 ;... и т.д.
Эта функция полностью игнорирует клавишу <ESC>. Клавиша табу-
ляции интерпретируется нормально. Клавиша забой сдвигает курсор
на одну позицию влево, но символ, находящийся в этой позиции не
стирается. Клавиша <Enter> вызывает перемещение курсора в первую
позицию текущей строки (нет автоматического перевода строки).