Что именно будет забавно для IR? )
Вид для печати
Например, интересно, чем инкрементируется R (раз на флаги не влияет, то наверное не с помощью АЛУ), и почему именно 7 бит.
или я что то пропустил или IR инкрементируется той же схемой что и PC ?
Для тех, кто не прочитал мой обзор - говорю кратко)
Конечно тем же самым методом, что и PC)
Первые два такта команды - это выдача PC на шину и инкремент,
Следующие два такта команды - это выдача IR на шину и инкремент с ограничением до 7 бит.
Причем, даже описал, как происходит этот инкремент.
Сперва регистровая пара пересылается в регистр PCR, а затем уже инкрементированная пересылается в PCR2, а уже из него обратно в регистровый файл.
интересно было бы посмотреть циклограмму выполнения команд из DD/FD префикса
Поработаю оракулом: оные префиксы работают как однобайтные команды аля NOP
ПС: вот только как они взаимодествуют с INT NMI - надо "смотреть"
Я думаю, @ZXMAK интересуют не префиксы, а циклы доступа к памяти по индексам)
- - - Добавлено - - -
Никак не взаимодействуют. Прерывания могут быть только после окончания выполнения команды.
- - - Добавлено - - -
Кстати, если кто-нибудь сидит на иностранных форумах, на которых обсуждают недокументированные особенности Z80 и всякие другие нюансы работы, киньте им ссылочку сюда.
- - - Добавлено - - -
Похоже, вот тут активно обсуждают баги Z80. Киньте им ссылку, если кто-то там зареган.
Стандартный цикл выполнения однобайтовой 4-х тактовой команды (без торможения памяти по WAIT):
Диаграммы (огромная простыня):
Скрытый текст
Для сравнения взяты две команды: LD D,L и ALU A,L
- В такте T3 всегда активен SEL_ACC.
- В такте T3.2.3 (Т3.2/Т4.1) разрывается связь между шинами HBUS и LBUS
В этом же такте активен R_H, обьединяя шины REG.H и HBUS (для чтения регистра A).
(Для LD) В этом же такте активен R_L (т.к. REQ_FLAGS = 0), обьединяя шины REG.L и LBUS (для чтения регистра F).
(REQ_FLAGS = 0 означает, что предыдущая команда не меняла флаги, и надо загрузить флаги из регистра F).- По переднему фронту такта T3.3 (Т4.1) сбрасывается REQ_FLAGS.
В такте Т3.3 (Т4.1) активен SEL_AF (выбор регистра AF).
(Для ALU) В этом же такте активны сигналы RL_WR и WRITE_REG (т.к. REQ_FLAGS = 1), по которым содержимое флагов с линии LBUS записывается в регистр F.- В такте T4 активен SEL_REG_SRC, инициируя выбор регистра источника.
- В такте T4.2.3 (T4.2/T5.1) активны сигналы R_L (работа с младшей половиной регистровой пары) и READ_REG.
- В такте T4.3 (T5.1) активен сигнал SEL_HL по которому читается значение HL на шину REGBIT0..15, но на обе шины LBUS и HBUS попадает только младшее значение регистра - L, т.к. команда работает с младшей половиной регистровой пары (активен R_L, а не R_H).
Работа с АЛУ:- В такте T3 активен REQ_ALUB1, по которому в такте T3.2.3 (T3.2/T4.1) активен HBUS_TO_ALUBUS, по которому содержимое регистра A поступает на ALUBUS. А в такте T3.3 (T4.1) содержимое ALUBUS (регистр A) поступает на ALUB.
(Для ALU) В такте Т3 по SEL_ACC активен сигнал REQ_ALUA, по которому в такте T3.3 (T4.1) активен ALUBUS_TO_ALUA, по которому содержимое ALUBUS (регистр A) поступает на ALUA.- В такте T4 активен REQ_ALUB2, по которому в такте T4.2.3 (T4.2/T5.1) активен HBUS_TO_ALUBUS, по которому содержимое регистра L поступает на ALUBUS. А в такте T4.3 (T5.1) содержимое ALUBUS поступает на ALUB.
(Для LD) В такте T4.3 (T5.1) на шину ALUA принудительно выставляется 0.- В такте T4.3.4 (Т5) активен ALU_SEL_LOW. Таким образом на ALU подаются младшие 4 бита аргументов.
В такте T4.5.6 (Т6) не активен ALU_SEL_LOW. Таким образом на ALU подаются старшие 4 бита аргументов,
По спаду ALU_SEL_LOW (Т6.1) в регистре REG_ALU_LOW защелкиваются младшие 4 бита результата.- (Для ALU) По переднему фронту T1 (T5) устанавливается флаг REQ_FLAGS.
- (Для LD) В такте T2 (T6) активны SEL_REG_DST и SEL_REG_DST_R, по которым в такте T6.3 (Т7.1) выбирается регистровая пара приемник DE (активен SEL_DE), а также активен RH_WR (запись в старший байт D) и WRITE_REG, по которым содержимое D записывается в регистровый файл.
(Для ALU) В такте Т2.3 (Т7.1) активны RH_WR, WRITE_REG и SEL_AF, по которым содержимое AF записывается в регистровый файл.
(Для ALU) В такте Т2.3 (Т7.1) устанавливается SET_PV_Z_S, по которому формируются флаги и защелкиваются в буферном регистре флагов.
(Для ALU) В такте Т3.2.3 (Т7.2/Т8.1) активен SEL_FLAGS по которому данные из буферного регистра флагов записываются на шину LBUS (биты 5 и 3 шины LBUS не меняются, на них остается предыдущее содержимое - значение регистра A).
(Для ALU) В такте Т3.3 (Т8.1) активны сигналы RL_WR и WRITE_REG (т.к. REQ_FLAGS = 1), по которым содержимое флагов с линии LBUS записывается в регистр F.
- - - Добавлено - - -
Описание работы ADD A,L и LD D,L простыми словами:
Пояснение: ALUA и ALUB - это два аргумента ALU.
- В такте T4 регистровая пара AF всегда читается на шину HBUS/LBUS, независимо от кода команды, а содержимое регистра A на всякий случай загружается в ALUB.
Для ADD A,L в этом же такте регистр A загружается в ALUA.- В такте T5 регистр L загружается в ALUB (перезаписывая ранее загруженное значение A). А для команды LD D,L обнуляется значение ALUA.
- В такте T6 на шине HBUS и LBUS (они в этом такте запараллелены) появляется значение результата работы ALU. Для ADD A,L - это A + L; для LD D,L - это 0 + L.
- В такте T7 результат операции записывается с шины HBUS в регистр A (для ADD A,L), или в регистр D (для LD D,L). В этом же такте формируются флаги для ADD A,L в буферном регистре флагов.
- Для ADD A,L в такте T8 флаги из буферного регистра флагов через LBUS записываются в регистр F (кроме битов 5 и 3, в которых сохраняется предыдущее содержимое, а имено значение регистра A). Надо заметить, что запись флагов в регистр F совпадает с чтением регистра AF следующей команды, и делается это одновременно.
Тадам! И по традиции, тема с подробным разбором не заходит)
- - - Добавлено - - -
Особенности работы команды NOP:
Не смотря на внешнее бездействие данной команды, внутренне проводится некоторая работа.
Как и во всех командах, вначале регистр флагов F кешируется, а регистр A засылается в оба аргумента АЛУ.
Далее, т.к. команда не использует аргументы, результатом работы АЛУ является A + A, но результат никуда не попадает.
Вот и все.
Команды LD I/R,A:
Не смотря на то, что большинство команд пересылок проходят через АЛУ (посредством сложения с нулем), есть группа команд, для которых сделаны специальные патчи, позволяющие модифицировать этот маршрут. Одна из таких команд LD I/R,A.
Команда выполняется (не считая префикса) за 5 тактов вместо 4. Это необходимо для того, чтобы приостановить конвейер выборки следующей команды и регенерацию памяти, освободив тем самым в 5-м такте доступ к дополнительному регистровому файлу, в котором расположен регистр IR.
В такте T4.2 содержимое ARGB (аргумент B), в котором находится только что загруженное значение регистра A выдается на HBUS в обход АЛУ.
В такте T4.3 (T5.1) активен SEL_IR, по которому в регистр I или R записывается значение регистра A с шины HBUS.
Интересно то, что 5..3 биты кода команды кодируют регистр, в который происходит запись точно таким же способом, как это делают команды, работающие с регистрами общего назначения. 010 - это регистр I, 011 - это регистр R. При этом сама информация о коде регистра используется лишь частично, а различие между I и R происходит по биту 3, как происходит выбор младшей и старшей части любого другого регистра общего назначения.
Также интересно, что на самом деле команда LD I/R,A работает даже быстрее (5 тактов), чем простая пересылка типа LD r1,r2 (7 тактов). Оставшиеся 3 такта АЛУ дорабатывает вхолостую.
Команда LD A,I/R:
Работа команды значительно отличается от ее антагониста LD I/R,A.
Прежде всего она заставляет АЛУ работать так, как если бы это была команда вида ADD A,r. За одним исключением, обнуляется аргумент A, как в командах LD r1,r2. Плюс, в 5-м такте конвейер приостанавливается на 1 такт, чтобы выбрать в качестве аргумента-источника регистр I или R из дополнительного регистрового файла.
Флаг P устанавливается как логическое ИЛИ флага V и IFF2. Но, благодаря тому, что арифметического переноса при прибавлении нуля к любому числу быть не может, мы получаем только значение IFF2. Все остальные флаги устанавливаются так же, как и при ADD, за исключением того, что не меняется флаг C.
Обновленная текущая версия черновика реверса.
* Исправлено несколько ошибок (как и ожидалось, все связанные с полярностями сигналов).
* Полностью избавился от проходных ключей (проходные регистры на шинах пока остались).
* Много оптимизаций, переработок, перегруппировок блоков.
* Много новых распознанных и подписанных линий и функций.
* Повышена четкость надписей увеличением DPI в два раза)
p.s.: Замечу - это полный реверс. Вся текущая работа над ним связана лишь с распознаванием, подписыванием, пониманием, причесыванием. Так что сохраните себе на всякий случай, на файлообменнике он лежит 14 дней.
NMOS Z80 - sketch rev.20.pdf
Команды сдвигов:
С ними все просто.
В такте T4 запрещается стандартная передача значения регистра с HBUS на ALUBUS, но включается специальная передача с HBUS на ALUBUS через сдвиговый регистр либо BUF_SHIFT_LEFT, либо BUF_SHIFT_RIGHT. Т.е. значение регистра попадает в аргументы АЛУ уже сдвинутое. Далее происходит все тоже самое, что и при команде LD. К значению регистра прибавляется ноль, и заносится обратно в регистр, только с влиянием на флаги.
Еще одна интересная находка.
Стал разбирать простые команды вида LD (HL/DE/BC),r, и сперва попал в ступор. В цикле M2, который следует после цикла M1 нет записи в память! Я уж и так, и сяк ищу. Нет и все. Но ведь всем известно, что задевятым вагоном сразу идет десятыйциклом M1 сразу идет цикл M2. Оказалось, что нет. Для некоторых команд (и в том числе для вышеописанных) за циклом M1 сразу идет цикл M4. А потом M5, если понадобится. А вот в цикле M4 запись в память как раз и есть.
Скажем еще раз 'пока' фирменным документациям)
Этого нельзя придумать самим. Они действительно описывают пять M-циклов, и их в реальности в процессоре действительно 5.
Я думаю, что писали по какому-то иностранному описанию. Иначе и быть не могло.
А в описании наверное что-то упрощенно было описано. Без перескоков с M1 на M4. Потому что для всех остальных команд циклы действительно идут последовательно.
чего "этого"? тупо нумерацию продолжить после единицы нельзя самим?
а байтов на инструкцию максимум 4 - ичо?
- - - Добавлено - - -
это я к тому, что доки пишутся на внешние сигналы, а внутри могло же быть что угодно, хоть обратный счётчик или код Грэя))
Вот интересно было бы посмотреь как M1 устанавливается сбрасыватеся для длинных инструкций.
Опять лирическое отступление на тему ПЛИС.
Как устроены у современных ПЛИС RS-входы у D-триггеров? Эти входы тоже синхронны с CLK, либо же вход D работает синхронно, а входы RS асинхронно?
Xilinx 7 семейство Физическая реализация
Триггеры:
FDCE Primitive: D Flip-Flop with Clock Enable and Asynchronous Clear
FDPE Primitive: D Flip-Flop with Clock Enable and Asynchronous Preset
FDRE Primitive: D Flip-Flop with Clock Enable and Synchronous Reset
FDSE Primitive: D Flip-Flop with Clock Enable and Synchronous Set
Защёлки (не рекомендуется использовать, но они есть в наличии).
LDCE Primitive: Transparent Data Latch with Asynchronous Clear and Gate Enable
LDPE Primitive: Transparent Data Latch with Asynchronous Preset and Gate Enable
Сиё взято из документа: UG768 "Xilinx 7 Series FPGA and Zynq-7000 All Programmable SoC Libraries Guide for HDL Designs UG768 (v14.7) October 2, 2013"
есть универсальный приметив ТРИГГЕР. в зависимости от того как он сконфигурён (при загрузке плисы) тем он и будет.Пример: есть 100 триггеров всего из них одновременно можно сделать
1 FDCE и 99 FDRE
а можно
по 25 штук каждого.
Интересно, как мне обозначать в схеме триггеры, у которых не только D синхронный, но и RS.
Потому что сейчас триггеры с асинхронным RS обозначаются так:
https://pic.maxiol.com/images2/17260...2988.01xxx.png
ХЗ. Наверно для синхронного : D C R входы объединять в одном прямоугольнике, а если асинхронный R вход - то примерно как в 155ТМ2 (в отдельном прямоугольнике).
ПС: к сожалению (для нас) и к радости (инженеров) в плисах нет триггеров с R и S входами одновременно. и всегда есть D и C.
Выше перечислен базис примитивов. На основе оных и доп. логики формируются все остальные "интимные фантазии" инженера... с той или иной точностью поведения
ПС: на практике в 99,9999% случаях ни кто не заморачивается с использованием примитивов напрямую (за исключением специализированных примитивов). Просто пишется описание требуемого поведения схемы на языке HDL - если написано реализуемая схема - то получаем прошивку, а если нет - то упрощаем описание...
Применение примитивов это как Асм вставки в СИ языке.
Ок. Значит буду писать на Verilog с расчетом, что все триггеры синхронные, и RS входы тоже синхронные. А трассировщик сам уже разберется. Естественно, прослежу, чтобы R и S не могли устанавливаться одновременно.
Titus, а почему Z80 опкод защёлкивает по спаду такта, а данные (аргументы и прочее) по фронту (так же, как и ВМ80)? С чем связано такие различие в циклах внешней шины?