【发布时间】:2017-11-28 13:29:57
【问题描述】:
我目前正在 LogiSim 中开发 6502 的子集。我的主要资源之一是Hanson's Block Diagram。
我正在尝试确定应该如何以及在何处构建电路来更新处理器状态寄存器。在下面的处理器状态寄存器图中,有多条控制线进入寄存器,但没有指明它们来自哪里。
6502 处理器状态寄存器何时何地更新?我认为它在 ALU 的输出上,但我想确保是这种情况。
【问题讨论】:
我目前正在 LogiSim 中开发 6502 的子集。我的主要资源之一是Hanson's Block Diagram。
我正在尝试确定应该如何以及在何处构建电路来更新处理器状态寄存器。在下面的处理器状态寄存器图中,有多条控制线进入寄存器,但没有指明它们来自哪里。
6502 处理器状态寄存器何时何地更新?我认为它在 ALU 的输出上,但我想确保是这种情况。
【问题讨论】:
你有汉森的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电路图。
【讨论】:
从上到下:
C 标志由
设置或清除ADCSBC、CMP、CPX、CPY
ASL、ROL、ROR
SEC, CLC
PLP, RTI
Z 由
设置或清除A、X、Y 的指令,例如进位、按位逻辑运算、加载、传输、从堆栈中拉取、移位和循环的算术运算。PLP, RTI
BITI 由
设置或清除SEI 和 CLI 指令。 PLP, RTI
BRK 设置和中断。D 仅由 PLP、RTI、SED 和 CLD 指令设置或清除。
B 很有趣。实际上,程序员完全无法访问它,处理器也没有使用它。压入堆栈的状态字节设置为BRK,并为中断清除。我猜这意味着RTI和PLP会设置它,如果它设置在从堆栈中拉出的字节中,但这并不重要。
V 标志被设置或清除
ADC, SBC
BITPLP,RTI的指令
CLV在与 Z 相同的情况下设置或清除 N。
我认为它在 ALU 的输出上
这是对所有 ALU 操作的公平评估,但正如您从上面看到的,在某些情况下,状态标志是从 ALU 以外的来源设置的。
参考:http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
【讨论】: