我正在为未来的NES仿真器实现自己的MOS 6502 cpu仿真器。我正在使用nestest来测试模拟器的正确性。一切似乎都找到了,直到我到达以下行:
您可以看到状态寄存器(6F)被压入堆栈。在下一条指令中,将其从累积器中的堆栈中拉出。在下一次读取中,日志显示A:7F。这有意义吗? A不应该是6F吗?
我正在使用此日志: http://www.qmtpro.com/~nes/misc/nestest.log
我想,由于它来自Nintendulator,因此应该可靠。
我误会了还是该日志不可靠?
答案 0 :(得分:3)
出于更好地解释here和here的原因,PHP
在将状态寄存器压入堆栈时始终设置 Break 标志。但是,该标志的物理实现方式与我们对其进行可视化呈现方式之间存在代表性的差异-它实际上根本没有保存在状态寄存器中,而是以实际状态显示。
6502执行一条PHP
指令时,它会将要写入堆栈的状态寄存器的值中的第4位设置为,但这并不反映为对状态寄存器本身。因此,您的日志显示PHP
之后的状态寄存器未更改,但是当您PLA
该字节时,它已设置第4位。您可以通过使用监视器在PHP
指令后中断然后查看堆栈存储区中的字节($ 01xx)来自己查看。
答案 1 :(得分:2)
状态寄存器(P)的第5位(有时称为R表示保留)和第4位(通常称为B表示中断)实际上并不像其他标志那样存储在硅中。
R will always be pushed as 1. B is pushed as 1 by a PHP or BRK, and 0 by IRQ and NMI interrupts。
#$ 6F仅仅是因为仿真器作者选择将B保留在仿真的P中。