2011-12-16 2 views
7

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

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

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

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

+0

Я бы подумал, что инструкция CPDR увеличит регистр обновления памяти не один раз, не дважды, а столько раз, сколько будет повторяться, поскольку это повторяющаяся инструкция. (И я сомневаюсь, что ожидалось, что память не будет обновляться в течение всей продолжительности повторяющихся инструкций.) –

ответ

-1

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

+3

Фактически, он увеличивается один раз за состояние M1. Инструкции с префиксом CBh, EDh, (или префиксы IX/IY) увеличивают R дважды. У вас может даже быть такая DD DD DD DD 21 00 00 (то есть LD IX, 0000h со многими префиксами DDh, которая действительна), которая увеличит R на 6. –

5

Sean Young's Z80 Undocumented Features имеет другую историю. Один раз для unprefixed, дважды для одного префикса, также дважды для двойного префикса (только DDCB) и один раз для префикса no-op.

Инструкции блока, конечно, влияют на R каждый раз, когда они запускаются (и они запускают BC).

+0

Спасибо за это - я дам этот документ a browse :-) – PhilPotter1987

+0

Кто-нибудь проверил временные диаграммы, чтобы выяснить, нарушает ли это кажущееся произвольное правило «один раз за цикл обновления»? Он чувствует себя как можно инстинктивно. – Tommy

+0

@ Томми, я не проверял их, но IIRC вы правы – harold

11

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

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

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

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

UPDATE:

Я ответил на свой вопрос повторно эти странные DD-CB-дисп-кодов операций и FD-CB-дисп-кодов операций инструкции. Если вы проверите документацию по 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; вместо этого это обычный цикл чтения памяти.

Вот разбивка RLC (IX + D) шесть М-циклов команд в:

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

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

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

Пол

+0

Да, весь DD-CB-то, что сперва сбило меня с ума: -D Мой Z80 сейчас почти 100% работает, и на самом деле часть эмулятора, запускающего реальные SMS-игры, хотя и в незавершенном состоянии. Тем не менее, эта проблема все еще нуждается в пересмотре. Спасибо за Ваш ответ. – PhilPotter1987

+0

Очень полезно. Есть ли пробой, подобный вышеперечисленному, доступный для всех кодов операций? Разбивка цикла T/M приведена в руководстве, но в нем не указано, что происходит в M-цикле. Я могу угадать большинство из них, но с точным обзором это поможет. –

1

Я видел несколько комментариев теперь эта странное 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?

+1

Я только что проверил тест на реальном Z-80, подтверждающий, что инструкции DDCB и FDCB дважды увеличивают регистр R. Чтобы выразить это конкретными терминами, следующая последовательность будет заканчиваться регистром A, загруженным 4: «ld ix, memloc; xor a; ld r, a; sla (ix); ld a, r". Так как «ld a, r» увеличивает R на 2, «sla (ix)» должен увеличивать R только на 2. –

+1

Удивительно, что я подтверждаю результат @ GeorgePhillips, у меня есть 4 на Z84C0020. Проверьте: я заменил 'sla (ix)' тремя nops и получил 5. – lvd

Смежные вопросы