Я просто ради удовольствия пытаюсь разработать более сложную систему Z80 CP / M с большим количеством периферийных устройств. При чтении документации я наткнулся на (недокументированное?) Поведение процессора Z80 при приеме прерывания в IM0.
Когда происходит прерывание, Z80 активирует M1 и IORQ, чтобы сигнализировать внешнему устройству: «Эй, дайте мне код операции». Все хорошо, если код операции rst 00 или что-то вроде этого. Теперь в документации сказано: ЛЮБОЙ код операции любой команды может быть передан процессору, например, CALL.
Но теперь идет недокументированная часть: «Первый байт многобайтовой инструкции считывается во время цикла подтверждения прерывания. Последующие байты считываются обычной последовательностью чтения из памяти».
«Обычная последовательность чтения из памяти». Как я могу определить, хочет ли ЦП получить байт из памяти или вместо этого следующий байт от устройства?
РЕДАКТИРОВАТЬ: Я думаю, что нашел (хорошее?) решение: я могу определить начало цикла подтверждения прерывания, проанализировав IORQ и M1. Также я могу обнаружить следующую «нормальную» выборку кода операции, проанализировав MREQ и M1. Таким образом, я могу установить триггер, запускаемый этими двумя сигналами AND, т.е. триггер равен 1, пока ЦП считывает данные с io-устройства. Этот 1 я могу использовать для запрета передачи драйверов шины в память и обратно.
Мои намерения? Я разрабатываю контроллер прерываний с 8 приоритетными входами в CPLD. Его регистры содержат 16-битный адрес для каждого вывода прерывания. Просто для удовольствия :-)
IM 0
в моем старом Роднею Заке Программирование Z80, он говорит следующее: в этом состоянии прерывающее устройство может вставить одну инструкцию на шину данных для выполнения, первый байт которой должен произойти во время цикл подтверждения прерывания. Это не сильно помогло :) - person Jongware   schedule 07.12.2014