我的问题是:在“某事”步骤中会发生什么?程序计数器是否被重定向到要执行的特殊程序?
6502 可屏蔽中断的情况是这样的:
- 引发中断(我的意思是芯片上的中断引脚被强制为低电平。
- 当需要执行一条新指令时,6502 会检查中断引脚是否为低电平以及状态寄存器中的中断屏蔽是否未设置。如果不是这种情况,即如果中断引脚为高电平或中断掩码为高电平,CPU 就会继续执行。
- 假设需要中断,CPU 将 PC 保存在堆栈中
- CPU 然后将状态寄存器保存在堆栈中,但
B 位设置为 0。B 位是“中断”位。对于 BRK 指令,它将被设置为 1,这是区分硬件中断和 BRK 指令的唯一方法。
- 然后 CPU 获取地址
$FFFE 和 $FFFF 并将其填充到 PC 中,因此从该地址重新开始执行。
就是这样。其他一切都取决于程序员,直到程序员执行RTI,然后将状态字和返回地址从堆栈中拉出并恢复到各自的寄存器中。保存所有寄存器和其他数据是程序员的责任。
程序计数器是否被重定向到要执行的特殊程序?比如读取按下按钮的 ASCII 码并将其保存到寄存器或某个内存位置?
没错。在基于 6502 的计算机系统中,内存顶部有三个向量:
$FFFA - $FFFB : 不可屏蔽中断(如上,除了状态寄存器中的I 位被忽略)。
$FFFC - $FFFD : CPU 检测到复位时使用的复位向量
$FFFE - $FFFF:普通中断向量。
以上内容通常在 ROM 中,因为当 CPU 上电时,复位向量(至少)必须存在。每个地址将指向机器操作系统中用于处理中断的例程。
通常,中断程序会首先通过存储在 RAM 中的向量进行间接跳转。这允许在机器运行时更改中断程序。
然后中断程序必须确定中断源。例如,在 Commodore PET 上,中断可能源自 VIA 芯片或任何一个 PIA 芯片,并且每个芯片都可能因各种原因引发中断,例如当显示器出现垂直空白时,即当它完成扫描屏幕并返回到顶行时,其中一个 PIA 芯片会引发中断。在此中断期间,PET 执行一个程序来扫描键盘,并执行另一个程序来反转光标。当 VIA 定时器达到零时,可能会发生另一个中断,程序员可以插入一个中断例程,例如切换输出线以生成声音方波。
对cmets中问题的一些回答。
程序计数器转到地址 $FFFE 以重新定位到该地址
不,程序计数器设置为该地址的任何内容。如果你有:
FFFE: 00
FFFF: 10
程序计数器将设置为$1000(6502 是小端序),这就是中断例程必须开始的地方。此外,NMI 的向量位于$FFFA。正常中断与BRK 指令共享$FFFE,而不是NMI。
复位向量到底是做什么的?它会重置cpu吗?
复位向量包含在处理器通电后或发生复位时运行的代码位置。
NMI 和 IRQ 有什么区别?那我也想知道遮罩是怎么回事?是把处理器状态寄存器中的“I”标志设置为高还是低?
6502 状态寄存器包含七个标志。大多数情况下,它们与算术指令的结果有关,例如如果操作的结果为零,则设置 Z,当操作溢出八位并移位时设置 C。 I 标志启用和禁用正常中断 (IRQ)。如果它为零,则将尊重 IRQ 上的中断。如果为 1,则禁用中断。您可以通过SEI和CLI指令手动设置和禁用它,并在发生中断时自动设置(这是为了防止中断中断中断)。
NMI 是一个不可屏蔽的中断。不同之处在于它忽略了 I 标志的状态并使用了不同的向量。
最后,什么是向量?它们是间接地址的同义词吗?
是的。
哦,如果你知道的话,从 $FFFA 开始的中断地址是如何存储在 ROM 中的,而不是实际 6502 中的 RAM 中?
您必须安排地址解码逻辑将这些地址指向 ROM 而不是 RAM。事实上,在 Commodore 系统中,$F000 的整个块是包含部分操作系统的 ROM。这可能适用于大多数其他基于 6502 的系统。