[Перевод] Восстанавливаем очередной PDP-11/04

Перевод статьи по восстановлению еще одного PDP-11/04. Прошлую трилогию можно почитать тут — часть 1 (сам PDP-11/04), часть 2 (ленточная станция TU60), часть 3 (терминал LA30). Курсивом мои комментарии.

PDP-11/04, присланный Гуннаром


Данный аппарат мы получили от Гуннара Барбро, и с ним шла куча разных вкусностей для PDP-11. Но состояние самого компьютера было далеко от совершенства. Не хватало плат процессора и памяти, переключатель питания был заменен новоделом, к тому же всё было ужасно пыльным. К объединительной плате (backplane) были подключены плата консоли программирования KY11-LB, XY11 (модуль для управления графопостроителем, к примеру IBM 1627, который поставлялся с машинами DEC, и являлся каноничным CalComp 565), KW11-P (модуль программируемого RTC, да-да под RTC шла целая плата! ), основная плата RK11-D с набором модулей (контроллер для накопителей на магнитных дисках, это был набор карт (3 или 4 штуки), объединенный общей платой), и DR11-B (контроллер DMA, который, опять же, состоял из нескольких плат: M7194, M971, M5916, M7820, …), также со всеми модулями.

492fc75ac289468382fab8c4aec39b56.png

Чистка


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

Сборка и проверка


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

KY11-LB


KY11-LB — очень интересная опция, доступная для PDP-11/04 и PDP-11/34. Вы можете не только включать и выключать CPU, отлаживать код, просматривать и изменять память, занося таким образом программы и данные в машину, но и использовать сервисный режим, в котором доступна пошаговая отладка микрокода процессора! Обеспечивается данная возможность подключением пары шлейфов к процессорному модулю. Но если процессор отсутствует или завис, то KY11-LB позволяет работать с Unibus (шина, связывающая модули во многих компьютерах DEC) без участия CPU. Реализуется это за счет наличия своего собственного микропроцессора i8008. На фото ниже обвёл его красным. И это замечательная новость, если вам нужно проверить работу самой шины или провести простые тесты памяти и плат ввода-вывода. Когда запрашивается несуществующий адресат, загорается лампочка BUS ERR. Йёрг Хоппе написал отличный документ по использованию KY11-LB.

60ccb1b556774f6aaedaf3135fd73877.png

Подключив логический анализатор, я проверил, что 8008 на плате M7859 (KY11-LB) работает нормально и исполняет записанную программу корректно. Но код считал, что никто не нажимает никаких клавиш… Выяснилось, что все CLR сигналы (clear, сигнал для очистки регистра) для выходных регистров были в активном состоянии. Контроллер unibus шины, который обрабатывал DCLO сигнал (сигнал на Unibus шине, который информирует о том, что напряжение постоянного тока слишком низкое) глючил. Несколько буферных формирователей с открытым коллектором и регистровых микросхем были неисправны. Как только я их заменил, консоль ожила! Но опять появился сбой после запуска процессора и тестирования диагностикой его функциональности. Причём дважды. Первый — ошибка в M9301, плате начальной загрузке. 8ой бит на шине данных был последним доступным для драйвера шины. Он не мог считать достаточно данных с шины. Второй раз процессор просто-напросто завис. Ничего не выставлялось на шину адреса, а изучение микрокода показало, что затык случился при попытке захвата шины. Процессор заработал только после того, как я вынул M7859 (KY11-LB). Оказалось, что M7859 генерировала 9Мгц-овый сигнал BBSY на шину Unibus (Bus Busy, в активном состоянии сигнализирует о том, что сигналы D0-D15 (по ним шли запрошенные данные) кем-то используются). Почему? Один триггер 7474 сломался и осцилировал как безумный. После его замены, диагностика процессора и памяти прошла успешно!

M9301-YB


В PDP-11/04 M9301-YB это модуль первичной загрузки и терминатор. В PROM’е платы хранится эмулятор консоли и загрузочный код для нескольких распространенных устройств. Чтобы процессор после запуска начинал исполнение сразу с загрузочной области в PROM, модуль формирует на шине (300 мс импульс с помощью мультивибратора 9602) специальный адрес 0173000 (часто для pdp используется восьмеричная система счисления, поэтому нули в начале чисел это не padding, а именно отсылка к СС), а процессор запрашивает адрес возобновления работы после сбоя питания, выставляя на Unibus-шину адрес 024/026 (по первому адресу MMIO-регистр, в котором лежит PC, по второму — PSW, processor status word, различные флаги и состояние процессора). В итоге, по шине идёт запрос на данные по адресам 0173024 и 0173026. Для ячейки 0173024 M9301 находит соответствие между набором значений микропереключателей (на фото — справа по центру, 10 штук) и данными в PROM. Эти переключатели, собственно, и определяют с какого именно адреса в пространстве 0173xxx процессор начнёт исполнение. Я сделал дамп четырёх микросхем PROM — 23–038A9, 23–039A9, 23–040A9 и 23–041A9. Поскольку M9301-YB инвертирует некоторые биты для поддержки возможности дизъюнкции переключателей платы с внешними сигналами (на фото контакты TP1/TP2/TP3, их значения OR’ятся с значениями микропереключателей на плате, к примеру, TP1 связан с S1 и S2), я написал небольшую программу, которая комбинирует эти четыре файла в единый бинарник. Проведя только первичный анализ дизассемблерного листинга, я, тем не менее, уже заметил, что код очень похож на PROM из M9301-YA, за исключением того, что блоки кода разбросаны по разным адресам.

b3ed36adc2c34fb0a3c85bde8286fb35.png

Запускаем RT11SJ и XXDP V2.2

Для запуска каждой из этих программ нужна соответствующая процедура в коде первичного загрузчика. Обычно, такие процедуры идут в отдельной микросхеме PROM, выполнение кода из которой происходит при наборе определенных символов в консольном эмуляторе. Но на этой машине стоит плата M9201-YB, которая не содержит первичного загрузчика DU (у DEC очень информативные названия, DU — это загрузчик с носителя через MSCP (MSCP — это протокол общения с накопителями, типа ATAPI)). Поэтому мне пришлось забить этот загрузчик вручную (консольный эмулятор, который является частью данного модуля, поддерживает 4 функции — загрузка адреса L, чтения памяти по адресу E, запись по адресу D, начало исполнения S, собственно, это и позволяет ввести код вручную. Последовательность команд типа L 016000, D XXXXXX, D XXXXXX, …, S 16002). Было непросто найти подходящий работающий загрузчик, но мне всё же попался один в исходниках SimH (эмулятор разных древних систем). С помошью PDP11GUI, я закинул небольшой файл в память машины. И это работает (по крайней мере, в большинстве случаев).

Дамп этого MSCP загрузчика:

0016000  042125  012706  016000  012700  000000  012701  172150  012704
0016020  016162  012705  004000  010102  005022  005712  100001  000000
0016040  030512  001773  012412  006305  100370  105714  001434  012702
0016060  007000  005022  020227  007204  103774  112437  007100  110037
0016100  007110  112437  007114  112437  007121  012722  007004  010522
0016020  012722  007104  010512  024242  005711  005712  100776  005737
0016040  007016  001743  000000  005011  005003  012704  016020  005005
0016060  005007  100000  007204  000000  000001  004420  020000  001041
0016200  000000  


Начните заполнение памяти с 016000, а выполнение с 016002 (0×4455 — magic word).

7617a397f1c7428c8246121031eb13d2.png

После этого, я попробовал запустить образ диска с XXDP v2.2. Но, увы, успеха не последовало. Появлялась командная строка XXDP, но любые команды, которые работали с диском, типа «D» (получить список файлов на загруженном носителе), завершались с ошибкой в консоли »? RD ERR». Выглядит это так, как будто программа не может получить доступ к диску. Поэтому я проверил небольшой дистрибутив RT11 (real-time операционная система для PDP-11). Создал образ диска с версией 5.3 и попробовал запустить. И всё прошло замечательно! Можно поиграть в Adventure или попрограммировать на BASIC’e!

© Geektimes