Многобайтовые команды Z80 в IM0

Я просто ради удовольствия пытаюсь разработать более сложную систему Z80 CP / M с большим количеством периферийных устройств. При чтении документации я наткнулся на (недокументированное?) Поведение процессора Z80 при приеме прерывания в IM0.

Когда происходит прерывание, Z80 активирует M1 и IORQ, чтобы сигнализировать внешнему устройству: «Эй, дайте мне код операции». Все хорошо, если код операции rst 00 или что-то вроде этого. Теперь в документации сказано: ЛЮБОЙ код операции любой команды может быть передан процессору, например, CALL.

Но теперь идет недокументированная часть: «Первый байт многобайтовой инструкции считывается во время цикла подтверждения прерывания. Последующие байты считываются обычной последовательностью чтения из памяти».

«Обычная последовательность чтения из памяти». Как я могу определить, хочет ли ЦП получить байт из памяти или вместо этого следующий байт от устройства?

РЕДАКТИРОВАТЬ: Я думаю, что нашел (хорошее?) решение: я могу определить начало цикла подтверждения прерывания, проанализировав IORQ и M1. Также я могу обнаружить следующую «нормальную» выборку кода операции, проанализировав MREQ и M1. Таким образом, я могу установить триггер, запускаемый этими двумя сигналами AND, т.е. триггер равен 1, пока ЦП считывает данные с io-устройства. Этот 1 я могу использовать для запрета передачи драйверов шины в память и обратно.

Мои намерения? Я разрабатываю контроллер прерываний с 8 приоритетными входами в CPLD. Его регистры содержат 16-битный адрес для каждого вывода прерывания. Просто для удовольствия :-)


person Hennes    schedule 06.12.2014    source источник
comment
Глядя IM 0 в моем старом Роднею Заке Программирование Z80, он говорит следующее: в этом состоянии прерывающее устройство может вставить одну инструкцию на шину данных для выполнения, первый байт которой должен произойти во время цикл подтверждения прерывания. Это не сильно помогло :)   -  person Jongware    schedule 07.12.2014
comment
Я прочитал это как возможность взять с устройства только один байт во время цикла подтверждения. ЦП, не зная, откуда взялся код операции, затем делает то, что он всегда делает при загрузке многобайтового операнда, и считывает остальное из памяти.   -  person Mike    schedule 07.12.2014
comment
@Mike, как следует из примечания к приложению, по крайней мере, достаточно умен, чтобы не настраивать ПК во время такой последовательности.   -  person Tommy    schedule 07.12.2014
comment
Я приятно удивлен качественными ответами для такого старого процессора здесь, на SO - тем более, что это также очень загадочная часть этого процессора (интересно, действительно ли кто-нибудь когда-либо использовал многобайтовые инструкции в IM0?).   -  person Michael Burr    schedule 07.12.2014


Ответы (2)


Насколько я понимаю, требуется периферийное устройство:

  • чтобы знать, сколько байтов нужно кормить;
  • реагировать на нормальные циклы чтения, следующие за циклом IORQ; и
  • сделать так, чтобы все, что обычно реагировало на циклы чтения из памяти, не реагировало на время.

Кроме того, Zilog задокументировал это поведение в примечании к приложению, из которого взята ваша цитата. (предположительно, в титрах не указан).

На практике я полагаю, что 99,99% пользователей IM0 просто используют RST, а 99,99% остальных используют инструкцию известного размера, например CALL xxxx.

(также я знаю несколько микросхем, которые эффективно гарантируют, что ничего не попадет на шину во время цикла прерывания, тем самым превратив IM0 в синоним IM1 из-за выхода с открытым коллектором).

person Tommy    schedule 07.12.2014
comment
Откуда берутся эти лишние байты? На диаграмме Закса в его разделе, посвященном обработке прерываний, указано, что ПК не имеет инкремента, что подтверждает, что ПК (Z80) не отображается, и периферийное устройство должно считывать память хоста. - person Jongware; 07.12.2014
comment
Я считал, что ЦП продолжит выполнять циклы чтения, а периферийное устройство должно считать их с помощью собственного счетчика. Я не смог найти четкой документации о том, какой адрес будет предоставлен для цикла чтения. Если история помогает, IM0 - это режим, совместимый с 8080, а 8080 был разработан с учетом прерывания, совместимого с 8008 (и совместимого с исходным кодом, но не совместимого с двоичным кодом). Итак, мы говорим о примитивных вещах. IM1 и IM2 - это попытка Zilog сделать что-то более умное. - person Tommy; 07.12.2014
comment
Хорошая находка в примечании к приложению. Цитата в вопросе также есть в руководстве пользователя Z80, но без особых подробностей (отсюда, вероятно, и вопрос). Похоже, ключевая деталь, которая не упоминается явно даже в примечании к приложению, заключается в том, что должна быть какая-то внешняя схема, чтобы обычные устройства памяти не мешали циклам чтения для байтов кодов OP после первого. - person Michael Burr; 07.12.2014

Поведение прерывания обоснованно задокументировано в руководстве Z80: Режимы прерывания, IM2 позволяет предоставить 8-битный адрес 16-битному указателю. По крайней мере, на полпути к желаемому 16-битному прямому адресу.

Как установить режимы прерывания

Насколько я понимаю, используется комбинация M1 + IORQ, поскольку не было оставлено вывода для выделенного ответа на прерывание. Интересной деталью также является то, что микросхемы ввода-вывода Zilog, такие как PIO, SIO, CTC, считывают инструкцию RETI (по мере того, как ее выбирает ЦП), чтобы узнать, что ЦП готов принять другое прерывание.

person jmn    schedule 01.02.2015
comment
Привет, спасибо за сообщение, хотя ничего нового. Возникает вопрос: как я могу определить, хочет ли ЦП получить байт из памяти или вместо этого следующий байт от устройства? - person Hennes; 02.02.2015
comment
Нет проблем, я просто добавил несколько штук. - person jmn; 02.02.2015
comment
Я предполагаю, что информация в исходном ответе и примечании к приложению была достаточно полной, чтобы передать байты адреса? В противном случае я тоже могу немного подробнее рассказать об этом. - person jmn; 02.02.2015