Z80 регистр обновления памяти - PullRequest
9 голосов
/ 17 декабря 2011

Я снова с еще одним безобидным вопросом Z80 :-). Так как ядро ​​моего эмулятора в настоящее время структурировано, я увеличиваю младшие 7 бит регистра обновления памяти каждый раз, когда байт кода операции извлекается из памяти - это означает для многобайтовойинструкции, такие как те, которые начинаются с DD или FD, я увеличиваю в регистре дважды - или в случае инструкции, такой как RLC (IX + d), три раза (как это выложено opcode1-opcode2-d-opcode3).

Это правильно?Я не уверен - руководство Z80 немного неясно по этому поводу, так как в нем говорится, что CPDR (двухбайтовая инструкция) увеличивает его в два раза, однако в разделе «Регистр обновления памяти» просто говорится, что он увеличивается после каждой выборки команд.Я заметил, что J80 (эмулятор, который я проверил, так как я не уверен в этом) увеличивается только после первого байта кода операции.

Что правильно?Я думаю, это не очень важно в любом случае, но было бы неплохо знать :-) Большое спасибо.

С уважением, Фил Поттер

Ответы [ 4 ]

13 голосов
/ 19 февраля 2012

На временных диаграммах Zilog содержится ответ на ваш вопрос.

Обновление происходит во время T3 и T4 всех циклов M1 (выборка кода операции).

В случае инструкций с одним кодом операции это одно обновление для каждой инструкции. Для инструкций с одним префиксом (префиксы читаются с использованием циклов M1) это два обновления на инструкцию.

Для тех странных инструкций типа DD-CB-disp-opcode и FD-CB-disp-opcode (странно, что байт смещения приходит перед последним кодом операции, а не после него), число обновлений по крайней мере 3 (для двух префиксов и окончательного кода операции), но я не уверен, читается ли байт смещения как часть цикла M1 (который вызовет другое обновление) или обычного цикла чтения из памяти (без обновления). Я склонен полагать, что байт смещения читается в цикле M1 для этих инструкций, но я не уверен. Я спросил Шона Янга об этом; он тоже не был уверен. Кто-нибудь знает наверняка?

UPDATE:

Я ответил на свой вопрос об этих странных инструкциях 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):

  1. цикл M1 для считывания префикса 0xDD (4 цикла T)
  2. цикл M1 для чтения префикса 0xCB (4 T-цикла)
  3. Цикл чтения памяти для чтения байта смещения (3 T-цикла)
  4. цикл M1 для извлечения кода операции 0x06 и загрузки IX в АЛУ (5 T-циклов)
  5. Цикл чтения из памяти для вычисления и чтения по адресу IX + d (4 Т-цикла)
  6. Цикл записи в память для вычисления RLC и записи результата по адресу IX + d (3 T-цикла)

(Расчет RLC перекрывает M-циклы 5 и 6.)

Эти инструкции типа уникальны тем, что являются единственными инструкциями Z80, которые имеют несмежные циклы M1 (M-циклы 1, 2 и 4 выше). Они также самые медленные!

Пол

5 голосов
/ 19 декабря 2011

Недокументированные возможности Шона Янга Z80 имеет другую историю.Один раз для префикса, дважды для одного префикса, также дважды для двойного префикса (только DDCB) и один раз для префикса без операции.

Разумеется, инструкции блока влияют на R при каждом запуске (и при запуске BC).раз).

1 голос
/ 25 апреля 2013

Я видел пару комментариев сейчас, когда эти странные инструкции 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?

0 голосов
/ 17 декабря 2011

Все ссылки, которые я могу найти в Интернете, говорят, что R увеличивается на единицу за инструкцию независимо от ее длины.

...