NMI和IRQ中断

时间:2014-05-08 18:31:18

标签: assembly 6502

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

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

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

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

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

BRK应该模拟一个IRQ但不能做得很好。

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

答案 1 :(得分:6)

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

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

PHA
PHX
PHY

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

6502.org有很多教程。

答案 2 :(得分:0)

为回答您的问题,NMI和IRQ在6502上的运行方式几乎相同。它运行七个周期,可以在《 MOS 6502编程手册》第9章中找到,该手册涵盖了所有中断键入说明。正如其他人所指出的,NMI代表不可屏蔽中断,IRQ代表中断请求(可以屏蔽它)。 NMI使用向量地址FFFA-FFFB,而IRQ和BRK都使用FFFE-FFFF。

请记住,当JSR指令存储PC寄存器时,即指向JSR指令的最后一个字节,而NMI和IRQ操作存储了中断结束时要执行的下一条指令的第一个字节。这就是为什么RTS和RTI不能互换使用的部分原因。

BRK与IRQ相似,但有两个例外。首先,尽管BRK只是一个字节的指令,但PC寄存器在存储之前先被前进了两次,因此返回地址将是BRK之后的第二个字节。其次,将堆栈中存储的P寄存器(状态寄存器)的值的第4位设置为1,同时清除IRQ。请注意,该位实际上并未在内部进行布线,因此,如果您使用PHP,则PLA会读取状态寄存器,由于6502上的数据线默认为高电平,因此始终会设置位4。

《 MOS 6502编程手册》非常适合理解6502的工作原理,因为它概述了每种6502指令和中断的执行方式。