Перевод статьи по восстановлению еще одного 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, ...), также со всеми модулями.
Чистка
Мы разобрали компьютер на части и аккуратно промыли их с мылом, а затем компрессором продули насухо. После просушки собрали их в единое целое. Во время этих процедур то тут, то там обнаруживались пятна ржавчины.
Сборка и проверка
Конечно же, ничего не заработало даже когда мы подключили платы процессора и памяти, взятые из своих запасов! Консоль была мертва. Если поначалу мы могли набирать цифровые коды, и они отображались на консоли (семисегментный шестиразрядный индикатор), то спустя какое-то время ситуация ухудшилась, и эта возможность пропала.
KY11-LB
KY11-LB — очень интересная опция, доступная для PDP-11/04 и PDP-11/34. Вы можете не только включать и выключать CPU, отлаживать код, просматривать и изменять память, занося таким образом программы и данные в машину, но и использовать сервисный режим, в котором доступна пошаговая отладка микрокода процессора! Обеспечивается данная возможность подключением пары шлейфов к процессорному модулю. Но если процессор отсутствует или завис, то KY11-LB позволяет работать с Unibus (шина, связывающая модули во многих компьютерах DEC) без участия CPU. Реализуется это за счет наличия своего собственного микропроцессора i8008. На фото ниже обвёл его красным. И это замечательная новость, если вам нужно проверить работу самой шины или провести простые тесты памяти и плат ввода-вывода. Когда запрашивается несуществующий адресат, загорается лампочка BUS ERR. Йёрг Хоппе написал отличный документ по использованию KY11-LB.
Подключив логический анализатор, я проверил, что 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, за исключением того, что блоки кода разбросаны по разным адресам.
Запускаем 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 (0x4455 — magic word).
После этого, я попробовал запустить образ диска с XXDP v2.2. Но, увы, успеха не последовало. Появлялась командная строка XXDP, но любые команды, которые работали с диском, типа «D» (получить список файлов на загруженном носителе), завершались с ошибкой в консоли "?RD ERR". Выглядит это так, как будто программа не может получить доступ к диску. Поэтому я проверил небольшой дистрибутив RT11 (real-time операционная система для PDP-11). Создал образ диска с версией 5.3 и попробовал запустить. И всё прошло замечательно! Можно поиграть в Adventure или попрограммировать на BASIC'e!
Автор: mark_ablov