6502 中的状态寄存器何时更新?

When is the status register updated in the 6502?

我目前正在 LogiSim 中开发 6502 的一个子集。我的主要资源之一是 Hanson's Block Diagram.

我正在尝试确定应该如何以及在何处构建电路来更新处理器状态寄存器。在下面的处理器状态寄存器图中,有多条控制线进入寄存器,但没有指示它们来自哪里。

6502 处理器状态寄存器何时何地更新?我会认为它在 ALU 的输出上,但我想确保情况确实如此。

自上而下:

C 标志由

设置或清除
  • 任何可能有无符号溢出的指令。这些包括 ADC SBCCMPCPXCPY
  • 移位和循环指令ASLROLROR
  • 显式设置和清除指令SECCLC
  • 加载整个状态寄存器的指令PLPRTI

Z 由

设置或清除
  • 任何写入 AXY 的指令,例如进位算术、按位逻辑运算、加载、传输、从堆栈中取出、移位和循环。
  • 加载整个状态寄存器的指令PLPRTI
  • BIT

I 由

设置或清除
  • SEICLI 指令。
  • 加载整个状态寄存器的指令PLPRTI
  • BRK 设置并中断。

D 仅由 PLPRTISEDCLD 指令设置或清除。

B 很有趣。它实际上是程序员完全无法访问的,处理器也不会使用它。压入堆栈的状态字节为 BRK 设置并为中断清除。我想这意味着 RTIPLP 会设置它,如果它被设置在从堆栈中拉出的字节中,但这并不重要。

V 标志由

设置或清除
  • ADCSBC
  • BIT
  • 加载整个状态寄存器的指令PLPRTI
  • CLV

N 在与 Z 相同的情况下设置或清除。

I would think that it is on the output of the ALU

这是对所有 ALU 操作的公平评估,但正如您从上面看到的那样,在某些情况下,状态标志是从 ALU 以外的来源设置的。

参考:http://www.e-tradition.net/bytes/6502/6502_instruction_set.html

你有汉森的 complete updated diagram? The paper is here. (Or original here。)

P 左侧的输入(DB0/C 等)是随机控制逻辑块底部的输出。 P 顶部的输入来自 ALU(ACR、AVR),IR5 是指令寄存器的第 5 位。 (但从下面的 Breaknes 来看,Hanson 的图表似乎不完整:"Donald missed the 0/V command on the schematic, which is used when processing the CLV instruction.")

对于不同的指令,输入将被不同地锁存。例如,像 CLC/SEC/CLD/SED/CLI/SEI/CLV 这样的两个周期指令有一个位 (IR5),它最终将硬编码值锁存到 C、I、V 或 D 中的一个。其他指令将 ALU(等)信号锁存到多个标志在以后的周期。这是我所知道的尽可能多的细节,以及适合此处答案的逻辑。

可在俄语 Breaknes site. The author has reverse engineered all of the 6502 logic at the transistor level from images at Visual6502. Have a good look around in the Wiki and Info sections of the site. E.g. here is a translated link to the flag info page which has a logic diagram, unlike the wiki page on flag logic 上获得非常详细的信息。

6502 forum when he did this work (flag logic on page 12 and page 15) and some of the content might only be linked from this thread. The original code repo has been moved to GitHub where there is emulator source code and Logisim电路图中有很多讨论。