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