Компьютер орион 128

Орион-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) Впрочем, по грамотности я недалеко ушел с тех пор.