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

Intel 8080 и 8085

8080 стал первым настоящим процессором, его производство началось в первой половине 1974 года. Первый вариант 8080 имел некоторые недоделки и поэтому его через полгода заменили на 8080A, который по факту часто называют тоже 8080. Этот процессор до сих пор производится и находит себе применение. Он многократно клонировался по всему миру, в СССР имел обозначение КР580ВМ80А. Современные процессоры Intel для РС до сих пор легко обнаруживают свою родственность этому уже в каком-то смысле реликтовому изделию. Сам для этого процессора кодов не писал, но будучи хорошо знакомым с архитектурой z80, рискну привести некоторые свои замечания.

Систему команд 8080, как и других процессоров Intel для РС, трудно назвать идеальной, но она универсальная, достаточно гибкая и имеет несколько очень привлекательных особенностей. От своих конкурентов, Motorola 6800 и MOS Technology 6502, 8080 выгодно отличался большим количеством пусть и несколько неуклюжих регистров, предоставляя пользователю один 8-битный аккумулятор А, один 16-битный полуаккуммулятор и по совместительству быстрый индексный регистр HL, 16-разрядный указатель стека SP, а также ещё два 16-битных регистра ВС и DE. Регистры BC, DE и HL можно было использовать и как 6 байтовых регистров. Кроме того, 8080 имел поддержку почти полного набора флагов состояния: переноса, знака, нуля и даже чётности и полупереноса. Некоторые инструкции из набора команд 8080 долгое время были чемпионами по быстродействию. Например, команда XCHG делает обмен содержимым 16-битных регистров DE и HL всего за 4 такта – это было исключительно быстро! Ряд других команд хотя и не ставили столь яркие рекорды, но также долгое время были одними из лучших:

Для 8080 есть отсутствующая в других мне известных архитектурах команда инвертирования переноса.

8080 помимо основной памяти, размером в 64 КБ, может использовать ещё два адресных пространства: портов ввода-вывода, размером 256 байт, и стека, размером 64 КБ. Преемники 8080, 8085 и Z80, последнюю возможность не унаследовали.

Этот процессор был использован в первом персональном компьютере Altair 8800, ставшим весьма популярным после журнальной публикации в начале 1975. К слову, в СССР похожая публикация случилась только в 1983, а соответствующая ей по актуальности только в 1986.

Первый почти ПК

Intel 8080 стал основой для разработки когда-то первой массовой профессиональной операционной системы CP/M, занимавшей доминирующие позиции среди микрокомпьютеров для профессиональной работы до середины 1980-х.

Теперь о недостатках. 8080 требовалось три напряжения питания -5, 5 и 12 вольт. Работа с прерываниями скорее неуклюжая: нужен специализированный контроллер и немаскируемые прерывания не поддерживались. И в целом 8080 скорее нетороплив, если сравнить его с вскоре появившимися конкурентами. 6502 мог быть до 3-х раз быстрее при работе на той же частоте, что и 8080. В системе команд несколько раздражает наличие 6 бессмысленных инструкция типа MOV A,A – их могли бы не документировать, сохраняя пространство кодов для новых операций. Команду десятичной коррекции можно использовать только после сложения, а после вычитания для десятичной коррекции нужно использовать специальный код, обычно состоящий из 4 инструкций. Нет команд нециклических сдвигов. Реализация работы с адресными пространствами портов и стека, требует для 8080 дополнительной внешней логики. 8085 и Z80 могут использовать порты напрямую.

Но в архитектуре 8080 было заложено, как оказалось, правильное видение будущего, а именно того неочевидного в 70-х факта, что процессоры будут быстрее памяти. Регистры 8080 DE и BC – это скорее прообраз современных кэшей, с ручным управлением, чем регистры общего назначения. 8080 начал с частоты 2 МГц, а конкуренты только с 1, что сглаживало разницу в производительности.

Первое время 8080 продавался по весьма высокой цене $360, но это была своеобразная ссылка на большие компьютеры IBM/360. Intel как бы сообщала, что если купить 8080, то можно получить что-то похожее на очень дорогой мейнфрейм.

Трудно назвать 8080 8-битным процессором на все 100%. Конечно, АЛУ у него на 8 бит, но есть много 16 разрядных команд, работающих быстрее, чем если использовать только 8-битные аналоги вместо них. А для некоторых команд 8-битных аналогов нет вообще. Команда XCHG по сути и таймингам 100% 16-битная. Есть реальные 16-разрядные регистры. Поэтому рискну назвать 8080 частично 16-битным. Было бы интересно по совокупности признаков вычислять индекс разрядности процессора, но, насколько известно автору, пока такой работы никто не проделал.

Автор не знает причины, почему Intel отказалась от прямой поддержки развития 8-битных персоналок своими процессорами. Intel всегда отличaла сложность и неоднозначность политики. Её связь с политикой, в частности, иллюстрирует тот факт, что долгое время у Intel функционируют заводы в Израиле и до конца 90-х это было тайным. Intel практически не пыталась улучшить 8080, была лишь до 3 с небольшим МГц поднята тактовая частота. Фактически 8-битный рынок был передан фирме Zilog с родственным 8080 процессором z80, который смог довольно успешно противостоять главному конкуренту, "терминатору" 6502. А Zilog к концу 70-х была компанией с огромными возможностями, имея почти неограниченное финансирование от Exxon и даже две новейшие фабрики по производству чипов, что было реально много – Motorola, имея миллиардный бизнес, имела в то время также только две фабрики. В начале 80-х значение 6502 стало уже незначительным и Zilog тоже стремительно потерял свой вес – странное совпадение. Кроме того, 8080 и 8085 использовались обычно как контроллеры и в этом качестве могли успешно продаваться по более высокой цене. Наличие z80 позволяло Intel устраниться от конкуренции 8-битных процессоров для компьютеров, где 6502 сильно обвалил цены.

В СССР и России отечественный клон 8080 стал основой многих массовых компьютеров, сохранявших популярность до начала 90-х. Это, конечно, Радио-86РК, Микроша, многоцветные Орион-128, Вектор и Корвет. Однако в войне клонов победили дешёвые и улучшенные клоны ZX Spectrum на основе z80.

Это уже настоящий ПК

В начале 1976 Intel был представлен процессор 8085, совместимый с 8080, но значительно превосходивший своего предшественника. В нём уже стало ненужным питание -5 и 12 вольт, использовалась тактовая частота от 3 до весьма солидных 6 МГц, система команд была расширена несколькими полезными инструкциями: 16-разрядным вычитанием, 16-разрядным сдвигом вправо всего за 7 тактов (это очень быстро), 16-разрядным вращением влево через флаг переноса, загрузкой 16-разрядного регистра с 8-разрядным смещением (эту команду можно использовать и с указателем стека SP), запись регистра HL по адресу в регистре DE, аналогичное чтение HL через DE. Все упомянутые инструкции кроме сдвига вправо выполняются за 10 тактов – это иногда существенно быстрее, чем их аналоги или эмуляция на z80. Были добавлены ещё несколько инструкций и даже два новых флага признаков: флаг переполнения и флаг, двоично суммирующий переполнение и знак. Работа с новыми флагами, особенно вторым практически не поддерживалась. Точное назначение второго флага, типичного для знаковой арифметики, стало известным только в 2013, спустя 37 лет после появления 8085! Этот флаг позволяет за раз проверить выполнение отношений "больше или равно" или "меньше", но проверки для парных им отношений потребуют ещё работы с флагом нуля. Были ускорены на такт многие инструкции для работы байтовыми данными. Это было очень существенно, так как на многих системах с 8080 или z80 вводились такты задержки, которые из-за наличия лишних тактов на 8080 могли вытянуть время исполнения почти в два раза. Например, в отечественном компьютере Вектор инструкции типа регистр-регистр выполнялись 8 тактов, а если бы там стоял 8085 или z80, то эти же инструкции выполнялись бы только за 4 такта. Инструкция XTHL стала быстрее на два такта, а инструкции переходов даже на 3. С новыми инструкциями можно написать код для копирования блока памяти, который работает быстрее команд LDI/LDD процессора Z80! Программы для 8080 8085 также, как правило, исполняет несколько быстрее, чем Z80. Однако, некоторые инструкции, например, вызов подпрограммы, 16-битный инкремент и декремент, PUSH, загрузка SP и условные возвраты стали на такт медленнее.

8085 имеет встроенный последовательный порт ввода-вывода и улучшенную поддержку работы с прерываниями: в добавок к зависящему от внешнего контроллера способу, унаследованному от 8080, добавлена подддержка трех маскируемых и одного немаскируемого прерывания – это позволяет, при необходимости, обходиться без отдельного контроллера прерываний в системе. Работа с портом и с управлением прерываниями реализуется через инструкции SIM и RIM – только эти две новые инструкции были официально документированы. Однако, само обслуживание прерываний осталось таким же как и 8080 – очень минималистическим: при прерывании процессор не сохраняет даже слово состояния, это сохранение нужно явно прописывать в коде. Как уже отмечалось, в 8085 работа со знаковой арифметикой так осталась несколько недореализованной. 16-битная арифметика также не получила поддержки некоторых очень желательных команд: сложения с переносом и вычитания. Такие команды были добавлены в Z80. В 8085 при сложении, например, 32-битных целых нужно использовать условный переход для учета переноса – это, кстати, тоже похоже на мейнфреймы IBM.

Однако, могу опять повторить формулу "по неизвестным автору причинам" Intel отказалась продвигать 8085 в качестве главного процессора. Только в 80-е появилось несколько довольно успешных систем на базе 8085. Первым в 1981 появился предшественник и почти конкурент IBM PC – IBM System/23 Datamaster. Затем в 1982 был выпущен очень быстрый компьютер с превосходной графикой Zenith Z-100, в котором 8085 работал на 5 Мгц. В 1983 в японской фирме Kyotronic был создан очень удачный наколенник KC-85, варианты которого производились и другими фирмами: Tandy производила TRS-80 model 100, NEC – PC-8201a, Olivetti – M-10. Всего их было выпущено возможно более 10 миллионов таких компьютеров! В СССР/РФ в начале 90-х на основе отечественного клона ИМ1821ВМ85А были попытки усовершенствовать некоторые системы, например, компьютер Вектор. Удивительно, что главным процессором марсохода Sojourner, достигшем поверхности Марса в 1997, был 8085 с частотой 2МГц! Такой успех 8085 в 80-е во многом связан с тем, что в 1979 был готов 80C85, вариант 8085 с низким энергопотреблением. Упомянутый первый реально карманный компьютер Tandy 100 мог работать до 20 часов на одной зарядке! Возможно, что если бы не ARM, то 80C85 активно использовали бы в мобильных компьютерах и в 90-е.

Фактически фирма Intel дала z80 "зеленый цвет". Спустя несколько лет в битве за 16-битный рынок Intel повела себя совершенно иначе, начав тяжбу по запрещению продаж процессоров v20 и v30 в США. Интересно, что упомянутые процессоры японской фирмы NEC могли переключаться в режим полной бинарной совместимости с 8080, что сделало их самыми быстрыми процессорами архитектуры 8080.

Другая тайна фирмы Intel – в отказе от публикации расширенной системы команд, включая поддержку новых флагов. Впервые она была опубликована в журнале в 1979, а затем и некоторыми из производителей этого процессора. Однако опубликованная информация о новых флагах была неполной. Каковы причины такого странного отказа? Можно лишь гадать. Может Zilog тогда играл роль, подобную которую когда-то возможно играл AMD, и создавал видимость конкуренции, а 8085 мог обрушить Zilog? Может дело в желании сохранять систему команд поближе к проектируемому тогда 8086? Последнее кажется сомнительным. Intel 8086 был выпущен спустя более 2 лет после выпуска 8085 и трудно поверить, что в 1975 уже была известна система его команд. И в любом случае, совместимость как с 8080, так и с 8085 на 8086 достижима только с использованием макропроцессора, заменяя иногда одну команду 8080/8085 (POP/PUSH PSW, Jcc, Ccc, Rcc, XTHL) на несколько своих. Причем две опубликованные новые инструкции 8085 (SIM, RIM) в 8086 не реализуемы вообще. Есть мнение, что отказ произошел только из-за сложностей в поддержке переноса на код 8086 новых флагов 8085. Действительно, такой перенос с поддержкой побитовой работы со словом состояния процессора получается крайне громоздким. Но 7 из 10 новых инструкций прямого отношения к использованию новых флагов не имеют и их можно было бы публиковать без создания сложностей по совместимости с 8086. Можно ещё предположить, что в Intel остались недовольны реализацией знаковой арифметики на 8085 и решили, что лучше скрыть, чем создать почву для постоянной критики. Хотя и в этом случае, семь новых инструкций можно было публиковать, а скрыть только флаги и три инструкции.

Особенно трудно объяснить, почему Intel не опубликовала информацию о новых командах уже после выпуска 8086. Можно только ещё предположить, что скорее всего дело было в маркетинге. Искусственно ухудшив спецификации 8085, получали на этом фоне более эффектный 8086.

Рискну предположить ещё одну версию. 8085 было очень трудно, почти невозможно расширить до реально 16-разрядного процессора. А 6502, имея незадействованными почти половину опкодов, мог легко быть расширен до 16-бит. Поэтому для Intel было важно создать тренд на переход к 16-битной архитектуре, без совместимости с 8-битной. Отказываясь от новой полезной функциональности 8085, как бы сообщали, что 8-битки это плохо и уже неважно, надо переходить на 16-бит. Что-то похожее происходило и вокруг 32-битной архитектуры, когда Intel создала ложный тренд на разработку сложного и бесперспективного Intel 8800 или iAPX 432.

Упомянутый клон 8080 производился в СССР с 1977 – это было рекордно быстро, его сделали всего через три года после появления оригинала. Интересно, что при этом использовалась технология, несколько отличная принятой в Intel. Из-за быстроты клонирования, СССР даже мог экспортировать эти чипы, это был единственный такой случай. А вот с клонированием 8085 получилась заминка до начала 90-х. Хотя с 1988 в СССР производился свой улучшенный 8080, КР580ВМ1, который мог тактироваться до 5 МГц и использовал только 5 вольт. Этот процессор при совместимости с 8080 имел множество дополнительных возможностей: он мог использовать дополнительные 64 КБ для данных, дополнительный регистр с функциональностью HL и сотни новых команд, среди которых мощные 16-разрядные. В целом, он несколько превосходил как 8085, так и Z80.


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