在上电时,CPU 的内部电路将“未使用”标志位硬连到逻辑“1”。这个标志位只能是“1”,因为它不由任何内部标志或寄存器控制,而是由连接到高信号线的物理连接确定。
状态寄存器中的“I”标志在 CPU 重置逻辑时初始化为“1”,当然也可以通过“SEI”和“CLI”程序指令以及 CPU 本身进行修改(例如在 IRQ 处理过程中)。默认状态为“1”(从而设置中断禁止标志)的原因是,主机系统可以执行启动/复位代码,而无需考虑和安排 IRQ 断言的服务。
许多 6502 主机系统依赖于一些外部触发源来引发 IRQ 和 NMI 断言——通常是一个 VIA 或 CIA 伴侣芯片,由 MOS Technology 特别设计为接口适配器,具有可配置的定时器和其他事件响应器,与 6502 无缝协同工作,根据预定的硬件条件引发中断。这些伴侣芯片本身需要一些程序驱动配置,以便将它们设置为已知状态,开始监视硬件事件并相应地引发中断。
由于这些芯片可能被硬件初始化为潜在的不确定状态,因此6502不想立即开始服务于这些中断,因为这些中断可能完全是虚假的。通过将“I”标志默认设置为“开启”,CPU开始其重置程序执行,知道软件可以初始化主机系统的其余部分 - 包括支持芯片如VIAs和CIAs - 在整个系统处于可以处理它们的状态之前,不存在虚假中断的可能性。举个例子,考虑一个情景,CPU IRQ向量在ROM中指向RAM中的间接向量,RESET代码通过将IRQ服务例程地址初始化到RAM向量来初始化它。如果在RESET代码初始化RAM向量之前发生了IRQ,则它几乎肯定指向随机地址(可能但不保证为$0000),很可能会导致系统崩溃。通过默认设置“I”标志,直到程序发出“CLI”命令,IRQs才不会发生,而这是在RAM向量地址已正确初始化以指向有效的IRQ服务例程后。
如果你研究6502 RESET代码的常见示例,你会看到一系列系统初始化例程的重复主题,用于设置主机环境(包括支持芯片计时器寄存器以进行IRQ生成),然后最后一件事情是运行'CLI'指令。大多数环境往往是基于IRQ驱动,以精确的间隔执行其工作和服务例程(例如每个视频帧执行一次),因此RESET代码以'CLI'结尾来表示初始化 - 包括IRQ生成设置 - 已完成且可以开始IRQ服务。
现在,说了这么多,还有什么可以阻止NMI在RESET处理期间的任何时候被断言呢?CPU会刻苦地暂停RESET程序,并跳转到NMI ROM向量 - 在这种情况下,“I”标志没有影响(正如你所预期的那样 - NMI是不可屏蔽的,不能被忽略)。因此,具有讽刺意味的是,虽然“I”标志默认设置为“1”以保护RESET代码免受虚假或过早的IRQ的干扰,但仍然始终存在虚假NMI的可能性,该问题无法阻止,并且如果向量指向RAM(直接或间接)则可能引起相同的问题。
程序员的任务是找到一种管理这样不及时的 NMIs 的方法,使得如果它们发生了,它们就没有任何影响,或者至少不会干扰 RESET 处理。因此,可以说,如果软件必须考虑这种情况,那么为 IRQ 做同样的事情并不需要更多的努力 - 这意味着在 CPU 初始化电路中默认将 'I' 标志设置为 '1' 可以被取消,或者将 NMIs 硬连线为在 RESET 期间被忽略。但当然,它们在所有情况下都不会是“不可屏蔽的”,你需要一个特殊的“RESET” 标志在状态寄存器中,您可以清除该标志以告诉CPU已完成RESET处理,并且NMIs现在可以正常服务。但是我岔开了话题。