Справочник программиста на персональном компьютере фирмы 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>  вызывает перемещение курсора в первую
позицию текущей строки (нет автоматического перевода строки).