据我所知,Z80 NMI 中断(0x66)是由 NMI 引脚的边缘检测触发的。当仍在 NMI 处理程序代码中(RETN 尚未执行)检测到另一个边缘时会发生什么?
NMI 是可重入的吗?Z80 是否只是将当前地址压入堆栈并再次从 0x66 开始?
据我所知,Z80 NMI 中断(0x66)是由 NMI 引脚的边缘检测触发的。当仍在 NMI 处理程序代码中(RETN 尚未执行)检测到另一个边缘时会发生什么?
NMI 是可重入的吗?Z80 是否只是将当前地址压入堆栈并再次从 0x66 开始?
我的阅读是第二个 NMI 会中断第一个 NMI 的处理。NMI 处理为避免额外中断所做的唯一特殊操作是将 IFF1 备份到 IFF2,然后设置 IFF1(具有RETN
特殊功能是在另一个方向上恢复)。但这不会禁止 NMI。因此,没有任何机制可以忽略未来的 NMI。
这一点在文献中得到了轻微的支持,尽管很微妙——例如“这个下降沿触发的中断不能在程序控制下被禁用,并且将在任何时候被 CPU 接受以在当前指令完成时兑现(如果总线请求没有待办的)”; 添加了重点,但也请注意,总线请求已作为特例被删除,没有提及现有的 NMI。