Войти
ФлеймФорумПрограммирование

Извраты Zilog (м/б интересно тем кто работал с Z80): eZ80

Страницы: 1 2 3 4 Следующая »
#0
23:49, 1 дек. 2011

Праздно лазая по вики случайно вышел на инфу, что Zilog, в своё время сделавшая ультрапопулярный проц для домашних компьютеров, но со временем слила гонку вооружений, все еще дышит и всё еще чего то производит и совершенствует.
Я вообще активно прогать и особенно ассемблерствовать, хотя я бы даже сказал нередко и машинокодить, начал со спектрума с его Zilog Z80, то ли настоящим то ли клоном, так уж был популярен в своё время данный проц.
Краем глаза увидел что у зилога есть даже 32-битный проц, не потерявший командной совместимости с 8-битным Z80, заинтересовался, полез полез и про 32 бита не нашел, но накопал что в настоящее время наиболее популярным чипом от Zilog является платформа eZ80, как я понял ориентированная на микроконтроллеры.
Причём она действительно не потеряла бинарной совместимости с кодом Z80! (за мелкими ньюансами, о которых ниже)
Итак, вот здесь юзер мануал, как пруф: http://www.zilog.com/docs/um0077.pdf (eZ80 User Manual)

Что же заставило меня создать эту тему? А то, что меня реально удивил ранее нигде не виданный мною подход инженеров Zilog в борьбе с вечными ценностями факторами:
а) за совместимость со старыми моделями, т.е. Z80
б) за преодоление рамок 8-битных процов, особенно по части размеров адресуемой памяти за 16 бит.
Заметим, что последний пункт (б) портит кровь не только 8-битным процессорам, а даже 16-битным. Собственно есть даже некоторая сумятица в терминологии и понятиях - что считать 8-битным процессором, а что 16-битным, поскольку даже у 8-битных процов широкого распространения шина адреса была 16 бит.
Типичным представителем "середнячкового" подхода между 8 и 16 битностями, в чём то даже, гениальным, был классический древний Z80, между прочим, программно совместимый с Intel 8008, предтечей 8086, но расширяющий его намного.
Вкратце опишу его основные архитектурные особенности, для тех кто не в курсе:
РЕГИСТРЫ:
- 8-битный регистр-аккумулятор под гордным символическим названием A, над которым доступен весь спектр арифметико-логических операций
- незримый напарник его, 8-битный регистр флагов F
- замечательная шестерка - 8-битные регистры B, C, D, E, H, L общего назначения
- 16-битные stack pointer SP и program counter PC
- мощное по сравнению с 8008 нововведение: два индексных 16-битных регистра IX и IY, через которые можно было удобно адресовать по смещению
Разумной фичей Z80 (ну вообще то Zilog концепт спер у Intel, а интел еще у кого наверное) было то, что великолепная шестерка могла в ряде команд выступать в роли трех 16-битных регистров: (B,C),(D,E),(H,L). Например можно было адресовать через пару (HL) память. Можно было сразу грузить например в любую из этих трех пар одной инструкцией 16-битное слово. Можно производить 16-битный инкремент и декремент этих пар. А регистр (HL) при этом выступает в роли подобия 16-битного аккумулятора - с ним можно производить 16-битные сложения и вычитания! Но к сожалению дальше этого дело не идет, более того, такие 16-битные операции не влияют на регистр флагов и потому истинно 16-битным процессор не является.
Ну это всё была присказка, для тех кто не в курсе дел, а сказка будет впереди.

Итак, Zilog задалась целью усовершенствовать Z80, снять лимиты и расширить возможности.
Как уже упомянуто выше - один из основных лимитов - это шина адреса, 16-битная как в 8-битном Z80, который, правда чуток может 16-бит даже с данными, так и в некоторых истинно 16-битных процах, ибо регистры то всё равно 16 бит.
Как мы знаем из истории тот же интел пошел по скользкому пути сегментации адресной шины - архитектура i8086. В общем то своего рода удачный ход, хотя к настоящему времени сегментация мертва, хоть и поддерживается современными процами x86. Но в сущности, и это было понятно и тогда и это понятно и сейчас - сегментация - суть - костыли. Костыли, которые можно в полной мере отбросить только перейдя на ступеньку выше - на ступеньку 32-битности. Да, именно с приходом 32-битного i30386 сегментация и умерла.
В сущности - сегментация не более чем засахренный хак с контроллером памяти, по сигналам из портов ввода-вывода процессора переключаещего отображение банков физической памяти на ножки адресной шины процессора. Да, как ни крути, это костыли.

Вы наверное уже поняли, что раз я так долго распинаюсь - значит чего то должно быть интересного в итоге то?
Возможно и нет. Кому как. Но действительно перейду к сути.
Итак, эти "извращенцы" из Zilog в eZ80 полностью сохранили совместимость с Z80, но ввели расширенный режим, который позволяет без хаков адресовать 16 мегабайт оперативной памяти.
Я заинтересовался и вник в вышеприведенный юзер мануал.

И отпрянул, ужаснувшись истиной.
Проц eZ80 остался 8-битным!
Но это полбеды - расширенный режим в сущности переводит его в.... 24-битный режим!
Нет нет, аккумулятор, т.е. 8-битный регистр A при этом остается 8-битным.
Технически это происходит так - у всех регистров, имеющих 16-битное представления появляется дополнительный верхний байт, расширяющий 16 бит до 24.
Т.е. 24-битными становятся IX, IY, SP, PC, ... BC, DE, HL. Вот эти добавочные байты нельзя адресовать из кода как можно, например, по отдельности адресовать LD A, B или LD A, IXL (IXL = нижний байт регистра IX). Нельзя. Но все операции загрузки выгрузки с этими регистрами становятся трехбайтными и учитывают эти байты. Можно выгрузить в память и считать оттуда содержимое "расширенного байта".
Таким образом адресация становится 3-байтной и все операции и данные, раньше бывшие 2-байтными - становятся 3-байтными. Т.е. так же доступен суженный диапазон арифметических операций 24-битного HL с 24-битными операндами в памяти или другими 24-битными парами.
Итак, можно считать, что перед нами смешанный 8-битно-24-битный процессор. O_o
Имхо, жэсть.


#1
0:13, 2 дек. 2011

Если коротко, да изврат.
Но согласись, довольно интересная, нестандартная реализация.

Вот только зачем?

Меня один постоянно бомбит письмами по поводу "возрождения БК-0010-01".
Вот только зачем?

#2
7:12, 2 дек. 2011

ZonoID

> Но согласись, довольно интересная, нестандартная реализация.

Согласен, поэтому и написал.

> Вот только зачем?

Не понял вопроса. Зачем что?

#3
7:33, 2 дек. 2011

И еще немного информации по теме.
В проце есть 2 режима - режим совместимости с Z80 и вышеописанный режим, который называется ADL (address and data long).
В режиме совместимости проц ведет себя почти как Z80, с одним важным исключением: существует невидимый для этого режима регистр (его можно увидеть и записать в него только в ADL режиме) MDATA, содержимое которого автоматически добавляется в верхний байт 24-битной адресной шины. Таким образом 16 мегабайт ОЗУ разбиты на 256 "страниц" по 64 килобайта внутри которых можно организовать изолированные среды исполнения обычного Z80, если ими управляет супервизор из ADL-режима. Для ADL режима все эти 16 мегабайт образуют единое 24-битное адресное пространство.
Для переключения между Z80 и ADL режимами существуют однобайтовы команды-префиксы, которые переключают режим разрядности следующей за ними инструкции до нужного.
Почему команд 4 я плохо понял, но насколько понял схема такова:
2 из них использоваться могут только в Z80 режиме, первая означает что данные 16-битные (т.е. ничего не делает), а вторая - что команда временно 24-битная (эффект от применения есть).
2 из них используются только в ADL режиме, первая означает что данные 16-битные (т.е. эффект есть), а вторая - 24 битные (т.е. ничего в этом режиме не делает).
И вот тут мы сталкивается с еще одним архитектурным "изобретением", которое можно считать спорным, а можно идеальным.
Дело в том, что Z80 еще в момент появления своего как проц совместимый с i8008, но существенно расширивший его систему команд занял все доступные 1-байтовые коды операций.
Собственно если посмотреть на instruction set i8008, то он весь однобайтовый (т.е. код команды занимает всегда 1 байт, плюс могут быть данные команды после этого байта) и заполняет примерно толлько 2/3 всех доступныех из 256 вариантоа. Z80 же заюзал все эти доступные варианты - раз и более того - 3 или 4 из них использовал как префиксы для двухбайтовых команд. Т.о. в Z80 есть двухбайтовые коды операций, причём более половины из них всё еще свободно. А вот свободных однобайтовых уже не осталось.
Однако где бы выкопать 1-байтовые префиксы, ибо в коде они могут встречаться довольно часто? Особенно если 24-битовый режим захочет поработать с 16-битовыми данными, ведь это вполне реально. Кроме того эти префиксы используются перед командами JMP, CALL и RET собственно для организации бесшовного переключения потока выполнения из Z80 режима в ADL и обратно.
Так вот, Zilog пошли на спорный наверное, но с другой стороны логичный шаг.
Они взяли 4 однобайтовых инструкции Z80 (и 8008), которые ничего в процессе своего выполнения не меняют состояние процессора и заюзали их как префиксы Z80/ADL Switch.
Вот эти команды (недословно, по памяти):
LD B, B
LD C, C
LD D, D
LD E, E
Т.е. да, эти команды совершенно не имеют смысла и присутствуют в системе команд i8008 для симметричности оп-кодов. Возможно ошибаюсь, но LD A, A (самая первая команда алфавита) - более известна как NOP. А вот эти 4 по сути дублируют NOP и в нормальном коде нигде по идее не должны встречаться.
Однако мало ли, да, как говорится. Т.е. всё таки есть 0,001% что прога для Z80 упадет на eZ80, если будет химичить что-то с этими командами.
Такие дела.

#4
8:43, 2 дек. 2011

Moondark
> Итак, эти "извращенцы" из Zilog в eZ80 полностью сохранили совместимость с Z80,
> но ввели расширенный режим, который позволяет без хаков адресовать 16 мегабайт
> оперативной памяти.

Не нужно, - последние 32х битные ARM  SoC чипы стоят не намного дороже изделий Zilog.

#5
8:45, 2 дек. 2011
Moondark

У Z80A - совместимость с i8080, а не 8008

#6
8:48, 2 дек. 2011

0iStalker
> У Z80A - совместимость с i8080, а не 8008

О, точно, попутал попутал. Уже и в другом посте попутал тоже.

> Не нужно, - последние 32х битные ARM SoC чипы стоят не намного дороже изделий Zilog.

Однако фирма цветет и пахнет, видимо кто-то покупает.

#7
8:53, 2 дек. 2011

Moondark
> Однако фирма цветет и пахнет, видимо кто-то покупает.

80186  тоже кто-то до сих пор покупает,... мало ли в мире извращенцев?

#8
9:18, 2 дек. 2011

Moondark
> 8-битный регистр-аккумулятор под гордным символическим названием A, над
> которым доступен весь спектр арифметико-логических операций
> - незримый напарник его, 8-битный регистр флагов F
> - замечательная шестерка - 8-битные регистры B, C, D, E, H, L общего назначения
>
> - 16-битные stack pointer SP и program counter PC

а где слова про альтернативный набор и регистр I ( в нём тоже можно временно хранить, я лично так делал :) )

#9
9:19, 2 дек. 2011

innuendo
> и регистр I

Это вроде к недокументированным командам относится и не все клоны поддерживают

#10
9:27, 2 дек. 2011

innuendo
> а где слова про альтернативный набор и регистр I ( в нём тоже можно временно
> хранить, я лично так делал :) )

Ну я в подробности сильно вдаваться не стал, только то что важно для понимания концепта. В Speccy еще IY использовался в обработке прерываний так, что хранил какое то временное, но нужное этой системе прерываний значение all the time, и потому выбывал из доступных регистров клиентского кода. Обыдна, но факт.

#11
9:28, 2 дек. 2011

0iStalker
> Это вроде к недокументированным командам относится и не все клоны поддерживают

В eZ80 он уже задокументирован и официален.

#12
11:14, 2 дек. 2011

0iStalker
> Это вроде к недокументированным командам относится и не все клоны поддерживают

нет, это всё официально было, ПО-СТАНДАРТУ :)

Moondark
> . В Speccy еще IY использовался в обработке прерываний так, что хранил какое то
> временное

неа, I к IY никакого отношение не имеет, IX, IY индексные регистры

#13
11:42, 2 дек. 2011

innuendo
> неа, I к IY никакого отношение не имеет, IX, IY индексные регистры

Я знаю. Тем не менее именно IY использовался ПЗУ - в обработке прерываний - для хранения какого то значения, ломать которое нельзя было. IY нигде в программах не использовался.

#14
11:48, 2 дек. 2011

Moondark
> для хранения какого то значения, ломать которое нельзя было. IY нигде в
> программах не использовался.

делался банальный PUSH IY и дальше как обычно 

Страницы: 1 2 3 4 Следующая »
ФлеймФорумПрограммирование

Тема в архиве.