
|
Затем установить, меньше ли этот код 91, тогда мы имеем дело с символом верхнего регистра. Если это так, то надо для перевода в нижний регистр добавить 32. В противном случае, оставить все как есть. После этого будет достаточно более короткого оператора, такого как IF C=97 THEN ... Вот код этой процедуры: 500 C=ASC(C$) 'получаем ASCII код символа 510 IF NOT ((C>64 AND C<91)OR(C>96 AND C<123)) THEN ... 520 IF C<91 THEN C=C+32 'приводим все к нижнему регистру 530 IF C=97 THEN ... '... начинаем проверку значений Средний уровень. Функции 7 и 8 прерывания 21H ожидают ввода символа, если буфер клавиатуры пуст, а когда он появляется, то не выводится на экран. При этом функция 8 определяет Ctrl-Break (и инициирует процедуру обработки Ctrl-Break[3.2.8]), а функция 7 не реагирует на него. В обоих случаях символ возвращается в AL. Когда AL содержит ASCII 0, то получен расширенный код. Повторите прерывание и в AL поя- вится второй байт расширенного кода. ;---получаем введенный символ MOV AH,7 ;номер функции INT 21H ;ожидаем ввод символа CMP AL,0 ;проверка на расширенный код JE EXTENDED_CODE ;если да, то на особую процедуру . ;иначе, код символа в AL ;---процедура обработки расширенных кодов EXTENDED_CODE: INT 21H ;берем второй байт кода CMP AL,75 ;проверяем на "стрелку-влево" JNE C_R ;если нет, то след. проверка JMP CURSOR_LEFT;если да, то на процедуру C_R: CMP AL,77 ;сравниваем дальше и т.д. BIOS обеспечивает процедуру, которая предоставляет те же воз- можности, что и функции MS DOS. Поместите 0 в AH и вызовите пре- рывание 16H. Функция ожидает ввода символа и возвращает его в AL. В этом случае и расширенные коды обрабатываются за одно прерыва- ние. Если в AL содержится 0, то в AH будет содержаться номер расширенного кода. При это не обрабатывается Ctrl-Break. ;---ждем нажатия клавиши MOV AH,0 ;номер функции ожидания ввода INT 16H ;получаем введенный код CMP AL,0 ;проверка на расширенный код JE EXTENDED_CODE ;если да, то на спец. процедуру . ;иначе символ в AL ;---процедура обработки расширенного кода EXTENDED_CODE: CMP AH,75 ;берем расширенный код из AH ;и т.д. 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>. Клавиша табу- ляции интерпретируется нормально. Клавиша забой сдвигает курсор на одну позицию влево, но символ, находящийся в этой позиции не стирается. Клавиша <Ent |