8

我正在尝试查找有关 6502 处理器如何处理中断的信息,但我很困惑。我看过一些关于它的例子,但它就像一个普通的子程序。

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

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

4

3 回答 3

11

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

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

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

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

除了推动状态寄存器之外,谁被认为负责增加程序计数器也是不同的,因此您使用RTI从中断处理程序返回而不是从RTS.

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

BRK应该有点模拟一个IRQ,但做得不是很好。

因此,预期的安排是:NMI 用于现在应该始终提供服务的任何事物。任何可以等待一段时间的 IRQ。相当多的 micros 根本不连接 NMI,因为那样你总是必须有一个工作处理程序,但这远非普遍。

于 2014-05-09T13:35:06.377 回答
9

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

触发中断时,执行跳转到 0xFFFE 和 0xFFFF(用于 IRQ)指向的内存位置。对于大多数处理器,应使用以下方法将寄存器推入堆栈:

PHA
PHX
PHY

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

6502.org有很多教程。

于 2014-05-08T18:46:08.927 回答
1

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

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

BRK 的工作方式类似于 IRQ,但有两个例外。首先,虽然 BRK 只是一个字节的指令,但是 PC 寄存器在被存储之前会前进两次,所以返回地址将是 BRK 之后的第二个字节。其次,设置存储在堆栈中的 P 寄存器(状态寄存器)的值的第 4 位,而对于 IRQ 清除它。注意这个位实际上并没有在内部连线,所以如果你使用PHP,那么PLA来读取状态寄存器,第4位总是会被置位,因为6502上的数据线默认为高电平。

MOS 6502 编程手册非常适合理解 6502 的工作原理,因为它概述了每种类型的 6502 指令和中断是如何执行的。

于 2019-01-28T00:49:14.870 回答