Немаскируемые прерывания
Запросы немаскируемых прерываний поступают в микропроцессор по линии NMI#. Программно они запрещены быть не могут.
При поступлении запроса немаскируемого прерывания микропроцессор сохраняет адрес возврата в прерванную программу в стеке и передаёт управление на инструкцию по адресу 0066h. Кроме того, состояние флага IFF1 копируется во флаг IFF2, а флаг IFF1 обнуляется, что приводит к запрещению маскируемых прерываний.
Маскируемые прерывания
Запросы маскируемых прерываний поступают в микропроцессор по линии INT#. Распознавание маскируемых прерываний разрешается установкой флага IFF1. Когда этот флаг сброшен, маскируемые прерывания запрещены.
Микропроцессор Z80 поддерживает три режима обработки маскируемых прерываний. Выбор режима осуществляется соответствующей установкой флагов IMFa и IMFb.
Режим 0 соответствует механизму обработки прерываний микропроцессора 8080 и предназначен главным образом для сохранения совместимости с изделием фирмы Intel. Однако инженеры фирмы Zilog не до конца продумали этот режим, в результате чего полной совместимости можно добиться только с помощью дополнительных внешних схем. Суть проблемы заключается в следующем.
Микропроцессор 8080 обрабатывает прерывание, получая у контроллера прерывания полный код команды, которая должна быть выполнена. В принципе может использоваться любая инструкция микропроцессора, но практическую ценность имеют лишь инструкции вызова подпрограммы CALL (трёхбайтовая; код операции – 0CDh) и RST 0–7 (однобайтовые; двоичный код операции 11nnn111, где nnn – номер, стоящий после мнемоники RST). В результате выполнения любой из этих инструкций адрес следующей команды (т.е. команды, которая выполнилась бы следующей, если бы не произошло прерывание) сохраняется в стеке, а в счётчик команд PC заносится адрес первой инструкции обработчика прерывания (этот адрес содержится во втором и третьем байтах инструкции CALL или является фиксированным для инструкций RST 0–7 – от 0000h до 0038h с шагом 0008h). Чтобы получить у контроллера код инструкции перехода к обработчику прерывания, микропроцессор 8080 в ответ на запрос прерывания выдаёт необходимое количество раз сигнал подтверждения прерывания. В ответ на первый сигнал подтверждения контроллер выдаёт байт кода операции. Расшифровав его, микропроцессор определяет, требуется ли получить дополнительные байты кода команды, а значит, нужно ли выдать дополнительные сигналы подтверждения. Таким образом, для инструкции CALL сигнал подтверждения прерывания будет выдан трижды, а для любой из инструкций RST – лишь один раз.
Микропроцессор Z80 не имеет специального выхода подтверждения прерывания. Вместо этого в режиме 0 он выполняет специальный цикл чтения кода операции, выдавая одновременно сигналы M1# (признак чтения первого байта кода команды) и IORQ# (признак обращения в пространство ввода-вывода) вместо сигналов M1# и MREQ# (признак обращения в пространство памяти), используемых при обычной выборке кода операции из памяти. Из сигналов M1# и IORQ# с помощью простейшей схемы можно получить сигнал подтверждения прерывания в стиле микропроцессора 8080, однако вырабатываться он будет только для первого байта кода команды. Таким образом, использовать для перехода к обработчику прерывания инструкции RST 0–7 можно, а инструкцию CALL – нельзя, поскольку она состоит из трёх байтов и требует выдачи трёх сигналов подтверждения прерывания. Однако именно инструкция CALL используется для перехода к обработчику прерывания в большинстве систем на базе микропроцессора 8080, поскольку её код выдаётся контроллером прерываний 8259 фирмы Intel (советский аналог – КР580ВН59). Чтобы добиться совместимости с этим или аналогичным контроллером, приходится применять дополнительные схемы, “отлавливающие” факт подтверждения прерывания по сигналам M1# и IORQ# и выдающие дополнительные сигналы подтверждения прерывания для инструкции CALL.
Режим 1 используется в маленьких вычислительных системах, где достаточно одного-единственного вектора маскируемого прерывания. При поступлении запроса прерывания микропроцессор сохраняет адрес возврата в прерванную программу в стеке и осуществляет переход на адрес 0038h. Таким образом, в этом режиме маскируемые прерывания обрабатываются точно тем же способом, что и немаскируемые. Разница заключается в возможности их маскирования и в адресе обработчика прерываний.
Следует заметить, что подобный режим обслуживания прерываний был возможен и в микропроцессоре 8080 при его использовании совместно с системным контроллером 8228 или 8238 (КР580ВК28 или КР580ВК38). Правда, в отличие от Z80, здесь такой режим реализовывался чисто аппаратным путём, и перепрограммировать его было невозможно.
Режим 2 является основным режимом обслуживания маскируемых прерываний, реализующим все потенциальные возможности микропроцессора Z80. Используя его, можно определить до 128 различных векторов прерываний.
Как и в режиме 0, микропроцессор подтверждает прерывание выдачей сигналов M1# и IORQ#. Устройство, запросившее прерывание, отвечает выдачей на шину данных своего вектора. Процессор, получив вектор, использует его в качестве младшего байта адреса элемента таблицы прерываний; в качестве старшего байта используется содержимое регистра I. Затем он сохраняет в стеке адрес возврата к прерванной программе, выбирает из таблицы прерываний двухбайтовый адрес обработчика и передаёт ему управление.
Поскольку адрес обработчика занимает два байта, вектор прерывания, выдаваемый устройством, должен иметь нулевой младший разряд.
Приоритет прерываний
Запрос немаскируемого прерывания всегда имеет больший приоритет, чем запрос маскируемого прерывания. Кроме того, когда происходит немаскируемое прерывание, обработка маскируемых прерываний блокируется (сбрасывается флаг IFF1).
Приоритет нескольких одновременных запросов маскируемых прерываний в режиме 0 определяется контроллером прерываний, на который поступают все запросы от устройств. Обычно, передав какой-либо запрос на обработку процессору, контроллер запрещает все прерывания такого же и более низкого уровня, однако это зависит от его возможностей и запрограммированных режимов работы.
В режиме 1 все устройства используют один и тот же вектор прерывания. Определение устройства, вызвавшего прерывание, ложится на программу обработки прерывания.
В режиме 2, как и в режиме 1, их запросы одновременно поступают на линию INT# микропроцессора; ответные сигналы (M1# и IORQ#) также поступают ко всем устройствам. Однако сами устройства связаны между собой в единую цепочку с помощью специальных сигналов IEI и IEO. Первый из них является входным сигналом, сообщающим устройству, что его предшественники не запрашивали прерывание. Второй сигнал идёт от данного устройства к последующим, сообщая, что ни это устройство, ни его предшественники прерывание не запрашивали. На входе IEI первого устройства в цепочке постоянно присутствует сигнал высокого уровня, а любое устройство, запрашивающее прерывание, выдаёт на свой выход IEO сигнал низкого уровня. Если устройство не запрашивает прерывание, оно транслирует на выход IEO значение входа IEI. Устройство выдаёт на шину данных свой вектор только в том случае, когда оно запросило прерывание, на его входе IEI присутствует напряжение высокого уровня, а от процессора поступили сигналы M1# и IORQ#.
Система команд
Система команд микропроцессора Z80 насчитывает 158 инструкций, из которых 78 полностью повторяют (правда, зачастую с иной мнемоникой и другим способом записи операндов) команды процессора 8080, благодаря чему часто достигается полная переносимость программного обеспечения.