我目前正在LogiSim中开发6502的子集。我的主要资源之一是Hanson's Block Diagram。
我正在尝试确定应该如何以及在何处构建更新处理器状态寄存器的电路。在下面的处理器状态寄存器图中,有多条控制线进入寄存器,但没有指示它们来自何处。
6502处理器状态寄存器何时何地更新?我认为这是在ALU的输出上,但我想确保这种情况。
答案 0 :(得分:7)
你有汉森的complete updated diagram吗?论文is here。 (或original here。)
P(DB0 / C等)左侧的输入是随机控制逻辑块底部的输出。 P顶部的输入来自ALU(ACR,AVR),IR5是指令寄存器的第5位。 (但是从下面的Breaknes看来,Hanson的图表似乎不完整:“Donald错过了原理图上的0 / V命令,该命令在处理CLV指令时使用。”)
对于各种指令,输入将被不同地锁存。例如,像CLC / SEC / CLD / SED / CLI / SEI / CLV这样的两个循环指令有一位(IR5),最终将硬编码值锁存到C,I,V或D中的一个。其他指令将在稍后的周期将ALU(等)信号锁存到多个标志。这就像我所知道的那么详细,以及适合这里答案的逻辑。
俄罗斯Breaknes site提供了非常详细的信息。作者从Visual6502的图像反向设计了晶体管级的所有6502逻辑。在网站的Wiki和Info部分仔细查看。例如。这是一个translated link到标志信息页面,它有一个逻辑图,与wiki page on flag logic不同。
6502 forum当他完成这项工作时有很多讨论(page 12和page 15上的标记逻辑),有些内容可能只是从这个帖子链接。原始代码仓库已移至GitHub,其中有仿真器源代码和Logisim电路图。
答案 1 :(得分:4)
从顶部开始:
C标志由
设置或清除ADC
SBC
,CMP
,CPX
,CPY
ASL
,ROL
,ROR
SEC
,CLC
PLP
,RTI
通过
设置或清除Z.A
,X
,Y
的指令,例如算术,如进位,按位逻辑运算,加载,传递,从堆栈中拉出,移位和旋转。PLP
,RTI
BIT
我被
设置或清除SEI
和CLI
说明。 PLP
,RTI
BRK
设置并中断。 D仅由PLP
,RTI
,SED
和CLD
说明设置或清除。
B很有意思。它实际上是程序员完全无法访问的,并且没有被处理器使用。堆栈上推送的状态字节设置为BRK
并清除中断。我想这意味着RTI
和PLP
如果在从堆栈中拉出的字节中设置它就会设置它,但它并不重要。
通过
设置或清除V标志ADC
,SBC
BIT
PLP
,RTI
CLV
在与Z相同的情况下设置或清除N。
我认为它在ALU的输出上
这是对所有ALU操作的公平评估,但正如您从上面可以看到的那样,有些情况下状态标志是从ALU以外的来源设置的。
参考:http://www.e-tradition.net/bytes/6502/6502_instruction_set.html