Файл: jourdain_spravochnik_programmista.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 04.07.2020

Просмотров: 3196

Скачиваний: 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]. Вместо курсора надо хранить переменные,

служащие указателями на текущую позицию.


Высокий уровень.


Бейсик выводит как отдельные символы, так и целые строки, с