问题描述
一个关于 6502 的快速而愚蠢的问题。例如,指令 nop 需要 2 个周期。如果6502发生了中断,能不能在nop的2个周期之间发生?
那么,这是一种可能的情况吗:
nop cycle 1
[ INTERRUPT ]
nop cycle 2
当然这个问题可以扩展到其他说明。中断会“等待”整个指令完成还是会中断指令本身?
解决方法
将评论整理为社区 Wiki:
当前指令finishes first:“当外围设备需要服务并将中断请求(IRQ)线拉低时,允许当前执行的机器语言指令完成,7时钟中断序列为启动。这个序列就像执行一条没有写入程序的指令,而是通过将 IRQ 线拉低到逻辑低电平这一事实隐式插入的。”
仅在指令的倒数第二个周期检查中断状态;因此,如果中断请求正在进行但中断禁用标志在序列之前设置:
CLI
SEI
然后会发生以下情况:
- CLI 结束前一个周期,中断禁用标志仍然设置,因此 CLI 之后没有任何反应;
- 在 SEI 结束前一个周期,中断禁用标志现在被禁用,因此安排了中断;
- SEI 设置中断禁用标志;和
- 然后响应中断请求,从而在堆栈上产生一个
P
,并设置了中断禁用标志。