NMI和IRQ中断

qui*_*dev 5 assembly 6502

我试图找到关于6502 proccesor如何处理中断的信息,但我很困惑.我已经看过一些关于它的例子,但它就像一个普通的subrutine.

我对8086处理器有一些经验,我记得有一些代码可以处理不同的中断.

首先,如果有人能用一些代码解释NMI和IRQ之间的差异,我将非常感激.甚至更多,如果您获得有关处理中断的更多信息(例如)处理键盘中断.

Tom*_*mmy 8

有两个独立的中断:可屏蔽和不可屏蔽.6502将在每条指令结束前对这一个周期进行采样.

如果NMI行已激活(它的边缘被触发),那么它将在此操作完成后执行NMI例程.

否则,如果IRQ线处于活动状态(触发电平)并且未设置中断禁用标志,则在此操作完成后它将执行IRQ例程.

在这两种情况下,它都会读取跳转向量,将当前程序计数器和状态寄存器推送到堆栈,设置中断禁用位并跳转到向量指示的位置.从记忆中,这一切都需要七个周期.

除了推送状态寄存器之外,还有一个区别在于谁被认为负责递增程序计数器,因此您使用RTI从中断处理程序返回而不是RTS.

从FFFA/FFFBh读取NMI载体,从FFFE/FFFFh读取IRQ.重置向量介于两者之间,您可以在远处将视图重置视为一种无法返回的NMI.

BRK 应该是模拟一个IRQ,但不是很好.

所以预期的安排是:NMI用于任何现在应该始终服务的东西.对于任何可以等待一段时间的任何事情的IRQ.相当多的微软根本没有连接NMI,因为那时你总是需要一个有效的处理程序,但这远非普遍.


Dav*_*ell 7

NMI(不可屏蔽中断)和IRQ(中断请求)是CPU封装上的独立物理引脚.

当触发中断时,执行跳转到0xFFFE和0xFFFF指向的存储单元(对于IRQ).对于大多数处理器,应使用以下命令将寄存器推送到堆栈:

PHA
PHX
PHY
Run Code Online (Sandbox Code Playgroud)

SEI可用于禁用IRQ,但不能用于禁用NMI. CLI将再次启用它们.

6502.org有很多教程.