6502第一次通电后是否立即将FF放入堆栈指针寄存器中?

6502第一次通电后是否立即将FF放入堆栈指针寄存器中?

我从 6502.org 上的许多链接中阅读有关 6502 处理器的指令集,其中一个教程指出:

堆栈指针(S)指向第 1 页上的某个字节,即指向地址从 0100 到 01FF 的字节,其中后两位由 S 提供。将字节压入堆栈时,会将其写入 S 中的地址,然后 S 会递减。

S 寄存器为 1 个字节,因此它显然保存从 00 到 FF 的值,但由于它在推送时会递减,因此当尚未推送任何内容时,它必须从 FF 开始。当芯片首次通电时,芯片中的物理硬件(晶体管)是否会将该寄存器中的所有位设置为“1”?

我只是喜欢了解底层的细节。

答案1

我见过的每个基于 6502 和兼容代码的 ROM 都会在 RESET 例程中初始化堆栈指针 ( LDX #$FF, )。你也应该这样做。TXS

后来的 6502 修订版(即 Apple II 中的 65C02)以及 65816 16 位变体及更高版本可能会明确地初始化它。

我敢打赌,这.S是原始 6502 和 Commodore 64 中的 6510 启动时的随机值,甚至可能是 NES 中的 2A07 启动时的随机值。

通常,任何 6502 复位例程也以以下内容开始,通常是前两个指令:

SEI ;disable interrupts (set interrupt disable flag)
CLD ;turn decimal mode off

答案2

如果你观看 Michael Steil 关于 6502 逆向工程的演示(http://www.youtube.com/watch?v=fWqBmmPQP40),您将在 42:15 左右看到他解释了 RESET 发生时会发生什么。作为 RESET 处理的一部分,6502 实际上会推送 PC 和 P 值。堆栈指针从 0x100 开始,在推送这三个字节后,因此最终位于 0x1fd。

答案3

http://forum.6502.org/viewtopic.php?t=468&sid=ccdf15a560f1520a347ba896ae89767f声称没有具体说明。

http://whats.all.this.brouhaha.com/2011/07/07/stack-usage-in-the-apple-1-monitor/还声称它没有指定,并且如果您不关心堆栈在该页面中的确切位置,那也没关系。无论它从哪里开始,它都会绕行,所以只要您使用的堆栈不超过 256 字节,就没问题。

http://visual6502.org/JSSim/它是实际硬件的晶体管级模拟,似乎在将 SP 设置为 FD 的情况下启动;您可能可以在那里追踪实际的寄存器并确定这是故意的还是仅仅是巧合。

(在该上下文中,“监视器”指的是低级控制程序而不是显示器)

答案4

对于软件应用程序来说,这通常无关紧要。如果您的程序不会返回到 basic,您可以按照上面所说的操作,即自己控制 SP。如果您要返回 basic,那么您应该确保返回时堆栈处于程序启动前的相同状态,否则 BASIC 将崩溃。

上述 Snarfblam 的回应在技术上具有误导性,首先是因为“读取第二个本地”没有特定含义,而且因为使用 TSX,LDA $00FF,X 永远不会从高于 $01FE 的任何地址执行 LDA,因为 X 的最大值是 $FF:$00FF + FF = $01FE。此外,如果您希望累加器读取之前推送到堆栈的值,PLA 就足够了。

相关内容