Является ли Z80 NMI реентерабельным?

Из того, что я мог понять, прерывание Z80 NMI (0x66) запускается при обнаружении фронта вывода NMI. Что происходит, когда обнаруживается другое ребро, когда оно все еще находится внутри кода обработчика NMI (RETN еще не выполнен)?

Является ли NMI реентерабельным и будет ли Z80 просто помещать текущий адрес в стек и снова начинать с 0x66?


z80
person obiwanjacobi    schedule 02.10.2016    source источник
comment
Спасибо за ссылку. Очень полезно.   -  person obiwanjacobi    schedule 03.10.2016


Ответы (1)


Насколько я понимаю, второй NMI прервет обработку первого. Единственная особая вещь, которую обработка NMI делает, чтобы избежать дополнительного прерывания, - это резервное копирование IFF1 на IFF2, а затем установка IFF1 (при этом особенностью RETNs является восстановление в другом направлении). Но это не запретит НМИ. Таким образом, нет никакого механизма, с помощью которого будущий NMI будет игнорироваться.

Это слегка подкреплено в литературе, хотя и тонко — например, "Это отрицательное преимущество инициированное прерывание не может быть отключено программным управлением и будет принято ЦП в любое время для обработки по завершении текущей инструкции (если запрос шины не ожидает обработки)"; добавлен акцент, но также обратите внимание, что запрос шины был выделен как особый случай без упоминания о существующем NMI.

person Tommy    schedule 02.10.2016
comment
И не так тонко подкреплено названием. NMI - немаскируемое прерывание. Другими словами, вы не можете остановить это, отключив (маскируя) прерывания с помощью DI. - person George Phillips; 02.10.2016