我试图找到有关6502 proccesor如何处理中断的信息,但我很困惑。我已经看到了一些关于它的例子,但它就像一个普通的小组。
我对8086处理器有一些经验,我记得有一些代码可以处理不同的中断。
首先,如果有人能用一些代码解释NMI和IRQ之间的差异,我将非常感激。甚至更多,如果你得到关于处理中断的更多信息(例如)处理键盘中断。
答案 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指令和中断的执行方式。