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