Законорожденные дети и внуки Zilog Z80

Полазил немного по википедии и бегло пробежался по техдокам по каждому процу и интересная вырисовывается картинка у Zilog с их процессорами в целом…
Легендарный Z80 они сделали в 1976 году.
Больше легендарных процессоров от них не было так что у меня лично создавалось ранее ощущение полной стагнации. Однако на самом деле всё было намного интереснее… Данные ниже получены крайне поверхностным ознакомлением с источниками, поэтому могут быть существенно неполны и даже в чём-то неправильными! Буду рад уточнениям и исправлениям.


Hitachi HD64180
В 1985 году Hitachi создают усовершенствованную версию Z80 — Hitachi HD64180.
Этот процессор мог работать на частотах до 10МГц и включал в себя довольно много фарша — двухканальный DMA, два таймера, серийные порты и готовый блок управления памятью с помощью которого можно было адресовать до 1Мб памяти (однако записью в порты вывода). Архитектура осталась почти неизменной — регистры все остались в том же составе и были добавлены 12 новых инструкций из которых интерес представляют в основном MLT — беззнаковое умножение двух байт регистровой пары с занесением результата в эту же пару (HL,BC,DE,SP) и неразрушающий AND, т.е. TST по обычной для 8-битных регистров схеме.

Z180
Немного позднее Zilog лицензирует HD64180, немного апгрейдит ему начинку и выпускает как Zilog Z180. Что забавно — есть режим полной совместимости с Hitachi. Тут, конечно, вовсю уже играет микроконтроллерная песня. Такой вариант как Z80182 может работать на 33Мгц. Архитектурно всё то же самое — 8-битный вариант Z80 с MMU для адресации до 1Мб путём переключения страниц.

Z800
Но еще где то в 1980 году Zilog в своих лабораториях разрабатывает другого зверька на базе Z80 (несовместимого с Z180) — Z800 где набор регистров и битность остаются прежними, но набор инструкций существенно усложняется и расширяется — прям весьма существенно.
Однако этот процессор Zilog придерживает пытаясь продвигать другие линейки и он в массовое производство не пошёл, поэтому…

Z280
В 1986 году когда другие линейки не особо продвинулись Z800 подтянули под актуальные технологии и ребрендировали под названием Z280.
На его борту сразу было четыре DMA канала, три таймера и серийный порт.
Регистры остались те же что и в Z80 за тем исключением что было введено два режима работы — системный и пользовательский и было два регистра стека — собственно системный и пользовательский, но с точки зрения пользовательского кода ничего не изменилось.
Но вот инструкции… Как мы помним в Z80 систему команд Intel 8080 расширили через 4 байтовых префикса — CB, DD, ED и FD в результате коды инструкций могли быть многобайтовыми — от 1 до 2 байт собственно. Насколько я помню максимальный размер одной инструкции в Z80 был 4 байта — это, например, инструкция LD IX, $1234 которая в байтах превратится в DD 21 34 12 где первые два байта это код инструкции из которых первый это префикс DD и последние два — непосредственное 16-битное данное в ней.
Второй байт в префиксированной инструкции почти полностью был использован только у префикса CB (расширения битовых операций с 8-битными регистрами). У остальных префиксов же бОльшая часть доп-кодов не была использована.
Так вот в Z800/Z280 эти неиспользованные доп-коды были использованы вглубь и вширь. Добавилось огромное количество новых адресаций и некоторое количество новых инструкций, особенно с 16-битными регистрами и арифметикой. Появились 16-битные умножение и деление. Индексные регистры IX и IY могли задавать смещения словами, а не только байтами, причём адресовать с их помощью стало возможно не только байты, но и слова. Более того — в качестве индексных стало можно использовать и HL и SP и PC (правда не всегда во всех инструкциях, например, как я понял индексируемый SP доступен только для 8-битных инструкций).
Просто приведу несколько инструкций чтобы вы поняли величину добавленного набора инструкций:

LDW (PC+1122h), 3344h ; DD 31 22 11 44 33
DIVW DEHL, (IX+1122h) ; FD ED CA 22 11
AND A, (SP+1122h) ; DD A0 22 11
PCACHE ; есть даже команда управления кешем...


Т.е., как видно, длина инструкции вместе с её непосредственными данными теперь может быть целых шесть байт. 16-битность, впрочем, довольно ограничена — она ограничена только арифметикой, прокрутки и побитовые операции к ним не прилагаются, в отличие от классического 8-битного аккумулятора.
Однако память больше 64Кб всё так же предлагается адресовать через переключение страниц записью в порты ввода-вывода MMU.

Z380
Необходимость вырваться за пределы 64Кб сохраняя совместимость с Z80 всё-таки приводит к логичному итогу — и Zilog создаёт новое детище Z380. Точного года на вики нет, ну судя по годам упоминаемых там книг это либо 1994 год либо ранее.
И тут опять начинаются метания — Z380 несовместим с Z800/Z280, он базирован на Z180!
Набор регистров количественно остаётся таким же как в Z80/Z180, но добавляется Select Register управляющий доп-функционалом и вводится 32-битный режим прибавлением к регистровым парам 16-битных половинок сверху к уже имеющимся. 32-битные регистровые пары называются добавкой буквы z в конец: PCz, SPz, BCz, DEz и т.п. Заметьте, что у 8-битного аккумулятора и флага никаких расширений нет — т.е. AF не является тут регистровой парой с 32-битной «половинкой». Режимы можно переключать глобально, плюс появилось 8 новых префиксов тонко управляющих адресацией и размером непосредственных данных в инструкции. Как я понял их взяли из инструкций вида LD E, E которые по сути ничего не делают.
Так же как в Z280 здесь вводится много 16-битных операций где HL(z) является аккумулятором, причём не только арифметика (включая умножение и деление), но и побитовые операции, а прокрутка стала доступна для вообще всех регистровых пар! Зато вот режимы адресации в целом остались такими же как в Z80 с поправкой на 32-битный режим, кроме одного — регистровые пары можно стало сохранять/грузить со смещением относительно стека: LD (SP+12h), BC.
Но вообще новых инструкций прибавилось — например появился CALL RELATIVE. Все операции где есть байтовое смещение из Z80 с помощью режимов и префиксов можно усилить до смещения-слова или смещения из трёх байт, но не 32 бит, включая этот самый CALL RELATIVE.

eZ80
Однако Z380 оказывается провальным и не находит отклика в сердце покупателя. Поэтому Zilog делает еще одно переосмысление и выпускает в сразу в формате микроконтроллера семейство eZ80.
Эта штука опять обратно совместима только с Z180 и исповедует довольно странный подход.
Как и в Z380 новых регистров практически нет, а регистровые пары в «длинном режиме» дополняются, но дополняются они всего лишь одним байтом, таким образом являясь 24-битными значениями.
Так же как в Z380 есть новые префиксы, но уже четыре штуки, которые позволяют управлять размером данных и регистров переключаясь на лету с 16 на 24 бита и обратно где надо.
Новые инструкции есть, но по сравнению с Z280 или Z380 их кот наплакал. Например появилась инструкция LEA которая может в регистровую пару положить результат сложения IX или IY с непосредственным байтом или 8-битное умножение с 16-битным результатом как в Z180, но в целом ни 16-битных продвинутых операций ни новых режимов адресации — практически ничего. Так появилась загрузка/сохранение регистровых пар через индексные регистры (IX+d), но смещение в индексных операциях может быть только байтовым как в оригинале. Судя по всему главная фича eZ80 была минималистичность при расширении адресного пространства Z80 — это было сделано дёшево и сердито без дорогостоящих изысков и кучи новых продвинутых 16-битных команд из предыдущих попыток. Процессор получился в основном 8-битным как его достопочтенный предок и с учётом того, что регистровые пары там уже давно можно было складывать и вычитать, то частично он так же стал… 24-битным. 24-битное линейное адресное пространство с 24-битными сложениями/вычитаниями, хех…
Неожиданно, но именно это семейство микроконтроллеров, судя по википедии, сейчас является самым востребованным в линейке внуков дедушки Z80 от Zilog и его используют чаще всего.
Действительно неожиданно.
Рабочая частота у этого «апогея серии» поднята до 50МГц, но надо учитывать, что в силу трёхстадийного конвеера и усовершенствованного АЛУ этот процессор если верить вики в среднем работает втрое быстрее Z80, поэтому можно сказать что он как Z80 на частоте 150МГц.

Какой тут можно сделать вывод? А чёрт его знает. Забавно всё это…
Заметьте, что у Zilog были и другие архитектуры несовместимые с Z80, но эта история не про них.

3 комментария

avatar
В статье упоминается, что Zilog сперва хотела продвигать другую архитектуру — дело в том, что в 1979 (всего через год после выхода в продажу Intel 8086) году фирма выпускает еще один процессор Z8000 уже несовместимый с Z80 с продвинутой 16–битной архитектурой: 16 регистров общего назначения, множество режимов адресации и до 8 Мб сегментированной памяти. Интересно, что когда IBM захотела покусится на нишу персональных компьютеров и создала IBM PC Z8000 уже был на рынке и гипотетически мог быть выбран в качестве сердца новой машины, но IBM выбрала процессор Intel и если верить википедии:
Федерико Фаджин, тогда исполнительный директор Zilog, считает, что причиной тому было то, что владельцем Zilog преимущественно был один инвестор — Exxon Enterprises, фирма которая имела амбиции конкурировать с IBM. Поэтому когда IBM начала проект PC она рассматривала Zilog как конкурента и выбрала Intel 8088, а не Z8000 потому что не видела в Intel конкурента на рынке компьютеров.
Позднее Z8000 обзаводится 32–битным наследником Z80000, но это уже не помогает — звезда Zilog на рынке персональных компьютеров закатилась окончательно и сейчас фирма занимается микроконтроллерами.
Интересно каким был бы современный мир домашних компьютеров если тогда давным давно IBM сделал бы выбор в пользу Z8000. :)
avatar
Интересно каким был бы современный мир домашних компьютеров если тогда давным давно IBM сделал бы выбор в пользу Z8000. :)

Регистров было бы в 2 раза больше :-)
avatar
:) Я, кстати, немного сравнивал Z8000 с i8086 по разным возможностям и в целом — забавно.
Как уже написано у Z8000 16 РОН и 8Мб сегментируемой памяти. При этом сегменты сделаны еще круче, чем в i8086 — вместо того чтобы держать отдельные сегментные регистры при сегментированной памяти адресация памяти через регистры автоматически подразумевает, что в чётных регистрах содержится номер сегмента (в верхнем байте), а в нечётных — смещение в сегменте. Т.е. косвенная адресация через регистры возможна с восемью 32-битными регистровыми парами 16-битных регистров R0-R15 которые уже называются RR0-RR14 (и могут быть только чётными номерами). Объединение в регистровые пары — характерная черта i8080/Z80 которая в Z8000 присутствует вплоть до 64-битных регистров RQ0,RQ4,RQ8,RQ12 видимо для операций длинного деления — разбираться не стал.
Дальше-больше. Если в i8086 подытожить все формы адресации, то их можно выразить самой комплексной формой:

[bx|bp+di|si+offset]

Т.е. или bx или bp сложенный с или di или si плюс смещение, при этом любая часть могла быть выкинута из выражения.
А вот в Z8000 самая сложная адресация возможная в любой команде — это [Rx+offset], где Rx это любой из шестнадцати его регистров кроме R0. А самая сложная адресация [Rx+Ry] где так же Rx и Ry это любые регистры кроме R0 возможна только в операциях передачи данных. С одной стороны вроде и менее сложные адресации, но с другой стороны этого более чем достаточно для эффективной адресации стековых переменных, а с другой стороны нет ограничений никаких какие именно регистры могут выступать в роли индексных, так что всё это немного похоже на современные RISC по возможностям.
Еще на англовики можно прочитать, что Z8000 неоднократно использовался в машинах на базе Unix. Чем же он был для них так привлекателен по сравнению с i8086? А вот чем:
Дело в том, что у Z8000 был дополнительный чип в _возможной_ обвязке — Z8010 именуемый еще Memory Managment Unit или MMU.
Так как сам Z8000 (точнее первая модель — Z8001) уже имел сегментированную память на 23 бита (8Мб) состоящую из 128 сегментов по 64Кб, то наличие MMU вроде бы смущает — казалось бы зачем?
Так вот как раз это самое — обеспечивать аппаратную защиту памяти read-only, code-only, data-only и system сегментов.
MMU ставился между процессором и памятью и обычные сегменты Z8010 становились «логическим адресным пространством», а аппаратный маппинг MMU уже превращал их в физические. Как я понял возможен даже трюк с шарингом одного сегмента в физической памяти между несколькими логическими сегментами разных процессов чтобы, допустим, на коде тех же DLL-ек экономить.
Забавно, что в один MMU вмещались дескрипторы только 64 сегментов, поэтому с одним MMU Z8000 мог обрабатывать в защите только 4Мб из 8 возможных.
Но достаточно было поставить еще один MMU в пару к другому — и возможно было обрабатывать аппаратной защитой все 128 возможных сегментов.
Но хуже того — можно было впаять и 4 MMU и сделать 16Мб физической памяти — и тогда с помощью MMU можно было разбрасывать задачи по 24-битному физическому адресному пространству хотя логические адреса конкретной задачи оставались 23-битными.
В общем Z8000 был реально не промах и наверное даже жаль, что его звезда закатилась. :)
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.