Орион-128: радиолюбительский компьютер

:

Исторически, первым массовым радиолюбительским компьютером был Радио-86РК, требовавший для построения всего 29 микросхем. Его существенным ограничением был то, что он поддерживал только текстовый режим и требовал трудно-доставаемых микросхем. Орион-128 — был логическим продолжением — также ориентирован на сборку радиолюбителями, имел больше памяти (128кб против 16/32кб) и поддерживал графический режим: 384 × 256 (в режиме 2 цвета, 4 цвета, и 2 цвета из палитры 16 цветов на каждые 8 пикселей). Ориентировочный размер популяции Орион-ов в период его пика популярности — около 30-40 тыс. компьютеров.

Орион появился у меня в 94-м году, и именно на Орионе я запускал свои первые программы (до него их приходилось писать «в стол»). К моменту приобретения первой PC-шки в 97-м — Орион начал глючить все забористее (не грузился с первого раза, приходилось много раз перезагружать...) и под конец перестал работать совсем. Отремонтировать я его тогда не мог, и все эти годы он пролежал без движения, но не забытым.

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

Сердце компьютера — процессор КР580ВМ80А, советский аналог Intel 8080. Для упрощения конструкции — слово состояния процессора не захватывалось (там процессор «говорит» когда пишет в стек, читает или пишет в порты ввода/вывода). Также отсутствует контроллер прерываний.

В самых верхних адресах находится ППЗУ Монитор-а (BIOS). Он сделан интересно — все его функции вызываются через таблицу в самых верхних адресах памяти, которые просто выполняют безусловный переход на место фактической реализации функции, таким образом при изменении реализаций функций адреса вызова остаются прежними, и остается возможность их добавления (таблица растет «вниз»).

Порты ввода вывода — были отображены на память, т.е. если при декодировании адреса мы видели что адрес=адресу порта, то происходила запись в регистр порта. Адреса портов находились в области Монитора, куда все равно записывать нельзя. Порты были сделающие:

0F400H — порт клавиатуры
0F500H — порт пользователя № 1
0F600H — порт пользователя № 2
0F700H — порт платы расширения
0F800H — управление графическим режимом (только для записи)
0F900H — переключение страниц памяти (только для записи)
0FA00H — переключение адреса экранной области памяти (только для записи)
0FB00H — системный порт № 4 (только для записи, не используется)

Процессор КР580ВМ80А — имеет 16-и битную шину адреса, и соответственно может адресовать только 64кб памяти, порт переключения страниц позволяет процессору выбирать текущую страницу памяти. Но если мы переключаем страницу — и программа будет выполнятся из другой страницы по тому же адресу! Т.к. в таких условиях работать сложно, обычно всю работу с дополнительными страницами делает монитор (т.к. он «виден в памяти» на всех страницах), но это конечно не слишком быстро.

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

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

Тут и находится основной недостаток Ориона — скорость вывода текста очень низкая (около секунды на страницу текста в цветном режиме), особенно по сравнению с Радио-86РК. Процессор делает 300-500 тыс. операций в секунду (при тактовой частоте 2.5Мгц), а запись на дополнительную страницу памяти — это по меньшей мере десяток операций.

У меня была заводская версия Ориона:

Т.к. компьютер был заводской, печатная плата отличалась от журнального варианта, и были некоторые отличия в схеме, что не облегчало задачу. Также на проводах (в левой части платы) висел счетчик К155ИЕ5 — конечно я понятия не имел, зачем он там висит, еще одна загадка.

По советам — заменил советские керамические конденсаторы на новые. Блок питания был больным местом Ориона (и у меня выдавал неправильные напряжения) — его я полностью заменил на новые импульсные. Орион требовал напряжения +5, +12 и -5В (вернее, эти напряжения требовал процессор КР580ВМ80А, всему остальному достаточно было +5).


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

Первой моей мыслью было то, что за 20 лет испортилось содержимое Монитора (защитное окошко не было заклеено изолентой) — заказал программатор TL866, слил прошивку — и к моему сожалению она совпала до байта с журналом. Печаль. Идей не было никаких.

Я знал, что если с -5 и 12В напряжениями есть проблемы — процессор может сгореть. Поэтому заменил процессор и шинный формирователь на шине данных — но это не дало никакого результата.

Сигналы RAS и CAS — похожи на правду (т.к. это наиболее высокочастотные сигналы — с ними также бывают проблемы).

Заметил, что один из битов шины данных — всегда 1. Оказалось, я случайно закоротил его на +5В когда перепаивал конденсаторы. Только сейчас я начал понимать, зачем на печатных платах паяльная маска :-)

Тест памяти заработал, но очень странно, после тестирования первой страницы памяти — снова тестировал первую, а не вторую. Подозрения пало на регистр текущей страницы памяти (порт 0F900H) — или не проходит запись, или потом это значение не переключает страницу.

Для того, чтобы легче было дебажить — написал программу вместо Монитора, которая постоянно переключает страницу памяти. Достал из Ориона старую EEPROM КС573РФ2, и начал стирать… Через пол часа под кварцевой лампой — прошивка все еще совпадала байт в байт (более современные EEPROM 27512 — стирались за 35-45 секунд)… Только через час прожарки микросхема была чистой. Но при попытке её записать — меня постигла былинная неудача, как оказалось, программатор может выдавать напряжение программирования не выше 21В, а КС573РФ2 требует 26.

Можно было конечно хакать программатор, но я решил припаять более современную флешку с электрическим стиранием — расположение выводов конечно не совпадало, и припаивать пришлось на проводах («многоэтажная» печатная плата не влезала по высоте). Переключатели — позволяют выбирать один из нескольких залитых Мониторов, и припаяны к первым неиспользуемым битам адреса с подтяжкой к 0 (КС573РФ2 — 2кб, 11 бит, значит переключатели на 12-13-14 битах):

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

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

Идей далее не было. Заметил, что на выходах двух микросхем памяти нет данных, заменил их. Старый текстолит проявлял себя с худшей стороны — чернел при пайке феном (про чернеющий от фена текстолит мне рассказывала страшные сказки мама — но я не верил), дорожки отваливались… Депрессивное зрелище. В отпаивании без фена — помогал паяльник с оловоотсосом (чудесное изобретение, расплавляешь припой, жмешь кнопку — и он все всасывает, главное потом плату не заляпать), и медная оплетка (solder wick), коей изведена была целая куча:

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

После пристального изучения платы с лупой — удалось найти еще 2 КЗ, которые сделал я, но тест памяти работать не начинал. Тогда я тотальной прозвонкой обнаружил, что на шине данных еще один КЗ — но просмотрев всю шину данных его я не нашел. Пришлось конкретный бит шины данных разрезать на кусочки, чтобы сузить круг поисков. Наконец КЗ нашлось — оно оказалось настолько микроскопическим, что его едва было видно в лупу. Причина по которой у меня так легко получались КЗ оказалось простой — я по ошибке вместо обычного припоя ПОС60 взял легкоплавкий с Висмутом (температура плавления 144 градуса). При контакте с паяльником с температурой 250 градусов — флюс мгновенно вскипал, и мельчайшие капли припоя разбрасывал вокруг. А я еще ломал голову, почему после пайки поверхность получается матовая…

Тест памяти заработал, и похоже найденные в процессе осмотра КЗ решили проблему с переключением страницы, теперь шина данных в 0 не сбрасывалась в самый ответственный момент, и переключение страницы работает стабильно:

Однако загрузка ORDOS с внешнего ROM-диска все еще не работала. Прочитав 3 байта с ром-диска руками через порты (команды для этого есть в Мониторе-1), увидел что 2 бита данных приходят неправильные (сравнивал с образом ROM-диска слитым на программаторе). После пропайки ромдиска — ORDOS загрузился! Радости не было предела:

Однако проблемы еще оставались: тест памяти показывал ошибку памяти на второй странице после прогрева, иногда пропадало изображение на телевизоре, особенно часто при тесте второй страницы памяти, и нужно было что-то делать с висящей на проводах мистической К155ИЕ5:

Микросхему памяти заменить было легко, а вот с пропаданием изображения пришлось помучатся. Подозрение упало на сигнал разрешения записи данных из видеопамяти в регистры формирования видеосигнала (запись туда запрещается когда процессор обращается к памяти). Дорожка была длинная (~50см), и поскольку никакого согласования импеданса нет — сигнал отражался от концов дорожки, превышая допустимый уровень 0 в TTL логике (0.4В) — это могло вызвать проблемы. Поэтому я реализовал последовательное терминирование — резистор 220 Ом рядом с источником сигнала — звон пропал, но проблема осталась:

Суть последовательного терминирования
Допустим волновое сопротивление дорожки — 220 Ом. Без терминирования — 5В импульс дойдет до конца дорожки, отразится, и мгновенное напряжение там будет 10В. Большая часть конечно срежеться на защитных диодах внутри микросхемы, но всплеск до 10В будет. Если же мы поставим резистор 220Ом рядом с источником сигнала — то по дорожке пойдет 2.5В (т.к. у нас получается делитель напряжения), когда 2.5В дойдет до конца дорожки и отразится обратно — как раз получится 5В, ровно столько, сколько нужно.

Волновое сопротивление дорожки зависит от её ширины и близости к земле, для тонких дорожек без земляного полигона под ней — оно высокое, сотни Ом.


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

После отслеживания К155ИЕ5 на проводах — оказалось, что она частично заменяет К1533ИЕ5, впаянную в плату. Зачем нужно было оставлять её висящую на проводах — мне не ясно. К1533ИЕ5 выкусил, К155ИЕ5 впаял — и все работает! 1533 серия — это буржуйская ALS, 155 — обычная ТТЛ. У ALS — пониженная нагрузочная способность и скорость, видимо в этом и была изначальная причина замены.

Более полная таблица соответствия отечественной и зарубежной ТТЛ логики
K155 - 74
K133 - 54
K530 - 54S
K531 - 74S
K533 - 74LS
K555 - 74LS
K1531 - 74F
K1533 - 74ALS
К1564 - 74HC

Общий вид в законченном виде:

Небольшая платка в левой части —

схема сдвига экрана вниз (иначе первая строчка на ЖК-телевизорах обрезается)
Проект платы для Eagle — 3.14.by/files/orion_sync.zip
Диоды любые, резистор 1к, навесным монтажом развязывающий конденсатор.
Микросхема — 74AC1G14 / 74AC1G04 / 74HC1G14 / 74HC1G04 (1 гейт инвертора с/без триггера Шмитта).

3 входа подключаются к ногам 8,9,11 DD4, выход — к ноге 13 DD7.4 (соответственно, дорожку ведущую к н.13 DD7 нужно обрезать рядом с DD7).

В оригинальной схеме, которую сейчас не смог найти (где-то на радиокоте) — ИЛИ было на микросхемах, а инвертор на транзисторе, я сделал ИЛИ на диодах а инвертор на микросхеме.


На ромдиске нашлась и моя первая программа, которая была представлена миру, HALPER (да, в названии небольшая ошибка ). Самая жесть была в том, что в редакцию журнала «Радио» я отсылал шестнадцатеричный дамп написанный от руки, да еще и с парой исправлений — но все равно кому-то было не лень её набирать (видимо более серьезных публикаций было недостаточно):

Востановление (facepalm) Впрочем, по грамотности я недалеко ушел с тех пор. Лично для меня последний скриншот — стоил всех трудов. Ну и конечно разрешение глобальной проблемы детства и отрочества — бесценно.

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

Emuverse — Wiki со ссылками и публикациями журнала Радио.
orion128.nikom.biz — Собрание всего софта для Ориона
zx.pk.ru/forumdisplay.php?f=56 — Форум по Ориону на zx.pk.ru, там же собирают новые Орионы (и конечно много других тем по винтажным компьютерам)
www.nedopc.org/forum/viewforum.php?f=39 — Форум по советским компьютерам на nedopc.org
emu80.org — универсальный эмулятор 8-и битных компьютеров, под Windows («Радио-86РК», «Партнер», «Апогей», «Микроша», «Специалист», «Орион», «Микро-80», «ЮТ-88»)