我想了解Logisim中类似我的6502工作相似的处理器项目的确切中断是什么。 我知道中断会执行以下步骤:
加载未完成的数据,让程序继续正常运行。
我的问题是:在“某些事情” 步骤中会发生什么?程序计数器是否重定向到要执行的特殊程序?像读取按钮的ASCII码并将其保存到寄存器或某个内存位置中一样?如果是这样,那个特殊程序通常存储在存储器中的什么位置?而且,您可以制造这样一种CPU来处理各种中断吗?也许如果您按下按钮“ a”,那么它的ASCII将存储在A寄存器中,但是如果您按下按钮“ b”,则它将被存储在X寄存器中?
非常感谢您的帮助。
编辑:谢谢大家的回答。我学到了很多东西,现在可以继续我的项目了。
答案 0 :(得分:11)
我的问题是:在“ SOMETHING”步骤中会发生什么?程序计数器是否重定向到要执行的特殊程序?
6502可屏蔽中断会发生以下情况:
B
位设置为0。B
位是“ break”位。对于BRK
指令,它将设置为1,这是区分硬件中断和BRK
指令之间区别的唯一方法。 $FFFE
和$FFFF
处的地址,并将其填充到PC中,因此从该地址再次开始执行。仅此而已。一切由程序员决定,直到程序员执行RTI
,然后将状态字和返回地址从堆栈中拉出并恢复到各自的寄存器中。保存所有寄存器和其他数据是程序员的责任。
程序计数器是否重定向到要执行的特殊程序?像读取被按下按钮的ASCII码并将其保存到寄存器或某个内存位置中一样?
是正确的。在基于6502的计算机系统中,内存顶部有三个向量:
$FFFA - $FFFB
:不可屏蔽的中断(除了上面提到的状态寄存器中的I
位以外,其他都一样)。
$FFFC - $FFFD
:CPU检测到重置时使用的重置向量
$FFFE - $FFFF
:正常中断向量。
上面的内容通常在ROM中,因为CPU启动时必须至少有一个复位向量。每个地址都指向机器操作系统中用于处理中断的例程。
通常,中断例程将首先通过RAM中存储的向量进行间接跳转。这允许在机器运行时更改中断例程。
然后,中断例程必须确定中断源。例如,在Commodore PET上,中断可能源自VIA芯片或PIA芯片中的任何一个,并且每个中断都可能出于各种原因(例如中断)引发中断。当监视器进行垂直空白显示时,即当它完成对屏幕的扫描并返回到第一行时,其中一个PIA芯片会引发中断。在此中断期间,PET执行一个例程以扫描键盘,并执行另一个例程以反转光标。当VIA计时器为零时,程序员可以插入一个中断例程,例如,切换输出线以产生声音的方波,则可能会发生另一个中断。
评论中一些问题的答案。
程序计数器转到地址$ FFFE以重新定位到该地址
否,程序计数器设置为该地址处的值。如果您有:
FFFE: 00
FFFF: 10
程序计数器将设置为$1000
(6502为小字节序),这是中断例程必须开始的地方。另外,NMI的向量在$FFFA
。普通中断与$FFFE
指令共享BRK
,而不是NMI。
复位向量到底是做什么的?它会重置CPU吗?
复位向量包含在处理器通电或发生复位后 运行的代码的位置。
NMI和IRQ有什么区别?然后,我也想知道蒙版怎么了?是将处理器状态寄存器中的“ I”标志设置为高还是低的方法?
6502状态寄存器包含七个标志。通常,它们与算术指令的结果有关,例如如果运算结果为零,则设置Z;当运算溢出8位并移位时,设置C。 I标志启用和禁用普通中断(IRQ)。如果为零,则将遵守IRQ上的中断。如果为1,则禁止中断。您可以使用SEI
和CLI
指令手动设置和禁用它,并在发生中断时自动设置该标志(这是为了防止中断中断中断)。
NMI是不可屏蔽的中断。区别在于它忽略了I标志的状态并使用了不同的向量。
最后,向量是什么?它们是间接地址的同义词吗?
是的
哦,如果您确实知道,如何将以$ FFFA开头的中断地址存储在ROM中而不是真实的6502中的RAM中?
您必须安排地址解码逻辑将这些地址指向ROM而不是RAM。实际上,在Commodore系统中,$F000
的整个块是包含操作系统一部分的ROM。这可能适用于大多数其他基于6502的系统。
答案 1 :(得分:3)
6502上有四种中断类型:RESET,NMI,IRQ和BRK。前三个是硬件中断,最后一个是软件中断。硬件中断在微处理器本身的引脚上具有物理输入电压。软件中断是由BRK指令引起的。
所有中断均为“向量”。这意味着当它们发生时,程序计数器(PC)立即从存储在内存中的地址装入,并且指令从该地址继续执行。
在64k存储器空间的末尾,地址以两个字节的小端格式存储。它们是(十六进制):
NMI $FFFA/$FFFB
RESET $FFFC/$FFFD
IRQ $FFFE/$FFFF
BRK $FFFE/$FFFF
对于NMI,IRQ和BRK,在加载中断地址之前,将当前PC地址压入堆栈。处理器状态寄存器也被压入堆栈。
将寄存器推送到堆栈上,足以为中断提供服务(处理)后恢复执行。但是,A,X和Y寄存器不会自动压入堆栈。相反,中断服务例程应在必要时执行此操作-并在服务结束时将其从堆栈中拉回。
请注意,IRQ和BRK向量具有相同的地址。为了区分服务代码中发生的情况,您需要检查推送的处理器状态寄存器的间隔位。如果中断来自BRK指令,则将设置中断位。
当前执行的指令将始终在服务中断之前完成。
中断处理有许多细微之处。其中之一是在同时发生(认定)中断的情况下获胜。另一个是在指令周期内发生中断的时间点。如果该中断发生在该指令的倒数第二个周期之前,那么它将在下一条指令中得到服务。如果是倒数第二个周期或之后,那么它将延迟到之后的一条指令。
通过使用SEI指令将处理器状态寄存器中的位置1,可以“关闭”或忽略IRQ中断。
通常,中断服务程序需要确定中断原因(光盘驱动器,键盘等),并确保清除中断条件并执行任何处理(例如,将按键放入缓冲区)。通常,它可以通过读取/写入映射到硬件的特定内存位置来做到这一点。
此链接上有更多信息:https://www.pagetable.com/?p=410
有关在实际的8位计算机中中断如何工作的更多信息(第59、86、295页):BBC Microcomputer Advanced User Guide
有关物理芯片封装的更多信息,您可以在其中查看芯片封装本身上的NMI,RES(ET)和IRQ引脚(第2,3页):6502 Datasheet
答案 2 :(得分:1)
我猜您要求硬件中断(IRQ或NMI)。在堆栈的第2步(不在堆栈寄存器中)存储程序计数器和标志寄存器。稍后,您调用RTI
以恢复程序执行。程序计数器加载有“某物”的起始地址,该地址是中断子程序或处理中断的程序。如果需要在RTI之前修改它们的值并恢复它们,则必须存储A,X,Y寄存器。可以使用I
标志来屏蔽(延迟)IRQ中断,并且NMI是不可屏蔽的,即始终对其进行处理。它们具有不同的子例程地址。
答案 3 :(得分:0)
中断是通过硬件或软件向正在运行的处理器发出信号,以便处理器关注该操作并根据中断消息执行操作。 中断分为三种:
Cpu 设计用于处理此类中断并在中断发生之前恢复进程。