История архитектуры популярных микропроцессоров — семейство Intel/Zilog





Intel 4004

Транзисторов: ~2300
Инструкций: 46
Частота: 740 кГц

В 1969 году японский производитель калькуляторов Busicom обратился к Intel с просьбой создать набор микросхем для высокопроизводительного калькулятора. Изначальный дизайн подразумевал жёстко зашитую в разные микросхемы логику, что в случае разработки нового калькулятора потребовало бы их значительной и дорогой переделки тоже. Инженеры Intel предложили вместо этого создать программируемый процессор и таким образом модифицировать возможности будущих калькуляторов путём перепрограммирования его логики. Идея всем понравилась, а когда вскоре у Busicom начались проблемы и она продала все права на процессор Intel на свет появился первый в мире коммерчески–доступный микропроцессор Intel 4004. В разработке 4004 принимали немаловажное участие Федерико Фаджин (от Intel) и Масатоси Сима (от Busicom) — запомните эти имена, мы с ними столкнёмся позже.

Микропроцессор является 4–битным. Это прямое следствие его предназначения — будучи микрокалькуляторным процессором он должен работать не с традиционными двоичными числами, а с десятичными разрядами на табло. Тем не менее будучи цифровым аппаратом 4004–ый работает с двоичными разрядами, а 10 цифр десятичной системы счисления минимально влазят в 4–битное двоичное число.
Память программ (ПЗУ/ROM) 8–битная, общим объёмом 4096 байт. Команды занимают от 1 до 2 байт. Некоторые инструкции извлекают из неё 8–битные данные (в регистровые пары).
Память данных (ОЗУ/RAM) замысловато разбита на несколько банков общим объёмом 1280 4–битных значения (эквивалентно 640 байт). При этом прямого доступа к ОЗУ у процессора нет — чтение/запись производятся как бы посредством портов ввода–вывода в несколько машинных инструкций.

Регистры:
— Аккумулятор Acc (4 бита).
— Флаг переноса Carry (1 бит). Условные переходы возможны только по трём условиям: флаг Carry равный 1, Acc равный нулю и выставленный внешний сигнал на специальной ножке процессора. Но при этом эти 3 условия могут быть произвольно смешаны через логическое «ИЛИ» в одной команде с опциональной же инверсией результата (4–битовая маска условия).
— Шестнадцать 4–битных регистра R0–R15, называемых «индексными», которые в некоторых операциях объединяются в восемь 8–битных регистровых пар.
— Четыре 12–битных адреса программы, образующие стек, вершина которого является указателем текущей инструкции (Program Counter или PC). Таким образом максимальная вложенность подпрограмм равняется трём. 12 бит адресуют 4096 байт ПЗУ (ROM), которое делится на шестнадцать 256–байтных страниц. Фактически есть только две инструкции (2–байтные) задающие полные 12 бит адреса программы — это безусловный переход и вызов подпрограммы. Все прочие инструкции любого характера обращающиеся к ROM работают только с 8–битным адресом в пределах текущей страницы кода (верхние четыре бита PC).
— Указатель данных (8 бит) — используется для доступа к ОЗУ. Инструкция DCL выбирает банк памяти, а инструкция SRC устанавливает этот 8–битный адрес в нём. Другими же инструкциями производятся запись и чтение.

Арифметико–логических операций в этом ЦП всего четыре — сложение/вычитание (частный случай — инкремент/декремент, то есть сложение и вычитание с единицей) и прокрутка бит аккумулятора через флаг переноса влево/вправо. Вторым аргументом у сложения/вычитания являются или один из шестнадцати индексных регистров или данное в ОЗУ на которое указывает указатель данных. Сложение/вычитание всегда учитывают перенос, поэтому Carry перед началом операций нередко надо очищать отдельными командами.
В системе команд 4004 немало неортогональных вещей. Например команда LD передаёт данные из индексных регистров в аккумулятор, но нельзя сделать обратного — передача значения из аккумулятора в индексный регистр может быть осуществлена только инструкцией обмена их значений — XCH (exchange). При этом нет команды передачи индексного регистра в индексный же — проброс надо осуществлять через аккумулятор. Аккумулятор можно инкрементировать и декрементировать, а вот индексные регистры — только инкрементировать. Есть экзотическая команда «keyboard process» (KBP), которая записывает в аккумулятор номер зажжённого в нём бита (нумеруя с единицы), причём она считает ошибкой ситуацию когда зажжено более одного бита. Естественно присутствует команда DAA для десятичной коррекции результата арифметической команды, приводящая 4–битное двоичное число после сложения или вычитания в десятичный диапазон с возможным взводом флага переноса — эта команда очень важна в поразрядной арифметике калькуляторных вычислений и она нас еще долго будет сопровождать в других процессорах.

В 1974 Intel выпустит усовершенствованную версию 4004 — Intel 4040, с обратной совместимостью. В ней добавили прерывания, расширили память команд до 8Кб, увеличили глубину стека до семи уровней, добавили 14 новых инструкций и 8 новых индексных регистра во «втором банке» регистров. Видимо почти все эти изменения нужны были как раз для реализации прерываний.

Особого успеха Intel 4004 не сыскал, но как пишет википедия, даже участвовал в прототипе первого управляемого центральным процессором пинболла.

Intel 8008

Транзисторов: ~3500
Инструкций: 48
Частота: 500–800 кГц

Нередко можно встретить утверждение, что Intel 8008 является потомком 4004, но если это и так, то только отчасти — по технологической линии, хотя есть некоторые схожести и в программной архитектуре. История появления 8008 напоминает историю появления 4004.
В том же 1969 году параллельно в Intel и Texas Instruments обратился производитель терминалов — Computer Terminal Corporation (CTC) с целью заказа чипов для своего проекта терминала Datapoint 2200. Дизайн архитектуры и системы команд центрального процессора был задан в техническом задании инженерами самого CTC, так что авторство программной архитектуры линейки в сущности принадлежит им. И Texas Instruments и Intel в итоге сошли с дистанции и CTC не приняло их работы по разным причинам, реализовав таки свой терминал на комплекте логических схем. Однако с Intel контракт был разорван таким образом, что у неё оставались права на разработанный в одном кристалле процессор и таким образом в 1972 году на рынке появился 8–битный микропроцессор Intel 8008. В числе разработчиков так же значится Федерико Фаджин, работавший над 4004.

Процессор адресует линейный банк памяти в 16 Кб — шина адреса у него таким образом является 14–битной. Существуют так же отдельные порты ввода–вывода.

Регистры:
— Аккумулятор A (8 бит).
— Четыре флага: C (перенос), P (четность), S (знак) и Z (ноль). Не образуют регистра как такового — из программы их значения можно определить только условными переходами.
— Шесть 8–битных регистров общего назначения (РОН): B, C, D, E, H, L. Знакомые с 8080 или Z80 могут на этом месте заулыбаться, но нет, концепция регистровых пар этому процессору была еще почти неизвестна. Единственную 16–битную регистровую пару в этом процессоре могли образовать регистры H и L и единственным местом где они могли это сделать — это кодируя в инструкциях псевдорегистр M, который обозначал содержимое байта в памяти по адресу HL (верхние 8 бит адреса берутся из регистра H, а нижние — из L). В сумме с аккумулятором получается восемь 8–битных данных — A,B,C,D,E,H,L,M, что удобно кодировать в инструкциях тремя битами. Эта система ляжет в основание следующих процессоров.
— Восемь 14–битных адреса программы, образующие стек, вершина которого является указателем текущей инструкции (Program Counter или PC). Таким образом максимальная вложенность подпрограмм равняется семи.

По сравнению с 4004 процессор довольно таки ортогонален и прямолинеен. Доступна равноправная пересылка данных между любыми регистрами общего назначения (РОН), включая аккумулятор и байт в памяти по адресу HL (M). В любой регистр можно загрузить непосредственное данное (байт в коде инструкции). Арифметико–логические операции аккумулятора с любым РОН представлены сложениями/вычитаниями (как с переносом так и без), сравнением (CP), логическими AND/OR/XOR и прокрутками бит аккумулятора влево/вправо как через флаг переноса так и минуя его (но с заносом). Любые арифметико–логические команды доступны с непосредственным операндом (байтом в коде инструкции). Однако инкремент/декремент доступен только для регистров B,C,D,E,H,L. Все операции перехода (прыжок, переход в процедуру и возврат из неё) доступны как в безусловных так и в условных исполнениях.
К явным недостаткам процессора можно отнести отсутствие стековых операций (ввиду ограниченного аппаратного стека), отсутствие загрузки/сохранения данного из/в непосредственно заданного в инструкции адреса (по сути была только косвенная адресация через M и непосредственное данное в инструкции) и в связи со всем этим — калечная поддержка прерываний. Которая формально была, но при входе в прерывание сохранить регистры без потерь было практически невозможно, что сводило пользу от поддержки сигнала прерываний почти в ноль.

Опять таки особых вершин 8008 не достиг, но несколько компьютеров–а–не–калькуляторов на нём появится успело.

Intel 8080

Транзисторов: ~4500
Инструкций: 80
Частота: 2–4 МГц

Intel 8080 явно спроектирован на твёрдой базе и концепциях 8008, по сути был объёмной работой над ошибками, но бинарной совместимости между ними не было. Начал продаваться в 1974 году и стал по настоящему популярным 8–битным процессором. Главным разработчиком 8080 был всё тот же Федерико Фаджин.

Адресует линейное пространство ОЗУ в 64 Кб (16–битная шина адреса). Так же имеет 256 портов ввода–вывода (8–битная шина адреса).

Регистры:
— Аккумулятор A (8 бит).
— Регистр флагов F (8 бит), включающий в себя биты: C (переноса), P (четности), AC (доп. переноса), Z (ноля) и S (знака).
Вместе с аккумулятором регистр флагов может образовывать 16–битную регистровую пару PSW (Processor Status Word).
— Шесть 8–битных регистров общего назначения (РОН): B, C, D, E, H, L. В некоторых инструкциях образуют 16–битные регистровые пары B (BC), D (DE), H (HL). При этом регистровая пара H служит своеобразным 16–битным аккумулятором и (как и в 8008) является адресом операнда M в командах (косвенно адресуемый байт в памяти).
— Указатель вершины стека SP (16 бит)
— Счётчик инструкций PC (16 бит)

По сравнению с 8008 нововведения включают в себя:
— полноценный стек в ОЗУ и операции сохранения (PUSH) и извлечения (POP) из/в него регистровых пар (PSW/B/D/H)
— загрузки непосредственного 16–битного данного (в коде инструкции) в регистровые пары (B/D/H/SP)
— загрузка/сохранение аккумулятора по непосредственному адресу (в коде инструкции) в памяти или адресу из регистровых пар B и D (а не только H)
— загрузка/сохранение регистровой пары H по непосредственному адресу в инструкции
— инкремент/декремент работает теперь и для A и для M и для регистровых пар (B/D/H/SP)
— обмен содержимого регистровых пар H и D, а так же регистровой пары H и вершины стека
— косвенный переход по адресу в регистровой паре H
— 16–битное сложение (без переноса) регистровой пары H с регистровыми парами B/D/H/SP
Любопытно, что в 8080 операции со стеком взводили специальные сигналы на ножках процессора, что могло быть использовано внешними схемами чтобы адресовать стек в отдельную микросхему ОЗУ нежели основная память — почему то идея того, что стек может быть каким то отдельным аппаратным решением, как это было в 8008, всё равно нравилась инженерам. Но (насколько мне известно) идея эта никем так использована не была и в дальнейшем аппаратный стек из машин благополучно исчезает.

Нововведения 8080–го по сравнению с 8008 очень сильно повысили удобство программирования под новый процессор. Так, для сравнения, подпрограмма копирования произвольного региона памяти на 8008 занимает примерно 40 инструкций (около 50 байт) в то время как на 8080 ей достаточно всего 11 инструкций (14 байт).
Intel 8080 оказал огромное влияние на индустрию. На его базе был спроектирован чуть ли не самый первый продающийся на рынке ПК в сборе — Altair 8800. На его базе была спроектирована популярная 8–битная операционная система CP/M.
Но всё–таки сокрушительной популярности добился не он, а его потомок — Zilog Z80.

Zilog Z80

Транзисторов: ~8500
Инструкций: 158 основных
Частота: 1–20 МГц

Сразу после разработки Intel 8080 часто упоминаемый выше Федерико Фаджин решает покинуть Intel и основать собственную компанию по производству чисто микропроцессоров и оснастки для них. В 1974 году к нему присоединяются интеловский менеджер Ральф Унгерманн и Масатоси Сима — тот самый японский инженер от Busicom с которым они вместе работали еще над Intel 4004 — и все вместе они основывают новую компанию Zilog.
Первым их продуктом в 1976 году становится усовершенствованная и обратно–совместимая с Intel 8080 версия микропроцессора — Z80.

Архитектура Z80 полностью совместима с Intel 8080 и включает в себя те же базовые возможности и регистры, но её создатели решили обозвать регистры более логичным образом и привести таким образом систему команд ассемблера в более читаемый и систематичный вид.
Поэтому я перечислю все регистры заново в новых названиях:

— Аккумулятор A (8 бит).
— Регистр флагов F (8 бит), включающий в себя биты: C (переноса), N (произведено вычитание), P/V (четность/переполнение), H (доп. переноса), Z (ноля) и S (знака).
Вместе с аккумулятором регистр флагов может образовывать 16–битную регистровую пару AF.
— Шесть 8–битных регистров общего назначения (РОН): B, C, D, E, H, L. В некоторых инструкциях образуют 16–битные регистровые пары BC, DE, HL. При этом регистровая пара HL служит своеобразным 16–битным аккумулятором и (как и в 8008) является адресом операнда M в командах, который в синтаксисе Zilog, однако, уже записывается в ассемблере как "(HL)".
— Указатель вершины стека SP (16 бит)
— Счётчик инструкций PC (16 бит)
(новое в Z80)
— Теневая регистровая пара AF', которую можно было быстро обменять с AF инструкцией EX AF, AF'
— Теневые регистровые пары BC', DE', HL', которые все за раз можно было быстро обменять с обычными командой EXX. Эти расширения позволяли реализовать сверхбыстрые обработчики прерываний.
— Два 16–битных индексных регистра IX и IY, которые можно использовать после префиксирования обычных инструкций байтами DD и FD соответственно. При этом инструкции почти полностью сохраняют свой смысл, но если в них участвует регистровая пара HL, то она заменяется на IX или IY, а если участвует ячейка памяти по адресу (HL), то она заменяется на адрес (IX+d) или (IY+d), где d — непосредственный байт со знаком дополняющий инструкцию. Забавно, что это расширение методом подмены действует и на команды в которых фигурируют 8–битные кусочки HL — регистры H и L. Так некоторые ассемблеры позволяют работать с 8–битными регистрами IXH, IXL, IYH и IYL. Однако сама Zilog до сих пор считает их недокументированными возможностями и не включает в «канон» инструкций этой архитектуры.
— Служебные 8–битные регистры вектора прерываний (I) и обновления ®.

Система команд 8080 тоже была значительным образом дополнена:
— можно загружать и сохранять регистровые пары BC, DE, SP в/из непосредственного адреса в инструкции (а не только HL, как в 8080)
— сложение и вычитание с переносом HL и BC, DE, HL, SP (а не только сложение без переноса как в 8080)
— относительный переход (в т.ч. по условию от флагов C и Z) по байтовому смещению, включая инструкцию быстрого цикла DJNZ отсчитывающую цикл в регистре B
— «строковые (или блоковые)» инструкции, позволяющие быстро копировать и тестировать блоки памяти одной инструкцией (двухбайтовой) и строить быстрые циклы с более сложной логикой
— ввод/вывод в порты по косвенному адресу (регистр C)
— продвинутая поддержка прерываний
— Огромный набор битовых инструкций (префикс CB) — такие как сдвиги и прокрутки бит аккумулятора на несколько разрядов или установка, сброс и тестирование бит в 8–битных регистрах (включая ячейку памяти (HL))
и др.

Нововведения в Z80 еще сильнее упростили жизнь программистам — почти полноценная 16–битная арифметика сложений/вычитаний была очень востребована даже в 8–битную эпоху, блоковые команды позволяли писать копирование кусков памяти буквально одной инструкцией, а индексные регистры IX и IY и косвенная адресация через них по байтовому смещению упрощали компиляцию с языков высокого уровня на этот процессор.

Z80 стал настоящим успехом. Он использовался в качестве центрального процессора в таких компьютерах как ZX Spectrum, MSX, Amstrad CPC и многих других. Применялся в таком же качестве в консолях ColecoVision, Sega Master System. Служил вспомогательным процессором в Commodore 128 и вообще даже такие компьютеры на других процессорах как Apple II и BBC Micro использовали платы с ним для совместимости с операционной системой CP/M. Для обратной совместимости Z80 включался в качестве вспомогательного процессора в состав такой консоли как Sega Megadrive
До сих пор Z80 и его менее удачные в плане популярности на рынке ПК потомки продолжают держаться на рынке микроконтроллеров, хотя уже порядком сдали позиции множеству конкурентов.

… и немного об Intel 8086

В 1978 году Intel (уже без Федерико Фаджина) выпускает 16–битный микропроцессор, который станет прямым родителем и фундаментом для почти всего современного парка персональных компьютеров. Все современные Intel Core и т.п. (семейство x86) поддерживают до сих пор его систему команд и способны исполнять его машинный код без перекомпиляции. Сам же 8086 не сохранит двоичной совместимости ни с каким из вышеперечисленных процессоров, однако перед командой разработчиков ставилась более скромная цель — добиться, чтобы исходные коды на ассемблере для Intel 8080 могли быть автоматически оттранслированы в рабочий машинный код для 8086 без изменений или с минимальными изменениями.
Эта цель достигалась тем, что регистры общего назначения x86 хоть и были 16–битными и назывались иначе в своём родном ассемблерном синтаксисе, но некоторые из них могли быть приведены по смыслу к регистрам и регистровым парам 8080. Набор же инструкций 8086 был настолько богаче, что с лихвой покрывал все операции и режимы адресации 8080. Поэтому не будет сильным преувеличением утверждать, что истоки современных домашних компьютеров можно отследить к далёкому 1971–ому году

13 комментариев

avatar
хорошая статья. никаких срывов покровов не увидел. но написано хорошо, прочитал с удовольствием.

а можно её все-таки под кат?
  • nyuk
  • +1
avatar
А я просто не в курсе был. Первая публикация тут. А через сколько времени можно создавать новый пост, ибо есть продолжение про MOS/Motorola?
avatar
aa-dav, рад видеть тебя с нами!
Ура! :)
avatar
:) Да, новых идей для статей пока больше нет, так что есть время потихоньку их перетаскивать сюда.
avatar
а разве есть ограничение на периодичность?
avatar
ну да, я сразу же хотел аналогичную статью про 8-битное семейство Motorola/MOS запостить, но мне движок сайта написал, что я не могу так часто постить. ну да ладно, наверное уже можно, попробую снова.
avatar
вечером только смогу посмотреть настройки. пока никто не пытался спамить статьями :)
avatar
да не особо важно, судя по всему нормальный диапазон выбран раз никто еще не жаловался.
avatar
Очень интересно поподробнее было бы узнать про недокументированные команды Z80 — и не только про половинки IX/IY (хотя и про них тоже) — а и про все остальные. Почему их незадокументировали и не признали, если они работают, например? И всё такое прочее)
  • sq
  • 0
avatar
Ну неиспользованные коды зачастую всё равно продолжают «замыкать» блоки внутри процессора и некоторые варианты выполняют какие то осмысленные вещи, что есть смысл даже их использовать.
Полный перечень их можно посмотреть тут: clrhome.org/table/ где недокументированные выделены красным.
Почему не признали даже весьма осмысленные IXL/IXH для меня самого загадка. Загадка даже почему их просто не ввели сразу в стандарт команд, ведь смысл их довольно прямолинеен — просто подмена команд с регистрами HL/H/L и они действительно это и делают. Так что я лично не знаю.
avatar
Отличная статья!
А можно узнать про андоки 8080?
  • tsl
  • +1
avatar
Я на самом деле не эксперт, но у 8080 насколько я понял незадокументированных инструкций как бы и не было — все незанятые слоты просто дублировали уже существующие команды сверху по таблице опкодов. Использовать такие просто не рекомендовалось как раз на случай будущего расширения системы команд, которую Z80 и сделал.
avatar
Незанятые слоты также были заняты в 8085, там задействованы все 256 возможных опкодов.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.