Difference between revisions of "Uknc Resources chapter1"

From Felixl.com
Jump to navigationJump to search
 
(Пример 9. Параллельная инверсия экрана)
 
(31 intermediate revisions by the same user not shown)
Line 1: Line 1:
: ''Это глава из книги [[Uknc Resources|«Ресурсы УКНЦ»]].''
+
{{Uknc Resources header}}
 +
 
 
'''''Глава 1. Аппаратные средства вывода на экран'''''
 
'''''Глава 1. Аппаратные средства вывода на экран'''''
 
----
 
----
 +
 +
 +
__TOC__
 +
  
 
Решение некоторых сложных проблем иногда полезно начинать с конца. Поскольку вывод на экран — штука отнюдь не простая, мы именно так и сделаем. Причем концом будет у нас сам экран.
 
Решение некоторых сложных проблем иногда полезно начинать с конца. Поскольку вывод на экран — штука отнюдь не простая, мы именно так и сделаем. Причем концом будет у нас сам экран.
Line 15: Line 20:
 
* '''Общий (земля).'''
 
* '''Общий (земля).'''
  
Все эти сигналы выводятся на разъемы "ВМ" на задней панели компьютера. Этих разъемов у УКНЦ два. Поэтому к ней можно подключить целых два монитора. (Любопытно, что у человека тоже целых два глаза. Совпадение?)
+
Все эти сигналы выводятся на разъемы «ВМ» на задней панели компьютера. Этих разъемов у УКНЦ два. Поэтому к ней можно подключить целых два монитора. (Любопытно, что у человека тоже целых два глаза. Совпадение?)
  
 
Теперь осталось подключить компьютер. К каждой машине прилагается видеошнур. В нем 10 жил. Разводка сигналов по этим жилам такова:
 
Теперь осталось подключить компьютер. К каждой машине прилагается видеошнур. В нем 10 жил. Разводка сигналов по этим жилам такова:
Line 27: Line 32:
 
Для передачи черно-белого изображения достаточно всего двух проводов — Видео и Земля. Для цветного требуется минимум 5: R, G, B, СС и земля.
 
Для передачи черно-белого изображения достаточно всего двух проводов — Видео и Земля. Для цветного требуется минимум 5: R, G, B, СС и земля.
  
Напряжение на выходе из компьютера в видеоразъеме - порядка 1 В.
+
Напряжение на выходе из компьютера в видеоразъеме — порядка 1 В.
 +
 
 +
=== §1. Как видеоинформация попадает на экран ===
 +
 
 +
==== 1.0 Вывод картинки на экран ====
 +
[[Image:UkncResources 1 0.png|thumb|222px|Рисунок 1.0 Движение электронного луча по экрану]]
 +
 
 +
Вы, очевидно, знаете принцип передачи теле-изображения. Электронный луч под управлением сигналов строчной и кадровой разверток обегает весь экран построчно (рисунок 1.0).
 +
 
 +
То есть при движении от левого края к правому луч высвечивает на экране строку с переменной яркостью, а при обратном ходе он гасится и возвращается снова к левому краю экрана, сместившись немного вниз. Далее процесс повторяется до тех пор, пока луч не достигнет нижнего края экрана. Тогда он гасится и перебрасывается снова на начало экрана. Кадр нарисован.
 +
 
 +
То, что появилось на экране, назовем видеоизображением, или просто картинкой. Картинка перерисовывается на экране 50 раз в секунду. За время, равное 1/50 секунды, часто называемое ''тиком'', глаз не успевает забыть старое изображение, поэтому картинка не мерцает.
 +
 
 +
==== 1.1 Создание картинки ====
 +
 
 +
Будем постепенно продвигаться от конца к началу. Теперь вдоль видеошнура, через разъем «ВМ» влезем в компьютер и разберемся, как формируется видеоизображение.
 +
 
 +
Среди прочих устройств УКНЦ есть устройство, отвечающее за формирование картинки. Оно называется так: Устройство Управления ВидеоОЗУ (УВОЗУ). Помимо других функций, в задачи его входит считывание видеоинформации на экран.
 +
 
 +
Видеоинформацией мы будем называть данные, хранящиеся в особо отмеченной области оперативной памяти ЭВМ, а саму эту область — ВидеоОЗУ (ВОЗУ). Чтобы разобраться в строении ВОЗУ, давайте пройдемся по адресному пространству УКНЦ.
 +
 
 +
==== 1.2 Экскурсия в адресное пространство УКНЦ ====
 +
 
 +
Среди всех микро-ЭВМ, выпущенных в нашей стране, УКНЦ — самая нетривиальная. Ни в одном другом компьютере больше не встретишь такого оригинального решения — 2 ОЗУ + 2 процессора. Некоторыми вопросами, связанные с повышенной микропроцессорностью УКНЦ, мы займемся позже, а теперь же перейдем к структуре памяти.
 +
 
 +
===== Прямой доступ к памяти =====
 +
 
 +
Каждый процессор — центральный (ЦП) и периферийный (ПП) имеет свое ОЗУ. Коль скоро в машине применены процессоры КМ1801ВМ2, адресное пространство которых 64 Кб, то прямым доступом к памяти оба они берут лишь каждый свои 64 Кб.
 +
 
 +
Взгляните на рисунок 1.2. Здесь показаны карты памяти для обоих
 +
процессоров при прямом доступе.
 +
 
 +
<p align="center">[[Image:UkncResources 1 2.png|514px|Рисунок 1.2 Адресное пространство при прямом доступе]]<br/>'''Рисунок 1.2 Адресное пространство при прямом доступе'''</p>
 +
 
 +
Адресное пространство обоих процессоров может меняться. То есть будут меняться устройства, к которым могут они обращаться, а сам объем адресных пространств не изменится.
 +
 
 +
Устройства, «намертво» подключенные в адресное пространство, выделены (*) . К ним относятся:
 +
 
 +
в ЦП:
 +
: ОЗУ пользователя (56 Кб, адреса 0 ... 157777). Именно здесь располагаются все программы пользователя, будь то Бейсик, RT-11 или Ваши собственные (если Вы случайно не являетесь автором Бейсика или RT-11);
 +
в ПП:
 +
# ОЗУ ПП (32 Кб, адреса 0 ... 77777). Это ОЗУ используется для системных нужд. Для каких — Вы скоро узнаете. Интересно то, что около 22 Кб из этих 32 остаются свободными и также пригодны к использованию пользователем.
 +
# Системное ПЗУ (банки 2-4 в адресах 120000-176777). До него нам тоже пока нет дела. Всему свой черед.
 +
# Страница ввода-вывода ПП. Здесь выведены регистры внешних и внутренних устройств.
 +
 
 +
Сменные устройства:
 +
 
 +
ЦП:
 +
: В верхние адреса (160000 и выше), в зависимости от режима работы ЦП (а их два - HALT и USER) подставляются:
 +
* Системное ОЗУ ЦП — 8 Кб (режим HALT), где хранится программа-монитор, драйверы внешних устройств, доступных ЦП через страницу ввода-вывода, программа-эмулятор команд с плавающей точкой и программа тестирования.
 +
* Страница ввода-вывода ЦП (режим USER). Аналогично странице ввода-вывода ПП, сюда подставляются по фиксированным адресам регистры внешних и внутренних устройств.
 +
: Как можно менять эти режимы ЦП из ЦП же, сказано в главе ... .
 +
ПП:
 +
: ПП в своем адресном пространстве имеет так называемое «окно» с адресами 100000-117777, в которое может подключаться:
 +
# Первый банк СПЗУ;
 +
# Один из трех банков ПЗУ на внешней кассете N1;
 +
# Один из трех банков ПЗУ на внешней кассете N2;
 +
# Вообще ничего.
 +
: Всем этим управляет особый регистр в странице ввода-вывода ПП. Его адрес — 177054.
 +
 
 +
Как видим, каждый процессор глядит напрямую только в свое адресное пространство, а общий объем ОЗУ при прямом доступе составляет:
 +
:64 + 32 = 96 Кб.
 +
 
 +
<blockquote>
 +
===== Пример 1. Прогулка по адресному пространству. =====
 +
 
 +
Влезьте, пожалуйста, любым известным Вам способом в монитор ЦП. Уже виден значок <code>@</code> ? Итак, мы на месте. Место это — адресное пространство ЦП.
 +
 
 +
Набрав любое восьмеричное число от 0 до 157776, и, нажав стрелку вправо, Вы увидите содержимое ячеек памяти с набранными адресами, а проделав то же с адресом от 160000 — сможете полюбоваться на грозные надписи «Зависание». На них не стоит обращать внимание, ибо УКНЦ как угодно может оповестить о своем зависании, но только не так. Эта часть адресного пространства ЦП — страница ввода-вывода. Здесь можно отыскать ячейки, не вызывающие при открытии никакого возмущения со стороны машины. Скорее всего, это и есть те самые регистры устройств.
 +
 
 +
Проделаем такой опыт: запишем в ячейку 177566 число 7. Машина что-то невнятно прогудит. Это значит, что число 7 попало куда следует (а следует ему попасть в канал связи с ПП). ПП обработал наш код, ответив добродушным гудком.
 +
 
 +
Тем, кому наскучило играться в мониторе ЦП, предлагаю покопаться с монитором ПП. Влезаем в него так:
 +
* нажимаем <УСТ>, при этом должно появиться меню «Установка режимов». Если оно не появилось, проверьте, действительно ли ЭВМ перед Вами — это УКНЦ;
 +
* нажмите <УПР>+@ или <ГРАФ>+<ИСП>.
 +
 +
Теперь мы находимся в «царстве теней» — мониторе ПП. Экран здесь не такой просторный, как в мониторе ЦП. Поэтому совет страдающим клаустрофобией — не задерживайтесь здесь подолгу! Из этого отладчика можно и не выбраться.  Иногда случается находить в ОЗУ ПП останки тех, кто так и не смог выйти из лабиринтов монитора ПП. Именно их духи, мне кажется, время от времени и подвешивают машины. Но я отвлекся.
 +
 
 +
Правила игры с монитором ПП те же — можно с полным правом копаться в содержимом любых ячеек от 0 до 77776 (ОЗУ ПП) и любоваться на ячейки от 100000 до 176776 (ПЗУ). Также можно заглянуть и в страницу ввода-вывода ПП. ЭВМ же, в свою очередь, оставляет за собой право подвиснуть в любое удобное ей время.
 +
 
 +
Если вы устали, выйдите:
 +
* <УПР>+C,
 +
а дальше, через меню «Установки», куда пожелаете.
 +
 
 +
Оставшимся предлагаю заглянуть туда, где доселе редко ступала нога человека — в СОЗУ ЦП. Для этого прибегнем к черной магии: наберем в ОЗУ ПП 2 масенькие программки:
 +
<pre>
 +
40000: 012704 MOV  #450, R4
 +
000450
 +
004737 CALL @#162164
 +
162164</pre>
 +
<pre>
 +
40020: 012704 MOV  #450, R4
 +
000450
 +
004737 CALL @#162204
 +
162204</pre>
 +
С помощью первой мы включим режим просмотра ОЗУ ЦП из монитора ПП. Смело жмем 40000 <ИСП>. Вверху появляются новые две буквы: ЦМ. Что они означают, не знаю, но вот что изменилось — можно посмотреть. Теперь перед нами до боли знакомое ОЗУ ЦП пользователя (в адресах от 0 до 157776) и совсем незнакомое СОЗУ ЦП (от 160000 и выше). Лазать в ОЗУ ЦП можно по-всякому — и записывать в ячейки, и считывать. Но вот запускать программы в ЦП из монитора ПП невозможно — даже черная магия здесь бессильна.
 +
 
 +
Прежде чем выбраться из этого заколдованного места, подправим кое-что в СОЗУ ЦП:
 +
* в ячейку 163416 вместо 000021 запишем 012500,
 +
* в ячейку 163450 вместо 000031 — 010045.
 +
 
 +
Теперь со всех ног бежим в монитор ЦП: <УПР>+C, <ENTER>. Наше последнее хитрое действо дало свои результаты — теперь из монитора ЦП можно без проблем «промониторить» все ОЗУ ЦП — пользователя и системное. Это адресное пространство ЦП в режиме «HALT».
 +
 
 +
Если Вы все же соскучились по монитору ПП и по ОЗУ ПП, вернитесь в монитор ПП, и запустите вторую программку, что с адреса 40020. Ничего страшного в том, что Вы не увидите эту записанную ранее программку - ведь монитор ПП покажет эти адреса в ОЗУ ЦП. Наберите 40020, крепко зажмурьтесь, и нажмите <ИСП>. Если, открыв глаза, в верхней строке Вы обнаружите слово "ПМ", значит, эксперимент удался.
 +
 
 +
Человек быстро привыкает ко всему хорошему. Поэтому вот инструкция к тому, чтобы восстановить обычную точку зрения монитора ЦП (работаем в мониторе ЦП):
 +
* в ячейку 163416 обратно запишем 21,
 +
* в ячейку 163450 — 31.
 +
 
 +
Ну что ж, теперь мы полностью восстановили первоначальный вариант: монитор ЦП видит ОЗУ пользователя + страницу ввода-вывода, а монитор ПП — свое суверенное адресное пространство. С возвращением!
 +
</blockquote>
 +
 
 +
===== Регистровый доступ к ОЗУ =====
 +
<p align="right">— Есть ли у вас план, мистер Фикс?<br/>— План, план… Да у меня целых три плана!<br/>''Ж.Верн «80 дней вокруг света»</p>
 +
 
 +
96 Кб — вроде не так уж и мало для микро-ЭВМ. Но экран — вещь, которая требует под себя значительную часть памяти машины. Поэтому в УКНЦ наряду с прямым применяется регистровый доступ к памяти.
 +
 
 +
В страницах ввода-вывода обоих процессоров есть регистры, с помощью которых можно заглянуть туда, куда с прямым доступом нам путь заказан. Делается это так.
 +
 
 +
В регистр адреса (РА), который доступен нам как ячейка в странице ввода-вывода, пишется, как Вы уже догадались, адрес. Моментально в другой регистр — данных (РД) аппаратно считывается содержимое ОЗУ, соответствующее записанному адрес. Если теперь записать в РД число, то оно аппаратно же запишется по соответствующему адресу в память. У каждой страницы ввода-вывода эти регистры свои, и каждый процессор может записывать и считывать информацию с помощью своих регистров.
 +
 
 +
Таким способом мы можем достать, помимо обычного ОЗУ, еще и дополнительное, которое выходит за пределы адресного пространства процессоров при прямом доступе. Такое дополнительное, или верхнее ОЗУ называется планами ОЗУ.
 +
 
 +
На рис. 1.3 показано адресное пространство при регистровом доступе. Планов всего 3. В каждом содержится по 32 Кб. Их адреса в РА — 100000 и выше. При РА, меньшем 100000, идет доступ к обычным ОЗУ.
 +
 
 +
<p align="center">[[Image:UkncResources 1 3.png|344px|Рисунок 1.3 Адресное пространство при регистровом доступе]]<br/>'''Рисунок 1.3 Адресное пространство при регистровом доступе'''</p>
 +
 
 +
В таблице 1.1 приведены адреса РА и РД для каждого процессора. Центральному процессору доступны через РА и РД планы 1 и 2, а также свое собственное ОЗУ. Периферийному процессору доступно все ОЗУ в машине. То есть через РД ПП может читать и записывать сразу 3 байта. Совокупность этих трех байтов в разных планах назовем Т-словом.
 +
 
 +
'''Таблица 1.1'''
 +
{| border="1" cellpadding="5" cellspacing="0" align="center"
 +
|rowspan="2"|  ||rowspan="2" align="center"| '''Регистр<br/>адреса'''
 +
|colspan="3" align="center"| '''Регистры данных'''
 +
|-
 +
|align="center"| План 0 ||align="center"| План 1 ||align="center"| План 2
 +
|-
 +
| '''ЦП''' || 177640 || —      || 176642 (мл) || 176642 (ст)
 +
|-
 +
| '''ПП''' || 177010 || 177012 || 177014 (мл) || 177014 (ст)
 +
|}
 +
 
 +
<blockquote>
 +
 
 +
===== Пример 2. Пример работы с регистрами РА и РД в ЦП. =====
 +
 
 +
В прошлом примере для того, чтобы поменять кое-что в СОЗУ ЦП, нам приходилось залезать в монитор ПП. «Подглядывание» за ОЗУ ЦП оттуда осуществлялось, конечно же, с помощью регистрового доступа: ПП через регистры доступно все ОЗУ в машине. Теперь попробуем воспользоваться тем же механизмом, но в ЦП, причем более осознанно.
 +
 
 +
Предлагаю совершить такую нехитрую манипуляцию (в мониторе ЦП):
 +
<pre>
 +
(176640)=71607 Записываем с помощью РА и РД по адресам
 +
(176642)=12500 163416 и 163450 некоторые числа. Адреса пишем
 +
(176640)=71624 в  РА несколько обделенными на 2.
 +
(176642)=10045</pre>
 +
После этой кропотливой работы можете убедиться, что перед Вами — ОЗУ ЦП в режиме HALT, и никаких регистров по адресам 176640 и 176642 уже не наблюдается. А так как их нет, то и говорить больше не о чем.
 +
В заключение совершенно бесполезный и не относящийся к делу совет — запишите в ячейку 163731 число 77000 (вместо 71400), а в 163735 — 20077. Приятного Вам времяпрепровождения с клавишами ИСП и СТОП в мониторе ЦП!
 +
</blockquote>
 +
 
 +
Теперь вернемся к видеоинформации. Видеоинформация — это не что иное, как данные, хранящиеся в планах ОЗУ и считываемые построчно на экран. В принципе, три плана можно называть и ВидеоОЗУ.
 +
 
 +
<blockquote>
 +
===== Пример 3. Сохранение части экрана =====
 +
 
 +
Используя регистровый доступ к ВОЗУ из ПП, сделаем две подпрограммки. Первая будет сохранять содержимое рабочего экрана в области ВОЗУ, которая  обычно используется под меню «Установка» и под монитор ПП, т.е. в служебный экран. Вторая будет восстанавливать содержимое рабочего экрана.
 +
 
 +
Подпрограмма сохранения:
 +
<pre>
 +
60000: 012702 MOV #100000,R2
 +
100000
 +
012703 MOV #154540,R3
 +
154540
 +
M1: 005004 CLR R4
 +
M2:  * 010237 MOV R2, @#177010
 +
177010
 +
013700 MOV @#177012,R0
 +
177012
 +
013701 MOV @#177014,R1
 +
177014
 +
    * 010337 MOV R3, @#177010
 +
177010
 +
010037 MOV R0, @#177012
 +
177012
 +
010137 MOV R1, @#177014
 +
177014
 +
005204 INC R4
 +
005202 INC R2
 +
005203 INC R3
 +
022704 CMP #50, R4
 +
000050
 +
001356 BNE M2
 +
062702 ADD #50, R2
 +
000050
 +
022703 CMP #157700,R3
 +
175700
 +
100350 BPL M1
 +
000207 RETURN</pre>
 +
Подпрограмма восстановления отличается лишь двумя словами (они отмечены звездочкой). Поэтому легче написать простенькую программу копирования, чем заново набивать нашу тяжеловесную подпрограмму.
 +
 
 +
Программа копирования:
 +
<pre>
 +
40040: 012702 MOV #60000, R2
 +
060000
 +
012703 MOV #60100, R3
 +
060100
 +
012701 MOV #37, R1
 +
000037
 +
M: 012223 MOV (R2)+, (R3)+
 +
077103 SOB M, R1</pre>
 +
Итак, Вы набиваете п/п, набиваете программу копирования, запускаете  ее с начального адреса (40040). После этого в ОЗУ ПП появится копия подпрограммы, но  уже с адреса 60100. В ней Вы меняете местами содержимое двух помеченных слов.
 +
 
 +
А для вызова этих подпрограмм используем местную хитрость — эти подпрограммы сделаем спецфункциями:
 +
<pre>
 +
13144: 60000
 +
13146: 60100</pre>
 +
Теперь при посылке в терминал (то есть на экран) кода <001> (соответствует комбинации клавиш  <УПР>+A) будет выполняться сохранение, а при посылке кода <002> (<УПР>+B) — восстановление левой верхней четверти рабочего экрана.
 +
</blockquote>
 +
 
 +
Как происходит считывание видеоинформации на экран?
 +
 
 +
Экран УКНЦ состоит из 288 видео-строк. Каждой строке ставится в соответствие адрес в ВОЗУ, с которого последовательно считывается содержимое трех планов так, что одной точке на экране соответствуют три бита в трех различных планах по одному адресу. Цвет каждой из точек строки (для цветных экранов), либо градация яркости (для черно-белых) зависит от содержимого смежных битов в ВОЗУ.
 +
 
 +
==== 1.3 Таблица строк ====
 +
 
 +
Эти соответствия — номера строки начальному адресу в ВОЗУ, цвета точек содержимому ВОЗУ и кое-что другое указываются в специальной таблице в ОЗУ ПП, называемой ТАБЛИЦЕЙ СТРОК. Она строится следующим образом.
 +
 
 +
Две ячейки с фиксированными адресами в ОЗУ ПП — 270 и 272 являются первым элементом таблиц строк. Вообще количество элементов в таблице должно бы равняться 288 (количеству строк). Но УВОЗУ сделано так, что первые 20 элементов в таблице строк не указывают на строки, и считывание информации на экран начинается с 21-го.
 +
 
 +
Элемент таблицы строк всегда содержит указатель на адрес в ВОЗУ, с которого начинается вывод на экран в данной строке. Этот адрес находится в предпоследнем слове элемента (а слово — это 2 байта). Адрес здесь задается так же, как при регистровом доступе. То есть адреса, начиная со 100000, указывают на планы памяти, а меньше 100000 — на ОЗУ ЦП + ОЗУ ПП.
 +
 
 +
Последнее слово элемента содержит адрес следующего элемента таблицы строк, а также некоторую информацию о нем.
 +
 
 +
Формат последнего слова элемента:
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px;" |
 +
| style="width:15px; text-align:right;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| colspan="13" style="text-align:center; background-color:#DDDDDD;" | Адрес следующего элемента
 +
| colspan="1" style="text-align:center; background-color:#DDDDDD;" | у
 +
| colspan="1" style="text-align:center; background-color:#DDDDDD;" | р
 +
| colspan="1" style="text-align:center; background-color:#DDDDDD;" | к
 +
|}
 +
* 0 разряд отвечает за состояние аппаратного курсора (им мы займемся чуть позже).
 +
* 1 разряд определяет размер следующего элемента:
 +
** 1 — 4 слова.
 +
** 0 — 2 слова.
 +
 
 +
Элементы в таблице строк могут быть либо четырехсловными, либо двухсловными. Первый элемент (270 и 272) всегда двухсловный. Двухсловный элемент состоит из адреса в ВОЗУ (1-е слово) и указателя на следующий элемент (2-е слово).
 +
 
 +
Четырехсловный элемент в первых своих двух словах несет дополнительную информацию, 3-е и 4-е слова имеют то же назначение, что и в двухсловном элементе. Как УВОЗУ будет интерпретировать первые два слова, зависит от содержимого 2-го разряда последнего слова предыдущего элемента:
 +
 
 +
* 2 разряд:
 +
*# если следующий элемент двухсловный (1-й разряд равен 0), то этот разряд интерпретируется просто как 2-й разряд адреса следующего элемента
 +
*# если следующий элемент все-таки четырехсловный (1-й разряд равен 1), то возможны два варианта:
 +
*#* 0 — из первых двух слов следующего элемента загружается регистр управления отображением (УО);
 +
*#* 1 — из них загружается регистр управления цветом (УЦ).
 +
* 3-15 разряды определяют адрес следующего элемента в таблице строк.
 +
 
 +
<blockquote>
 +
===== Пример 4. С ног на голову и наоборот =====
 +
Ради развлечения и только ради него был задуман этот пример. Наберите в ОЗУ ПП такой фрагмент:
 +
<pre>
 +
40100: 012700 MOV #2500, R0
 +
002500
 +
A: 162710 SUB #54420, (R0)
 +
054420
 +
005410 NEG (R0)
 +
062700 ADD #4, R0
 +
000004
 +
020027 CMP R0, #4666
 +
004666
 +
100770 BMI A
 +
000207 RETURN
 +
 +
13152: 040100</pre>
 +
Теперь при приеме терминалом кода <004> (<УПР>+D) рабочий экран перевернется вверх тормашками. Отменяется это безобразие все тем же кодом <004>.
 +
</blockquote>
 +
 
 +
Регистры УО и УЦ не имеют фиксированного адреса. Они могут загружаться из таблицы строк произвольное количество раз.
 +
 
 +
===== Регистр управления цветом =====
 +
 
 +
Этот регистр имеет очень важное значение. Он ставит в соответствие триаде в планах ВОЗУ (комбинации из трех бит) цвет выводимых точек, то есть является тем самым мостиком между видеоинформацией и картинкой. Младший бит в триаде соответствует содержимому плана 0, старший — плана 2.
 +
 
 +
Регистр управления цветом состоит из двух слов. В первом слове определяются цвета тех точек, которым соответствуют коды от 0 до 3 в планах ВОЗУ. Второе слово  определяет цвета триад с содержимым от 4 до 7.
 +
 
 +
Формат первого слова регистра УЦ:
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
|-
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 011
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 010
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 001
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 000
 +
|}
 +
 
 +
Формат второго слова регистра УЦ:
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
| style="text-align:center; background-color:#DDDDDD;" | Y
 +
| style="text-align:center; background-color:#FFDDDD;" | R
 +
| style="text-align:center; background-color:#DDFFDD;" | G
 +
| style="text-align:center; background-color:#DDDDFF;" | B
 +
|-
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 111
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 110
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 101
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 100
 +
|}
 +
 
 +
Нетрудно заметить, что каждому возможному коду в ВОЗУ (а их всего 8) соответствует комбинация из 4 бит. Три из них (R, G, B) отвечают за составляющие цвета в цветных мониторах, а черно-белых — за градацию яркости: 1 — составляющая есть, 0 — составляющей нет. Но есть и четвертый — Y. Этот управляет яркостью сразу всех цветов: 1 — 100% яркости, 0 — 50%. Хотя на протяжении одной видеостроки может быть одновременно максимум 8 цветов, в разных строках на экране их может быть 16.
 +
 
 +
Для черно-белых экранов сигнал Y не влияет на яркость изображения. Для них этот четвертый бит не имеет никакого значения.
 +
 
 +
<blockquote>
 +
===== Пример 5. Негатив служебного экрана =====
 +
 
 +
Чтобы не перенапрячься в изучении регистров УО и УЦ, приведу такой пример. В мониторе ПП обновим 2 ячейки в ТС:
 +
4700: 042547
 +
4702: 000443
 +
 
 +
Делать это следует невзирая на все безобразия, которые будут проистекать на экране. Для пущей красочности выйдите в меню «Установка»: <УПР>+C, и полюбуйтесь на результат.
 +
 
 +
Числа в словах для УЦ служебного экрана подобраны так, чтобы поменять местами триады — они теперь расположены в обратной последовательности, отсюда и инверсия экрана.
 +
 
 +
Для того, чтобы восстановить прежнее положение, запишите в эти ячейки старые значения:
 +
4700: 135230
 +
4702: 177334,
 +
или просто сбросьте машину.
 +
</blockquote>
 +
<blockquote>
 +
===== Пример 6. Пылающий экран =====
 +
 
 +
Набейте в мониторе ПП такую программку:
 +
<pre>
 +
40200: 005237 INC @#4700
 +
006750
 +
005237 INC @#4702
 +
006752
 +
012737 MOV #1, @#7130
 +
000001
 +
007130
 +
000207 RETURN</pre>
 +
В ячейку (7132) запишите адрес этой подпрограммки — 40200, а в ячейку (7130) — единичку. То, что происходит теперь с цветами служебного экрана, — это следствие того, что УЦ1 и УЦ2 соответствующего участка таблицы строк увеличиваются на 1 с частотой 50 Гц.
 +
</blockquote>
 +
 
 +
===== Регистр управления отображением и аппаратный курсор =====
 +
 
 +
Этот регистр также состоит из двух слов.
 +
 
 +
'''1-е слово''' управляет видом курсора, его горизонтальной позицией на экране, а также цветом.
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| colspan="1" style="text-align:center; background-color:#EEEEEE;" |
 +
| colspan="7" style="text-align:center; background-color:#DDDDDD;" | Позиция курсора
 +
| colspan="3" style="text-align:center; background-color:#DDDDDD;" | Поз.гр.к
 +
| colspan="1" style="text-align:center; background-color:#DDDDDD;" | тк
 +
| colspan="1" style="text-align:center; background-color:#DDDDDD;" | Y
 +
| colspan="1" style="text-align:center; background-color:#FFDDDD;" | R
 +
| colspan="1" style="text-align:center; background-color:#DDFFDD;" | G
 +
| colspan="1" style="text-align:center; background-color:#DDDDFF;" | B
 +
|}
 +
* 0-3 разряды — яркость и цвет курсора:
 +
:: 1 — есть составляющая,
 +
:: 0 — нет составляющей.
 +
* 4 разряд — тип курсора:
 +
:: 1 — графический курсор,
 +
:: 0 — символьный.
 +
* 5-7 разряды — позиция графического курсора в октете.
 +
* 8-14 разряды — позиция курсора (октета) на экране.
 +
* 15 разряд — не используется.
 +
 
 +
Курсор на экране формируется следующим образом. Включенный символьный курсор накладывается поверх изображения строки. Он занимает 8 подряд высвеченных точек, то есть один октет. Его позиция определяется 8-14 разрядами первого слова регистра УО. Минимальная позиция — 0, максимальная — 79. Графический курсор отличается от символьного тем, что из восьми точек октета лишь одна остается включенной. Ее положении в октете определяют 5-7 разряды. Цвет включенного курсора зависит от 0-3 разрядов.
 +
 
 +
: ''О включении/выключении курсора.''
 +
: В последнем слове каждого элемента таблицы строк есть разряд, который отвечает за изменение состояние курсора.
 +
: Это нулевой разряд. Если он установлен, курсор изменяет свое состояние. То есть если в предыдущих строках курсор был включен (зажжен), то начиная с этой строки он выключится, и наоборот. Изначально (по умолчанию) курсор выключен.
 +
: Найдя установленным этот бит, УВОЗУ изменяет состояние курсора и оставляет его таким в последовательных строках до следующего установленного нулевого бита последнего элемента, либо до конца строк.
 +
: Мигание курсора делается программно.
 +
 
 +
Не забудем и про '''2-е слово''' регистра УО. Оно отвечает за масштабирование изображения по горизонтали, а также за яркость R,G,B сигналов в текущей видеостроке.
 +
 
 +
Его формат:
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;&quot; | 0
 +
|-
 +
| colspan="10" style="text-align:center; background-color:#EEEEEE;" |
 +
| colspan="2" style="text-align:center; background-color:#DDDDDD;" | масш
 +
| colspan="1" style="text-align:center; background-color:#EEEEEE;" |
 +
| colspan="1" style="text-align:center; background-color:#FFDDDD;" | яR
 +
| colspan="1" style="text-align:center; background-color:#DDFFDD;" | яG
 +
| colspan="1" style="text-align:center; background-color:#DDDDFF;" | яB
 +
|}
 +
* 0-2 разряды — управляют яркостью R,G,B сигналов соответственно. Это управление распространяется лишь на текущую строку:
 +
:: 1 — 100%,
 +
:: 0 — 50%.
 +
* 3 разряд — не используется.
 +
* 4, 5 разряды управляют количеством выводимых на экран точек, то есть масштабированием (таблица 1.2).
 +
 
 +
'''Таблица 1.2'''<br/>
 +
{| border="1" cellpadding="5" cellspacing="0" align="center"
 +
|colspan="2" align="center"| '''Содержимое<br/>разрядов'''
 +
|rowspan="2" align="center"| '''Кол-во точек<br/>в строке'''
 +
|rowspan="2" align="center"| '''Кол-во<br/>октетов<br/>в строке'''
 +
|-
 +
|align="center"| '''4''' ||align="center"| '''5'''
 +
|-
 +
|align="center"| 0 ||align="center"| 0 ||align="center"| 640 ||align="center"| 80
 +
|-
 +
|align="center"| 0 ||align="center"| 1 ||align="center"| 320 ||align="center"| 40
 +
|-
 +
|align="center"| 1 ||align="center"| 0 ||align="center"| 160 ||align="center"| 20
 +
|-
 +
|align="center"| 1 ||align="center"| 1 ||align="center"| 80  ||align="center"| 10
 +
|}
 +
 
 +
В УКНЦ 4 формата экрана. В режиме максимального количества точек в строке на экран отображается видеоинформация из 80 последовательных Т-слов, адрес первого указывается в таблице строк для каждой строки. Режим наименьшего количества точек в строке позволяет выводить 80 точек, то есть всего 10 Т-слов в строке. Общий размер картинки при этом не меняется. Видеоизображение занимает всегда весь экран.
 +
 
 +
Таблица строк позволяет для каждой строки установить свой формат. По умолчанию установлен формат 640 точек в строке. Загрузкой регистра УО можно изменить формат, тогда в последующих строках также установится новый режим, и так до строки, где вновь загрузится регистр УО (либо до конца таблицы строк).
 +
 
 +
<blockquote>
 +
 
 +
===== Пример 7. Апофеоз таблицы строк. =====
 +
Этот пример следует выполнять лишь в том случае, если дальше Вы не собираетесь использовать УК с какой-либо важной целью, ибо выход из него — только системный сброс.
 +
 
 +
Войдите в монитор ПП, а в нем — в режим терминала (нажав D). А теперь нажмите комбинацию <УПР>+V и держите ее под треск пьезодинамика, пока не надоест.
 +
 
 +
То, что Вы увидите на экране, послужит, пожалуй, лучшей иллюстрацией к описанию УО и УЦ, да и всему устройству таблицы строк. Команда <УПР>+V — это комнда прокрутки рулона. Но, поскольку рулон для служебного экрана не предусмотрен, с таблицей строк происходят такие вот забавные превращения, что и отражается на экране.
 +
</blockquote>
 +
 
 +
==== Резюме к §1 ====
 +
* Изображение на экране УКНЦ состоит из 288 видеострок.
 +
* Видеоинформация на экран построчно считывается Устройством Управления ВидеоОЗУ (УВОЗУ) из видеопамяти.
 +
* Адресное пространство может быть доступно либо прямым доступом процессоров, либо регистровым доступом.
 +
* Через РА и РД (регистры адреса и данных) доступно 192 Кб ОЗУ. Одному адресу соответствует Т-слово: 3 байта из трех смежных областей, называемых планами. ЦП доступны планы 1 и 2, ПП — 0, 1 и 2, т.е. все ОЗУ в УКНЦ.
 +
* Одному Т-слову соответствуют восемь выведенных подряд точек на экране.
 +
* Адреса в РА с 100000 указывают на особую область памяти, прямым доступом не видимую. Объем ее - 96 Кб, по 32 в каждом плане, и используется она в качестве ВОЗУ. Адреса меньше 100000 — это ОЗУ ЦП +ОЗУ ПП.
 +
* Таблица строк — список в ОЗУ ПП, необходимый УВОЗУ для формирования видеоизображения. Начинается с пары ячеек с адресами 270 и 272.
 +
* Таблица строк состоит из отдельных элементов. Каждый элемент, начиная с 21-го, соответствует видеостроке на экране. 21-й элемент соответствует самой верхней строке. Элементы могут быть двухсловными и четырехсловными. Первый элемент (270 и 272) всегда двухсловный.
 +
* Формат двухсловного элемента:
 +
** 1-е слово — адрес в ВОЗУ, с которого начинается вывод видеоинформации в текущую строку.
 +
** 2-е слово — адрес следующего элемента в таблице строк. В трех младших битах слова содержится информация о типе следующего элемента, о переключении курсора в данной строке, а также определяется, какой регистр УВОЗУ загрузится из следующего элемента, если он — четырехсловный.
 +
* Формат четырехсловного элемента:
 +
** 1-е, 2-е слова — интерпретируются УВОЗУ либо как регистр управления отображением, либо как регистр управления цветом.
 +
** 3-е слово — адрес в ВОЗУ.
 +
** 4-е слово — адрес следующего элемента.
 +
* Регистры управления цветом (УЦ) и отображением (УО) состоят из двух 16-битных слов каждый и входят в состав УВОЗУ. Загружаются они лишь из таблицы строк, только из четырехсловных элементов.
 +
* Регистр УЦ определяет соответствие цвета точки содержимому трех битов в планах ВОЗУ. В данной строке может быть одновременно 8 цветов.
 +
* Регистр УО управляет: цветом, типом, горизонтальной позицией аппаратного курсора.
 +
** масштабированием изображения по горизонтали.
 +
** яркостью составляющих R,G,B в текущей строке.
  
=== §1. Как видеоинформация попадает на экран. ===
 
'''''TODO'''''
 
 
=== §2. Формирование видеоизображения. Использование аппаратных возможностей. ===
 
=== §2. Формирование видеоизображения. Использование аппаратных возможностей. ===
'''''TODO'''''
+
 
 +
Каким образом видеоинформация попадает на экран, мы разобрались. Теперь рассмотрим способы формирования информации в ВОЗУ.
 +
 
 +
Самый, пожалуй, простой способ — это записывать в ВОЗУ видеоинформацию через РА и РД. Однако это не самый эффективный путь работы с экраном на УКНЦ. Один из способов повышения эффективности:
 +
 
 +
==== 2.0 Размещение видеоинформации в нижней области ОЗУ ====
 +
 
 +
Можно настроить таблицу строк таким образом, чтобы она указывала на адреса меньше 100000, т.е. на ОЗУ ЦП и ПП. Тогда менять информацию ВОЗУ можно прямым доступом, а это значительно быстрее.
 +
 
 +
Однако появляется и проблема. Дело в том, что планы раскиданы по разным ОЗУ, и план 0 теперь смотрится только из ПП.
 +
 
 +
Выходом из такой ситуации может быть использование не всех планов сразу, т.е. работа только с планами 1 и 2 из ЦП, ибо он несколько быстрее ПП. Но при этом сократится многоцветность выводимой информации. Во многих случаях это не страшно, например, при выводе текста.
 +
 
 +
Еще можно координировать работу процессоров таким образом, чтобы они писали одновременно в свое ОЗУ свои порции информации. Этот способ, несомненно, интересен, и, быть может, даже красив. Однако сложен.
 +
 
 +
Но есть в УКНЦ другие возможности, позволяющие повышать эффективность программ за счет перекладывания некоторых забот с плеч программиста на плечи аппаратной части.
 +
 
 +
==== 2.1 Аппаратный спрайтовый механизм ====
 +
 
 +
Эти возможности предоставляет опять-таки УВОЗУ. В его состав входят еще несколько регистров, доступных через страницу ввода-вывода ПП:
 +
 
 +
* Регистр октета точек (177024).
 +
* Регистр кода цвета фона (177020, 177022).
 +
* Регистр кода цвета точки (177016).
 +
* Регист¬р маски записи в планы (177026).
 +
 
 +
Первые три регистра удобно рассматривать вместе, так как используются они также вместе.
 +
 
 +
Давайте представим себе изображение на экране как «картинку» определенного цвета, накладываемую на «фон». Это может быть символ (в виде буквы, например) либо какое-нибудь определенное изображение.
 +
 
 +
Такое представление удобно, если требуется перемещать объект по экрану, например, в динамической игре. Очень часто нужно, чтобы этот объект, называемый спрайтом, не затирал старое изображение, а двигался «поверх» него.
 +
 
 +
Чтобы реализовать эту задачу, нужно выполнить последовательность действий:
 +
 
 +
# Сохранить старое изображение (фон).
 +
# Вывести на экран спрайт таким образом, чтобы изменился цвет только тех точек, где спрайт «присутствует».
 +
# Некоторое время «продержать» эту картинку на экране.
 +
# Воспроизвести старое изображение, затерев спрайт.
 +
 
 +
Самая трудоемкая задача — в пункте 2. Чтобы ее решить программно, нужно совершить целый ряд побитных логических операций с фоном и спрайтом.
 +
 
 +
Эта операция реализуется в УКНЦ аппаратно. Пусть наш спрайт по габаритам умещается в 8 последовательных точек (по горизонтали).
 +
 
 +
'''Регистр октета точек''' представляет собой «макет» спрайта в некотором сечении.
 +
 
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
|}
 +
 
 +
Логической единице в байте соответствует цвет спрайта, а 0 — цвет фона.
 +
 
 +
Цвет спрайта, или точки (наш спрайт пока одноцветный), определяет '''регистр кода цвета точки''' (177016). Его формат:
 +
 
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| colspan="5" style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
|}
 +
* 0 разряд — информация плана 0.
 +
* 1 разряд — информация плана 1.
 +
* 2 разряд — информация плана 2.
 +
 
 +
Фон может быть многоцветным, поэтому '''регистр кода цвета фона''' отражает содержимое полного Т-слова в видеопамяти. Этот регистр двухсловный:
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
|-
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 4
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 3
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 2
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 1
 +
|}
 +
 
 +
{|
 +
| style="width:15px; text-align:center;" | 15
 +
| style="width:15px; text-align:center;" | 14
 +
| style="width:15px; text-align:center;" | 13
 +
| style="width:15px; text-align:center;" | 12
 +
| style="width:15px; text-align:center;" | 11
 +
| style="width:15px; text-align:center;" | 10
 +
| style="width:15px; text-align:center;" | 9
 +
| style="width:15px; text-align:center;" | 8
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
| Содержимое трех планов ВОЗУ для каждой точки
 +
|-
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 8
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 7
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 6
 +
| colspan="4" style="text-align:center; background-color:#DDDDDD;" | 5
 +
| Порядковые номера точек в октете
 +
|}
 +
 
 +
Эти три регистра могут участвовать в следующих процессах (или фазах):
 +
* Чтение.
 +
Вызов:
 +
: Чтение регистра октета точек, например: <code>TST @#177024</code>.
 +
Действие:
 +
: Регистр кода цвета фона загружается из ВОЗУ содержимым трех планов в формате, представленном выше, то есть каждой точке соответствует триада битов. Теперь его можно запомнить в две ячейки ОЗУ либо в два регистра. Это фон, т.е. старое изображение. В этом процессе из регистра октета точек считывается 0, т.к. он доступен лишь по записи. Перед этой фазой надо предварительно загрузить РА требуемым адресом.
 +
 
 +
* Модификация и запись.
 +
Вызов:
 +
: Запись в регистр октета точек байта, соответствующего выбранному сечению спрайта, например: <code>MOVB (R1)+?, @#177024</code>.
 +
Действие:<br/>
 +
а) Модификация.
 +
: В те триады в регистре кода цвета фона, которым соответствует установленные разряды регистра октета точек, аппаратно записывается значение регистра кода цвета точки. Остальные триады не меняются.
 +
б) Запись.
 +
: Проводится загрузка планов ВОЗУ модифицированным значением регистра кода цвета фона.
 +
: То есть после этого процесса в октете спрайт наложится поверх фона, перекрашивая лишь те точки, где он «присутствует».
 +
 
 +
Чтобы вывести весь спрайт целиком, нужно повторить несколько раз эти процессы, каждый раз запоминая регистр кода цвета фона после фазы «чтение», и менять содержимое РА и регистра октета точек.
 +
 
 +
Если спрайт многоцветный, то надо последовательно проводить фазу «модификация-запись», предварительно загружая новые значения в регистр кода цвета точки. Запоминать же фон из регистра кода цвета фона надо лишь один раз — в начале для каждого октета.
 +
 
 +
==== 2.2 Регистр маски записи в планы ====
 +
 
 +
Этот регистр позволяет запретить запись в каждый план памяти. Адрес — 177026. Его формат:
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| colspan="5" style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | 2
 +
| style="text-align:center; background-color:#DDDDDD;" | 1
 +
| style="text-align:center; background-color:#DDDDDD;" | 0
 +
|}
 +
* 0 разряд: 1 — запрещена запись в план 0.
 +
* 1 разряд: 1 — запрещена запись в план 1.
 +
* 2 разряд: 1 — запрещена запись в план 2.
 +
 
 +
При запрещении записи в соответствующие планы чтение происходит как обычно, но вот записать в план информацию с помощью регистрового доступа уже невозможно. Где и как это излишество можно использовать, рассказано в Главе 6.
 +
 
 +
<blockquote>
 +
===== Пример 8. Мираж на экране =====
 +
 +
Посмотрите на экран. Если он пуст, включите машину. Делайте с ней все что угодно, лишь бы на экране было побольше всего изображено (хотя вполне хватит и надписи «Загрузка из сети»). Теперь войдите в монитор ПП, найдите там ячейку 177026. Запишите в нее любое число от 1 до 6 (рекомендую значение 2).
 +
 
 +
Выйдите из монитора ПП и продолжайте работать, но так, чтобы изображение поменялось. Например, выполните очистку экрана. На экране останется изображение (правда, не такое яркое, как было), которое остается теперь под защитой регистра маски. Чтобы убрать эти привидения, обнулите этот регистр: (177026)=0, и очистите экран.
 +
</blockquote>
 +
 
 +
==== Резюме к §2 ====
 +
 
 +
* Чтобы ускорить работу видеоинформацией (УКНЦ — далеко не самая быстрая ЭВМ), можно в качестве ВОЗУ использовать ОЗУ ЦП + ОЗУ ПП, указывая в таблице строк адреса меньше 100000.
 +
* Повысить эффективность программ, работающих с динамической видеоинформацией, позволяет аппаратный спрайтовый механизм.
 +
* Спрайтом называется картинка, которую нужно накладывать на фон и перемещать таким образом, чтобы она не затирала фон и двигалась как бы поверх него.
 +
* Спрайтовый механизм представлен тремя регистрами:
 +
** октета точек (РО), (177024)
 +
** кода цвета точки (РТ), (177016)
 +
** кода цвета фона (РФ), (177020) и (177022)
 +
* Регистр октета точек можно представить как срез спрайта в некотором горизонтальном сечении. Он состоит из 8 бит. Каждый бит соответствует точке в сечении. Установленный бит указывает, что точка принадлежит спрайту, а сброшенный — фону.
 +
* Регистр кода цвета точки состоит из трех бит, каждый из которых соответствует своему плану ВОЗУ. РТ определяет, какой код будет записываться в ВОЗУ в точках, соответствующих установленным битам РО. Иными словами, в РТ указан цвет спрайта.
 +
* Регистр кода цвета фона содержит 8 триад, каждая из которых содержит код в трех планах ВОЗУ в восьми точках.
 +
* При чтении РО из него всегда считывается 0. При этом РФ аппаратно загружается содержимым Т-слова из ВОЗУ по текущему адресу.
 +
* При записи в РО байта РФ аппаратно изменяется в тех триадах, которым соответствуют установленные биты в РО. Эти триады заменяются содержимым РТ. Затем модифицированное содержимое РФ аппаратно же заносится в ВОЗУ по текущему адресу.
 +
 
 
=== §3. Каналы связи между процессорами. ===
 
=== §3. Каналы связи между процессорами. ===
 +
 +
==== 3.0 Принцип разделения труда между процессорами ====
 +
<p align="right">За одним зайцем погонишься — двух уже<br/>не поймаешь.<br/>''А.Кнышев''</p>
 +
 +
Давайте попробуем разобраться, зачем в УКНЦ понадобилось ставить 2 процессора вместо одного, да еще и одинаковых.
 +
 +
В нормальных ЭВМ (а УКНЦ явно выходит из этого ряда), таких, как IBM PC, например, каждому или почти каждому внешнему устройству (давайте к ним отнесем экран и клавиатуру) соответствует нечто вроде своего процессора, который только тем и занимается, что обслуживает свое ВУ. Этим достигается большая выгода в скорости, а заодно и экономится труд (опять-таки время) программистов.
 +
 +
Если реализовать те же функции, что выполняет аппаратура, программно с помощью центрального процессора, который у нормальных машин максимум один, то получится казус: вместо того, чтобы решать в поте лица те задачи, которые уготованы ему программами пользователя, процессору приходится только тем и заниматься, что выводить что-то на экран, принимать что-то с клавиатуры либо, не дай Бог, работать с дисководами.
 +
 +
Какая при этом получается скорость? Посмотрите на пользователей IBM-якобы-совместимой машин «Поиск», в которой все это реализовано программно. Вам бросится в глаза медленная реакция, вялые движения и сонливость этих несчастных.
 +
 +
А взгляните теперь на пользователей УКНЦ! Да в их глазах прямо-таки сияет гордость за родную машину. Ведь как-никак целый процессор отвечает за работу внешних устройств, и целое ОЗУ величиной аж в 32 Кб «брошено» на его нужды.
 +
 +
Центральный процессор может спокойно, не особо напрягаясь, заниматься своим делом, а вся эта грязная работа, вся эта суета с клавиатурой, экраном, дисководом перекладывается на периферийный.
 +
 +
==== 3.1 Общение между процессорами ====
 +
<p align="right">Присоедините к телефонному аппарату<br/>дверной звонок. Тогда, взглянув в дверной<br/>глазок, вы сможете узнать, кто звонит вам<br/>по телефону.<br/>''А.Кнышев''</p>
 +
 +
Итак, каждый процессор занимается своим делом, причем одновременно.
 +
 +
Возникает вопрос: как общаются эти ребята, ведь взаимодействие между ними обязательно, и от его эффективности зависит общая эффективность работы машины в целом.
 +
 +
Еще при обсуждении адресного пространства было вскользь замечено, что периферийному процессору доступно все ОЗУ в машине через регистровый механизм доступа. Т.е. он легко может изменять ОЗУ ЦП также, как он меняет ВОЗУ.
 +
 +
Такой подход не решает, конечно, проблемы общения — ведь ЦП не видит через регистровый доступ ПП и его ОЗУ, а он как-никак центральный!
 +
 +
Чтобы не впасть в меланхолию, перейдем скорее к каналам связи между ЦП и ПП. Эти каналы подобны проволочному телеграфу или даже телефону с двумя абонентами. При этом телефонных линий целых 3 — две двунаправленные, т.е. по ним может вестись передача данных в двух направлениях, и третья — однонаправленная.
 +
 +
Передача информации ведется побайтно. Двунаправленные — каналы 0 и 1. Однонаправленный канал — канал 2. Эти каналы — высокоскоростные, и их пропускная способность ограничивается лишь расторопностью процессоров.
 +
 +
==== 3.2 Общая структура каналов ====
 +
 +
Каждый двунаправленный канал (0 и 1) со стороны центрального процессора в странице ввода-вывода имеет 4 регистра:
 +
* регистр состояния источника;
 +
* регистр состояния приемника;
 +
* регистр данных источника;
 +
* регистр данных приемника.
 +
 +
Однонаправленный канал (2) имеет со стороны ЦП только регистры состояния и данных источника (ЦП по нему может только отправлять информацию).
 +
 +
В странице ввода-вывода ПП схожая картина. Разница в том, что регистры состояния источников объединены в один регистр, то же сделано и с регистрами состояния приемников. Здесь отсутствуют регистры источника для канала 2 (ПП может лишь принимать по нему).
 +
 +
==== 3.3 Описание канальных регистров ====
 +
 +
'''Сторона ЦП.'''
 +
 +
Формат регистров состояний:
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#DDDDDD;" | r
 +
| style="text-align:center; background-color:#DDDDDD;" | p
 +
| colspan="6" style="text-align:center; background-color:#EEEEEE;" |
 +
|}
 +
* 0-5 разряды — не используются.
 +
* 6 разряд — разрешение прерывания при установленном разряде 7:
 +
:: 1 — прерывание разрешено,
 +
:: 0 — прерывание запрещено.
 +
* 7 разряд:
 +
:: Для источников: готовность к передаче данных.
 +
::* Сбрасывается в лог. 0 при записи в регистр данных со стороны ЦП.
 +
::* Устанавливается в лог. 1 по команде RESET и по чтению сответствующего регистра данных со стороны ПП.
 +
::Для приемников: готовность к приему данных.
 +
::* сбрасывается в 0 по команде RESET и по чтению со стороны ЦП.
 +
::* устанавливается в 1 при записи в соответствующий регистр данных со стороны ПП.
 +
 +
Формат регистров данных:
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | &nbsp;
 +
|}
 +
:: Для источников: доступны по записи, читаются как 0.
 +
:: Для приемников: доступны лишь для чтения.
 +
 +
'''Сторона ПП.'''
 +
 +
Формат регистра состояний источников:<br/>
 +
Адрес 177076
 +
{|
 +
| style="width:15px; text-align:center;" | 7
 +
| style="width:15px; text-align:center;" | 6
 +
| style="width:15px; text-align:center;" | 5
 +
| style="width:15px; text-align:center;" | 4
 +
| style="width:15px; text-align:center;" | 3
 +
| style="width:15px; text-align:center;" | 2
 +
| style="width:15px; text-align:center;" | 1
 +
| style="width:15px; text-align:center;" | 0
 +
|-
 +
| colspan="3" style="text-align:center; background-color:#EEEEEE;" | &nbsp;
 +
| style="text-align:center; background-color:#DDDDDD;" | г1
 +
| style="text-align:center; background-color:#DDDDDD;" | г0
 +
| style="text-align:center; background-color:#DDDDDD;" | в0
 +
| style="text-align:center; background-color:#DDDDDD;" | г0
 +
| style="text-align:center; background-color:#DDDDDD;" | р0
 +
|}
 +
 
'''''TODO'''''
 
'''''TODO'''''
 +
 +
==== 3.4 Как работают каналы? ====
 +
 +
Предположим, понадобилось отправить информацию из ЦП в ПП по каналу К0.
 +
 +
Мы проверяем регистр состояния источника (177564), и, если установлен бит 7 (канал готов для записи), записываем в регистр данных источника (177566) байт, который нужно передать.
 +
 +
При этом сбросится бит 7, указывая на то, что канал занят, а по адресу 177060 в странице ввода-вывода ПП (регистр данных приемника ПП) появится наш байт.
 +
 +
Обычно в регистре-приемнике разрешено прерывание (установлен соответствующий разряд), и, так как в регистре состояния приемника установится бит 3 (готовность К0 к приему данных), сработает прерывание, и управление предастся программе обработки прерывания, адрес которой находится в ячейке 320.
 +
 +
Как правило, в ней считывается регистр данных в ОЗУ ПП, при этом сбросится бит готовности приемника в ПП, а также установится бит готовности источника ЦП. Канал возвратился в исходное состояние и готов к новой передаче.
 +
 +
Этот механизм одинаков для всех каналов и вне зависимости от того, какой процессор выступает в роли источника, какой — в роли приемника информации.
 +
 +
<blockquote>
 +
===== Пример 9. Параллельная инверсия экрана =====
 +
 +
Давайте пустим наперегонки два процессора. Они будут инвертировать видеопамять рабочего экрана слово за словом, каждый со своей стороны и с помощью своих регистров.
 +
 +
Стартовый сигнал от ЦП к ПП передастся как прерывание от 1-го канала. Для этого программу инвертирования ПП мы сделаем в виде программы обработки прерываний от приемника K1 в ПП. Тогда при старте программы в ЦП произойдет синхронный старт точно такой же программы в ПП.
 +
 +
Установка процедуры в ЦП (работаем в мониторе ЦП):
 +
<pre>
 +
176664: 000100
 +
 +
1000: 012737 MOV #1, @#176666
 +
000001
 +
176666
 +
000137 JMP @#40300
 +
040300
 +
 +
40300: 005737 TST @#0
 +
    * 000000
 +
010046 MOV R0, -(SP)
 +
010146 MOV R1, -(SP)
 +
012700 MOV #100000,R0
 +
100000
 +
012701 MOV #154540,R1
 +
154540
 +
A: 010037 MOV R0, @#176640
 +
    * 176640
 +
005137 COM @#176642
 +
    * 176642
 +
005200 INC R0
 +
020001 CMP R0, R1
 +
001371 BNE A
 +
012601 MOV (SP)+, R1
 +
012600 MOV (SP)+, R0</pre>
 +
 +
Установка программы в ПП (работаем в мониторе ПП):
 +
<pre>
 +
330: 040300</pre>
 +
С адреса 40300, но уже в ОЗУ ПП запишите ту же процедуру, изменив три выделенных звездочкой слова:
 +
: вместо 0 — 177062,
 +
: вместо 176640 — 177010,
 +
: вместо 176642 — 177014.
 +
В конце процедуры припишите код 2 (RTI). Теперь войдите в монитор ЦП и дайте старт:
 +
<pre>
 +
1000 <ИСП>.</pre>
 +
Белая полоса, пробежавшая по экрану — это результат отставания ПП от ЦП.
 +
 +
</blockquote>
 +
 +
==== 3.5 Использование каналов в УКНЦ ====
 +
 +
Канал К0 используется системными программами для терминального ввода-вывода, чему, собственно, и посвящена эта книга. Программы центрального процессора посылают информацию, подлежащую выводу на экран, а периферийный, сканируя клавиатуру, выдает ЦП конечные результаты этого сканирования.
 +
 +
Канал К1 отвечает за работу с принтером (параллельным программируемым интерфейсом).
 +
 +
Канал К2 заведует передачей массивов данных между ОЗУ ЦП и внешними устройствами, доступными периферийному процессору.
 +
 +
Использование прерываний в каналах позволяет экономить время в работе каждого процессора. Оба они могут заниматься какими-то делами, и если одному из них «приспичит» послать своему собрату по разуму информацию, ему достаточно записать в канал посылку, и продолжить свои процессорные дела. Второй процессор немедленно отзовется прерыванием на эту посылку и спишет ее в свое ОЗУ. Дальше он сам решит, что с ней делать, а пока он выходит из программы обработки прерываний и возвращается к своей прерванной программе.
 +
 +
==== Резюме к §3 ====
 +
 +
* В УКНЦ два процессора — центральный и периферийный.
 +
* Работа их разделена по следующему принципу: ЦП исполняет программы пользователя (в ОЗУ ЦП); ПП программно реализует обслуживание внешних устройств.
 +
* Центральный процессор «приказывает» периферийному, какие операции следует сделать на ВУ, а ПП выполняет его приказы с помощью программ, расположенных в своем ОЗУ.
 +
* Приказы отправляются по каналам связи между ЦП и ПП.
 +
* Есть всего 3 канала — К0, К1, К2. Каналы 0 и 1 — двунаправленные,  канал 2 — однонаправленный (от ЦП к ПП).
 +
* Каналы представлены в страницах ввода-вывода регистрами источников и приемников. И источники, и приемники имеют свои регистры состояния и данных.
 +
* Регистры данных — это ячейки, младший байт которых доступен для записи из одного процессора, и для чтения из другого. Т.е. РД источника в ПП является и РД приемника в ЦП.
 +
* Регистры состояния указывают на факты чтения и записи в регистры данных со стороны процессоров, а также разрешают прерывания по этим фактам.
 +
* Регистры состояния со стороны ПП позволяют также:
 +
** разрешать прерывания с а.в.п. 314 по команде ЦП RESET.
 +
** выключать регистры К0 из страницы ввода-вывода ЦП.
 +
* Умелое использование прерываний от каналов позволяет «синхронизировать» работу процессоров в нужные моменты времени.

Latest revision as of 10:52, 1 April 2007

Это — часть книги Ресурсы УКНЦ.

 

Глава 1. Аппаратные средства вывода на экран



Contents


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

§0. Немного об экранах.

Экраном обычно служит телевизор или монитор. Оба они бывают черно-белые, цветные и выключенные. Причем последний тип легко может быть превращен в один из первых двух путем включения последнего. Если Вы уже запутались, кто первый, а кто последний, не страшно. Немного страшнее, если после подключения монитора или телевизора к компьютеру вместо удобоваримой картинки Вы обнаружите беспорядочное мерцание полос и бегание кадров с потрясной скоростью. Если предположить, что и монитор (телевизор), и ЭВМ исправны, то остается лишь разобраться с подключением одного к другому.

Обычно от компьютера к экрану идут следующие сигналы:

  • Синхросмесь (смесь строчной и кадровой разверток).
    Этот сигнал, грубо говоря, управляет положением электронного луча на экране.
  • Видеосигнал.
    Для черно-белых экранов этот сигнал управляет яркостью точки в текущем положении электронного луча. В него еще подмешано немного синхросмеси (для вкуса).
  • R, G, B.
    Сигналы управления красным (Red), зеленым (Green) и синим (Blue) составляющими цвета точки (для цветных экранов).
  • Звук.
    Тот же сигнал, что подается на пьезодинамик ЭВМ. Как правило, его подключают к телевизору в плату звукового канала.
  • Общий (земля).

Все эти сигналы выводятся на разъемы «ВМ» на задней панели компьютера. Этих разъемов у УКНЦ два. Поэтому к ней можно подключить целых два монитора. (Любопытно, что у человека тоже целых два глаза. Совпадение?)

Теперь осталось подключить компьютер. К каждой машине прилагается видеошнур. В нем 10 жил. Разводка сигналов по этим жилам такова:

СС — 10
GND — 2, 4, 6, 8
R — 5
G — 3
B — 1
Видео — 9
Звук — 7

Для передачи черно-белого изображения достаточно всего двух проводов — Видео и Земля. Для цветного требуется минимум 5: R, G, B, СС и земля.

Напряжение на выходе из компьютера в видеоразъеме — порядка 1 В.

§1. Как видеоинформация попадает на экран

1.0 Вывод картинки на экран

Рисунок 1.0 Движение электронного луча по экрану

Вы, очевидно, знаете принцип передачи теле-изображения. Электронный луч под управлением сигналов строчной и кадровой разверток обегает весь экран построчно (рисунок 1.0).

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

То, что появилось на экране, назовем видеоизображением, или просто картинкой. Картинка перерисовывается на экране 50 раз в секунду. За время, равное 1/50 секунды, часто называемое тиком, глаз не успевает забыть старое изображение, поэтому картинка не мерцает.

1.1 Создание картинки

Будем постепенно продвигаться от конца к началу. Теперь вдоль видеошнура, через разъем «ВМ» влезем в компьютер и разберемся, как формируется видеоизображение.

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

Видеоинформацией мы будем называть данные, хранящиеся в особо отмеченной области оперативной памяти ЭВМ, а саму эту область — ВидеоОЗУ (ВОЗУ). Чтобы разобраться в строении ВОЗУ, давайте пройдемся по адресному пространству УКНЦ.

1.2 Экскурсия в адресное пространство УКНЦ

Среди всех микро-ЭВМ, выпущенных в нашей стране, УКНЦ — самая нетривиальная. Ни в одном другом компьютере больше не встретишь такого оригинального решения — 2 ОЗУ + 2 процессора. Некоторыми вопросами, связанные с повышенной микропроцессорностью УКНЦ, мы займемся позже, а теперь же перейдем к структуре памяти.

Прямой доступ к памяти

Каждый процессор — центральный (ЦП) и периферийный (ПП) имеет свое ОЗУ. Коль скоро в машине применены процессоры КМ1801ВМ2, адресное пространство которых 64 Кб, то прямым доступом к памяти оба они берут лишь каждый свои 64 Кб.

Взгляните на рисунок 1.2. Здесь показаны карты памяти для обоих процессоров при прямом доступе.

Рисунок 1.2 Адресное пространство при прямом доступе
Рисунок 1.2 Адресное пространство при прямом доступе

Адресное пространство обоих процессоров может меняться. То есть будут меняться устройства, к которым могут они обращаться, а сам объем адресных пространств не изменится.

Устройства, «намертво» подключенные в адресное пространство, выделены (*) . К ним относятся:

в ЦП:

ОЗУ пользователя (56 Кб, адреса 0 ... 157777). Именно здесь располагаются все программы пользователя, будь то Бейсик, RT-11 или Ваши собственные (если Вы случайно не являетесь автором Бейсика или RT-11);

в ПП:

  1. ОЗУ ПП (32 Кб, адреса 0 ... 77777). Это ОЗУ используется для системных нужд. Для каких — Вы скоро узнаете. Интересно то, что около 22 Кб из этих 32 остаются свободными и также пригодны к использованию пользователем.
  2. Системное ПЗУ (банки 2-4 в адресах 120000-176777). До него нам тоже пока нет дела. Всему свой черед.
  3. Страница ввода-вывода ПП. Здесь выведены регистры внешних и внутренних устройств.

Сменные устройства:

ЦП:

В верхние адреса (160000 и выше), в зависимости от режима работы ЦП (а их два - HALT и USER) подставляются:
  • Системное ОЗУ ЦП — 8 Кб (режим HALT), где хранится программа-монитор, драйверы внешних устройств, доступных ЦП через страницу ввода-вывода, программа-эмулятор команд с плавающей точкой и программа тестирования.
  • Страница ввода-вывода ЦП (режим USER). Аналогично странице ввода-вывода ПП, сюда подставляются по фиксированным адресам регистры внешних и внутренних устройств.
Как можно менять эти режимы ЦП из ЦП же, сказано в главе ... .

ПП:

ПП в своем адресном пространстве имеет так называемое «окно» с адресами 100000-117777, в которое может подключаться:
  1. Первый банк СПЗУ;
  2. Один из трех банков ПЗУ на внешней кассете N1;
  3. Один из трех банков ПЗУ на внешней кассете N2;
  4. Вообще ничего.
Всем этим управляет особый регистр в странице ввода-вывода ПП. Его адрес — 177054.

Как видим, каждый процессор глядит напрямую только в свое адресное пространство, а общий объем ОЗУ при прямом доступе составляет:

64 + 32 = 96 Кб.
Пример 1. Прогулка по адресному пространству.

Влезьте, пожалуйста, любым известным Вам способом в монитор ЦП. Уже виден значок @ ? Итак, мы на месте. Место это — адресное пространство ЦП.

Набрав любое восьмеричное число от 0 до 157776, и, нажав стрелку вправо, Вы увидите содержимое ячеек памяти с набранными адресами, а проделав то же с адресом от 160000 — сможете полюбоваться на грозные надписи «Зависание». На них не стоит обращать внимание, ибо УКНЦ как угодно может оповестить о своем зависании, но только не так. Эта часть адресного пространства ЦП — страница ввода-вывода. Здесь можно отыскать ячейки, не вызывающие при открытии никакого возмущения со стороны машины. Скорее всего, это и есть те самые регистры устройств.

Проделаем такой опыт: запишем в ячейку 177566 число 7. Машина что-то невнятно прогудит. Это значит, что число 7 попало куда следует (а следует ему попасть в канал связи с ПП). ПП обработал наш код, ответив добродушным гудком.

Тем, кому наскучило играться в мониторе ЦП, предлагаю покопаться с монитором ПП. Влезаем в него так:

  • нажимаем <УСТ>, при этом должно появиться меню «Установка режимов». Если оно не появилось, проверьте, действительно ли ЭВМ перед Вами — это УКНЦ;
  • нажмите <УПР>+@ или <ГРАФ>+<ИСП>.

Теперь мы находимся в «царстве теней» — мониторе ПП. Экран здесь не такой просторный, как в мониторе ЦП. Поэтому совет страдающим клаустрофобией — не задерживайтесь здесь подолгу! Из этого отладчика можно и не выбраться. Иногда случается находить в ОЗУ ПП останки тех, кто так и не смог выйти из лабиринтов монитора ПП. Именно их духи, мне кажется, время от времени и подвешивают машины. Но я отвлекся.

Правила игры с монитором ПП те же — можно с полным правом копаться в содержимом любых ячеек от 0 до 77776 (ОЗУ ПП) и любоваться на ячейки от 100000 до 176776 (ПЗУ). Также можно заглянуть и в страницу ввода-вывода ПП. ЭВМ же, в свою очередь, оставляет за собой право подвиснуть в любое удобное ей время.

Если вы устали, выйдите:

  • <УПР>+C,

а дальше, через меню «Установки», куда пожелаете.

Оставшимся предлагаю заглянуть туда, где доселе редко ступала нога человека — в СОЗУ ЦП. Для этого прибегнем к черной магии: наберем в ОЗУ ПП 2 масенькие программки:

	40000:	012704	MOV  #450, R4
		000450
		004737	CALL @#162164
		162164
	40020:	012704	MOV  #450, R4
		000450
		004737	CALL @#162204
		162204

С помощью первой мы включим режим просмотра ОЗУ ЦП из монитора ПП. Смело жмем 40000 <ИСП>. Вверху появляются новые две буквы: ЦМ. Что они означают, не знаю, но вот что изменилось — можно посмотреть. Теперь перед нами до боли знакомое ОЗУ ЦП пользователя (в адресах от 0 до 157776) и совсем незнакомое СОЗУ ЦП (от 160000 и выше). Лазать в ОЗУ ЦП можно по-всякому — и записывать в ячейки, и считывать. Но вот запускать программы в ЦП из монитора ПП невозможно — даже черная магия здесь бессильна.

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

  • в ячейку 163416 вместо 000021 запишем 012500,
  • в ячейку 163450 вместо 000031 — 010045.

Теперь со всех ног бежим в монитор ЦП: <УПР>+C, <ENTER>. Наше последнее хитрое действо дало свои результаты — теперь из монитора ЦП можно без проблем «промониторить» все ОЗУ ЦП — пользователя и системное. Это адресное пространство ЦП в режиме «HALT».

Если Вы все же соскучились по монитору ПП и по ОЗУ ПП, вернитесь в монитор ПП, и запустите вторую программку, что с адреса 40020. Ничего страшного в том, что Вы не увидите эту записанную ранее программку - ведь монитор ПП покажет эти адреса в ОЗУ ЦП. Наберите 40020, крепко зажмурьтесь, и нажмите <ИСП>. Если, открыв глаза, в верхней строке Вы обнаружите слово "ПМ", значит, эксперимент удался.

Человек быстро привыкает ко всему хорошему. Поэтому вот инструкция к тому, чтобы восстановить обычную точку зрения монитора ЦП (работаем в мониторе ЦП):

  • в ячейку 163416 обратно запишем 21,
  • в ячейку 163450 — 31.

Ну что ж, теперь мы полностью восстановили первоначальный вариант: монитор ЦП видит ОЗУ пользователя + страницу ввода-вывода, а монитор ПП — свое суверенное адресное пространство. С возвращением!

Регистровый доступ к ОЗУ

— Есть ли у вас план, мистер Фикс?
— План, план… Да у меня целых три плана!
Ж.Верн «80 дней вокруг света»

96 Кб — вроде не так уж и мало для микро-ЭВМ. Но экран — вещь, которая требует под себя значительную часть памяти машины. Поэтому в УКНЦ наряду с прямым применяется регистровый доступ к памяти.

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

В регистр адреса (РА), который доступен нам как ячейка в странице ввода-вывода, пишется, как Вы уже догадались, адрес. Моментально в другой регистр — данных (РД) аппаратно считывается содержимое ОЗУ, соответствующее записанному адрес. Если теперь записать в РД число, то оно аппаратно же запишется по соответствующему адресу в память. У каждой страницы ввода-вывода эти регистры свои, и каждый процессор может записывать и считывать информацию с помощью своих регистров.

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

На рис. 1.3 показано адресное пространство при регистровом доступе. Планов всего 3. В каждом содержится по 32 Кб. Их адреса в РА — 100000 и выше. При РА, меньшем 100000, идет доступ к обычным ОЗУ.

Рисунок 1.3 Адресное пространство при регистровом доступе
Рисунок 1.3 Адресное пространство при регистровом доступе

В таблице 1.1 приведены адреса РА и РД для каждого процессора. Центральному процессору доступны через РА и РД планы 1 и 2, а также свое собственное ОЗУ. Периферийному процессору доступно все ОЗУ в машине. То есть через РД ПП может читать и записывать сразу 3 байта. Совокупность этих трех байтов в разных планах назовем Т-словом.

Таблица 1.1

Регистр
адреса
Регистры данных
План 0 План 1 План 2
ЦП 177640 176642 (мл) 176642 (ст)
ПП 177010 177012 177014 (мл) 177014 (ст)
Пример 2. Пример работы с регистрами РА и РД в ЦП.

В прошлом примере для того, чтобы поменять кое-что в СОЗУ ЦП, нам приходилось залезать в монитор ПП. «Подглядывание» за ОЗУ ЦП оттуда осуществлялось, конечно же, с помощью регистрового доступа: ПП через регистры доступно все ОЗУ в машине. Теперь попробуем воспользоваться тем же механизмом, но в ЦП, причем более осознанно.

Предлагаю совершить такую нехитрую манипуляцию (в мониторе ЦП):

	(176640)=71607		Записываем с помощью РА и РД по адресам 
	(176642)=12500		163416 и 163450 некоторые числа. Адреса пишем
	(176640)=71624		в  РА несколько обделенными на 2.
	(176642)=10045

После этой кропотливой работы можете убедиться, что перед Вами — ОЗУ ЦП в режиме HALT, и никаких регистров по адресам 176640 и 176642 уже не наблюдается. А так как их нет, то и говорить больше не о чем. В заключение совершенно бесполезный и не относящийся к делу совет — запишите в ячейку 163731 число 77000 (вместо 71400), а в 163735 — 20077. Приятного Вам времяпрепровождения с клавишами ИСП и СТОП в мониторе ЦП!

Теперь вернемся к видеоинформации. Видеоинформация — это не что иное, как данные, хранящиеся в планах ОЗУ и считываемые построчно на экран. В принципе, три плана можно называть и ВидеоОЗУ.

Пример 3. Сохранение части экрана

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

Подпрограмма сохранения:

 	60000:	012702	MOV	#100000,R2
 		100000
 		012703	MOV	#154540,R3
 		154540
 	M1:	005004	CLR	R4
 	M2:  *	010237	MOV	R2,	@#177010
 		177010
 		013700	MOV	@#177012,R0
 		177012
 		013701	MOV	@#177014,R1
 		177014
 	     *	010337	MOV	R3,	@#177010
 		177010
 		010037	MOV	R0,	@#177012
 		177012
 		010137	MOV	R1,	@#177014
 		177014
 		005204	INC	R4
 		005202	INC	R2
 		005203	INC	R3
 		022704	CMP	#50,	R4
 		000050
 		001356	BNE	M2
 		062702	ADD	#50,	R2
 		000050
 		022703	CMP	#157700,R3
 		175700
 		100350	BPL	M1
 		000207	RETURN

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

Программа копирования:

	40040:	012702	MOV	#60000,	R2
 		060000
 		012703	MOV	#60100,	R3
 		060100
 		012701	MOV	#37,	R1
 		000037
 	M:	012223	MOV	(R2)+,	(R3)+
 		077103	SOB	M,	R1

Итак, Вы набиваете п/п, набиваете программу копирования, запускаете ее с начального адреса (40040). После этого в ОЗУ ПП появится копия подпрограммы, но уже с адреса 60100. В ней Вы меняете местами содержимое двух помеченных слов.

А для вызова этих подпрограмм используем местную хитрость — эти подпрограммы сделаем спецфункциями:

 	13144:	60000
 	13146:	60100

Теперь при посылке в терминал (то есть на экран) кода <001> (соответствует комбинации клавиш <УПР>+A) будет выполняться сохранение, а при посылке кода <002> (<УПР>+B) — восстановление левой верхней четверти рабочего экрана.

Как происходит считывание видеоинформации на экран?

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

1.3 Таблица строк

Эти соответствия — номера строки начальному адресу в ВОЗУ, цвета точек содержимому ВОЗУ и кое-что другое указываются в специальной таблице в ОЗУ ПП, называемой ТАБЛИЦЕЙ СТРОК. Она строится следующим образом.

Две ячейки с фиксированными адресами в ОЗУ ПП — 270 и 272 являются первым элементом таблиц строк. Вообще количество элементов в таблице должно бы равняться 288 (количеству строк). Но УВОЗУ сделано так, что первые 20 элементов в таблице строк не указывают на строки, и считывание информации на экран начинается с 21-го.

Элемент таблицы строк всегда содержит указатель на адрес в ВОЗУ, с которого начинается вывод на экран в данной строке. Этот адрес находится в предпоследнем слове элемента (а слово — это 2 байта). Адрес здесь задается так же, как при регистровом доступе. То есть адреса, начиная со 100000, указывают на планы памяти, а меньше 100000 — на ОЗУ ЦП + ОЗУ ПП.

Последнее слово элемента содержит адрес следующего элемента таблицы строк, а также некоторую информацию о нем.

Формат последнего слова элемента:

15 3 2 1 0
Адрес следующего элемента у р к
  • 0 разряд отвечает за состояние аппаратного курсора (им мы займемся чуть позже).
  • 1 разряд определяет размер следующего элемента:
    • 1 — 4 слова.
    • 0 — 2 слова.

Элементы в таблице строк могут быть либо четырехсловными, либо двухсловными. Первый элемент (270 и 272) всегда двухсловный. Двухсловный элемент состоит из адреса в ВОЗУ (1-е слово) и указателя на следующий элемент (2-е слово).

Четырехсловный элемент в первых своих двух словах несет дополнительную информацию, 3-е и 4-е слова имеют то же назначение, что и в двухсловном элементе. Как УВОЗУ будет интерпретировать первые два слова, зависит от содержимого 2-го разряда последнего слова предыдущего элемента:

  • 2 разряд:
    1. если следующий элемент двухсловный (1-й разряд равен 0), то этот разряд интерпретируется просто как 2-й разряд адреса следующего элемента
    2. если следующий элемент все-таки четырехсловный (1-й разряд равен 1), то возможны два варианта:
      • 0 — из первых двух слов следующего элемента загружается регистр управления отображением (УО);
      • 1 — из них загружается регистр управления цветом (УЦ).
  • 3-15 разряды определяют адрес следующего элемента в таблице строк.
Пример 4. С ног на голову и наоборот

Ради развлечения и только ради него был задуман этот пример. Наберите в ОЗУ ПП такой фрагмент:

	40100:	012700	MOV	#2500,	R0
		002500
	A:	162710	SUB	#54420,	(R0)
		054420
		005410	NEG	(R0)
		062700	ADD	#4,	R0
		000004	
		020027	CMP	R0,	#4666
		004666
		100770	BMI	A
		000207	RETURN
		
	13152:	040100

Теперь при приеме терминалом кода <004> (<УПР>+D) рабочий экран перевернется вверх тормашками. Отменяется это безобразие все тем же кодом <004>.

Регистры УО и УЦ не имеют фиксированного адреса. Они могут загружаться из таблицы строк произвольное количество раз.

Регистр управления цветом

Этот регистр имеет очень важное значение. Он ставит в соответствие триаде в планах ВОЗУ (комбинации из трех бит) цвет выводимых точек, то есть является тем самым мостиком между видеоинформацией и картинкой. Младший бит в триаде соответствует содержимому плана 0, старший — плана 2.

Регистр управления цветом состоит из двух слов. В первом слове определяются цвета тех точек, которым соответствуют коды от 0 до 3 в планах ВОЗУ. Второе слово определяет цвета триад с содержимым от 4 до 7.

Формат первого слова регистра УЦ:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Y R G B Y R G B Y R G B Y R G B
011 010 001 000

Формат второго слова регистра УЦ:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Y R G B Y R G B Y R G B Y R G B
111 110 101 100

Нетрудно заметить, что каждому возможному коду в ВОЗУ (а их всего 8) соответствует комбинация из 4 бит. Три из них (R, G, B) отвечают за составляющие цвета в цветных мониторах, а черно-белых — за градацию яркости: 1 — составляющая есть, 0 — составляющей нет. Но есть и четвертый — Y. Этот управляет яркостью сразу всех цветов: 1 — 100% яркости, 0 — 50%. Хотя на протяжении одной видеостроки может быть одновременно максимум 8 цветов, в разных строках на экране их может быть 16.

Для черно-белых экранов сигнал Y не влияет на яркость изображения. Для них этот четвертый бит не имеет никакого значения.

Пример 5. Негатив служебного экрана

Чтобы не перенапрячься в изучении регистров УО и УЦ, приведу такой пример. В мониторе ПП обновим 2 ячейки в ТС: 4700: 042547 4702: 000443

Делать это следует невзирая на все безобразия, которые будут проистекать на экране. Для пущей красочности выйдите в меню «Установка»: <УПР>+C, и полюбуйтесь на результат.

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

Для того, чтобы восстановить прежнее положение, запишите в эти ячейки старые значения: 4700: 135230 4702: 177334, или просто сбросьте машину.

Пример 6. Пылающий экран

Набейте в мониторе ПП такую программку:

	40200:	005237	INC	@#4700
		006750
		005237	INC	@#4702
		006752
		012737	MOV	#1,	@#7130
		000001
		007130
		000207	RETURN

В ячейку (7132) запишите адрес этой подпрограммки — 40200, а в ячейку (7130) — единичку. То, что происходит теперь с цветами служебного экрана, — это следствие того, что УЦ1 и УЦ2 соответствующего участка таблицы строк увеличиваются на 1 с частотой 50 Гц.

Регистр управления отображением и аппаратный курсор

Этот регистр также состоит из двух слов.

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

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Позиция курсора Поз.гр.к тк Y R G B
  • 0-3 разряды — яркость и цвет курсора:
1 — есть составляющая,
0 — нет составляющей.
  • 4 разряд — тип курсора:
1 — графический курсор,
0 — символьный.
  • 5-7 разряды — позиция графического курсора в октете.
  • 8-14 разряды — позиция курсора (октета) на экране.
  • 15 разряд — не используется.

Курсор на экране формируется следующим образом. Включенный символьный курсор накладывается поверх изображения строки. Он занимает 8 подряд высвеченных точек, то есть один октет. Его позиция определяется 8-14 разрядами первого слова регистра УО. Минимальная позиция — 0, максимальная — 79. Графический курсор отличается от символьного тем, что из восьми точек октета лишь одна остается включенной. Ее положении в октете определяют 5-7 разряды. Цвет включенного курсора зависит от 0-3 разрядов.

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

Не забудем и про 2-е слово регистра УО. Оно отвечает за масштабирование изображения по горизонтали, а также за яркость R,G,B сигналов в текущей видеостроке.

Его формат:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
масш яR яG яB
  • 0-2 разряды — управляют яркостью R,G,B сигналов соответственно. Это управление распространяется лишь на текущую строку:
1 — 100%,
0 — 50%.
  • 3 разряд — не используется.
  • 4, 5 разряды управляют количеством выводимых на экран точек, то есть масштабированием (таблица 1.2).

Таблица 1.2

Содержимое
разрядов
Кол-во точек
в строке
Кол-во
октетов
в строке
4 5
0 0 640 80
0 1 320 40
1 0 160 20
1 1 80 10

В УКНЦ 4 формата экрана. В режиме максимального количества точек в строке на экран отображается видеоинформация из 80 последовательных Т-слов, адрес первого указывается в таблице строк для каждой строки. Режим наименьшего количества точек в строке позволяет выводить 80 точек, то есть всего 10 Т-слов в строке. Общий размер картинки при этом не меняется. Видеоизображение занимает всегда весь экран.

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

Пример 7. Апофеоз таблицы строк.

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

Войдите в монитор ПП, а в нем — в режим терминала (нажав D). А теперь нажмите комбинацию <УПР>+V и держите ее под треск пьезодинамика, пока не надоест.

То, что Вы увидите на экране, послужит, пожалуй, лучшей иллюстрацией к описанию УО и УЦ, да и всему устройству таблицы строк. Команда <УПР>+V — это комнда прокрутки рулона. Но, поскольку рулон для служебного экрана не предусмотрен, с таблицей строк происходят такие вот забавные превращения, что и отражается на экране.

Резюме к §1

  • Изображение на экране УКНЦ состоит из 288 видеострок.
  • Видеоинформация на экран построчно считывается Устройством Управления ВидеоОЗУ (УВОЗУ) из видеопамяти.
  • Адресное пространство может быть доступно либо прямым доступом процессоров, либо регистровым доступом.
  • Через РА и РД (регистры адреса и данных) доступно 192 Кб ОЗУ. Одному адресу соответствует Т-слово: 3 байта из трех смежных областей, называемых планами. ЦП доступны планы 1 и 2, ПП — 0, 1 и 2, т.е. все ОЗУ в УКНЦ.
  • Одному Т-слову соответствуют восемь выведенных подряд точек на экране.
  • Адреса в РА с 100000 указывают на особую область памяти, прямым доступом не видимую. Объем ее - 96 Кб, по 32 в каждом плане, и используется она в качестве ВОЗУ. Адреса меньше 100000 — это ОЗУ ЦП +ОЗУ ПП.
  • Таблица строк — список в ОЗУ ПП, необходимый УВОЗУ для формирования видеоизображения. Начинается с пары ячеек с адресами 270 и 272.
  • Таблица строк состоит из отдельных элементов. Каждый элемент, начиная с 21-го, соответствует видеостроке на экране. 21-й элемент соответствует самой верхней строке. Элементы могут быть двухсловными и четырехсловными. Первый элемент (270 и 272) всегда двухсловный.
  • Формат двухсловного элемента:
    • 1-е слово — адрес в ВОЗУ, с которого начинается вывод видеоинформации в текущую строку.
    • 2-е слово — адрес следующего элемента в таблице строк. В трех младших битах слова содержится информация о типе следующего элемента, о переключении курсора в данной строке, а также определяется, какой регистр УВОЗУ загрузится из следующего элемента, если он — четырехсловный.
  • Формат четырехсловного элемента:
    • 1-е, 2-е слова — интерпретируются УВОЗУ либо как регистр управления отображением, либо как регистр управления цветом.
    • 3-е слово — адрес в ВОЗУ.
    • 4-е слово — адрес следующего элемента.
  • Регистры управления цветом (УЦ) и отображением (УО) состоят из двух 16-битных слов каждый и входят в состав УВОЗУ. Загружаются они лишь из таблицы строк, только из четырехсловных элементов.
  • Регистр УЦ определяет соответствие цвета точки содержимому трех битов в планах ВОЗУ. В данной строке может быть одновременно 8 цветов.
  • Регистр УО управляет: цветом, типом, горизонтальной позицией аппаратного курсора.
    • масштабированием изображения по горизонтали.
    • яркостью составляющих R,G,B в текущей строке.

§2. Формирование видеоизображения. Использование аппаратных возможностей.

Каким образом видеоинформация попадает на экран, мы разобрались. Теперь рассмотрим способы формирования информации в ВОЗУ.

Самый, пожалуй, простой способ — это записывать в ВОЗУ видеоинформацию через РА и РД. Однако это не самый эффективный путь работы с экраном на УКНЦ. Один из способов повышения эффективности:

2.0 Размещение видеоинформации в нижней области ОЗУ

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

Однако появляется и проблема. Дело в том, что планы раскиданы по разным ОЗУ, и план 0 теперь смотрится только из ПП.

Выходом из такой ситуации может быть использование не всех планов сразу, т.е. работа только с планами 1 и 2 из ЦП, ибо он несколько быстрее ПП. Но при этом сократится многоцветность выводимой информации. Во многих случаях это не страшно, например, при выводе текста.

Еще можно координировать работу процессоров таким образом, чтобы они писали одновременно в свое ОЗУ свои порции информации. Этот способ, несомненно, интересен, и, быть может, даже красив. Однако сложен.

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

2.1 Аппаратный спрайтовый механизм

Эти возможности предоставляет опять-таки УВОЗУ. В его состав входят еще несколько регистров, доступных через страницу ввода-вывода ПП:

  • Регистр октета точек (177024).
  • Регистр кода цвета фона (177020, 177022).
  • Регистр кода цвета точки (177016).
  • Регист¬р маски записи в планы (177026).

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

Давайте представим себе изображение на экране как «картинку» определенного цвета, накладываемую на «фон». Это может быть символ (в виде буквы, например) либо какое-нибудь определенное изображение.

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

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

  1. Сохранить старое изображение (фон).
  2. Вывести на экран спрайт таким образом, чтобы изменился цвет только тех точек, где спрайт «присутствует».
  3. Некоторое время «продержать» эту картинку на экране.
  4. Воспроизвести старое изображение, затерев спрайт.

Самая трудоемкая задача — в пункте 2. Чтобы ее решить программно, нужно совершить целый ряд побитных логических операций с фоном и спрайтом.

Эта операция реализуется в УКНЦ аппаратно. Пусть наш спрайт по габаритам умещается в 8 последовательных точек (по горизонтали).

Регистр октета точек представляет собой «макет» спрайта в некотором сечении.

7 6 5 4 3 2 1 0
               

Логической единице в байте соответствует цвет спрайта, а 0 — цвет фона.

Цвет спрайта, или точки (наш спрайт пока одноцветный), определяет регистр кода цвета точки (177016). Его формат:

7 6 5 4 3 2 1 0
  2 1 0
  • 0 разряд — информация плана 0.
  • 1 разряд — информация плана 1.
  • 2 разряд — информация плана 2.

Фон может быть многоцветным, поэтому регистр кода цвета фона отражает содержимое полного Т-слова в видеопамяти. Этот регистр двухсловный:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  2 1 0   2 1 0   2 1 0   2 1 0
4 3 2 1
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
  2 1 0   2 1 0   2 1 0   2 1 0 Содержимое трех планов ВОЗУ для каждой точки
8 7 6 5 Порядковые номера точек в октете

Эти три регистра могут участвовать в следующих процессах (или фазах):

  • Чтение.

Вызов:

Чтение регистра октета точек, например: TST @#177024.

Действие:

Регистр кода цвета фона загружается из ВОЗУ содержимым трех планов в формате, представленном выше, то есть каждой точке соответствует триада битов. Теперь его можно запомнить в две ячейки ОЗУ либо в два регистра. Это фон, т.е. старое изображение. В этом процессе из регистра октета точек считывается 0, т.к. он доступен лишь по записи. Перед этой фазой надо предварительно загрузить РА требуемым адресом.
  • Модификация и запись.

Вызов:

Запись в регистр октета точек байта, соответствующего выбранному сечению спрайта, например: MOVB (R1)+?, @#177024.

Действие:
а) Модификация.

В те триады в регистре кода цвета фона, которым соответствует установленные разряды регистра октета точек, аппаратно записывается значение регистра кода цвета точки. Остальные триады не меняются.

б) Запись.

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

Чтобы вывести весь спрайт целиком, нужно повторить несколько раз эти процессы, каждый раз запоминая регистр кода цвета фона после фазы «чтение», и менять содержимое РА и регистра октета точек.

Если спрайт многоцветный, то надо последовательно проводить фазу «модификация-запись», предварительно загружая новые значения в регистр кода цвета точки. Запоминать же фон из регистра кода цвета фона надо лишь один раз — в начале для каждого октета.

2.2 Регистр маски записи в планы

Этот регистр позволяет запретить запись в каждый план памяти. Адрес — 177026. Его формат:

7 6 5 4 3 2 1 0
  2 1 0
  • 0 разряд: 1 — запрещена запись в план 0.
  • 1 разряд: 1 — запрещена запись в план 1.
  • 2 разряд: 1 — запрещена запись в план 2.

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

Пример 8. Мираж на экране

Посмотрите на экран. Если он пуст, включите машину. Делайте с ней все что угодно, лишь бы на экране было побольше всего изображено (хотя вполне хватит и надписи «Загрузка из сети»). Теперь войдите в монитор ПП, найдите там ячейку 177026. Запишите в нее любое число от 1 до 6 (рекомендую значение 2).

Выйдите из монитора ПП и продолжайте работать, но так, чтобы изображение поменялось. Например, выполните очистку экрана. На экране останется изображение (правда, не такое яркое, как было), которое остается теперь под защитой регистра маски. Чтобы убрать эти привидения, обнулите этот регистр: (177026)=0, и очистите экран.

Резюме к §2

  • Чтобы ускорить работу видеоинформацией (УКНЦ — далеко не самая быстрая ЭВМ), можно в качестве ВОЗУ использовать ОЗУ ЦП + ОЗУ ПП, указывая в таблице строк адреса меньше 100000.
  • Повысить эффективность программ, работающих с динамической видеоинформацией, позволяет аппаратный спрайтовый механизм.
  • Спрайтом называется картинка, которую нужно накладывать на фон и перемещать таким образом, чтобы она не затирала фон и двигалась как бы поверх него.
  • Спрайтовый механизм представлен тремя регистрами:
    • октета точек (РО), (177024)
    • кода цвета точки (РТ), (177016)
    • кода цвета фона (РФ), (177020) и (177022)
  • Регистр октета точек можно представить как срез спрайта в некотором горизонтальном сечении. Он состоит из 8 бит. Каждый бит соответствует точке в сечении. Установленный бит указывает, что точка принадлежит спрайту, а сброшенный — фону.
  • Регистр кода цвета точки состоит из трех бит, каждый из которых соответствует своему плану ВОЗУ. РТ определяет, какой код будет записываться в ВОЗУ в точках, соответствующих установленным битам РО. Иными словами, в РТ указан цвет спрайта.
  • Регистр кода цвета фона содержит 8 триад, каждая из которых содержит код в трех планах ВОЗУ в восьми точках.
  • При чтении РО из него всегда считывается 0. При этом РФ аппаратно загружается содержимым Т-слова из ВОЗУ по текущему адресу.
  • При записи в РО байта РФ аппаратно изменяется в тех триадах, которым соответствуют установленные биты в РО. Эти триады заменяются содержимым РТ. Затем модифицированное содержимое РФ аппаратно же заносится в ВОЗУ по текущему адресу.

§3. Каналы связи между процессорами.

3.0 Принцип разделения труда между процессорами

За одним зайцем погонишься — двух уже
не поймаешь.
А.Кнышев

Давайте попробуем разобраться, зачем в УКНЦ понадобилось ставить 2 процессора вместо одного, да еще и одинаковых.

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

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

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

А взгляните теперь на пользователей УКНЦ! Да в их глазах прямо-таки сияет гордость за родную машину. Ведь как-никак целый процессор отвечает за работу внешних устройств, и целое ОЗУ величиной аж в 32 Кб «брошено» на его нужды.

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

3.1 Общение между процессорами

Присоедините к телефонному аппарату
дверной звонок. Тогда, взглянув в дверной
глазок, вы сможете узнать, кто звонит вам
по телефону.
А.Кнышев

Итак, каждый процессор занимается своим делом, причем одновременно.

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

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

Такой подход не решает, конечно, проблемы общения — ведь ЦП не видит через регистровый доступ ПП и его ОЗУ, а он как-никак центральный!

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

Передача информации ведется побайтно. Двунаправленные — каналы 0 и 1. Однонаправленный канал — канал 2. Эти каналы — высокоскоростные, и их пропускная способность ограничивается лишь расторопностью процессоров.

3.2 Общая структура каналов

Каждый двунаправленный канал (0 и 1) со стороны центрального процессора в странице ввода-вывода имеет 4 регистра:

  • регистр состояния источника;
  • регистр состояния приемника;
  • регистр данных источника;
  • регистр данных приемника.

Однонаправленный канал (2) имеет со стороны ЦП только регистры состояния и данных источника (ЦП по нему может только отправлять информацию).

В странице ввода-вывода ПП схожая картина. Разница в том, что регистры состояния источников объединены в один регистр, то же сделано и с регистрами состояния приемников. Здесь отсутствуют регистры источника для канала 2 (ПП может лишь принимать по нему).

3.3 Описание канальных регистров

Сторона ЦП.

Формат регистров состояний:

7 6 5 4 3 2 1 0
r p
  • 0-5 разряды — не используются.
  • 6 разряд — разрешение прерывания при установленном разряде 7:
1 — прерывание разрешено,
0 — прерывание запрещено.
  • 7 разряд:
Для источников: готовность к передаче данных.
  • Сбрасывается в лог. 0 при записи в регистр данных со стороны ЦП.
  • Устанавливается в лог. 1 по команде RESET и по чтению сответствующего регистра данных со стороны ПП.
Для приемников: готовность к приему данных.
  • сбрасывается в 0 по команде RESET и по чтению со стороны ЦП.
  • устанавливается в 1 при записи в соответствующий регистр данных со стороны ПП.

Формат регистров данных:

7 6 5 4 3 2 1 0
               
Для источников: доступны по записи, читаются как 0.
Для приемников: доступны лишь для чтения.

Сторона ПП.

Формат регистра состояний источников:
Адрес 177076

7 6 5 4 3 2 1 0
  г1 г0 в0 г0 р0

TODO

3.4 Как работают каналы?

Предположим, понадобилось отправить информацию из ЦП в ПП по каналу К0.

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

При этом сбросится бит 7, указывая на то, что канал занят, а по адресу 177060 в странице ввода-вывода ПП (регистр данных приемника ПП) появится наш байт.

Обычно в регистре-приемнике разрешено прерывание (установлен соответствующий разряд), и, так как в регистре состояния приемника установится бит 3 (готовность К0 к приему данных), сработает прерывание, и управление предастся программе обработки прерывания, адрес которой находится в ячейке 320.

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

Этот механизм одинаков для всех каналов и вне зависимости от того, какой процессор выступает в роли источника, какой — в роли приемника информации.

Пример 9. Параллельная инверсия экрана

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

Стартовый сигнал от ЦП к ПП передастся как прерывание от 1-го канала. Для этого программу инвертирования ПП мы сделаем в виде программы обработки прерываний от приемника K1 в ПП. Тогда при старте программы в ЦП произойдет синхронный старт точно такой же программы в ПП.

Установка процедуры в ЦП (работаем в мониторе ЦП):

	176664:	000100
	
	1000:	012737	MOV	#1,	@#176666
		000001
		176666
		000137	JMP	@#40300
		040300
		
	40300:	005737	TST	@#0
	     *	000000
		010046	MOV	R0,	-(SP)
		010146	MOV	R1,	-(SP)
		012700	MOV	#100000,R0
		100000
		012701	MOV	#154540,R1
		154540
	A:	010037	MOV	R0,	@#176640
	     *	176640
		005137	COM	@#176642
	     * 	176642
		005200	INC	R0
		020001	CMP	R0,	R1
		001371	BNE	A
		012601	MOV	(SP)+,	R1
		012600	MOV	(SP)+,	R0

Установка программы в ПП (работаем в мониторе ПП):

	330:	040300

С адреса 40300, но уже в ОЗУ ПП запишите ту же процедуру, изменив три выделенных звездочкой слова:

вместо 0 — 177062,
вместо 176640 — 177010,
вместо 176642 — 177014.

В конце процедуры припишите код 2 (RTI). Теперь войдите в монитор ЦП и дайте старт:

	1000 <ИСП>.

Белая полоса, пробежавшая по экрану — это результат отставания ПП от ЦП.

3.5 Использование каналов в УКНЦ

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

Канал К1 отвечает за работу с принтером (параллельным программируемым интерфейсом).

Канал К2 заведует передачей массивов данных между ОЗУ ЦП и внешними устройствами, доступными периферийному процессору.

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

Резюме к §3

  • В УКНЦ два процессора — центральный и периферийный.
  • Работа их разделена по следующему принципу: ЦП исполняет программы пользователя (в ОЗУ ЦП); ПП программно реализует обслуживание внешних устройств.
  • Центральный процессор «приказывает» периферийному, какие операции следует сделать на ВУ, а ПП выполняет его приказы с помощью программ, расположенных в своем ОЗУ.
  • Приказы отправляются по каналам связи между ЦП и ПП.
  • Есть всего 3 канала — К0, К1, К2. Каналы 0 и 1 — двунаправленные, канал 2 — однонаправленный (от ЦП к ПП).
  • Каналы представлены в страницах ввода-вывода регистрами источников и приемников. И источники, и приемники имеют свои регистры состояния и данных.
  • Регистры данных — это ячейки, младший байт которых доступен для записи из одного процессора, и для чтения из другого. Т.е. РД источника в ПП является и РД приемника в ЦП.
  • Регистры состояния указывают на факты чтения и записи в регистры данных со стороны процессоров, а также разрешают прерывания по этим фактам.
  • Регистры состояния со стороны ПП позволяют также:
    • разрешать прерывания с а.в.п. 314 по команде ЦП RESET.
    • выключать регистры К0 из страницы ввода-вывода ЦП.
  • Умелое использование прерываний от каналов позволяет «синхронизировать» работу процессоров в нужные моменты времени.