Орион-128/Радио 06-91/Организация экранной памяти

Материал из Emuverse
Данный материал защищён авторскими правами!

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

Автор: В. СУГОНЯКО, В. САФРОНОВ

Источник: http://retro.h1.ru/Orion/DspMem/DspMem.php

Одна из важных задач, которую помогают решать самодельные («гаражные») компьютеры — не только приобщение радиолюбителей к конструированию аппаратуры, но и изучение ими основ программирования. Можно спорить о целесообразности промышленного выпуска компьютеров подобного класса (хотя их дешевизна и простота дают основание для такого спора), но трудно отрицать тот факт, что тысячи любителей, пройдя школу «Микро-80» и «Радио-86РК» стали «на ты» с микропроцессорными системами, многие профессиональные программисты выросли из среды бывших самодельщиков.

В этой статье мы постараемся помочь тем, кто хочет глубже вникнуть в устройство ПРК «Ориона-128» и расскажем о некоторых особенностях его построения — вскользь они уже затрагивались в предыдущих публикациях, но продолжают вызывать вопросы со стороны читателей.

Итак, вернемся немного назад и посмотрим, что из себя представляет «память» нашего ПРК. Рассмотрение устройства памяти ПРК «Ориона-128» удобнее начать с экранной области ОЗУ (или, как еще говорят, видеоОЗУ). Отличие видеоОЗУ «Микро-80» и «Радио-86РК» состоит в том, что информация, записанная в ячейки этой области, непосредственно отображается на экране дисплея, минуя дополнительное преобразование в аппаратно исполненном знакогенераторе.

Область видеоОЗУ «Ориона-128» занимает в основной странице памяти адресное пространство размером 12К, начиная с адреса 0C000H (по адрес 0EFFFH включительно). Кроме того, если включен цветной режим, в формировании изображения участвует соответствующая ей область дополнительной страницы, расположенная в тех же адресах, и общий объем используемой под видеоОЗУ памяти становится равным 24К. Каждая ячейка ОЗУ экранной области соответствует восьми расположенным в горизонтальный ряд точкам одной строки растра ЭЛТ. На рис.1 в качестве примера показано увеличенное схематическое изображение левого верхнего угла экрана.

Если компьютер работает в монохромном режиме, ячейки дополнительной страницы в формировании изображения не участвуют и изображение целиком зависит от того, какая информация в данный момент записана в ячейках видео области основной страницы. Бит, установленный в 1, дает на экране одну светящуюся точку. Если бит равен 0 — точка погашена. Так, например, чтобы получить такую картину — полностью погашенный экран и одна светящаяся точка в левом верхнем углу, необходимо заполнить всю область 0C000H- 0EFFFH байтами со значением 00Н, а в ячейку 0С000Н записать значение 80Н (двоичное представление шестнадцатиричного числа 80Н-10000000).

Распределение ячеек по пространству экрана показано на рис.2. Ячейки памяти располагаются последовательно друг за другом вертикальными колонками по 256 (100H) в каждой. Адрес ячейки задается двумя байтами — старший определяет номер колонки, младший — номер ячейки в колонке. Так, для того, чтобы перейти от некоторой ячейки памяти к соседней, расположенной ниже, надо увеличить на единицу значение младшего байта адреса, на ячейку выше — уменьшить на единицу это значение. Аналогично, для того чтобы перейти от некоторой ячейки к соседней, расположенной справа или слева от заданной, надо проделать такие же операции со старшим байтом адреса.

Для программиста, занимающегося разработкой программ, работающих непосредственно с ОЗУ, в том числе и с экранной областью, необходимо иметь представление об общей структуре памяти компьютера. Память компьютера можно представить в виде ленты, на которой друг за другом расположены ячейки, начиная с самой первой, имеющей адрес 0 до последней, с адресом 0FFFFH (в десятичной форме записи это число равно 65535). Однако рассмотренное нами устройство видеоОЗУ показывает, что гораздо удобнее придерживаться несколько другого представления о памяти «Ориона-128», такого, например, какое показано на рис.3.

На этом рисунке вся память схематически представлена так же, как для экранной области (см. рис.2), колонками по 256 ячеек. Основная экранная область при этом является составной частью общего поля памяти. Точно так же, как и основная страница ОЗУ, расположена дополнительная страница. Она показана сзади основной, параллельно ей. Это объясняется тем, что адреса ячеек дополнительной страницы соответствуют адресам ячеек основной, а то, с какой областью в настоящий момент работает процессор, зависит от состояния системного порта переключения страниц. Служебная область, с адреса 0F000H по адрес 0FFFFH, включает в себя служебное ОЗУ (0F000H- 0F3FFH), порты (0F400H-0F7FFH), ПЗУ и системные порты (0F800H-0FFFFH). На рис.3 она выглядит «склеенной». Это значит, что независимо от состояния системного порта страниц при обращении по этим адресам процессор однозначно будет иметь доступ к системной области.

В вопросах читателей встречается просьба более подробно рассказать о переключении экранов. Пространство ОЗУ, начиная с нулевого адреса и по адрес 0BFFFH, на рис.3 показано условно разделенным на три 16-килобайтных области. Отображаться на экране дисплея может информация, содержащаяся в любой из них. Для переключения экранов служит системный порт 2 (то есть область с адресами 0FA00H — 0FAFFH. Записывая в любую ячейку этой области значения 0, 1, 2 или 3, мы включим на отображение область экрана с соответствующим номером). Следует заметить, что возможность такого переключения была заложена еще при теоретической проработке будущего компьютера. На практике пока только одна-две большие программы используют этот режим, да и то манипулируют только двумя экранными областями. В этих программах использование двух экранов необходимо для быстрой смены информации на дисплее — «перекачка» 12К видеоОЗУ и 12К атрибутов цвета занимает достаточно большое (относительно, конечно) время, и, если такую смену надо делать часто, использование переключения экранных областей себя оправдывает. Что касается полного использования режима четырех экранов, то здесь можно сказать следующее: программы, которые будут использовать все четыре экрана в цветном варианте, должны быть достаточно специфическими.

Во-первых, тело основной программы придется размещать в «окнах», которые не отображаются на дисплее — З000Н-3FFFH, 7000Н-7FFFH, 0В000Н-0BFFFH. Во-вторых, эта программа скорее всего будет рассчитана на работу не в операционной среде «ORDOS», так как в «ORDOS» дополнительная страница ОЗУ всегда используется как электронный квазидиск, и имеет структуру, которую нельзя нарушать. Тем не менее такая возможность существует, и программисты ПРК «Ориона-128» должны это учитывать.

И, наконец, остановимся более подробно на вопросе, каким образом выводится на дисплей нашего ПРК цветная графическая информация.

ПРК «Ориона-128» имеет 3 режима отображения информации на дисплее — монохромный, четырехцветный и 16-цветный. Будем называть их режим 0, режим 1 и режим 2. Напомним, что для переключения режимов достаточно записать в системный порт с адресами 0F800H-0F8FFH (то есть в любую ячейку этой области) одно из следующих значений, являющихся основными: 0, 4, 6 (могут использоваться так же дополнительные: 1,2,3,5,7- значения 1 и 5 включат те же режимы, что и 0, 4, но в другом цветовом решении — палитре 2 — отключит изображение; значения 2 и 3, а также 6 и 7 равнозначны).

Как уже было сказано выше, в режиме 0 ячейки дополнительной страницы не принимают участие в формировании изображения. Получение 4-цветного изображения иллюстрируется рис.4. В этом режиме цвет каждой точки растра определяется значениями двух битов, один из которых берется из ячейки в основной области, другой из ячейки с тем же адресом дополнительной страницы, получившееся двоичное число (от 0 до 3), и дает цвет, в который окрашена точка: 00 — черный, 01 — красный, 10 — зеленый, 11 — синий.

Можно проделать эксперимент, непосредственно записывая значения в ячейки экранной области, пользуясь, например, программой «М128$». Для этого вызовите программу «М128$» и выполните директиву COLOR 0 (это делается для того, чтобы заполнить экранную область дополнительной страницы значениями 00Н). Изображение при этом пропадет. Теперь нажмите кнопку системного сброса и вновь вызовите «М128$». Директивой MODIFY F8001 запишите в системный порт значение 4 и нажмите «.» (точку), чтобы выйти обратно в меню программы «М128$». Далее директивой MODIFY Е8801 запишите в эту ячейку дополнительной страницы значение из примера на рисунке 4 (1E) и вновь нажмите «.». Наконец, в ячейку с тем же адресом, но в основной странице, запишите значение 93Н (директива MODIFY Е8801).

Если вы правильно проделаете все действия и сведение лучей вашего телевизора достаточно хорошее, вы получите 8 цветных точек, расположенных так, как это показано на рис.4.

В режиме 2 окраска точек происходит совершенно по-другому (рис.5). В этом режиме 8 точек каждой ячейки могут быть окрашены в одно из 256 сочетаний 16 цветов фона и 16 цветов переднего плана. Точками фона считаются точки, значения соответствующих битов которых в байте основной области равны 0 — в наших примерах это (считая слева направо) 2-я, 3-я, 5-я и 6-я точки, а передний план (изображение) — 1-я, 4-я, 7-я и 8-я точки. Ячейка дополнительной области в данном случае определяет, какой цвет имеют те и другие. Старшая тетрада байта этой ячейки задает окраску фона, младшая — изображения. Так, в примере на рис.5 выбрано сине-желтое сочетание.

Проверить все сказанное можно так же, как и в случае с 4-цветным режимом: с помощью программы «М128$». Если вы будете это делать, то вместо директивы COLOR О нужно выполнить директиву COLOR О А и, не пользуясь системным сбросом, перейти к следующему пункту, но в ячейку 0F800H (системный порт цвета) нужно записать не 4, а 6. Все дальнейшие действия повторяются.

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

В режиме 2 каждый бит тетрады отвечает за один из основных цветов, а старший (биты 7 и 3- соответственно для старшей и младшей тетрады) — за яркость цвета (1 — полная яркость, 0 — несколько пониженная): D7 (D3) — яркость, D6 (D2) — красный, D5 (D1) — зеленый, D4 (D0) — синий.

Так, в примере на рис.4 желтый цвет получается сочетанием зеленого и красного (биты D2 и D1), а яркость его определяет установленный в 1 бит D3.

Для записи байта в дополнительную страницу ОЗУ (и соответственно для задания атрибутов цвета любой ячейки экрана) служит специальная подпрограмма «Монитора», адрес входа в которую 0F8З0Н. Для обращения к этой подпрограмме необходимо в регистр С занести значение записываемого байта, а в аккумулятор — значение 1 (признак того, в какую страницу производится запись).

В. СУГОНЯКО, В. САФРОНОВ

Московская обл.

Отсканировано с журнала Радио № 6 1991 г.

Отредактировано Лесных Ю. 2001 г.