Z80 регистр обновления памяти
Я снова с другим безобидным вопросом о Z80:-) То, как в настоящее время структурировано мое ядро эмулятора, я увеличиваю младшие 7 бит регистра обновления памяти каждый раз, когда байт кода операции извлекается из памяти - это означает для многобайтовых инструкций, таких как как те, которые начинаются с DD или FD, я увеличиваю регистр дважды - или в случае инструкции, такой как RLC (IX+d), три раза (как это выложено opcode1-opcode2-d-opcode3).
Это правильно? Я не уверен - руководство Z80 немного неясно по этому поводу, так как в нем говорится, что CPDR (двухбайтовая инструкция) увеличивает его вдвое, однако в разделе "Регистр обновления памяти" просто говорится, что он увеличивается после каждой выборки команд. Я заметил, что J80 (эмулятор, который я проверил, так как я не уверен в этом) увеличивается только после первого байта кода операции.
Что правильно? Я думаю, что это не очень важно в любом случае, но было бы неплохо знать:-) Большое спасибо.
С уважением, Фил Поттер
4 ответа
Все ссылки, которые я могу найти в Интернете, говорят, что R увеличивается на единицу за инструкцию независимо от ее длины.
Временные диаграммы Zilog содержат ответ на ваш вопрос.
Обновление происходит во время T3 и T4 всех циклов M1 (выборка кода операции).
В случае инструкций с одним кодом операции это одно обновление для каждой инструкции. Для инструкций с одним префиксом (префиксы читаются с использованием циклов M1) это два обновления на инструкцию.
Для этих странных инструкций типа DD-CB-disp-opcode и FD-CB-disp-opcode (странно, потому что байт смещения идет перед конечным кодом операции, а не после него), количество обновлений составляет по крайней мере 3 (для двух префиксов и последний код операции), но я не уверен, читается ли байт смещения как часть цикла M1 (который вызовет другое обновление) или обычного цикла чтения из памяти (без обновления). Я склонен полагать, что байт смещения читается в цикле M1 для этих инструкций, но я не уверен. Я спросил Шона Янга об этом; он тоже не был уверен. Кто-нибудь знает наверняка?
ОБНОВИТЬ:
Я ответил на свой вопрос об этих странных инструкциях DD-CB-disp-opcode и FD-CB-disp-opcode. Если вы посмотрите документацию Zilog для этих инструкций типа, таких как RLC (IX+d), вы заметите, что для инструкции требуется 6 M-циклов и 23 T-циклов, разбитых на: (4,4,3,5,4),3).
Мы знаем, что первые два M-цикла - это M1-циклы для извлечения префиксов DD и CB (по 4 T-цикла каждый). Следующий M-цикл читает байт смещения d. Но этот M-цикл использует только 3 T-цикла, а не 4, поэтому он не может быть циклом M1; вместо этого это обычный цикл чтения из памяти.
Вот разбивка шести M-циклов инструкции RLC (IX + d):
- Цикл M1 для чтения префикса 0xDD (4 Т-цикла)
- Цикл M1 для чтения префикса 0xCB (4 Т-цикла)
- Цикл чтения памяти для чтения байта смещения (3 Т-цикла)
- Цикл M1 для получения кода операции 0x06 и загрузки IX в ALU (5 T-циклов)
- Цикл чтения из памяти для вычисления и чтения с адреса IX+d (4 T-цикла)
- Цикл записи в память для вычисления RLC и записи результата по адресу IX+d (3 T-цикла)
(Расчет RLC перекрывает M-циклы 5 и 6.)
Эти инструкции типа уникальны тем, что являются единственными командами Z80, которые имеют несмежные циклы M1 (M-циклы 1, 2 и 4 выше). Они также самые медленные!
Павел
У недокументированных функций Шона Янга Z80 совсем другая история. Один раз для префикса, дважды для одного префикса, также дважды для двойного префикса (только DDCB) и один раз для префикса без операции.
Блок-инструкции, конечно, влияют на R каждый раз, когда они выполняются (и они запускаются раз BC)
Теперь я видел пару комментариев, что эти странные инструкции DDCB и FDCB только увеличивают регистр R в два раза.
Я всегда предполагал (и то, как я реализовал свой эмулятор Z80), что регистр R реализуется в конце каждого цикла M1.
Напомним, что эти странные инструкции DDCB и FDCB имеют длину четыре байта:
DD CB, код операции
Код операции FD CB
Ясно, что два префиксных кода операции считываются с использованием циклов M1, в результате чего регистр R увеличивается в конце каждого из этих циклов.
Также ясно, что байт смещения, следующий за префиксом CB, читается обычным циклом чтения, поэтому регистр R не увеличивается в конце этого цикла.
Это оставляет окончательный код операции. Если он читается циклом M1, то либо регистр R увеличивается в конце цикла, что дает в общей сложности 3 приращения, либо в особых случаях Z80 этот цикл M1 не увеличивается на регистр R.
Есть еще одна возможность. Что, если окончательный код операции читается обычным циклом чтения, таким как байт смещения, который предшествовал ему, а не циклом M1? Это, конечно, также приведет к тому, что регистр R будет увеличен только в два раза для этих инструкций, и не потребует, чтобы Z80 сделал исключение, не увеличивая регистр R в конце каждого цикла M1.
Это также может иметь больший смысл с точки зрения внутреннего состояния Z80. Как только он переключается на обычные циклы чтения, чтобы прочитать дополнительные байты инструкции (в данном случае это байт смещения после префикса CB), он никогда не переключается обратно на циклы M1, пока не начнет следующую инструкцию.
Кто-нибудь может проверить это на реальном оборудовании Z80, чтобы подтвердить значение регистра R, следуя одной из этих инструкций DDCB или FDCB?