Эмоциональная история процессоров для первых компьютеров с 70-х до начала 90-х

Процессоры DEC PDP-11

С начала 70-х в мире началась 10-летняя эпоха доминирования фирмы DEC. Компьютеры DEC были существенно дешевле, производимых фирмой IBM и поэтому привлекли к себе внимание со стороны небольших организаций, для которых системы IBM были недоступны. С этих компьютеров начинается также эпоха массового профессионального программирования. Серия компьютеров PDP-11 оказалась очень удачной. Различные модели PDP-11 производили с начала 70-х до начала 90-х. В СССР они были успешно клонированы и стали первыми массовыми популярными компьютерными системами. Среди клонов компьютеры с названиями СМ ЭВМ, Электроника-60/81/85, ДВК-1/2/3, БК-0010/0011 (БК0010 – это первый ПК, которые стало возможным купить в магазине). Кстати, очень вероятно, что количество компьютеров архитектуры PDP-11, произведенных в СССР, было большим общего числа компьютеров этой архитектуры, произведенных во всем остальном мире.

Однако, DEC продвигала также более дорогие и сложные компьютеры семейства VAX-11, ситуация вокруг которых отличалась некоторой политизированностью. И со второй половины 70-х DEC практически остановила развитие в линии PDP-11. В частности, так и не была введена поддержка 16-х чисел для ассемблера. СУБД Oracle изначально была создана для PDP-11 в 1979, но уже следующую версию в 1983 для этих компьютеров делать не стали – предпочли им системы на MS-DOS. Быстродействие систем PDP-11 также практически не менялось с середины 70-х. Всё это очень удивительно, так как DEC добилась крупных успехов именно с относительно недорогими компьютерами PDP-11, а отказ от их поддержки в пользу дорогих, почти мейнфреймов VAX получался как добровольный отказ от дальнейших успехов. Хотя скорее всего отказ произошел не добровольно, а под давлением IBM, которая таким изящным образом сломила своего опасного конкурента, заставив его "конкурировать" на своем поле. Возможно тут была также замешана большая политика, так как в 1974 в СССР начали клонировать архитектуру PDP-11 и чуть позже произошел странный сдвиг приоритетов у DEC. Произошёл фактический отказ от развития систем PDP-11, в частности, от очень интересной многопроцессорной модели 11/74. Странности у DEC закончились в точности к началу 90-х, когда СССР развалился.

PDP-11/70 (Мисс Хрюшка) из Музея живых компьютеров, работает до сих и свободно доступен через сеть

PDP-11 использовали разные, совместимые по основной системе команд процессоры, например, LSI-11, F-11, J-11. В конце 70-х DEC сделала дешёвый процессор для микрокомпьютеров T-11. Однако, несмотря на казалось бы большое и качественное программное обеспечение, которое можно было бы в перспективе перенести на систему его использующую, T-11 так и не был замечен производителями компьютерных систем. Единственным исключением стала одна модель игровой консоли фирмы Atari. T-11 нашёл себе массовое применение только в мире встроенного оборудования, хотя по возможностям он скорее слегка превосходил z80. В СССР массово выпускались процессоры К1801ВМ1, К1801ВМ2, К1801ВМ3, ... близкие процессорам DEC, а также точные копии некоторых процессоров DEC. Клоны T-11 и J-11 стали производиться только к началу 90-х. Клонирование J-11 тогда считалось особенно большим успехом, а на самом деле – это был шаг на дороге в никуда, просто тратой ресурсов. К1801ВМ1 был функционально близок к T-11. Интересно, что он был спешно переделан из оригинального процессора К1801ВЕ1, который использовался в первом советском ПК Электроника НЦ-8010 в 1981, по принуждающему приказу, скорее из-за общей политической ситуации. Особенно трудно понять такой приказ на фоне действовавших тогда ограничений COCOM. К1802ВМ2, который использовался в ДВК и УКНЦ, теоретически должен быть примерно в два раза быстрее К1801ВМ1, но на практике он обычно лишь чуть быстрее. К1801ВМ3 несколько быстрее К1801ВМ2, поддерживает управление памятью и во многом, кроме своей значительно более низкой тактовой частоты и соответственно более низкой производительности, соответствует лучшим процессорам PDP-11.

Систему команд процессоров архитектуры PDP-11 отличает почти полная ортогональность, приятное качество, но когда его доводят до крайности, это может создавать и нелепые команды. Система команд процессоров PDP-11 оказала влияние на многие архитектуры и в особенности на Motorola 68000. Возможно, что использование нескольких стеков в 68k, – это прямое следствие того, что многие модели PDP-11 также используют несколько стеков. Мнемоники ассемблера для PDP-11 стали основой ассемблеров и для некоторых других популярных процессоров 680x, 6502, ARM.

Система команд PDP-11 строго 16-битная. Все 8 регистров общего назначения (а счетчик команд в этой архитектуре – это обычный регистр R7) – 16 разрядные, регистр состояний (содержит типичные флаги) 16-разрядный тоже, размер команд от 1-го до 3-х 16-разрядных слов. Каждый операнд в команде может быть (хотя есть исключения, например, инструкция XOR) любого типа – это и есть ортогональность. Среди типов – обычные регистр или память. Программисты в 80-е иногда не понимали, почему в системе команд Intel x86 нет команд типа память-память. Это влияние школы PDP-11 и VAX, где запросто можно написать полные адреса у каждого операнда. Это, конечно, медленно и особенно медленно для систем с типичной с начала 90-х медленной памятью. К памяти можно обращаться и через регистр, регистр со смещением, регистр с авто-декрементаций или инкрементацией. Система команд PDP-11 даёт возможность двойного косвенного обращения к памяти через регистр, например, MOV @(R0)+,@-(R1) означает то же, что и оператор языка С/C++ **–r1 = **r1++;, где r0 и r1 декларируются как signed short **r0, **r1;.

Другой пример, команда MOVB @11(R2),@-20(R3) соответствует **(r3-20) = **(r2+11);, где r2 и r3 декларируются как char **r2, **r3;.

В популярных ныне архитектурах одной командой в таких случаях уже не обойтись, понадобится возможно не менее 10 команд. Можно также получать адрес относительно текущего значения счётчика команд. Приведу ещё пример с более простой адресацией. Команде ADD #16,11(R4) в архитектуре Intel x86 можно сопоставить ADD [BX+11],16. В ассемблерах DEC принято писать операнды слева-направо, в отличие от Intel, где пишут справа-налево. Есть основание полагать, что GNU ассемблер для x86 делали под влиянием именно ассемблера PDP-11. Хотя в ассемблере PDP-11 есть странное исключение для инструкции CMP, где операнды почему-то идут как в x86.

Команды умножения и деления только знаковые и доступны не на всех процессорах. Команда деления, как и на 68k, но в отличие от x86, правильно ставит флаги, что позволяет нормально работать со случаями переполнения. Однако не все PDP-11, поддерживающие деление, правильно работают с флагами при таком переполнении. Арифметика десятичных чисел также опциональна – это часть так называемого коммерческого набора инструкций по терминологии DEC. Интересно, что эти инструкции были добавлены из архитектуры VAX, но оказалось, на на PDP-11 они работают быстрее, чем на VAX и от их дальнейшей поддержки из-за этого в итоге отказались!

В качестве курьёза полной ортогональности приведу пример команды MOV #11,#22, которая после исполнения превращается в MOV #11,#11 – это пример использования непосредственной константы в качестве операнда. Другая курьёзная команда – это уникальная команда MARK, код которой нужно класть в стек и никогда нельзя использовать явно. Вызов подпрограмм в архитектуре PDP-11 также несколько своеобразен. Соответствующая команда сначала сохраняет выделенный регистр (может быть любым) в стеке, затем сохраняет счётчик команд в этом регистре и только затем записывает в счетчик команд новое значение. Команда возврата из подпрограммы должна сделать всё наоборот и знать, какой регистр был использован при вызове подпрограммы. В качестве примера необычной команды можно ещё указать на умножение, в котором в зависимости от номера используемого регистра для результата можно получить либо полное 32-битное произведение, либо только его младшие 16 разрядов. Наличии в системе команд абсолютно бесполезных инструкций CLV, SEV, CLZ, SEZ, CLN, SEN демонстрирует некоторую непродуманность в мелочах этой системы. Работа с флагами демонстрирует и некоторые другие недоделки. Например, команда SWAB, меняющая байты в слове местами, зачем-то сбрасывает флаг переноса. Этот же флаг без необходимости меняют и команды TST, CLR, и COM. Также несколько неуклюже реализована работа с переносом в командах ADC и SBC, например, чтобы сделать сложение двух слов с переносом на PDP-11 нужно две команды, в то время как на x86 или 68k достаточно одной. Хотя на IBM/370 для такой операции потребуется даже три команды. Некоторой неожиданностью может стать, что некоторые типовые инструкции выполняются на разных процессорах по-разному, например, MOV R0,(R0)+ или MOV SP,-(SP), – такие инструкции стандартный ассемблер DEC рассматривает как ошибочные. Также по-разному исполняются некоторые команды, использующие счётчик команд (PC) как обычный регистр. Вообще различий между разными моделями PDP-11 довольно много, поэтому писать коды, которые можно исполнять на разных системах не совсем просто. И если отсутствие общей поддержки экзотической инструкции MARK погоды не делают, то отсутствие поддержки популярных инструкций SOB (интересное название!) и XOR может быть раздражающим фактором. Однако, процессоры PDP-11 позволяют через программирование исключений симулировать исполнение практически любых инструкций, что хотя и замедляет исполнение кодов, но снимает остроту проблемы. На x86 подобным образом эмулировать отсутствующие инструкции стало возможным только с 80386.

Необычной архитектурной особенностью некоторых моделей PDP-11 является то, что регистры, например, слово состояния процессора или R1, доступны через адреса как обычная память. Это свойство, однако, создает уязвимости при работе с защитой памяти. Другая необычная особенность в том, что у некоторых моделей PDP-11 есть режим супервизора, который в отличие от многих других архитектур, не является привилегированным, а лишь является дополнительным режимом пользователя. Привилегированный режим называется режимом ядра.

Команды, использующие PC, как обычный регистр, могут весьма озадачить при встрече с ними. Попробуйте понять, что, например, означает INC PC, CALL (PC), MOV -(PC),-(PC) – такие команды иногда реально используют, первая может быть полезна для создания быстрого двукратного цикла!

Для работы с вещественными числами есть две основные опции. Первая – это расширение FIS (Floating Instruction Set), которое позволяет работать на базовом уровне с короткими вещественными. Как правило, FIS использовалось на уровне программной эмуляции. Вторая – это расширение FP11 floating point instruction set, которое даёт значительно большие возможности. Эти расширения используют разные инструкции. В СССР только к концу 80-х был создан чип К1801ВМ4, реализующий второе расширение.

Любопытно, что среди программировших на PDP-11 сложилась культура работы напрямую с машинными кодами. Программисты могли, например, работать без дизассемблера при отладке. Или даже писать небольшие программы прямо в память, не ассемблируя!

Тайминги команд не отличаются слишком скоростными характеристиками. Обращение к памяти даже для J-11 занимает до 8 тактов. Для сравнения для Z80, 8088 или 68000 – это только 4 такта. Удивительно было когда-то узнать, что на отечественном компьютере БК команда пересылки из регистра в регистр занимает целых 12 тактов (10 тактов при использовании кода из ПЗУ), а команды с двумя операндами с двойной косвенной адресацией исполняются за более чем 100 тактов. Z80 делает 16-разрядную регистровую пересылку за 8. Однако, медленность БК вызвана не столько процессором, сколько тормознутым способом работы с памятью. Если бы использовался достаточно быстрый способ, то и БК пересылал 16 регистровых бит за 8 тактов тоже. Когда-то было много споров, что быстрее БК или Спектрум? Сразу надо сказать, что Спектрум – это при использовании верхних 32 КБ памяти один из самых быстрых массовых 8-битных персональных компьютеров. Поэтому неудивительно, что Спектрум быстрее БК, но не намного. А если бы БК работал с памятью без тормозов, то он был бы наверное чуть быстрее.

На первый взгляд, плотность кодов скорее слабое место архитектуры PDP-11. Коды инструкций должны быть кратными длине машинного слова – 2 байтам, что особенно неприятно при работе с байтовыми аргументами или простыми командами вроде установки или сброса флага. Но при сравнении с другими архитектурами PDP-11 показывает на практике иногда даже лучшую плотность кодов!

Интересны попытки сделать персональный компьютер на базе архитектуры PDP-11. Одним из первых ПК в мире, появившихся лишь чуть позже Apple ][ и Commodore PET и скорее чуть раньше Tandy TRS-80, был Terak 8510/a, который имел черно-белую графику и возможность загружать неполный вариант Unix. Этот ПК был довольно дорог и, насколько мне известно, использовался только в системе высшего образования США. С 1978 производился компьютер в виде комплекта для сборки Heathkit H11. Сама фирма DEC тоже пыталась сделать свой ПК, но очень непоследовательно. DEC, например, выпускала ПК на базе z80 и 8088, явно играя скорее против своих основных разработок. Интересно, что некоторые модели PDP-11 используют два набора регистров как и Z80.

В 1978 DEC выпустила серию интеллектуальных терминалов PDT-11, лучший из которых PDT-11/150 можно было использовать как ПК. Настоящие персоналки на базе архитектуры PDP-11 – это DEC PRO-325/350 (1982) и 380 (1985). Фактически это были рабочие станции. Но DEC почему-то только ограничено предоставляла для них своё хорошо известное системное ПО. Это, а также общее нежелание DEC развивать архитектуру PDP-11, привело эти теоретически вполне конкурентные IBM PC машины к быстрому исчезновению из пространства ИТ. Интересно, что для этих машин DEC предлагала плату с процессором Z80 для запуска CP/M. Плат совместимости с IBM PC DEC не предлагала. Этим фактически DEC ставила системы Pro на уровень 8-битных машин! По производительности Pro-325/350 были несколько медленнее первых IBM PC, но Pro-380 обгонял даже топовые Turbo PC XT. По классу программного обеспечения DEC Pro существенно превосходил IBM PC XT.

Лучше всего персонализация технологий мини-компьютеров получилась в СССР, где производились БК, ДВК, УК НЦ, ... Кстати, Электроника-85 – это довольно точный клон DEC PRO-350 на базе клона F-11. Кроме того, родственный архитектуре PDP-11 процессор CP1600 использовался в популярных в начале 80-х игровых консолях Intellivision.

Отечественный 16-разрядный домашний компьютер (модель 1987 года) – почти PDP-11 совместимый

В топовых моделях PDP-11 и близких им отечественных компьютерах процессор может адресовать до 4 МБ памяти, но одной программе при этом может обычно выделяться не более 64 КБ. Однако, используя специальные возможности аппаратуры и системного ПО, можно было создавать и большие коды. Лучшие процессоры DEC, например, J-11 могут использовать раздельное адресное пространство для инструкций и данных, что увеличивает размер адресного пространства вдвое и никак не замедляет исполнения. Массовые отечественные процессоры такого не умели. И тут стоит заметить, что даже первые процессоры x86, умели такое прямо "из коробки" и более продвинуто, выделяя таким образом до 256 КБ, а если считать пространство портов, то и все 320КБ. Размер исполняемого кода в PDP-11 можно также увеличивать через оверлеи, размещаемые в памяти. Работа с оверляеми PDP-11 требует основательной поддержки со стороны ОС и компиляторов и медленнее, чем дальние вызовы в первых x86. Для работы с большими данными на PDP-11 можно использовать виртуальные массивы, что опять требует хорошей поддержки со стороны ОС и компиляторов и также медленнее, чем работа с большими массивами на первых x86.

По быстродействию лучшие процессоры для PDP-11 по числу операций на мегагерц близки к 8086. Однако из-за более высоких используемых частот, лучшие PDP-11 были быстрее первых IBM PC, но уже первые AT с ними практически сравнялись. Персоналки DEC Pro-325/350 по производительности примерно соответствовали первым IBM PC на частоте 4 МГц, а Pro-380 был несколько медленнее первых IBM PC AT. Кстати, первые микропроцессоры DEC, LSI-11 и F-11, были даже медленнее первых советских чипов К1801ВМ1 и К1801ВМ2. Можно, поэтому предположить, что микропроцессоры DEC создавались только с целью удешевить производство. Интересно, что LSI-11 и F-11 состоят из нескольких чипов, а J-11, T-11 и все советские из одного.


Cтатья опубликована на geektimes, а также переведена на английский.