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