ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 04.07.2020
Просмотров: 3187
Скачиваний: 1
которое вместе со значением "конечной строки" определяет толщину
курсора [4.2.4]. Поскольку тип курсора не имеет значения, когда
курсор выключен, то надо просто поместить в регистр 10 значение
32, чтобы установить бит 6. Чтобы восстановить курсор Вы должны
также вернуть значение "начальной строки" курсора. Для нормаль-
ного курсора это значение равно 11. Значение "конечной строки"
при этих процедурах не меняется, поскольку оно хранится в другом
регистре.
;---выключение курсора
MOV DX,3B4H ;номер порта адресного регистра 6845
MOV AL,10 ;выбор регистра 10
OUT DX,AL ;посылаем запрос
INC DX ;доступ к регистру через следующий порт
MOV AL,32 ;устанавливаем бит 6 для выключения курсора
OUT DX,AL ;выключаем курсор
;---обратное включение курсора
MOV AL,11 ;значение "начальной строки"
OUT DX,AL ;включаем курсор
4.2.4 Изменение формы курсора.
Курсор может меняться по толщине от тонкой линии до максималь-
ного размера, отводимого под символ. Он строится из коротких
горизонтальных отрезков, верхний из которых называется "начальной
строкой" курсора, а нижний - "конечной строкой". Для монохромного
дисплея под каждый символ отводится 14 строк, пронумерованных от
0 до 13, начиная сверху. Промежутки между символами обеспечивают-
ся двумя верхними строками и тремя нижними. Большинство символов
распологаются в строках 2-10, хотя хвостики некоторых символов
достигают линий 12 и 13, в то время как подчеркивание занимает
одну двенадцатую строку.
На 200-строчном цветном дисплее для каждого символа отводится
только 8 строк, а символ рисуется в верхних семи строках. Эти 8
строк пронумерованы от 0 до 7, начиная сверху, и нормальный кур-
сор формируется одной строкой 7. (Отметим, что на цветном дисплее
нет подчеркивания, поскольку использование для подчеркивания
строки 7 привело бы к тому, что символы сливались бы с располо-
женными под ними.) Цветной дисплей высокого разрешения использует
14-строчный монохромный вариант, когда он работает в режиме высо-
кого разрешения, а когда он работает в одном из цветных графичес-
ких режимов, то он использует 8-строчный режим.
Курсор может быть сформирован любой комбинацией прилегающих
отрезков. Для монохромного дисплея он занимает все отведенное под
символ место, когда "начальная строка" равна 0, а "конечная стро-
ка" равна 13 (для графического дисплея надо использовать значение
"конечной строки" равное 7). Если значения "начальной" и "конеч-
ной" строки совпадают, то возникает однострочный курсор. Если
номер "конечной строки" меньше чем "начальной" то возникает кур-
сор, состоящий из двух частей, так как происходит перенос в верх-
ние строки. Например, если "начальная строка" равна 12, а "конеч-
ная" - 1, то сначала заполняется строка 12, затем 13, затем 0 и,
наконец, 1. Курсор при этом принимает форму двух параллельных
линий, указывающих верхнюю и нижнюю границы ряда, который он
занимает.
BIOS хранит 2-байтную переменную по адресу 0040:0060, которая
содержит текущие значения "начальной" и "конечной" строк. Первый
байт содержит значение "конечной строки", а второй - "начальной".
Высокий уровень.
В Бейсике оператор LOCATE может не только позиционировать
курсор и включать или выключать его, но и управлять его формой.
Парметры, устанавливающие "начальную" и "конечную" строки - это
4-е и 5-е число, следующие за словом LOCATE. Другие параметры
могут быть опущены, если присутствуют разделяющие их запятые.
Таким образом, чтобы создать толстый курсор, занимающий строки со
2 по 12, надо записать LOCATE ,,,2,12. Отметим, что Бейсик обычно
выключает курсор, когда начинает выполнение программы. Как вклю-
чить его обратно см. в [4.2.3].
Средний уровень.
Функция 1 прерывания BIOS 10H устанавливает "начальную" и
"конечную" строки курсора. В CH должна быть указана "начальная",
а в CL - "конечная" строка.
;---установка "начальной" и "конечной" строк курсора
MOV AH,1 ;номер функции
MOV CH,0 ;начать курсор в верхней строке
MOV CL,7 ;окончить курсор в восьмой строке
INT 10H ;
Низкий уровень.
Регистры 10 и 11 контроллера дисплея 6845 содержат значения
"начальной" и "конечной" строки, соответственно. Доступ к обоим
регистрам осуществляется через порт 3B5H для монохромного адапто-
ра и 3D5H - для цветного алаптора и PCjr. Предварительно надо
послать номер требуемого регистра в адресный регистр, имеющий
адрес порта 3B4H (см. [4.1.1]). Значения занимают младший конец
каждого регистра. Однако регистр "начальной" строки (#10) битами
5 и 6 индицирует также должен ли выводиться курсор. Поскольку
курсор выводится, когда оба этих бита сброшены в 0, то просто
поместив в регистр номер "начальной" строки мы установим эти биты
в 0. Остальные биты этого регистра не используются.
;---установка "начальной" строки
MOV DX,3B4H ;доступ к адресному регистру 6845
MOV AL,10 ;выбор регистра 6845
OUT DX,AL ;посылка запроса
MOV AL,0 ;номер "начальной строки" 0
INC DX ;переходим к управляющему регистру
OUT DX,AL ;посылаем номер "начальной строки"
;---установка "конечной строки"
MOV AL,11 ;выбираем регистр 11
DEC DX ;возвращаемся к адресному регистру
OUT DX,AL ;посылаем запрос
MOV AL,7 ;номер "конечной строки" 7
INC DX ;переходим к управляющему регистру
OUT DX,AL ;посылаем номер "конечной строки"
4.2.5 Чтение/сохранение/восстановление позиции курсора.
Программы иногда читают и сохраняют текущее положение курсора,
с тем чтобы можно было временно перевести курсор в командную
строку, а затем вернуть его в исходную позицию. Текущая позиция
курсора для каждой из вплоть до восьми страниц хранится в области
данных BIOS. Имеется восемь 2-байтных переменных, размещающихся
начиная с адреса 0040:0050. Первая позиция соответствует странице
0, вторая - странице 1 и т.д. Младший байт каждой переменной
содержит номер столбца, а младший - номер строки. Как столбцы,
так и строки нумеруются, начиная с нуля.
Высокий уровень.
В Бейсике оператор CRSLIN возвращает строку, а POS - столбец.
Оператор POS должен быть снабжен фиктивным аргументом, т.е. он
всегда должен записываться в виде POS(0). В данном примере курсор
переводится в нижнюю строку экрана, а затем возвращается на мес-
то. Отметим, что курсор возвращается на место после выполнения
оператора INPUT [4.2.3].
100 ROW = CRSLIN 'получаем строку курсора
110 COL = POS(0) 'получаем столбец курсора
120 LOCATE 25,1 'переводим курсор в командную строку
130 INPUT "Enter file name", F$ 'запрос на ввод
140 LOCATE ROW,COL,1 'восстанавливаем позицию курсора
Средний уровень.
Функция 3 прерывания 10H возвращает строку курсора в DH, а
столбец - в DL. На входе надо поместить в BH номер страницы
(всегда 0 для монохромного дисплея).
;---определение позиции курсора
MOV AH,3 ;номер функции
MOV BH,0 ;страница 0
INT 10H ;строка:столбец в DH:DL
MS DOS предоставляет две Esc-последовательности для сохранения
и восстановления позиции курсора. Это специальные строки, которые
если их "вывести" на терминал управляют монитором. Основы исполь-
зования этих последовательностей описаны в приложении Д. Последо-
вательность для запоминания позиции курсора - Esc[s, а для восс-
тановления - Esc[u. Нет нужды запоминать координаты в переменной.
;---в сегменте данных
SAVE_CURSOR DB 27,'[s$'
RESTORE_CURSOR DB 27,'[u$'
;---сохранение курсора
LEA DX,SAVE_CURSOR ;адрес начала строки в DX
MOV AH,9 ;номер функции вывода строки
INT 21H ;сохраняем позицию курсора
;---восстановление курсора
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 (а
также в Бейсике) помещают символ в текущую позицию курсора и
автоматически передвигают курсор на одну позицию вправо. Все они
переносят вывод на следующую строку при достижении конца строки,
если не сделано специальных указаний отбрасывать все символы за
80-м столбцом [4.2.2]. Важное отличие между отдельными процедура-
ми состоит в том, что некоторые вместе с символом пишут также и
его атрибуты, а некоторые этого не делают.
Как в языках высокого, так и в языках низкого уровня, символы
могут выводиться на экран без использования обычных операций
печати. Вместо этого используется прямое отображение в память,
при котором коды символов и их атрибуты прямо засылаются в ячейки
памяти видеобуфера, соответствующие определенной позиции курсора
на экране. Буфер начинается с адреса B000:0000 для монохромного
адаптора и с адреса B800:0000 - для цветного графического адапто-
ра и PCjr. EGA использует те же самые адреса в аналогичных режи-
мах экрана. Позиции с четными номерами (начиная с нуля) содержат
коды ASCII символов, а позиции с нечетными номерами - байты атри-
бутов. На рис. 4-2 показан участок памяти видеобуфера. При этих
операциях позиция курсора не меняется и он может быть выключен
при желании [4.2.3]. Вместо курсора надо хранить переменные,
служащие указателями на текущую позицию.
Высокий уровень.
Бейсик выводит как отдельные символы, так и целые строки, с