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

Материал из Emuverse

Глава 3. Стандартный экранный вывод.




§ 7. Разделение экранов

Итак, мы разобрались с буфером и с Диспетчером. Рассмотрим такую рядовую ситуацию: ПП «кружит» в Диспетчере, сканируя таблицу запросов и с нетерпением ожидая задачи на исполнение.

Пусть теперь ЦП по каналу К0 послал байт (пока неважно какой). Сработает прерывание от приемника К0 со стороны ПП. Наш байт запишется в буфер, указатель буфера изменится.

Также установится ячейка (7064) в таблице запросов. Программа обработки прерывания завершается, и управление возвращается в Диспетчер. Он обнаруживает, что поступил запрос на обслуживания экрана (ячейка (7064) не равна 0) и запускает подпрограмму экранного вывода, адрес которой находит в таблице задач.

Этот адрес — 111144.

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

7.0. Принцип разделения экранов

Из множества хитростей, заложенных в УК разработчиками, эта, на первый взгляд, в глаза не бросается. Однако без нее УК — не УК.

Допустим, Вы работаете в Бейсике, или в пультовом отладчике, и понадобилось, например, изменить цвет символа. Что Вы делаете? Нажимаете клавишу «УСТ». Что происходит? Появляется меню «Установка режимов». Выполнив необходимые манипуляции с этим меню, Вы возвращаетесь опять в ту же среду, где находились, нажатием клавиш «ИСП» или «Ввод».

При этом никаких изменений в текущем экране Вы не находите. Даже курсор на том же месте.

Иными словами, работа в меню «Уст» не касалась Вашей программы и Вашего экрана. Эта работа велась в другом экране. Каким образом этот другой экран влез вместо основного, рабочего? Конечно же, с помощью таблицы строк. Она стала указывать на другие адреса в ВОЗУ, и, таким образом, сделала видимой видеоинформацию другой области видеопамяти.

В этом заключается принцип разделения экранов в УК. Вместо того, чтобы копировать массивы видеоинформации, сохраняя старое изображение, просто меняются несколько ячеек в таблице строк, и в результате перед Вами — новый экран.

7.1 Стандартные экраны в УК-НЦ

Поскольку таблица строк указывает на целые строки, а не на их отрезки, экраны в УК представляют собой горизонтальные «полосы» на всю ширину экрана, различной высоты и расположения на экране.

Системой поддерживаются 4 стандартных экрана (см. рис. 7.0).

Два из них можно назвать экранами лишь с натяжкой. Они представляют собой по символьной строке каждая — служебная (вверху) и информационная (внизу). Эти «экранчики» всегда присутствуют на терминале. Каждая из них содержит 40 знакомест.

Служебная строка служит для отображения текущего алфавита (РУС/ЛАТ), индикации режимов инверсии, подчеркивания, дополнительной клавиатуры (ИНВ, ПОДЧ, ДКЛ), режима индикации символов управления (ИСУ), режима «Установка режимов» (УСТ). Разработчиками предусмотрен вывод и кое-каких других надписей в верхнюю строку, но почему-то Система не использует эти возможности.

Нижняя инфо-строка в Системе вообще не используется.

Для вывода в эти строки предназначены ЕМТ 52 и ЕМТ 56. Но о них позже. Пока — на очереди еще 2 экрана.

Они выводятся в «окошко» между служебной строкой и инфо-строкой. Один — назовем его рабочим — самый главный в УК. В нем работают практически все программы пользователя.

Этот экран содержит 26 символьных строк по 80 символов максимум. Из этих 26 строк 24 всегда выводятся на экран, а две оставшиеся можно просмотреть, циклически сдвинув экран вверх или вниз с помощью команд терминала (УПР+R или УПР+V). Лишь в этом экране действует рулон, и меню «Установка режимов» меняет режимы этого экрана (меняет цвета, формат рабочего экрана, тип рулона).

И последний стандартный экран — служебный. Он содержит 20 символьных строк, максимум по 40 символов в каждой. Рулон в этом экране всегда выключен. Служебный экран используется для размещения меню «Установка режимов», а также под монитор ПП.

Входят в этот монитор так: вызывают меню «Установка» нажатием УСТ, а затем нажимают ГРАФ + ИСП или УПР + @. Работа в мониторе ПП аналогична работе в мониторе ЦП. Однако подвесить машину здесь намного легче. Выход из него в меню «Установки» выполняется нажатием УПР + C.

Каждому экрану в таблице строк соответствуют свои регистры управления цветом и отображением. Их адреса даны в таблице 7.1. Напомним, что каждый из этих регистров занимает в таблице строк 2 слова.

TODO: Таблица 7.1. Адреса регистров управления отображением и цветом для стандартных экранов.

Экран	Адр. УО	Адр. УЦ
Рабочий	2460	2470
Служебный	4670  	4700
Служебная строка (верхняя)	2370 	2400
Инфо-строка (нижняя)	6740	6750

Ячейка с адресом 2476 содержит информцию о том, какой экран - рабочий или служебный - будет отображаться в окне:

1) рабочий экран:   (2476)=2500
2) служебный экран: (2476)=4672.

7.2. Экранные карты

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

Оказывается, можно.

Вывод на экран требует размещения в ОЗУ некоторых переменных, например, цвета символа, знакоместа, текущего адреса в ВОЗУ и т.д. Чтобы разделение экранов было полным, у каждого из экранов есть своя саО H8jщiующая и т.д. Тогда обращение к переменным будет выглядеть так:

  Смещение       Ассемблер        Блок-схема
  
    10            10(R5)            (R5+10)
     2             2(R5)            (R5+2)

В таблице 7.2 приведены смещения переменных, их смысл, а также характерные значения для каждого из четырех экранов.

< Таблица 7.2    Экранные карты  >

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

Пример 15. Вечные строки.

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

Нажав D, Вы окажетесь в режиме терминала. Очистите экран - <СБРОС>, и сделайте какую-нибудь приличную надпись в верхней строке. Затем выйдите из этого режима - <УПР>+C.

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

1) (+2): (22756)=155430 (сместим начальный адрес ВОЗУ "вниз"), 2) (+30):(23004)=5104 ("опустим" адрес верхней видеостроки в таблице строк), 3) (+14):(22770)=312 (уменьшим количество стираемых видео-строк на 11):, 4) (+12):(22766)=23 (уменьшим на 1 количество символьных строк).

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

Убрать защиту с первой строки можно, приведя измененные ячейки ЭК в их первоначальное состояние (оно дано в приложении).

Резюме к § 7

• Для создания дружественного интерфейса бывает удобно организовать многоэкранный вывод. Принцип разделения экранов позволяет это сделать.

• Таблица строк может указывать на разные экраны. Экран в УК - это горизонтальная полоса на терминале, состоящая из последовательных видео-строк.

• Чтобы отобразить нужный экран, достаточно "направить" маршрут таблицы строк по нужному руслу. Для этого, как правило, нужно изменить содержимое всего одной ячейки в таблице строк.

• Система поддерживает 4 стандартных экрана: Верхняя служебная строка. Рабочий экран. Служебный экран. Нижняя инфо-строка.

• У каждого экрана - своя область ВОЗУ.

• Служебная и информационная строки всегда отображаются на экране (вверху и внизу). Между ними может быть включен либо рабочий, либо служебный экран. Их переключение делается с помощью ячейки (2476). Рабочему экрану соответствует значение 2500 ,служебному - 4672.

• Вывод в каждый экран полностью независим. Это достигается с помощью экранных карт.

• Экранная карта - таблица переменных для экранного вывода. У каждого экрана она своя, и состоит из 31 слова. Начальный адрес текущей ЭК хранится в ячейке (23150).

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

• Начальные адреса четырех экранных карт: 22560 - верхняя служебная строка, 22656 - рабочий экран, 22754 - служебный экран, 23052 - нижняя инфо-строка.


§ 8. Программа экранного вывода

TODO


§ 9. Спецфункции

TODO


§10. EMT 52, 56, 40

Теперь займемся тремя EMT-подпрограммами.Две из них - EMT 52 и EMT 56 служат для вывода в служебную (верхнюю) и информационную (нижнюю) строки. EMT 40 служит для инициализации экрана.

10.0. Вывод в служебную и информационную строки (EMT 52, 56)

Итак, EMT 52 и 56. Если желаете, то можете взглянуть на схему 10.0. Здесь даны блок-схемы этих подпрограмм. Точнее, подпрограмма-то всего одна, а точки входа разные. EMT 52 началом текущей экранной карты утанавливает адрес 22560 (служебная строка), а EMT 56 - 23052 (информационная). Кроме того, можно "оградить" служебную строку от надписей через EMT 52 - для этого надо установить ячейку (7150) значением 2.

Действие этих подпрограмм не связано с буфером. Байты выводятся сразу из строки, адрес которой помещается за командой EMT. Первый байт в этой строке всегда интерпретируется как позиция X на экране. Строка должна заканчиваться 0.

Еще один маленький нюанс. EMT 52 и 56 использует для вывода символов стандартную программу экранного экранного вывода с адресом точки входа в нее 111272. А это значит, что управляющие коды (0 ... 37) не будут здесь управляющими. Они не будут вызывать спецфункции, а отображаются в виде символов (в знакогенераторе можно записать символы для таких слов).

10.1. Инициализация экрана (EMT 40)

Выполняя программу начального запуска, ПП должен, в числе прочих задач, инициализировать экран. Что это такое? Это последовательность действий, приводящая "с нуля" к нормальной работоспособности экрана. Инициализация включает в себя:

1) очистка ВОЗУ; 2) подготовка K0 к приему байт; 3) построение таблицы строк; 4) построение таблицы знакогенератора; 5) построение таблицы спецфункций; 6) инициализация буфера; 7) некоторые начальные установки (типа включения курсора).

Все эти действия выполняет EMT 40. Его утройство представлено на схеме 10.1. Помимо начальной точки входа, здесь показаны и некоторые дополнительные адреса.

Если, предположим, Вам не надо очищать экран, а просто нужно заново отстроить таблицу строк, ТЗГ, ТСФ и т.д., можно вызвать подпрограмму через CALL со следующих адресов:

Адрес Начальный пункт (из вышепречисленных)

107754 1 110022 2 110044 3 110050 4 110076 5 110114 6 110136 7

Конечно же, предварительно надо сохранить в стеке нужные еще Вам регистры (при вызове через EMT регистры сохранять не нужно).

Теперь опишем некоторые процедуры, вызываемые из EMT 40.

Процедура 110266. Строит таблицу строк. Как уже говорилось, эта таблица состоит из отдельных элементов. Каждый элемент должен содержать адрес ВОЗУ и адрес следующего элемента. Вначале строится "скелет" таблицы - пишутся адреса последовательных элементов. Затем с помощью процедуры 110550 в таблицу записываются адреса ВОЗУ. И уже в последнюю очередь делаются поправки на регистры УО и УЦ. Заметим, что процедура лишь строит таблицу строк, а не включает ее (ячейка 272 не трогается).

Процедура 110550. Используется предыдущей процедурой для построения непрерывного участка таблицы строк. Вызывается через JSR R5 и содержит 4 параметра, располагаемые в 4-х словах после команды.

1-й параметр - начальный адрес в ВОЗУ. 2-й параметр - начальный адрес в таблице строк. 3-й параметр - количество элементов. 4-й параметр - шаг в ВОЗУ.

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

Процедура 110656. Эта подпрограмма переписывает из ПЗУ (хотя может и из ОЗУ) в экранные карты их начальые значения, а затем по адресам, указанным в карте, записываются регистры УО и УЦ. Процедура вызывается через JSR R5 и имеет 2 параметра.

1-й параметр - начальный адрес в ПЗУ (ОЗУ). 2-й параметр - начальный адрес экранной карты.

В ПЗУ каждая экранная карта представлена так:

1-е слово - количество переменных в ЭК. Далее идут эти переменные, а затем 4 слова - содержимые УО1, УО2, УЦ1, УЦ2.

Резюме к §10

• EMT 52 выводит строку символов в верхнюю служебную строку.

• EMT 56 - в нижнюю информционную строку.

• Адрес строки указывается в слове, следующем за командой. Первый байт в строке - позиция по X (слева).

• EMT 40 выполняется инициализацию экрана.

• Последовательность инициализации:

1) стирание всех 3-х планов ВОЗУ; 2) разрешени прерываний от приемника К0; 3) построение таблицы строк; 4) переписывание таблицы знакогенератора из ПЗУ; 5) переписывание таблицы спецфункций из ПЗУ; 6) начальная установка указателей буфера; 7) переписывание экранных карт из ПЗУ; 8) начальные установки: - включение таблицы строк, - текущий экран - рабочий, - включение курсора, - начальные установки цветов символа и знакоместа.