Блоки 6, 9, 12 осуществляют проверку сигналов RST7.5, RST6.5, RST5.5 соответственно (разумеется, в таком же порядке располагаются их приоритеты). В том случае, когда проверка выявит активный уровень какого-либо сигнала, последует переход на проверку маски соответствующего сигнала (блоки 7, 10, 13). Например, если активен сигнал RST7.5, то последует переход на блок 7, который проверяет маску Mask7.5. Если маска установлена (т.е. MaskX.5 = 1), то следует переход на проверку следующего запроса на прерывание, например, из блока 7 в блок 9. В противном случае (маска сброшена) в регистр WZ загружается соответствующий фиксированный вектор прерывания (см. блоки 8, 11, 14). Например, для RST7.5 значение вектора равно 3Сh. Очевидно, что запросы RSTx.5 маскируемые.
Если запросы на прерывания TRAP, RSTx.5 отсутствуют, то блок 15 проверяет наличие запроса INTR. Если и этот запрос отсутствует, то следует переход на блок 1 (чтение КОП следующей команды). В противном случае (INTR активен) выполняется блок 16, который формирует активный сигнал INTA#. С помощью этого сигнала вводится байт, формируемый контроллером прерываний.
Блок 17 проверяет, принадлежит ли введенный байт одной из команд RST i (где i = 0...7, см. п. 2.8.8). Если это так, то выполняется блок 18, который формирует вводимый вектор прерывания по простому правилу (вектор = 8 * i).
Если введенный байт не принадлежит ни одной из команд RST i, то это КОП команды CALL (см. п. 2.8.7), поэтому МП еще дважды формирует сигнал INTA#, что позволяет ввести адрес перехода, который загружается в регистр WZ.
Блок 19 выполняется всякий раз, когда МП определил действительный запрос на прерывание (см. блоки 8, 11, 14). Этот блок сбрасывает триггер разрешения прерываний, запрещая обработку запросов на прерывания на время выполнения текущего обработчика. Исключение составляет запрос TRAP, при обработке которого блок 19 обходится (см. блок 4). Это позволяет другим запросам прервать выполнение обработчика TRAP (такие прерывания называются вложенными).
Блок 20 сохраняет содержимое счетчика команд в стеке. Таким образом сохраняется адрес возврата из прерывания. В этом же блоке происходит переход на первую команду обработчика (PC:= (WZ)), который выполняется в блоке 21.
После выхода из обработчика выполняется блок 22, в котором сбрасывается триггер разрешения прерываний. Это актуально для запроса TRAP, при обработке которого обходится блок 19. В блоке 23 проверяется источник прерывания. Если это RST7.5, то в блоке 24 сбрасывается триггер tRST7.5 (см. п. 2.5.1).
Блок 25 завершает алгоритм аппаратной поддержки прерываний. Именно в нем адрес из вершины стека загружается в счетчик команд. Если обработчик все операции над стеком выполнил корректно, то на вершине стека находится адрес возврата из прерывания, который был загружен в стек в блоке 20.
Для более детального знакомства с процессом прерывания в п. 2.5.3 приводится временные диаграммы цикла прерывания, инициируемого запросом INTR (команда RST i).
2.5.3. Машинный цикл прерывания
Временные диаграммы машинного цикла прерывания приведены на рис. 2.10. Собственно циклом прерывания является цикл М1 (см. промежуток времени t1...t2), оставшиеся два цикла М2, М3 являются циклами записи в память.
Проверка запросов на прерывания осуществляется в начале последнего такта Тn последнего машинного цикла любой команды (см. момент времени t0). Поскольку в этот момент времени активен запрос INTR (см. блок 15 на рис. 2.9), то следующим машинным циклом М1 будет чтение КОП команды, которую формирует контроллер прерывания (см. блок 16 на рис. 2.9).
Ввод КОП (сигналы: S0 = 1, S1 = 1) осуществляется сигналом INTA#, который формируется в тех же временных границах что и сигналы RD#, WR#. Можно считать, что сигнал INTA# функционально аналогичен сигналу RD#. Отличие заключается только в том, что КОП читается не из памяти, а из порта ввода (IO/M# = 1), каковым для МП является контроллер прерывания. Адрес, который устанавливает МП в этом цикле (младший и старший байты содержимого счетчика команд - PCL и PCH соответственно - это адрес команды, на которую должен быть произведен возврат из прерывания), не используется.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.