Орион-128: радиолюбительский компьютер
Исторически, первым массовым радиолюбительским компьютером был Радио-86РК, требовавший для построения всего 29 микросхем. Его существенным ограничением был то, что он поддерживал только текстовый режим и требовал трудно-доставаемых микросхем. Орион-128 - был логическим продолжением - также ориентирован на сборку радиолюбителями, имел больше памяти (128кб против 16/32кб) и поддерживал графический режим : 384 × 256 (в режиме 2 цвета, 4 цвета, и 2 цвета из палитры 16 цветов на каждые 8 пикселей). Ориентировочный размер популяции Орион-ов в период его пика популярности - около 30-40 тыс. компьютеров.Орион появился у меня в 94-м году, и именно на Орионе я запускал свои первые программы (до него их приходилось писать "в стол"). К моменту приобретения первой PC-шки в 97-м - Орион начал глючить все забористее (не грузился с первого раза, приходилось много раз перезагружать...) и под конец перестал работать совсем. Отремонтировать я его тогда не мог, и все эти годы он пролежал без движения, но не забытым.
Этим летом я наконец решил попробовать его отремонтировать - что из этого получилось (а также обзор архитектуры и некоторых программных особенностей) - под катом.
Архитектура
Сердце компьютера - процессор КР580ВМ80А, советский аналог Intel 8080. Для упрощения конструкции - слово состояния процессора не захватывалось (там процессор "говорит" когда пишет в стек, читает или пишет в порты ввода/вывода). Также отсутствует контроллер прерываний.В самых верхних адресах находится ППЗУ Монитор-а (BIOS). Он сделан интересно - все его функции вызываются через таблицу в самых верхних адресах памяти, которые просто выполняют безусловный переход на место фактической реализации функции, таким образом при изменении реализаций функций адреса вызова остаются прежними, и остается возможность их добавления (таблица растет "вниз").
Порты ввода вывода - были отображены на память, т.е. если при декодировании адреса мы видели что адрес=адресу порта, то происходила запись в регистр порта. Адреса портов находились в области Монитора, куда все равно записывать нельзя. Порты были сделающие:
Процессор КР580ВМ80А - имеет 16-и битную шину адреса, и соответственно может адресовать только 64кб памяти, порт переключения страниц позволяет процессору выбирать текущую страницу памяти. Но если мы переключаем страницу - и программа будет выполнятся из другой страницы по тому же адресу! Т.к. в таких условиях работать сложно, обычно всю работу с дополнительными страницами делает монитор (т.к. он "виден в памяти" на всех страницах), но это конечно не слишком быстро.0F400H — порт клавиатуры 0F500H — порт пользователя № 1 0F600H — порт пользователя № 2 0F700H — порт платы расширения 0F800H — управление графическим режимом (только для записи) 0F900H — переключение страниц памяти (только для записи) 0FA00H — переключение адреса экранной области памяти (только для записи) 0FB00H — системный порт № 4 (только для записи, не используется)
Вывод графики реализован следующим образом: двоичные счетчики постоянно перебирают текущий адрес видеопамяти. Мультиплексоры могут подключать к адресным выводам памяти то адресную шину процессора (когда ему это надо), то адрес перебираемый счетчиками. Каждый адрес видеопамяти - читается 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 Ом рядом с источником сигнала - звон пропал, но проблема осталась:
▶ Суть последовательного терминирования
Мистики добавляло то, что при подключении земли осциллографа - пропадания изображения прекращались. Оказалось, проблема была в плохом сетевом блоке питания 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
Общий вид в законченном виде:
Небольшая платка в левой части - ▶ схема сдвига экрана вниз (иначе первая строчка на ЖК-телевизорах обрезается)
На ромдиске нашлась и моя первая программа, которая была представлена миру, HALPER (да, в названии небольшая ошибка ). Самая жесть была в том, что в редакцию журнала "Радио" я отсылал шестнадцатеричный дамп написанный от руки, да еще и с парой исправлений - но все равно кому-то было не лень её набирать (видимо более серьезных публикаций было недостаточно):
Востановление (facepalm) Впрочем, по грамотности я недалеко ушел с тех пор.
Стоило ли это того?
Лично для меня последний скриншот - стоил всех трудов. Ну и конечно разрешение глобальной проблемы детства и отрочества - бесценно.Помимо этого, удалось лучше разобраться с тем, как на самом деле работают (старые) компьютеры, и понять какой я иногда криворукий, ведь все КЗ, с которыми я самоотверженно боролся - сделаны были мной-же.
Информация по Ориону-128
Emuverse - Wiki со ссылками и публикациями журнала Радио.http://orion128.nikom.biz/ - Собрание всего софта для Ориона
http://zx.pk.ru/forumdisplay.php?f=56 - Форум по Ориону на http://zx.pk.ru , там же собирают новые Орионы (и конечно много других тем по винтажным компьютерам)
http://www.nedopc.org/forum/viewforum.php?f=39 - Форум по советским компьютерам на http://nedopc.org
http://emu80.org/ - универсальный эмулятор 8-и битных компьютеров, под Windows ("Радио-86РК", "Партнер", "Апогей", "Микроша", "Специалист", "Орион", "Микро-80", "ЮТ-88")