



通常情况下,处理器支持某些形式的中断处理,以响应来自外部设备的服务请求。从概念上讲,中断处理类似于当正在忙于某项工作时电话响起的情况。在接听电话并记下要点后,挂断电话并恢复被中断的工作。生活中也有许多类似的机制,例如门铃和闹钟,能够让人们先响应中断优先级较高的活动请求。
处理
6502集成电路具有两个输入信号,用于外部组件通知处理器有服务请求。第一个输入信号是中断请求输入信号
。
是低电平有效输入信号(
字符上方的横线表示低电平有效),表示输入为低电平时向处理器发出中断请求。可以将此信号视为电话铃声来通知处理器当前正在有一个电话呼入。
6502无法立即响应
输入上的低电平信号。在6502开始处理中断之前,首先必须完成正在执行的指令,接下来将返回地址(正在执行的指令完成之后将要执行的下一条指令的地址)压入栈,处理器标志寄存器也入栈。由于这个中断是由
输入产生的,因此栈里处理器标志中的B标志将为0。
与JSR指令不同,响应
时压入栈的返回地址是下一条将要被执行的指令的实际地址,而不是指令地址减1。中断返回地址不会像RTS指令执行期间那样递增以生成返回地址。
在中断处理的下一阶段,处理器将
处理程序的入口地址从内存地址$FFFE~$FFFF加载到PC寄存器中,6502从该地址执行中断处理程序。中断处理程序能够识别发起中断的外围设备,并执行能够满足请求所需的处理,然后将控制权返回到中断之前正在执行的代码。
当中断处理完成后,处理器执行RTI指令。RTI指令从栈中弹出处理器标志与PC寄存器的值,并恢复执行在
输入为低电平时正在执行指令的下一条指令。
输入是可屏蔽中断,它可以实现与让电话铃声静音相同的功能。当
中断处理开始时,6502自动置位I标志,这样可以屏蔽(禁用)
输入信号,直到I标志被清除。
因为处理器开始响应
时I标志可能还没有被置位,所以I标志会被RTI指令清除。I标志也可以通过CLI指令清除,这意味着可以在处理
中断时启用
中断。处理一个中断的同时响应另一个中断的现象称为
嵌套中断
(nested interrupt)。
输入信号是由电平控制的,意味着只要
输入为低电平且I标志被清除,处理器就会启动中断处理程序。这样的结果是,在完成一个中断处理时,与6502交互的中断源必须确保
输入不再为低电平。如果在执行RTI指令时
保持低电平,则6502将立即开始新的中断处理过程。
通过
输入信号发起中断可以实现6502与外围设备之间的大多数常规交互。例如,在大多数计算机中键盘是中断源,每次按键都会产生一个
中断。在键盘中断处理期间,6502从键盘接口读取按键标识,并将其存储在队列中,以便被当前活动的应用程序进行处理。
处理程序不需要知道有关按键信息的用途,只是保存数据供以后使用。
处理
6502的第二个中断输入信号是
,即不可屏蔽中断。顾名思义,
不会被I标志所屏蔽。
是下降沿触发的边沿敏感输入信号。
除了中断处理程序的入口地址是从内存地址$FFFA~$FFFB加载的且不受I标志影响外,
中断处理与
中断处理类似。
因为
是不可屏蔽中断,所以可以在任何时刻触发,包括6502在处理
中断时或者在处理较早的
中断时。
输入通常为优先级非常高的中断条件保留,因此不能延迟处理或忽略。
中断的一种可能用途是触发实时时钟的定时递增。
每次发生中断时,
处理程序会使位于地址$10~$13的32位时钟计数器递增:
需要注意的是,当在程序源代码中访问硬件信号时,可以在信号名前面使用正斜杠表示低电平有效。比如在代码注释中,/NMI表示
。
BRK指令触发一个类似于
中断的处理过程。因为BRK是一条指令,所以在启动中断处理之前不需要等待正在执行的指令完成。在执行BRK指令时,返回地址(BRK指令地址加2)和处理器标志都被压入栈,这类似于对
输入信号的低电平响应。值得注意的是,通过BRK指令地址加2,返回地址就不再指向BRK指令之后的字节,而是指向它后面的第二个字节。
BRK指令是不可屏蔽的,即I标志不影响BRK指令的执行。
BRK指令处理程序与
处理程序地址相同,位于内存地址$FFFE~$FFFF处。由于BRK指令和
共享同一个处理程序,因此在处理期间一定要根据B标志来识别中断源。在响应BRK指令时,将处理器标志中的B标志压入栈中[注意,这不是处理器标志(P)寄存器中的B标志],并且在处理
中断期间将其清除。
在大多数6502的应用中,很少使用BRK指令。这条指令的传统用法是在调试程序时设置断点。通过使用BRK指令临时替换在中断位置处的操作码字节,调试程序(在较小的计算机系统中通常称为监控器)获得控制权,并允许用户在恢复执行前显示和修改寄存器内容和内存位置。
下面的代码示例实现了一个最小的
处理程序,该处理程序可区分
中断和BRK指令。使用内存地址$14作为这个程序专用的临时存储单元:
这个例子说明了在6502体系结构中,如何区分由处理器
输入信号发起的中断和由BRK指令引起的中断。在更为复杂的处理器中,这些体系结构通常为每个中断源实现唯一的中断向量(中断处理程序入口地址),支持在指定的指令位置设置断点等调试操作。
本节介绍了6502体系结构中的指令类型,并简要说明了指令类别中的每条指令。尽管6502比现代的32位和64位处理器简单得多,但这里介绍了最常见的指令(包括支持通用中断处理的指令)和寻址方式,它们在最复杂的现代处理器中也要使用。
下一节将介绍用于处理器和外围设备之间进行数据传送的I/O处理的基础知识。