Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Создание альтернативных типов курсора
ОГЛАВЛЕНИЕ
4.2.6 Создание альтернативных типов курсора.
Все прерывания операционной системы, связанные с выводом на
экран, используют курсор. Вы можете изменить форму курсора с
помощью техники показанной в [4.2.4] или сделать курсор невидимым
[4.2.3]. Возможны альтернативные типы курсора, когда вывод на
экран осуществляется с помощью метода прямого отображения в па-
мять [4.3.1]. При этом "истинный" курсор выключается, поскольку
он не будет адресовать символы в определенную позицию видеобуфе-
ра. Вместо этого создается "фальшивый" курсор с помощью байта
атрибутов.
Наиболее эффективным методом является установка атрибута выво-
да в негативе для символа, на который указывает курсор. Для чер-
но-белого экрана для этого атрибута следует использовать код
ASCII 112. Другой способ - заставить символ, на который указывает
курсор мигать. В этом случае надо просто добавить 128 к текущему
значению атрибута, чтобы символ начал мигать, и вычесть 128,
чтобы прекратить мигание. Третий способ - установить для символа
режим подчеркивания (используя код ASCII 1). И, наконец, в прог-
раммах использующих командную строку можно рассмотреть возмож-
ность использования специального графического символа, который
следует за последним символом командной строки, такого как стрел-
ки выводимые кодами ASCII 17 или 27. Отметим, что когда программа
получает ввод в нескольких режимах, то Вы можете помочь идентифи-
цировать текущий режим за счет особого типа курсора.
Высокий уровень.
В данном примере курсор формируется за счет вывода символа в
позиции курсора в негативе. Переменная CURSORPOSITION хранит
смещение символа, на который указывает курсор в видеобуфере. Это
четное число в интервале от 0 до 3998. Прибавление к этой пере-
менной 1 дает позицию байта атрибутов для этого символа и помес-
тив туда 112 мы обеспечим вывод этого символа в негативе. Пере-
менная FORMERATTRIBUTE хранит обычные атрибуты символа, с тем
чтобы можно было восстановить их после того как курсор сдвинется.
500 '''процедура анализа поступающих расширенных кодов
.
560 IF EXTENDEDCODE = 77 THEN GOSUB 5000 'курсор вправо
5000 '''процедура сдвигающая курсор вправо на одну позицию
5010 POKE CURSORPOSITION+1,FORMERATTRIBUTE 'восст. атрибут
5020 CURSORPOSITION = CURSORPOSITION+2 'новая позиция
5030 FORMERATTRIBUTE = PEEK(CURSORPOSITION+1) 'сохр. атрибут
5040 POKE CURSORPOSITION+1,112 'включаем негатив
5050 RETURN 'все сделано
Низкий уровень.
Здесь тот же самый пример реализован на ассемблере:
;---процедура перемещения курсора на одну позицию вправо
CURSOR_RIGHT: MOV BX,CURSORPOSITION ;получение позиции
INC BX ;указываем на атрибут символа
MOV AL,FORMERATTRIBUTE ;берем сохраненный атрибут
MOV ES:[BX],AL ;восстанавливаем его
INC BX ;указываем на следующий символ
MOV CURSORPOSITION,BX ;сохраняем его смещение
MOV AL,ES:[BX]+1 ;получаем атрибут нового символа
MOV FORMERATTRIBUTE,AL ;сохраняем его
MOV AL,112 ;помещаем атрибут вывода в негативе
MOV ES:[BX]+1,AL ;засылаем его для следующего символа