https://emuverse.ru/w/index.php?title=%D0%A0%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%A3%D0%9A%D0%9D%D0%A6/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_6&feed=atom&action=historyРесурсы УКНЦ/Глава 6 - История изменений2024-03-29T15:24:26ZИстория изменений этой страницы в викиMediaWiki 1.40.0https://emuverse.ru/w/index.php?title=%D0%A0%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%A3%D0%9A%D0%9D%D0%A6/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_6&diff=3721&oldid=prevXolod в 09:22, 20 ноября 20232023-11-20T09:22:13Z<p></p>
<table style="background-color: #fff; color: #202122;" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="ru">
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">← Предыдущая версия</td>
<td colspan="2" style="background-color: #fff; color: #202122; text-align: center;">Версия от 12:22, 20 ноября 2023</td>
</tr><tr><td colspan="2" class="diff-lineno" id="mw-diff-left-l297">Строка 297:</td>
<td colspan="2" class="diff-lineno">Строка 297:</td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><br/></td></tr>
<tr><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>- Средства экранного вывода можно разделить на жесткие и мягкие</div></td><td class="diff-marker"></td><td style="background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>- Средства экранного вывода можно разделить на жесткие и мягкие</div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;"></ins></div></td></tr>
<tr><td colspan="2" class="diff-side-deleted"></td><td class="diff-marker" data-marker="+"></td><td style="color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">[[Категория:УКНЦ]]</ins></div></td></tr>
</table>Xolodhttps://emuverse.ru/w/index.php?title=%D0%A0%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%A3%D0%9A%D0%9D%D0%A6/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_6&diff=2347&oldid=prevNzeemin: разметка2016-11-06T11:16:48Z<p>разметка</p>
<a href="https://emuverse.ru/w/index.php?title=%D0%A0%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%A3%D0%9A%D0%9D%D0%A6/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_6&diff=2347&oldid=2340">Внесённые изменения</a>Nzeeminhttps://emuverse.ru/w/index.php?title=%D0%A0%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B_%D0%A3%D0%9A%D0%9D%D0%A6/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0_6&diff=2340&oldid=prevNzeemin: для начала как есть из http://zx-pk.ru/threads/12203-quot-resursy-uknts-quot-vlada-zhigalova.html?p=887000&viewfull=1#post8870002016-11-05T13:37:49Z<p>для начала как есть из http://zx-pk.ru/threads/12203-quot-resursy-uknts-quot-vlada-zhigalova.html?p=887000&viewfull=1#post887000</p>
<p><b>Новая страница</b></p><div>Глава 6 Практические рекомендации<br />
<br />
П16 Многоэкранный вывод<br />
<br />
1 Как влезть в другой экран<br />
2 Как создать свой экран<br />
3 Использование таблицы строк<br />
4 расслоение экранов (маска + УЦ)<br />
<br />
Теперь, разобрав по косточкам все аспекты экранного вывода, подведем итог, соединив все в практических рекомендациях. Эти рекомендации несут минимум нового и максимум полезного. Соответственно, минимум теории и максимум практики.<br />
<br />
16.0 Смена текущего экрана<br />
<br />
Под сменой текущего экрана будем понимать такие действия, после которых экранный вывод станет работать в нужном экране, предсказуемо и без проблем.<br />
<br />
Прежде всего необходимо сделать нужный экран видимым (например, меняя рабочий экран на служебный).<br />
<br />
Работа идет конечно над таблицей строк.<br />
<br />
Здесь все вертится вокруг ячейки (2476), которая содержит адрес продолжения таблицы строк, т.е. экрана, которое мы включим в окно между информационными строками.<br />
<br />
Этот адрес для служебного экрана однозначен:<br />
<br />
- служебный экран в окне: (2476)=4672<br />
<br />
Для рабочего же экрана такой однозначности нет. Причина в том, что в рабочем экране может работать рулон, и значение ячейки (2476) меняется при прокрутке экрана.<br />
<br />
<br />
-- 76 --<br />
<br />
<br />
Поэтому, перед тем как сменить рабочий экран на служебный, надо сохранить значение ячейки (2476). Затем, при возврате, эту ячейку следует восстановить.<br />
<br />
Что касается верхней и нижней инфо-строк, то таблицу строк здесь не нужно менять, ибо эти строки всегда присутствуют на терминале.<br />
<br />
Итак, чтобы менять в окне рабочий экран на служебный без проблем с возвратом обратно, надо:<br />
<br />
1. Сохранить значение ячеек (2476)<br />
2. Записать в (2476) число 4672<br />
3. При возврате восстановить старое значение ячейки (2476).<br />
<br />
Теперь, чтобы обеспечить вывод в этот экран, надо сменить экранную карту, записав в ячейку (23150) ее начальный адрес:<br />
<br />
Экран (23150)<br />
<br />
Рабочий - 22656<br />
Служебный - 22754<br />
Верх. и.с. - 22560<br />
Нижн. и.с. - 23052<br />
<br />
Однако, если нам нужен в новом экране курсор, необходимо сделать ещё некоторые мероприятия.<br />
<br />
А именно:<br />
<br />
- Сменить содержимое ячейки (23160) - адрес позиции курсора (задать адрес 2 байта УО1 нового экрана)<br />
<br />
- Обновить (из ЭК) ячейку отслеживания курсором - (23164). И ещё надо в УО1 записать цвет курсора (опять-таки из ЭК).<br />
<br />
Все эти действия сделает за нас заключительная часть EMT 40 (если ее хорошо попросить). Просить следует так: в R5 пишем адрес той ЭК, которую мы делаем текущей, и вызываем подпрограмму с адреса 110210, и та все сделает в лучшем виде (в том числе запишет адрес ЭК в ячейку (23150) и загрузит из ЭК цвета точки и фона в РТ и РФ). <br />
<br />
<br />
-- 77 --<br />
<br />
<br />
Действие по переносу экранного вывода в нужный экран:<br />
<br />
MOV #A, R5<br />
CALL 110210<br />
<br />
#A - адрес начала экранной карты, которую мы делаем текущей<br />
<br />
При переноса экранного вывода в инфо-строки надо учесть, что в их экранных картах курсор "выключен":<br />
<br />
(R5+72) = 0, т.е. выключено отслеживание<br />
(R5+70) = 0, т.е. цвет курсора - 0.<br />
<br />
Если в этих экранчиках нам нужен полноценный курсор, то , перед тем, как вызывать процедуру 110210, надо включить отслеживание, и установить приемлемый цвет курсора (например, 7):<br />
<br />
MOV #2, 72(R5)<br />
MOV #7, 70(R5).<br />
<br />
<br />
16.1 - Строим свой экран<br />
<br />
В случае, если вас не удовлетворяют стандартные экраны УК, можно разработать свои. Разработка ведется на нескольких уровнях:<br />
<br />
- экранная карта (ЭК)<br />
- таблица строк (ТС)<br />
- видео-ОЗУ (ВОЗУ).<br />
<br />
На рис. 16.1 показана образная схема работы экранного вывода. Стандартная часть средства экранного вывода (программа экранного вывода и спецфункции) через экранную карту работают с ВОЗУ (видеоинформацией) и с таблицей строк (отображением видеоинформации на терминал).<br />
<br />
Рис. 16.1 <br />
<br />
Нестандартной частью (сменной) выступают ЭК, ТС и ВОЗУ.<br />
<br />
Иными словами надо позаботиться о: <br />
<br />
- структуре экрана и его месте на терминале (в таблице строк);<br />
- о размещении видеоинформации (выделить место в ВОЗУ);<br />
<br />
И все это надо обобщить в экранной карте.<br />
<br />
<br />
-- 78 --<br />
<br />
<br />
О размещении видеоинформации<br />
<br />
Стандартные экраны используют под видео-ОЗУ 3 плана памяти общим объемом 96Кб. Причем все 96Кб активно используются системой - нет свободного места в планах. См. рис. 16.2 и табл. 16.0.<br />
<br />
Поэтому для новых экранов надо использовать либо планы, и таким образом отключать некоторые стандартные экраны, либо под ВОЗУ надо использовать ОЗУ ЦП + ОЗУ ПП. В этом случае работать с этой видеоинформацией можно будет и напрямую. Однако стандартные программы вывода работают с видеоинформацией только с помощью регистрового доступа. Так что простым опусканием ВОЗУ вниз вы , увы, не сможете увеличить скорость стандартного вывода.<br />
<br />
Табл. 16.1<br />
<br />
Всё же таким образом можно использовать часть ОЗУ, во многих программах не нужную:<br />
<br />
- часть ОЗУ ЦП (свободную от программ)<br />
- системное ОЗУ ЦП (8Кб)<br />
- часть системного ОЗУ ПП (<22Кб)<br />
<br />
Напомним, что ОЗУ ЦП соответствует 1- и 2-му планам ВОЗУ, ОЗУ ПП - 0-му плану (рис 1.?)<br />
<br />
Если к примеру использовать по ВОЗУ ~10Кб ОЗУ ПП (план 0) и ~20Кб ОЗУ ЦП (планы 1 и 2), то можно реализовать экран в 24 символьные строки в режиме 40 знакомест в строке, что весьма неплохо и вполне достаточно для большинства программ.<br />
<br />
Некоторые возможные комбинации размеров экранов мы представили в таблице 16.1.<br />
<br />
Все это справедливо для 3-планных экранов. Но если использовать расслоенные экраны можно в 3 раза увеличить их размер при то же объеме памяти. Но об этом чуть позже.<br />
<br />
<br />
<br />
-- 79 --<br />
<br />
<br />
Если вы используете под ВОЗУ системное ОЗУ ЦП (адреса 160000 и выше), желательно по выходе из программы восстанавливать СОЗУ (его содержимое). Это делается с помощью подпрограммы 173252. Она просто переписывает около 5,5Кб из ПЗУ в СОЗУ ЦП.<br />
<br />
После использования СОЗУ ЦП под ваши нужды восстановите программы, обычно прописанные там (монитор и прочее):<br />
<br />
CALL 173252<br />
<br />
Используя СОЗУ старайтесь не допускать в ваше программе ситуация, приводящих к переводу ЦП в режим HALT. Иначе произойдёт прерывание, вектор которого находится по адресу 160170, а его содержимое может быть непредсказуемым, если будет являться частью ВОЗУ.<br />
<br />
Организация таблицы строк<br />
<br />
Теперь быстренько вспомним зачем нужна таблица строк. А нужна она для того, чтобы отобразить информацию в ВОЗУ в определенной последовательности (построчно). Каждой строке соответствует элемент в ТС, в которой указан некий адрес ВОЗУ (адресация - регистровая). С этого адреса видеоинформация из последовательных адресов ВОЗУ, из 3-х планов будет отображаться на экране, сколько влезет в строку при данным формате.<br />
<br />
То есть ТС - это мостик между видеоинформацией в ВОЗУ и видеоизображением на экране.<br />
<br />
Опишем стандартную таблицу строк в таблице 16.2 и на рис 16.3.<br />
<br />
Стандартная таблица строк<br />
<br />
N эл-тов Адреса в ТС Адреса в видео-ОЗУ Место на экране N видеострок<br />
<br />
Таблица<br />
<br />
-- 80 --<br />
<br />
Пояснение. Кроме привычных 4-х экранов в таблицу строку входят ещё несколько образований:<br />
<br />
- верхняя разделительная видеострока (на экране присутствует всегда, сразу за верхней инфо-строкой).<br />
- нижняя разделительная видестрока (всегда присутствует на экране, перед нижней инфо-строкой).<br />
- верхняя и нижняя каймы служебного экрана. Окаймляет служебный экран, дополняя его до 24 символьных строк.<br />
<br />
<br />
-- 81 --<br />
<br />
<br />
В таблице строк эти элементы указывают на адрес 177460 ВОЗУ. Вывести в эти строки ничего нельзя, поскольку отсутствует стандартная экранная карта (хотя при желании можно и такую сделать). В Системе эти строки носят не информационную, а скорее декоративную функцию.<br />
<br />
Кстати, этот маленький кусочек видеопамяти - 177460...177777 также можно задействовать. В режиме 20 символов в строке из него может получиться 10 полноценных видеострок. Вполне хватит на какой-нибудь крупный заголовок к служебному экрану.<br />
<br />
Ваша таблица строк может быть как частью стандартной в виде фрагмента, так и совершенно отдельной таблицей в памяти.<br />
<br />
Таблица строк должна удовлетворять требованиям стандартного экранного вывода.<br />
<br />
Символьный вывод:<br />
<br />
- элементы должны идти по порядку (в пределах одного экрана). То есть допускается ссылаться из данного элемента лишь на следующий за ним в памяти.<br />
<br />
- адреса в ВОЗУ должны иметь постоянное приращение от строки к строке. Оно указывает в ЭК, (смещение +10).<br />
<br />
Графический вывод<br />
<br />
- элементы - по порядку (см. 1-е правило для символьного вывода). Постоянное приращение адресов ВОЗУ необязательно.<br />
<br />
Стандартная ТС вполне удовлетворяет этим требованиям, поэтому удобно строить свои ТС "по образу и подобию".<br />
<br />
Ну и наконец, сделав ТС и позаботившись о месте в ВОЗУ, составить свою экранную карту - дело легкое и даже приятное.<br />
<br />
<br />
-- 82 --<br />
<br />
<br />
16.2 Расслоение экранов по планам<br />
<br />
Сочетание всего-лишь 2-х аппаратных хитростей УК позволяет делать весьма полезные вещи с экранами, как стандартными, так и нестандартными.<br />
<br />
Вспомним, что соответствие цвета изображения содержимому ВОЗУ указывается в регистре управления цветом (УЦ). В принципе можно сделать для каждой видеостроки свой УК. Но практичнее все же сохранить один и тот же УК для одного экрана.<br />
<br />
Далее, в главе 1 был описан регистр маскирования записи в планы памяти со стороны ПП. Он позволяет перекрыть запись в любой план памяти регистровым доступом (защитить любой план).<br />
<br />
Теперь представим, что УК позволяет видеть содержимое только одного плана, допустим, плана 0, а регистр маски запрещает запись в планы 1 и 2.<br />
<br />
Стандартные средства экранного вывода не трогают регистр масок. Поэтому при выше перечисленных условиях будет работать лишь план 0, а остальные будут выключены из работы и отображения.<br />
<br />
Те же действия с двумя остальными планами приведут к тому, что вместо одного экрана с 8-ми цветным изображением у нас будет 3 двухцветных экрана, причем цвет для каждого из 3-х экранов можно задавать свои.<br />
<br />
Такой подход - расслоение экранов - может быть полезен при отображении символьной или другой информации, не требующей разнообразия палитры. Хотя и тут можно извернуться одна часть экрана может иметь свою палитру, другая - свою и т.д., так что экран будет состоять из отдельных горизонтальных полос, каждая со своими 2-мя цветами.<br />
<br />
Можно разбить 3 плана и по-другому 2+1. Тогда мы обретем 4-х цветный экран + 2-х цветный экран. Применение такой хитрости: 2-цветный символьный экран + 4-цветные иллюстрации к тексту. <br />
<br />
Переключение экранов выполняется элементарно сменой УЦ и регистра маски.<br />
<br />
<br />
-- 83 --<br />
<br />
<br />
Рис. 16.4 Работает лишь план 1.<br />
<br />
На практике это осуществляется следующим образом. УК разбит на 8 групп, каждая из которых содержит 4 бита и отвечает за определенную комбинацию в 3-х планах ВОЗУ (табл. 16.2).<br />
<br />
Каждая группа устанавливает свой цвет на экране и имеет формат: <br />
<br />
3 2 1 0<br />
+---+---+---+---+<br />
| Y | R | G | B |<br />
+---+---+---+---+<br />
<br />
Для того, чтобы выключить 2 плана из отображения, надо, чтобы группы содержали лишь 2 возможных цвета:<br />
<br />
1) - цвет точки (4 группы)<br />
2) - цвет фона (4 группы).<br />
<br />
Пусть цвет точки содержит группы, соответствующие единице в отображаемом плане. Цвет фона - группы, в которых в этом пане - 0.<br />
<br />
Табл. 16.4<br />
<br />
Отображаемый Номера групп Содержимое<br />
план Цвет точки Цвет фона УЦ1 УЦ2 регистра маски<br />
<br />
0 1,3,5,7 0,2,4,6 170360 170360 6<br />
1 2,3,6,7 0,1,4,5 177400 177400 5<br />
2 4,5,6,7 0,1,2,3 0 177777 3<br />
<br />
В таблице 16.4 даны номера групп под цвета точки и фона при одном отображаемом плане а также даны примеры содержимого УЦ:<br />
<br />
цвет фона - 0 (черный)<br />
цвет точки - 17 (белый цвет + установленный бит Y).<br />
<br />
Регистр маски содержит 0 в разряде для видимого плана, и 1 в двух остальных.<br />
<br />
Расслоение экранов позволит вам втрое повысить полезную информационную ёмкость видеопамяти.<br />
<br />
<br />
-- 84 --<br />
<br />
<br />
16.3 "Горизонтальный" рулон. Активная страницы.<br />
<br />
Стандартное переключение формата рабочего экрана подразумевает и урезание рабочих знакомест на экране. То есть в режиме 40 символов в строке вывод ведётся лишь в левой половине экрана - в видимых 40 знакоместах (рис.16.5).<br />
<br />
Сделать видимой остальную часть экрана можно, изменив адреса ВОЗУ в таблице строк для всех элементов рабочего экрана. Надо прибавить к адресам ВОЗУ число, равное смещению в октетах от левого края (рис 16.6).<br />
<br />
Это надо сделать для всех 286 элементов рабочего экрана.<br />
<br />
Таким образом можно добиться того, чтобы "окно" ездило по рабочему экрану вправо-влево.<br />
<br />
Следует однако следить чтобы окно не выходило за пределы рабочего экрана:<br />
<br />
delta A меньше или равно (80-F),<br />
<br />
здесь F - формат окна.<br />
<br />
Экранный вывод можно ограничить определенной областью - активной страницей.<br />
<br />
Напомним, что активной страницей называется область текущего экрана, внутри которой ведется экранный вывод. Левый край активной страницы имеет координату 0.<br />
<br />
Размер активной страницы следует указать в экранной карте:<br />
<br />
- ячейка (+4) - размер активной страницы<br />
- ячейка (+22) - позиция левого края активной страницы (рис.16.7)<br />
<br />
Активная страница и "окно" это совершенно разные вещи: "окно" лишь позволяет увидеть текущий экран или его часть, а активная страница - ограничить вывод внутри определенных фиксированных рамок.<br />
<br />
<br />
-- 85 --<br />
<br />
<br />
16.4 Быстрое стирание окна<br />
<br />
Под окном здесь мы будем понимать просто прямоугольную часть экрана (символьного).<br />
<br />
Для очищения окна можно использовать несколько способов.<br />
<br />
Один из них - заполнить пробелами нужную часть экрана. Этот способ, хоть и наиболее распространен в программах, однако недостаточно эффективен по скорости. Ведь каждый раз, когда посылается пробел, идет работу с буфером, Диспетчером, программой экранного вывода, знакогенератором. Разумеется, такой универсальный путь является и самым долгим.<br />
<br />
Однако есть более быстрый способ очищения окна - напрямую, через ВОЗУ.<br />
<br />
Подпрограмма очищения части экрана вшитая в ПЗУ построена с наибольшей эффективность довольно проста в работе.<br />
<br />
Для стирания окна на экране надо записать в R1-R3 параметры окна, R5 должен указывать на текущую ЭК:<br />
<br />
R1 - адрес ВОЗУ левого верхнего октета окна.<br />
R2 - ширина очищаемого окна (в знакоместах).<br />
R3 - высота окна (в пикселях).<br />
(R5 + 44) - цвет закрашивания (в формате РФ).<br />
<br />
CALL 113376 - вызов подпрограммы<br />
<br />
Этот быстрый способ используется системой при стирании экрана (СФ-14), при очищении до конца строки (СФ-13) и т.д. <br />
<br />
16.5 Выключение курсора<br />
<br />
Часто курсор оказывается не нужен на экране. В таких случаях его полезно без лишнего шума убрать.<br />
<br />
Делается это так:<br />
<br />
MOV A,R5 ; A - адрес текущей ЭК<br />
CALL 111632<br />
<br />
Эта маленькая процедура отключает отслеживание курсора, а также "выкусывает" курсор прямо из таблицы строк (схема 16.8).<br />
<br />
Включить потом курсор можно так:<br />
<br />
(23164)=2.<br />
<br />
<br />
-- 86 --<br />
<br />
<br />
После этого курсор объявится на своем месте после первого же обращения к программе экранного вывода.<br />
<br />
Нечто важное из П16<br />
<br />
- Средства экранного вывода можно разделить на жесткие и мягкие</div>Nzeemin