Компьютер - электронное устройство, которое не заменит человека до тех пор, пока не научится смеяться шуткам начальника и сваливать свои собственные ошибки на соседний компьютер.




r>      LEA DX,RESTORE_CURSOR ;адрес начала строки в DX
      MOV AH,9 ;номер функции вывода строки
      INT 21H ;восстанавливаем позицию курсора

      Низкий уровень.

      Регистры 14 и 15 микросхемы 6845 хранят текущую позицию курсо- ра, как объяснялось в [4.1.1]. Старший байт хранится в регистре 14. Два байта хранят числа от 0 до 1999 в режиме 80 символов в строке и от 0 до 999 в режиме 40 символов. Вам необходимо пере- вести получаемое число в координаты строки и столбца. Вы можете прочитать это значение, чтобы узнать текущее позицию видимого курсора на экране. Но запоминание этого значения и последующее восстановление его в регистрах не обязательно приведет к возврату курсора в предыдущую позицию, особенно если Ваша программа ис- пользует любую из обычных функций работы с экраном, предоставляе- мых операционной системой. Это происходит потому, что BIOS хранит положение курсора в своих переменных, для того чтобы иметь воз- можность управлять страницами дисплея [4.5.3]. После того как Вы восстановите регистры 14 и 15 курсор переместится в соответствую- щую позицию, но при следующем вызове прерывания вывода на экран курсор вернется назад к той позиции, в которой он должен нахо- диться согласно значениям переменных BIOS.


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 ;засылаем его для следующего символа

Раздел 3. Вывод символов на экран.



      Имеется много способов вывода символов на экран. Некоторые просто помещают один символ, белый на черном, в текущую позицию курсора. Другие методы более сложны, но дают больше возможностей управления размещением символов, а также их атрибутами и цветами. Некоторые процедуры выводят на экран целые строки. Но в любом случае, основной операцией, на которой основан вывод, является помещение кода ASCII выводимого символа в указанную позицию ви- деобуфера; при этом может также записываться и байт атрибутов в следующий адрес памяти.
      Ваши программы могут помещать эти коды непосредственно в бу- фер, этот метод называется отображением в память. Отображение в память, как правило, требует больше усилий при программировании для выполнения заданной функции, чем при использовании процедур операционной системы, но в результате получаем более быстрый вывод на экран. IBM не рекомендует использовать этот метод вывода на экран, поскольку будущие изменения аппаратуры могут привести к тому, что программы будут работать неверно. Но на самом деле пока все новые разработки IBM следуют одной и той же схеме адресации, на которой основано отображение в память.


4.3.1 Вывод на экран одного символа.



      Все процедуры для вывода символа на экран в BIOS и DOS (а также в Бейсике) помещают символ в текущую позицию курсора и автоматически передвигают курсор на одну позицию вправо. Все они переносят вывод на следующую с