Ресурсы УКНЦ/Глава 6

Материал из Emuverse
Перейти к: навигация, поиск

Глава 6. Практические рекомендации




§ 16. Многоэкранный вывод

1 Как влезть в другой экран 2 Как создать свой экран 3 Использование таблицы строк 4 расслоение экранов (маска + УЦ)

Теперь, разобрав по косточкам все аспекты экранного вывода, подведем итог, соединив все в практических рекомендациях. Эти рекомендации несут минимум нового и максимум полезного. Соответственно, минимум теории и максимум практики.

16.0 Смена текущего экрана

Под сменой текущего экрана будем понимать такие действия, после которых экранный вывод станет работать в нужном экране, предсказуемо и без проблем.

Прежде всего необходимо сделать нужный экран видимым (например, меняя рабочий экран на служебный).

Работа идет конечно над таблицей строк.

Здесь все вертится вокруг ячейки (2476), которая содержит адрес продолжения таблицы строк, т.е. экрана, которое мы включим в окно между информационными строками.

Этот адрес для служебного экрана однозначен:

- служебный экран в окне: (2476)=4672

Для рабочего же экрана такой однозначности нет. Причина в том, что в рабочем экране может работать рулон, и значение ячейки (2476) меняется при прокрутке экрана.

Поэтому, перед тем как сменить рабочий экран на служебный, надо сохранить значение ячейки (2476). Затем, при возврате, эту ячейку следует восстановить.

Что касается верхней и нижней инфо-строк, то таблицу строк здесь не нужно менять, ибо эти строки всегда присутствуют на терминале.

Итак, чтобы менять в окне рабочий экран на служебный без проблем с возвратом обратно, надо:

1. Сохранить значение ячеек (2476) 2. Записать в (2476) число 4672 3. При возврате восстановить старое значение ячейки (2476).

Теперь, чтобы обеспечить вывод в этот экран, надо сменить экранную карту, записав в ячейку (23150) ее начальный адрес:

Экран (23150)

Рабочий - 22656 Служебный - 22754 Верх. и.с. - 22560 Нижн. и.с. - 23052

Однако, если нам нужен в новом экране курсор, необходимо сделать ещё некоторые мероприятия.

А именно:

- Сменить содержимое ячейки (23160) - адрес позиции курсора (задать адрес 2 байта УО1 нового экрана)
- Обновить (из ЭК) ячейку отслеживания курсором - (23164). И ещё надо в УО1 записать цвет курсора (опять-таки из ЭК).

Все эти действия сделает за нас заключительная часть EMT 40 (если ее хорошо попросить). Просить следует так: в R5 пишем адрес той ЭК, которую мы делаем текущей, и вызываем подпрограмму с адреса 110210, и та все сделает в лучшем виде (в том числе запишет адрес ЭК в ячейку (23150) и загрузит из ЭК цвета точки и фона в РТ и РФ).

Действие по переносу экранного вывода в нужный экран:

	MOV 	#A, R5
	CALL	110210
  1. A - адрес начала экранной карты, которую мы делаем текущей

При переноса экранного вывода в инфо-строки надо учесть, что в их экранных картах курсор "выключен":

(R5+72) = 0, т.е. выключено отслеживание (R5+70) = 0, т.е. цвет курсора - 0.

Если в этих экранчиках нам нужен полноценный курсор, то , перед тем, как вызывать процедуру 110210, надо включить отслеживание, и установить приемлемый цвет курсора (например, 7):

       MOV		#2, 72(R5)
       MOV		#7, 70(R5)


16.1. Строим свой экран

В случае, если вас не удовлетворяют стандартные экраны УК, можно разработать свои. Разработка ведется на нескольких уровнях:

- экранная карта (ЭК) - таблица строк (ТС) - видео-ОЗУ (ВОЗУ).

На рис. 16.1 показана образная схема работы экранного вывода. Стандартная часть средства экранного вывода (программа экранного вывода и спецфункции) через экранную карту работают с ВОЗУ (видеоинформацией) и с таблицей строк (отображением видеоинформации на терминал).

TODO: Рис. 16.1

Нестандартной частью (сменной) выступают ЭК, ТС и ВОЗУ.

Иными словами надо позаботиться о:

- структуре экрана и его месте на терминале (в таблице строк); - о размещении видеоинформации (выделить место в ВОЗУ);

И все это надо обобщить в экранной карте.

О размещении видеоинформации

Стандартные экраны используют под видео-ОЗУ 3 плана памяти общим объемом 96Кб. Причем все 96Кб активно используются системой - нет свободного места в планах. См. рис. 16.2 и табл. 16.0.

Поэтому для новых экранов надо использовать либо планы, и таким образом отключать некоторые стандартные экраны, либо под ВОЗУ надо использовать ОЗУ ЦП + ОЗУ ПП. В этом случае работать с этой видеоинформацией можно будет и напрямую. Однако стандартные программы вывода работают с видеоинформацией только с помощью регистрового доступа. Так что простым опусканием ВОЗУ вниз вы , увы, не сможете увеличить скорость стандартного вывода.

TODO: Табл. 16.1

Всё же таким образом можно использовать часть ОЗУ, во многих программах не нужную:

- часть ОЗУ ЦП (свободную от программ) - системное ОЗУ ЦП (8Кб) - часть системного ОЗУ ПП (<22Кб)

Напомним, что ОЗУ ЦП соответствует 1- и 2-му планам ВОЗУ, ОЗУ ПП - 0-му плану (рис 1.?)

Если к примеру использовать по ВОЗУ ~10Кб ОЗУ ПП (план 0) и ~20Кб ОЗУ ЦП (планы 1 и 2), то можно реализовать экран в 24 символьные строки в режиме 40 знакомест в строке, что весьма неплохо и вполне достаточно для большинства программ.

Некоторые возможные комбинации размеров экранов мы представили в таблице 16.1.

Все это справедливо для 3-планных экранов. Но если использовать расслоенные экраны можно в 3 раза увеличить их размер при то же объеме памяти. Но об этом чуть позже.

Если вы используете под ВОЗУ системное ОЗУ ЦП (адреса 160000 и выше), желательно по выходе из программы восстанавливать СОЗУ (его содержимое). Это делается с помощью подпрограммы 173252. Она просто переписывает около 5,5Кб из ПЗУ в СОЗУ ЦП.

После использования СОЗУ ЦП под ваши нужды восстановите программы, обычно прописанные там (монитор и прочее):

CALL 173252

Используя СОЗУ старайтесь не допускать в ваше программе ситуация, приводящих к переводу ЦП в режим HALT. Иначе произойдёт прерывание, вектор которого находится по адресу 160170, а его содержимое может быть непредсказуемым, если будет являться частью ВОЗУ.

Организация таблицы строк

Теперь быстренько вспомним зачем нужна таблица строк. А нужна она для того, чтобы отобразить информацию в ВОЗУ в определенной последовательности (построчно). Каждой строке соответствует элемент в ТС, в которой указан некий адрес ВОЗУ (адресация - регистровая). С этого адреса видеоинформация из последовательных адресов ВОЗУ, из 3-х планов будет отображаться на экране, сколько влезет в строку при данным формате.

То есть ТС - это мостик между видеоинформацией в ВОЗУ и видеоизображением на экране.

Опишем стандартную таблицу строк в таблице 16.2 и на рис 16.3.

Стандартная таблица строк

N эл-тов Адреса в ТС Адреса в видео-ОЗУ Место на экране N видеострок

Таблица

Пояснение. Кроме привычных 4-х экранов в таблицу строку входят ещё несколько образований:

- верхняя разделительная видеострока (на экране присутствует всегда, сразу за верхней инфо-строкой).
- нижняя разделительная видестрока (всегда присутствует на экране, перед нижней инфо-строкой).
- верхняя и нижняя каймы служебного экрана. Окаймляет служебный экран, дополняя его до 24 символьных строк.

В таблице строк эти элементы указывают на адрес 177460 ВОЗУ. Вывести в эти строки ничего нельзя, поскольку отсутствует стандартная экранная карта (хотя при желании можно и такую сделать). В Системе эти строки носят не информационную, а скорее декоративную функцию.

Кстати, этот маленький кусочек видеопамяти - 177460...177777 также можно задействовать. В режиме 20 символов в строке из него может получиться 10 полноценных видеострок. Вполне хватит на какой-нибудь крупный заголовок к служебному экрану.

Ваша таблица строк может быть как частью стандартной в виде фрагмента, так и совершенно отдельной таблицей в памяти.

Таблица строк должна удовлетворять требованиям стандартного экранного вывода.

Символьный вывод:

- элементы должны идти по порядку (в пределах одного экрана). То есть допускается ссылаться из данного элемента лишь на следующий за ним в памяти.

- адреса в ВОЗУ должны иметь постоянное приращение от строки к строке. Оно указывает в ЭК, (смещение +10).

Графический вывод

- элементы - по порядку (см. 1-е правило для символьного вывода). Постоянное приращение адресов ВОЗУ необязательно.

Стандартная ТС вполне удовлетворяет этим требованиям, поэтому удобно строить свои ТС "по образу и подобию".

Ну и наконец, сделав ТС и позаботившись о месте в ВОЗУ, составить свою экранную карту - дело легкое и даже приятное.

16.2. Расслоение экранов по планам

Сочетание всего-лишь 2-х аппаратных хитростей УК позволяет делать весьма полезные вещи с экранами, как стандартными, так и нестандартными.

Вспомним, что соответствие цвета изображения содержимому ВОЗУ указывается в регистре управления цветом (УЦ). В принципе можно сделать для каждой видеостроки свой УК. Но практичнее все же сохранить один и тот же УК для одного экрана.

Далее, в главе 1 был описан регистр маскирования записи в планы памяти со стороны ПП. Он позволяет перекрыть запись в любой план памяти регистровым доступом (защитить любой план).

Теперь представим, что УК позволяет видеть содержимое только одного плана, допустим, плана 0, а регистр маски запрещает запись в планы 1 и 2.

Стандартные средства экранного вывода не трогают регистр масок. Поэтому при выше перечисленных условиях будет работать лишь план 0, а остальные будут выключены из работы и отображения.

Те же действия с двумя остальными планами приведут к тому, что вместо одного экрана с 8-ми цветным изображением у нас будет 3 двухцветных экрана, причем цвет для каждого из 3-х экранов можно задавать свои.

Такой подход - расслоение экранов - может быть полезен при отображении символьной или другой информации, не требующей разнообразия палитры. Хотя и тут можно извернуться одна часть экрана может иметь свою палитру, другая - свою и т.д., так что экран будет состоять из отдельных горизонтальных полос, каждая со своими 2-мя цветами.

Можно разбить 3 плана и по-другому 2+1. Тогда мы обретем 4-х цветный экран + 2-х цветный экран. Применение такой хитрости: 2-цветный символьный экран + 4-цветные иллюстрации к тексту.

Переключение экранов выполняется элементарно сменой УЦ и регистра маски.

Рис. 16.4 Работает лишь план 1.

На практике это осуществляется следующим образом. УК разбит на 8 групп, каждая из которых содержит 4 бита и отвечает за определенную комбинацию в 3-х планах ВОЗУ (табл. 16.2).

Каждая группа устанавливает свой цвет на экране и имеет формат:

 3   2   1   0

+---+---+---+---+ | Y | R | G | B | +---+---+---+---+

Для того, чтобы выключить 2 плана из отображения, надо, чтобы группы содержали лишь 2 возможных цвета:

1) - цвет точки (4 группы) 2) - цвет фона (4 группы).

Пусть цвет точки содержит группы, соответствующие единице в отображаемом плане. Цвет фона - группы, в которых в этом пане - 0.

Табл. 16.4

Отображаемый Номера групп Содержимое план Цвет точки Цвет фона УЦ1 УЦ2 регистра маски

0 1,3,5,7 0,2,4,6 170360 170360 6 1 2,3,6,7 0,1,4,5 177400 177400 5 2 4,5,6,7 0,1,2,3 0 177777 3

В таблице 16.4 даны номера групп под цвета точки и фона при одном отображаемом плане а также даны примеры содержимого УЦ:

цвет фона - 0 (черный) цвет точки - 17 (белый цвет + установленный бит Y).

Регистр маски содержит 0 в разряде для видимого плана, и 1 в двух остальных.

Расслоение экранов позволит вам втрое повысить полезную информационную ёмкость видеопамяти.

16.3 «Горизонтальный» рулон. Активная страницы.

Стандартное переключение формата рабочего экрана подразумевает и урезание рабочих знакомест на экране. То есть в режиме 40 символов в строке вывод ведётся лишь в левой половине экрана - в видимых 40 знакоместах (рис.16.5).

Сделать видимой остальную часть экрана можно, изменив адреса ВОЗУ в таблице строк для всех элементов рабочего экрана. Надо прибавить к адресам ВОЗУ число, равное смещению в октетах от левого края (рис 16.6).

Это надо сделать для всех 286 элементов рабочего экрана.

Таким образом можно добиться того, чтобы "окно" ездило по рабочему экрану вправо-влево.

Следует однако следить чтобы окно не выходило за пределы рабочего экрана:

delta A меньше или равно (80-F),

здесь F - формат окна.

Экранный вывод можно ограничить определенной областью - активной страницей.

Напомним, что активной страницей называется область текущего экрана, внутри которой ведется экранный вывод. Левый край активной страницы имеет координату 0.

Размер активной страницы следует указать в экранной карте:

- ячейка (+4) - размер активной страницы - ячейка (+22) - позиция левого края активной страницы (рис.16.7)

Активная страница и "окно" это совершенно разные вещи: "окно" лишь позволяет увидеть текущий экран или его часть, а активная страница - ограничить вывод внутри определенных фиксированных рамок.

16.4 Быстрое стирание окна

Под окном здесь мы будем понимать просто прямоугольную часть экрана (символьного).

Для очищения окна можно использовать несколько способов.

Один из них - заполнить пробелами нужную часть экрана. Этот способ, хоть и наиболее распространен в программах, однако недостаточно эффективен по скорости. Ведь каждый раз, когда посылается пробел, идет работу с буфером, Диспетчером, программой экранного вывода, знакогенератором. Разумеется, такой универсальный путь является и самым долгим.

Однако есть более быстрый способ очищения окна - напрямую, через ВОЗУ.

Подпрограмма очищения части экрана вшитая в ПЗУ построена с наибольшей эффективность довольно проста в работе.

Для стирания окна на экране надо записать в R1-R3 параметры окна, R5 должен указывать на текущую ЭК:

R1 - адрес ВОЗУ левого верхнего октета окна.
R2 - ширина очищаемого окна (в знакоместах).
R3 - высота окна (в пикселях).
(R5 + 44) -  цвет закрашивания (в формате РФ).
CALL 113376 - вызов подпрограммы

Этот быстрый способ используется системой при стирании экрана (СФ-14), при очищении до конца строки (СФ-13) и т.д.

16.5 Выключение курсора

Часто курсор оказывается не нужен на экране. В таких случаях его полезно без лишнего шума убрать.

Делается это так:

MOV	A,R5	; A - адрес текущей ЭК
CALL	111632

Эта маленькая процедура отключает отслеживание курсора, а также "выкусывает" курсор прямо из таблицы строк (схема 16.8).

Включить потом курсор можно так:

(23164)=2.

После этого курсор объявится на своем месте после первого же обращения к программе экранного вывода.

Нечто важное из § 16

- Средства экранного вывода можно разделить на жесткие и мягкие