Например, интересно, чем инкрементируется R (раз на флаги не влияет, то наверное не с помощью АЛУ), и почему именно 7 бит.
или я что то пропустил или IR инкрементируется той же схемой что и PC ?
Для тех, кто не прочитал мой обзор - говорю кратко)
Конечно тем же самым методом, что и PC)
Первые два такта команды - это выдача PC на шину и инкремент,
Следующие два такта команды - это выдача IR на шину и инкремент с ограничением до 7 бит.
Причем, даже описал, как происходит этот инкремент.
Сперва регистровая пара пересылается в регистр PCR, а затем уже инкрементированная пересылается в PCR2, а уже из него обратно в регистровый файл.
AlexG (05.09.2024), b2m (05.09.2024), Barmaley_m (05.09.2024)
интересно было бы посмотреть циклограмму выполнения команд из DD/FD префикса
ZXMAK2 - Виртуальная Машина ZX Spectrum https://github.com/zxmak/ZXMAK2 (старая ссылка http://zxmak2.codeplex.com)
ZXMAK.NET - спектрум на C# http://sourceforge.net/projects/zxmak-dotnet
Поработаю оракулом: оные префиксы работают как однобайтные команды аля 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 следующей команды, и делается это одновременно.
Последний раз редактировалось Titus; 07.09.2024 в 14:08.
Тадам! И по традиции, тема с подробным разбором не заходит)
- - - Добавлено - - -
Особенности работы команды NOP:
Не смотря на внешнее бездействие данной команды, внутренне проводится некоторая работа.
Как и во всех командах, вначале регистр флагов F кешируется, а регистр A засылается в оба аргумента АЛУ.
Далее, т.к. команда не использует аргументы, результатом работы АЛУ является A + A, но результат никуда не попадает.
Вот и все.
AlexG (07.09.2024), Barmaley_m (08.09.2024), CodeMaster (08.09.2024)
Команды 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 такта АЛУ дорабатывает вхолостую.
Barmaley_m (08.09.2024)
Эту тему просматривают: 7 (пользователей: 0 , гостей: 7)