Маскируемые прерывания
Запросы маскируемых прерываний поступают в микропроцессор по линии 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. Затем он сохраняет в стеке адрес возврата к прерванной программе, выбирает из таблицы прерываний двухбайтовый адрес обработчика и передаёт ему управление.
Поскольку адрес обработчика занимает два байта, вектор прерывания, выдаваемый устройством, должен иметь нулевой младший разряд.